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

在什么智慧大棚、智慧农业等一些课设毕设中土壤湿度检测是一个常见需求。本文将介绍如何使用STM32F103微控制器(基于HAL库)驱动一款常见的模拟输出土壤湿度传感器(内部使用NE555芯片),通过ADC读取湿度值,并通过串口输出数据。

1. 硬件准备

  • STM32F103开发板(如STM32F103C8T6最小系统板)

  • 土壤湿度传感器(模拟输出,带NE555芯片,通常有三个引脚:VCC、GND、AO)

  • USB转TTL模块(用于串口调试)

  • 杜邦线若干

传感器与STM32连接

传感器引脚 STM32引脚
VCC 3.3V / 5V(根据传感器要求,多数为3.3V)
GND GND
AO PA0(ADC1通道0)

这玩意的原理就是通过湿度引起电压变化,然后我们通过电压转换为对应的湿度值。不加湿纸巾的时候电压是2.258V,使用湿纸巾覆盖探头部分后电压为1.476V,所以湿度和电压是反比关系。

2. 软件环境

  • STM32CubeMX(用于生成初始化代码)

  • Keil MDKSTM32CubeIDE(编译下载)

  • 串口调试助手(如XCOM、SecureCRT)

3. 项目配置(STM32CubeMX)

  1. 新建工程,选择芯片型号(如STM32F103C8)。

  2. 配置RCC:HSE外部晶振(8MHz),系统时钟设为72MHz。

  3. 配置ADC1

    • 选择IN0(PA0),单次转换,软件触发。

    • 分辨率12位,采样时间可设为55.5周期。

  4. 配置USART1

    • 异步模式,波特率115200,8N1。

    • 引脚:PA9(TX),PA10(RX)。

  5. 生成代码,选择"初始化所有外设",生成独立的.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.3V,12位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?pwd=rvfw 提取码: rvfw

--来自百度网盘超级会员v8的分享

相关推荐
玩转单片机与嵌入式6 小时前
一个成熟的嵌入式AI系统,是长什么样子的?
人工智能·单片机·嵌入式硬件·嵌入式ai
Wave8458 小时前
从单片机开发看透网络底层:Wi-Fi、TCP/IP 与 HTTP 的通俗解析
网络·单片机·tcp/ip
玩转单片机与嵌入式10 小时前
不会 Python、不会深度学习,也能在STM32上跑AI模型吗?
人工智能·单片机·嵌入式硬件·嵌入式ai
jghhh0111 小时前
基于STM32的桌面Mini时钟设计
stm32·单片机·嵌入式硬件
电化学仪器白超12 小时前
小乌龟Git全程图形化操作指南:嵌入式本地版本管理与Gitee私有云备份实战
git·python·单片机·嵌入式硬件·物联网·gitee·自动化
yong999013 小时前
基于STM32 Nucleo板的彩色LED照明灯设计(纯CubeMX开发)
stm32·单片机·嵌入式硬件
独小乐13 小时前
019.ADC转换和子中断|千篇笔记实现嵌入式全栈/裸机篇
linux·c语言·驱动开发·笔记·嵌入式硬件·mcu·arm
lingzhilab14 小时前
零知派——STM32驱动INA219电流功率监测计实现高精度电源管理
stm32·单片机·嵌入式硬件
QH1392923188016 小时前
KEYSIGHT N9030B PXA信号/频谱分析仪
科技·嵌入式硬件·集成测试
Shang1809893572617 小时前
T31ZX 君正/INGENIC智能视频处理器T31ZX可提供软硬件资料T31Z采用先进的低功耗设计
嵌入式硬件·fpga开发·音视频·t31zx智能视频处理器