当前位置: 首页 > article >正文

STM32F103C8T6 + YL-69传感器:从ADC采集到串口打印的完整保姆级教程

STM32F103C8T6与YL-69土壤湿度传感器实战指南从硬件搭建到数据可视化的全流程解析在物联网和智能农业快速发展的今天土壤湿度监测已成为许多项目的核心需求。对于嵌入式开发者而言如何快速搭建一个可靠的土壤湿度监测系统是必备技能。本文将带你从零开始使用STM32F103C8T6最小系统板和YL-69传感器构建一个完整的土壤湿度监测解决方案。1. 硬件准备与连接原理1.1 硬件选型与采购建议对于初学者而言选择合适的硬件是项目成功的第一步。以下是经过验证的硬件组合主控芯片STM32F103C8T6最小系统板蓝色板价格约15-25元具备丰富的外设接口社区资源丰富适合学习传感器YL-69土壤湿度传感器四线制设计VCC、GND、AO、DO工作电压3.3V-5V价格约5-10元提示购买时建议选择带有防锈处理探针的版本可延长户外使用时间。1.2 硬件连接详解YL-69传感器与STM32的连接看似简单但每个引脚都有其特定作用传感器引脚STM32连接点作用说明VCC3.3V电源输入GNDGND接地AOPA1模拟信号输出DO不连接数字信号输出阈值报警为什么选择PA1引脚PA1是STM32F103C8T6的ADC1通道1该芯片共有10个ADC通道PA0-PA7, PB0-PB1PA1位置便于布线不易与其他外设冲突// 在代码中对应的ADC通道定义 #define ADC_CHANNEL ADC_Channel_1 // PA1对应ADC1通道12. 软件开发环境搭建2.1 Keil MDK工程配置创建一个规范的工程结构是项目成功的关键。建议采用以下文件结构Project/ ├── USER/ │ ├── main.c │ ├── adc.c │ ├── adc.h │ ├── usart.c │ ├── usart.h ├── CORE/ ├── FWLIB/ ├── SYSTEM/关键配置步骤新建Keil工程选择STM32F103C8器件添加标准外设库STM32F10x_StdPeriph_Lib配置Target选项勾选Use MicroLIB简化printf重定向设置ROM和RAM地址范围优化等级建议选择-O12.2 ADC模块初始化详解ADC初始化是项目的核心部分需要理解每个参数的意义void ADC1_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; ADC_InitTypeDef ADC_InitStructure; // 1. 时钟使能 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1, ENABLE); // 2. GPIO配置 GPIO_InitStructure.GPIO_Pin GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode GPIO_Mode_AIN; // 模拟输入模式 GPIO_Init(GPIOA, GPIO_InitStructure); // 3. ADC分频配置 RCC_ADCCLKConfig(RCC_PCLK2_Div6); // 72MHz/612MHz // 4. ADC参数配置 ADC_InitStructure.ADC_Mode ADC_Mode_Independent; // 独立模式 ADC_InitStructure.ADC_ScanConvMode DISABLE; // 单通道 ADC_InitStructure.ADC_ContinuousConvMode DISABLE; // 单次转换 ADC_InitStructure.ADC_ExternalTrigConv ADC_ExternalTrigConv_None; // 软件触发 ADC_InitStructure.ADC_DataAlign ADC_DataAlign_Right; // 数据右对齐 ADC_InitStructure.ADC_NbrOfChannel 1; // 1个转换通道 ADC_Init(ADC1, ADC_InitStructure); // 5. 使能ADC并校准 ADC_Cmd(ADC1, ENABLE); ADC_ResetCalibration(ADC1); while(ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1); while(ADC_GetCalibrationStatus(ADC1)); }3. 数据采集与处理3.1 ADC数据采集实现获取ADC原始值的函数实现uint16_t Get_ADC_Value(uint8_t ch) { // 设置规则组通道采样时间为239.5周期 ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5); // 启动软件转换 ADC_SoftwareStartConvCmd(ADC1, ENABLE); // 等待转换完成 while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); // 返回转换结果 return ADC_GetConversionValue(ADC1); }3.2 数据滤波与湿度计算土壤湿度值通常需要经过滤波处理以提高稳定性#define SAMPLE_TIMES 10 // 采样次数 uint16_t Get_Soil_Humidity(uint8_t ch) { uint32_t adc_sum 0; uint16_t humidity 0; // 多次采样取平均 for(uint8_t i0; iSAMPLE_TIMES; i) { adc_sum Get_ADC_Value(ch); Delay_ms(5); } uint16_t adc_avg adc_sum / SAMPLE_TIMES; // 转换为百分比湿度 (YL-69特性) // 干燥时ADC值接近0湿润时接近409512位ADC humidity (4095 - adc_avg) * 100 / 4095; return humidity; }注意不同批次的YL-69传感器可能有不同的特性曲线建议在实际使用前进行校准。4. 数据输出与可视化4.1 串口通信配置实现printf重定向方便数据输出#include stdio.h // 重定向printf到串口1 int fputc(int ch, FILE *f) { USART_SendData(USART1, (uint8_t)ch); while(USART_GetFlagStatus(USART1, USART_FLAG_TC) RESET); return ch; } void USART1_Init(uint32_t baudrate) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; // 1. 时钟使能 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); // 2. GPIO配置 // PA9-USART1_TX, PA10-USART1_RX GPIO_InitStructure.GPIO_Pin GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP; // 复用推挽输出 GPIO_Init(GPIOA, GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode GPIO_Mode_IN_FLOATING; // 浮空输入 GPIO_Init(GPIOA, GPIO_InitStructure); // 3. USART参数配置 USART_InitStructure.USART_BaudRate baudrate; USART_InitStructure.USART_WordLength USART_WordLength_8b; USART_InitStructure.USART_StopBits USART_StopBits_1; USART_InitStructure.USART_Parity USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, USART_InitStructure); // 4. 使能USART USART_Cmd(USART1, ENABLE); }4.2 数据格式设计与输出设计合理的数据输出格式有助于后续处理void Print_Sensor_Data(uint16_t humidity) { // 获取系统时间需实现Get_Tick()函数 uint32_t tick Get_Tick(); // 格式化输出 printf([%lu ms] Soil Humidity: %d%%\r\n, tick, humidity); // 或者JSON格式输出 // printf({\sensor\:\YL-69\,\humidity\:%d,\unit\:\%%\}\r\n, humidity); }4.3 使用串口助手可视化数据推荐几款常用的串口调试工具ATK XCOM正点原子出品支持多种数据格式显示自带数据保存功能SSCOM野火推荐支持波形显示多串口同时监控CoolTermMac平台简洁易用支持多种编码格式典型输出示例[1250 ms] Soil Humidity: 45% [2250 ms] Soil Humidity: 47% [3250 ms] Soil Humidity: 46%5. 项目优化与扩展5.1 硬件优化建议电源稳定性添加0.1μF去耦电容靠近传感器VCC引脚在长距离传输时考虑使用屏蔽线传感器保护探针可涂覆防锈漆避免长时间通电导致电解腐蚀接口设计增加XH2.54插座方便插拔考虑添加LED状态指示5.2 软件优化技巧低功耗设计// 间歇采样模式 void Enter_LowPower_Mode(void) { // 关闭ADC时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, DISABLE); // 进入停止模式 PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI); // 唤醒后重新初始化ADC ADC1_Init(); }自适应采样率// 根据湿度变化率调整采样间隔 uint32_t Get_Sample_Interval(uint16_t prev_humidity, uint16_t curr_humidity) { uint8_t delta abs(curr_humidity - prev_humidity); if(delta 20) return 500; // 快速变化500ms采样一次 else if(delta 5) return 1000; // 中等变化1s采样一次 else return 5000; // 缓慢变化5s采样一次 }5.3 项目扩展方向多传感器融合结合DHT11温湿度传感器添加光照强度传感器无线传输通过ESP8266实现WiFi上传使用HC-05模块实现蓝牙传输本地显示添加OLED显示屏使用TFT LCD实现图形界面云端对接通过MQTT协议上传到阿里云IoT对接Home Assistant智能家居系统6. 常见问题排查指南在实际项目中可能会遇到以下典型问题问题1ADC读数不稳定检查电源是否稳定示波器观察3.3V纹波尝试增加软件滤波次数检查传感器与土壤接触是否良好问题2串口无输出检查TX/RX线序是否正确确认波特率设置一致验证printf重定向是否成功问题3湿度值始终为0或100%检查AO引脚连接是否正常测量传感器AO引脚输出电压范围确认ADC配置是否正确特别是对齐方式问题4程序下载失败检查BOOT0/BOOT1引脚状态确认下载器驱动安装正确尝试降低下载速度以下是一个简单的排查流程图电源正常是 → 2否 → 检查电源电路串口通信正常是 → 3否 → 检查串口配置ADC能读取到变化的值是 → 4否 → 检查传感器和ADC配置计算后的湿度值合理是 → 系统正常否 → 检查计算公式和传感器特性在实际项目中我遇到过最棘手的问题是传感器在潮湿环境下读数漂移后来发现是电源纹波过大导致的。添加了一个47μF的钽电容后问题得到解决。另一个常见问题是新手容易混淆AO和DO引脚的功能记住AO是模拟输出需要连接ADC引脚DO是数字输出可以连接普通GPIO但不适用于精确测量。

