【已验证】基于STM32F103的土壤湿度传感器驱动

【已验证】基于STM32F103的土壤湿度传感器驱动 在什么智慧大棚、智慧农业等一些课设毕设中土壤湿度检测是一个常见需求。本文将介绍如何使用STM32F103微控制器基于HAL库驱动一款常见的模拟输出土壤湿度传感器内部使用NE555芯片通过ADC读取湿度值并通过串口输出数据。1. 硬件准备STM32F103开发板如STM32F103C8T6最小系统板土壤湿度传感器模拟输出带NE555芯片通常有三个引脚VCC、GND、AOUSB转TTL模块用于串口调试杜邦线若干传感器与STM32连接传感器引脚STM32引脚VCC3.3V / 5V根据传感器要求多数为3.3VGNDGNDAOPA0ADC1通道0这玩意的原理就是通过湿度引起电压变化然后我们通过电压转换为对应的湿度值。不加湿纸巾的时候电压是2.258V使用湿纸巾覆盖探头部分后电压为1.476V所以湿度和电压是反比关系。2. 软件环境STM32CubeMX用于生成初始化代码Keil MDK或STM32CubeIDE编译下载串口调试助手如XCOM、SecureCRT3. 项目配置STM32CubeMX新建工程选择芯片型号如STM32F103C8。配置RCCHSE外部晶振8MHz系统时钟设为72MHz。配置ADC1选择IN0PA0单次转换软件触发。分辨率12位采样时间可设为55.5周期。配置USART1异步模式波特率1152008N1。引脚PA9TXPA10RX。生成代码选择“初始化所有外设”生成独立的.c/.h文件。4. 代码实现在生成的工程基础上编写main.c文件实现ADC读取、电压转换、湿度百分比计算并通过串口打印。下面给出关键部分代码其实原理很简单的。/** * brief 读取ADC值计算电压和湿度百分比通过串口输出 */ void ReadSoilMoisture(void) { uint16_t adc_value 0; float voltage 0.0; float moisture_percent 0.0; HAL_ADC_Start(hadc1); if (HAL_ADC_PollForConversion(hadc1, 100) HAL_OK) { adc_value HAL_ADC_GetValue(hadc1); } HAL_ADC_Stop(hadc1); // 参考电压3.3V12位ADC最大值4095 voltage (adc_value * 3.3f) / 4095.0f; // 湿度换算假设电压0V对应100%湿度3.3V对应0%湿度线性 // 实际使用时请根据传感器特性校准 moisture_percent (1.0f - (voltage / 3.3f)) * 100.0f; if (moisture_percent 0) moisture_percent 0; if (moisture_percent 100) moisture_percent 100; char msg[64]; sprintf(msg, ADC: %d, Voltage: %.2f V, Moisture: %.1f%%\r\n, adc_value, voltage, moisture_percent); HAL_UART_Transmit(huart1, (uint8_t*)msg, strlen(msg), 100); }5. 代码说明ADC读取采用单次转换模式每次读取前启动转换读取后停止。采样时间设为55.5周期可适应传感器输出阻抗。电压转换STM32F103的ADC为12位参考电压3.3V因此电压值 ADC值 * 3.3 / 4095。湿度计算传感器输出与湿度的关系通常是非线性的但很多低成本传感器可以近似为线性。示例中假设电压越低湿度越高常见情况实际使用时建议在干燥空气和水中分别测量ADC值然后通过插值得到更准确的百分比。串口输出通过USART1每秒输出一次数据便于在串口助手查看。6. 测试结果将程序下载到开发板连接传感器打开串口助手波特率115200即可看到类似输出7. 参考代码通过网盘分享的文件SoilSensor_ADC_Example.zip链接: https://pan.baidu.com/s/1E-QKsymzPdlj2C0TVGNegw?pwdrvfw 提取码: rvfw--来自百度网盘超级会员v8的分享