从零到一:基于STC单片机与AHT10传感器的低成本温湿度监测方案实现
1. 为什么选择STC单片机与AHT10传感器组合当你第一次想做一个温湿度监测设备时可能会被市面上五花八门的方案搞得眼花缭乱。我刚开始接触这个领域时也踩过不少坑买过DHT11模块试过SHT30传感器最后发现STC单片机AHT10这个组合才是性价比之王。先说说STC单片机。作为国产MCU的扛把子STC系列最大的优势就是便宜大碗。像STC8A8K64S4A12这款64K Flash、8K RAM跑在24MHz主频下性能完全够用价格却只要几块钱。更重要的是STC的开发环境对新手特别友好用Keil C51就能开发烧录也只需要一根USB转TTL线不像STM32那样需要专门的下载器。AHT10传感器则是奥松电子推出的新一代环境传感器。相比大家熟悉的DHT11它的体积缩小了60%精度却提高了3倍温度±0.3℃湿度±2%RH。我实测过在25℃环境下AHT10的读数波动范围不超过0.2℃而DHT11能有1℃的跳动。更关键的是价格AHT10批量价只要3元左右比SHT30便宜一半还多。2. 硬件搭建全攻略2.1 元器件采购清单在开始焊接前建议先备齐这些材料STC8A8K64S4A12开发板或最小系统板AHT10传感器模块建议买带电平转换的版本0.96寸OLED屏幕I2C接口128x64分辨率10K电阻、0.1uF电容若干面包板或万能板杜邦线建议用彩色的方便区分这里有个省钱小技巧AHT10裸片比模块便宜但需要自己画PCB。如果是第一次做建议先买现成模块等调试通了再考虑自制。2.2 电路连接详解接线图其实特别简单主要注意三点I2C总线的上拉电阻不能省SCL和SDA各接一个10K电阻到VCCAHT10的VDD一定要和单片机同电压3.3V或5VOLED和AHT10不能挂在同一条I2C总线上具体接线方式STC单片机 AHT10模块 OLED屏幕 P2.0 —— SCL P2.1 —— SDA 3.3V —— VCC VCC GND —— GND GND3. 软件开发关键点3.1 I2C驱动编写STC的I2C外设用起来有点反人类我更喜欢用GPIO模拟。下面这个模拟I2C的代码框架经过多次优化稳定性和兼容性都很好void I2C_Start() { SDA 1; Delay_us(2); SCL 1; Delay_us(2); SDA 0; Delay_us(2); SCL 0; Delay_us(2); } uint8_t I2C_WriteByte(uint8_t dat) { for(uint8_t i0;i8;i) { SDA (dat0x80)?1:0; SCL 1; Delay_us(2); SCL 0; Delay_us(2); dat 1; } SDA 1; //释放总线 SCL 1; Delay_us(2); if(SDA) { //检测ACK SCL 0; return 0; //失败 } SCL 0; return 1; //成功 }3.2 AHT10数据采集AHT10的初始化流程需要特别注意校准使能位。我在项目中发现如果上电后立即初始化失败率很高。后来改成延时500ms再初始化稳定性大幅提升uint8_t AHT10_Init() { Delay_ms(500); //关键延时 I2C_Start(); if(!I2C_WriteByte(0x70)) return 0; //写地址 I2C_WriteByte(0xE1); //初始化命令 I2C_WriteByte(0x08); I2C_WriteByte(0x00); I2C_Stop(); uint8_t retry 10; while(retry--) { Delay_ms(10); if(AHT10_ReadStatus() 0x08) return 1; //校准成功 } return 0; //校准失败 }4. 数据显示与优化技巧4.1 OLED界面设计中景园的OLED驱动确实好用但默认字库太单调。我推荐用PCtoLCD2002这个软件自定义字库。比如要显示℃符号可以这样取模选择16x16点阵字体设为宋体字号12在文本框输入℃注意不是普通字母C生成字模后复制到oledfont.h实际显示时温度值建议做滑动平均滤波。我常用的方法是保留最近5次采样值去掉最高最低后取平均float temp_buf[5]; uint8_t buf_index 0; float Get_FilteredTemp() { temp_buf[buf_index] AHT10_ReadTemp(); if(buf_index 5) buf_index0; float sum0, min100, max0; for(uint8_t i0;i5;i) { sum temp_buf[i]; if(temp_buf[i]min) mintemp_buf[i]; if(temp_buf[i]max) maxtemp_buf[i]; } return (sum-min-max)/3; }4.2 低功耗优化如果要用电池供电这几个优化很管用将STC单片机切换到低速模式6MHz采集间隔从1秒改为10秒不用OLED时关闭其电源开启STC的掉电唤醒功能实测下来采用这些措施后2000mAh的锂电池可以连续工作3个月以上。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2613178.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!