相关文章:

STM32F103C8T6 + YL-69传感器:从ADC采集到串口打印的完整保姆级教程

STM32F103C8T6与YL-69土壤湿度传感器实战指南:从硬件搭建到数据可视化的全流程解析 在物联网和智能农业快速发展的今天,土壤湿度监测已成为许多项目的核心需求。对于嵌入式开发者而言,如何快速搭建一个可靠的土壤湿度监测系统是必备技能。本文…...

终极Sismo徽章铸造协议实战指南:从核心原理到完整部署

终极Sismo徽章铸造协议实战指南:从核心原理到完整部署 【免费下载链接】sismo-badges Contracts of the Sismo Badge Minting Protocol 项目地址: https://gitcode.com/gh_mirrors/si/sismo-badges Sismo徽章铸造协议(Sismo Badge Minting Proto…...

如何快速掌握ComfyUI:终极视觉AI工作流构建指南

如何快速掌握ComfyUI:终极视觉AI工作流构建指南 【免费下载链接】ComfyUI The most powerful and modular diffusion model GUI, api and backend with a graph/nodes interface. 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI ComfyUI是一款功…...

基于Python的学生宿舍管理系统毕设源码

博主介绍:✌ 专注于Java,python,✌关注✌私信我✌具体的问题,我会尽力帮助你。一、研究目的本研究旨在开发一套基于Python的学生宿舍管理系统,以实现对学生宿舍资源的有效管理。具体研究目的如下: 首先,通过构建学生宿…...

终极指南:如何使用remoteStorage.js构建离线优先的Web应用

终极指南:如何使用remoteStorage.js构建离线优先的Web应用 【免费下载链接】remotestorage.js ⬡ JavaScript client library for integrating remoteStorage in apps 项目地址: https://gitcode.com/gh_mirrors/re/remotestorage.js remoteStorage.js是一个…...

递归算法及其应用

递归算法定义递归是一种函数直接或间接调用自身来解决问题的方法。需要满足两个条件:递归边界:问题规模缩小到一定程度时直接给出答案,不再递归。递归递推式:把原问题分解为规模更小的同类型子问题,通过调用自身求解。…...

测试左移实战:如何让职业价值翻倍

在软件快速迭代与DevOps文化盛行的今天,测试工程师的角色正经历一场深刻的变革。传统模式下,测试往往被置于开发周期的末端,成为上线前的最后一道“质检关卡”,这种被动定位使得测试人员常陷入“救火队员”的困境,职业…...

Agent Skill编写基础教程(非常详细),掌握这8条法则,从入门到精通!

在 AI Agent 领域,很多开发者都陷入了一个瓶颈:明明模型底座一直在升级,为什么我的 Agent 还是经常“间歇性降智”? 其实,Agent 并不缺“大脑”,缺的是好用的“肌肉”——也就是我们常说的 Skills&#xf…...

DSAlgo排序算法深度解析:10种经典排序的Python3实现

DSAlgo排序算法深度解析:10种经典排序的Python3实现 【免费下载链接】DSAlgo 📚A repository that contains all the Data Structures and Algorithms concepts and solutions to various problems in Python3 stored in a structured manner.&#x1f4…...

眼科医生和研发工程师都该懂:SS-OCT如何成为眼底疾病诊断的“黄金标准”

SS-OCT技术:重塑眼底疾病诊断的临床实践与设备研发范式 在眼科诊疗领域,诊断工具的每一次革新都意味着疾病检出率和治疗精准度的跃升。当传统时域OCT(TD-OCT)还在为获取一张清晰的视网膜断层图像需要患者保持数秒静止时&#xff0…...

Vue3集成百度地图:从零构建个性化轨迹可视化应用

1. 为什么选择Vue3集成百度地图? 最近在做一个物流轨迹监控系统时,我发现百度地图的个性化定制能力确实强大。相比其他地图服务,百度地图对国内开发者更友好,特别是在地址解析、行政区划数据等方面表现突出。Vue3的Composition AP…...

overseer 生产环境部署最佳实践:安全、监控和故障处理

overseer 生产环境部署最佳实践:安全、监控和故障处理 【免费下载链接】overseer Monitorable, gracefully restarting, self-upgrading binaries in Go (golang) 项目地址: https://gitcode.com/gh_mirrors/ov/overseer overseer 是一款用 Go 语言开发的可监…...

若依框架与微信小程序:构建企业级双用户体系与支付集成

1. 若依框架与微信小程序的天然契合点 第一次接触若依框架是在2018年,当时我正在为一个连锁零售企业开发会员系统。客户要求既要有一个功能强大的后台管理系统,又要配套微信小程序供会员使用。在尝试了多个框架后,若依(RuoYi)以其清晰的模块化…...

计算机辅助药物设计中的分子对接与虚拟筛选

计算机辅助药物设计中的分子对接与虚拟筛选 在药物研发领域,计算机辅助药物设计(CADD)已成为加速新药发现的重要工具。其中,分子对接与虚拟筛选技术通过模拟药物分子与靶标蛋白的相互作用,显著提高了候选化合物的筛选…...

Simulink电机仿真避坑指南:手把手教你封装一个可复用的电流环PI控制器(含Mask参数绑定技巧)

Simulink电机仿真避坑指南:手把手教你封装一个可复用的电流环PI控制器(含Mask参数绑定技巧) 在电机控制系统的开发过程中,PI控制器的设计与实现是核心环节之一。很多工程师虽然掌握了PID的基本原理,但在实际项目中却常…...

CocoaRestClient:macOS上最优雅的HTTP/REST API测试工具完整指南

CocoaRestClient:macOS上最优雅的HTTP/REST API测试工具完整指南 【免费下载链接】cocoa-rest-client A free, native Apple macOS app for testing HTTP/REST endpoints 项目地址: https://gitcode.com/gh_mirrors/co/cocoa-rest-client CocoaRestClient是一…...

php学习01,一个文件搞懂php的所有语法,PHP实现贪吃蛇,记事本

php学习01,一个文件搞懂php的所有语法,PHP实现贪吃蛇,记事本 PHP是干什么用的来龙去脉适用场景发展历史详解 PHP 是一门专为 Web 开发而生的开源服务器端脚本语言,核心价值是快速、低成本地构建动态网站与后端服务。它从个人工具…...

AT32F403A SPIM功能深度解析:从内部Flash到外部W25QH128A的代码迁移技巧

AT32F403A SPIM功能深度解析:从内部Flash到外部W25QH128A的代码迁移技巧 在嵌入式开发中,存储空间往往是限制项目扩展的关键因素。当AT32F403A微控制器的内部Flash容量无法满足日益增长的代码需求时,如何高效地将代码迁移到外部Flash运行成为…...

终极指南:如何用Groovy脚本实现动态数据源路由规则

终极指南:如何用Groovy脚本实现动态数据源路由规则 【免费下载链接】dynamic-datasource dynamic datasource for springboot 多数据源 动态数据源 主从分离 读写分离 分布式事务 项目地址: https://gitcode.com/gh_mirrors/dy/dynamic-datasource 在Spring…...

OneMore插件:如何用表格全选功能让你的OneNote效率提升3倍?

OneMore插件:如何用表格全选功能让你的OneNote效率提升3倍? 【免费下载链接】OneMore A OneNote add-in with simple, yet powerful and useful features 项目地址: https://gitcode.com/gh_mirrors/on/OneMore OneMore是一款专为OneNote设计的强…...

NERD Commenter终极指南:Vim多光标批量注释技巧大全

NERD Commenter终极指南:Vim多光标批量注释技巧大全 【免费下载链接】nerdcommenter Vim plugin for intensely nerdy commenting powers 项目地址: https://gitcode.com/gh_mirrors/ne/nerdcommenter NERD Commenter是一款功能强大的Vim插件,为开…...

DownKyi:3步掌握B站视频下载,从新手到高手的完整指南

DownKyi:3步掌握B站视频下载,从新手到高手的完整指南 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水…...

从 Minified React error #31 到精准定位:React 日期数据格式的实战排查指南

1. 遇到Minified React error #31时该怎么办? 那天我正在调试一个活动管理系统的编辑功能,点击某条记录的"编辑"按钮后,控制台突然蹦出一个让人头疼的错误:Uncaught Invariant Violation: Minified React error #31。相…...

Squeel源码解析:深入理解DSL如何转化为Arel查询

Squeel源码解析:深入理解DSL如何转化为Arel查询 【免费下载链接】squeel Active Record, improved. Live again :) 项目地址: https://gitcode.com/gh_mirrors/sq/squeel Squeel是一个为Active Record提供增强查询能力的Ruby库,其核心功能在于通过…...

Py之yacs:从零到一,掌握yacs配置管理的核心实践与避坑指南

1. 为什么你需要yacs:告别混乱的配置文件 第一次跑深度学习实验时,我像大多数新手一样把超参数直接硬编码在代码里。结果第二天想调整学习率时,不得不在几十个.py文件中搜索magic number。更灾难的是,当同事问我"上周三那个准…...

5MB超轻量字体:文泉驿微米黑的多语言显示革命

5MB超轻量字体:文泉驿微米黑的多语言显示革命 【免费下载链接】fonts-wqy-microhei Debian package for WenQuanYi Micro Hei (mirror of https://anonscm.debian.org/git/pkg-fonts/fonts-wqy-microhei.git) 项目地址: https://gitcode.com/gh_mirrors/fo/fonts-…...

深入ByteHook核心:解密ELF解析和动态链接机制

深入ByteHook核心:解密ELF解析和动态链接机制 【免费下载链接】bhook :fire: ByteHook is an Android PLT hook library which supports armeabi-v7a, arm64-v8a, x86 and x86_64. 项目地址: https://gitcode.com/gh_mirrors/bh/bhook ByteHook是一个功能强大…...

地平线西之绝境dll缺失怎么解决?2026最新安全修复指南

当你兴冲冲地打开《地平线:西之绝境》,却只等来一个弹窗,告诉你某个dll文件找不到或无法启动,这种挫败感确实让人难受。别着急,这通常不是游戏本身或你电脑硬件的问题,而是Windows系统中某些必要的运行组件…...

移动端性能测试核心关注点

移动端性能测试主要围绕流畅度、稳定性、资源占用、网络、功耗、兼容性六大维度,覆盖用户真实使用全场景。1. 流畅度(最影响体感)FPS 帧率:滑动、列表、动画、游戏是否稳定,是否频繁掉帧卡顿率 / Jank:单位…...

wan2.1-vae部署案例:高校AI实验室用双4090部署教学演示平台,支持30并发

wan2.1-vae部署案例:高校AI实验室用双4090部署教学演示平台,支持30并发 1. 平台介绍与核心特点 muse/wan2.1-vae文生图平台是基于Qwen-Image-2512模型的AI图像生成系统,专为高校AI实验室教学需求设计。这个平台最吸引人的地方在于它能够用简…...