基于STM32与SIM800C的GSM短信远程智能花盆系统

基于STM32与SIM800C的GSM短信远程智能花盆系统
简介本资源是一套完整的基于STM32F103C8T6的智能远程浇花系统设计资料面向嵌入式初学者、课程设计学生及电子类毕业设计实践者解决花卉养护中环境感知、自动调控与远程交互的实际问题。资源包共232个文件涵盖35个C源码文件含主控逻辑、GSM短信解析、传感器驱动、36个H头文件模块接口定义、19个PDF文档含开题报告、任务书、参考论文、芯片资料、12个DOC/DOCX文档答辩技巧、系统说明、7个MP4实操视频功能演示与接线讲解以及电路图SCH/SchDoc、Keil工程UVPROJ/AXF/HEX、流程图与框图等总大小84.48MB。已有1653人学习下载内容组织清晰从硬件原理到软件实现层层递进提供可直接烧录运行的完整工程、兼容SIM800A/SIM900A的GSM通信方案、湿度阈值自动浇水与光照联动补光逻辑以及短信指令jiaoshui/get/buguang的完整协议实现与反馈机制具备强实践性与教学适配性。1. 项目拆解与整体方案选型先说结论这个项目本质上是一个“不带WiFi也能远程控制的物联网系统”。你可能会有疑问——都2025年了物联网方案一堆为什么还有人用GSM短信这种看起来“过时”的技术答案是适用场景完全不同。我现在住的房子阳台离路由器太远WiFi信号一到阳台就剩一格摄像头都连不上更别提智能花盆了。试过用蓝牙Mesh方案稳定性一般穿墙也费劲。后来干脆换思路与其纠结WiFi信号不如用GSM——只要手机有信号花盆就能收到指令完全不依赖家里的宽带和路由器。在国内“短信”覆盖基本是100%的哪怕断网了短信也照常送达这是WiFi方案做不到的。这套系统能做什么核心就三件事定时浇水本地设置好时间表STM32到点自动驱动水泵远程浇水发一条短信到花盆里的SIM卡号码花盆解析指令后立刻浇水自动补光光照传感器检测到光线不足自动点亮LED补光灯适合谁做电子相关专业的学生做课设、毕设或者DIY爱好者想给家里花草做个“保姆”都可以参考这套方案。技术栈不算难STM32基础操作加上串口收发短信再加几个GPIO控制逻辑清晰特别适合练手。方案选型时我列过一张对比表方案优点缺点最终结论WiFiESP8266便宜、可上云、速度快依赖路由器和宽带信号死角直接瘫痪阳台场景不可用蓝牙BLE功耗低、手机直连距离近10米内穿墙不行没法远程只适合近距离GSM短信覆盖广、不依赖宽带、稳定每条短信有资费、有延迟几秒到几十秒最终选择我选的是GSM这个方向具体模块用的是SIM800C。你如果手头有SIM900A也可以AT指令基本通用只是SIM800C体积更小、支持四频市面配件多、资料也多适合新手。2. 核心硬件模块拆解与选型指南2.1 主控——STM32F103C8T6仍是首选主控我没有用最新的STM32F4或者H7而是选了STM32F103C8T6也就是大家常说的“蓝丸”核心板。原因很实在便宜十几块钱一块板子资料极其丰富遇到问题搜一下到处都是解决方案72MHz主频完全够用串口、ADC、PWM、定时器、GPIO全都有3.3V供电和SIM800C逻辑电平匹配不需要额外电平转换外设资源分配大概这样USART1接SIM800C用于AT指令通信USART2预留调试接口打印日志ADC1PA0接土壤湿度传感器ADC1PA1接光敏电阻分压电路PB0控制水泵继电器PB1控制补光灯MOS管PA2/PA3USART2做调试打印整个引脚分配就俩原则第一避开JTAG占用的PA13-PA15、PB3-PB4除非你禁用JTAG第二ADC通道要选同一个ADC的不同通道方便做多通道扫描。2.2 通信模块——SIM800C的选型与接线SIM800C是整个系统的“远程神经”选它有几个关键原因支持四频850/900/1800/1900MHz国内三大运营商都能用串口透传AT指令控制逻辑不用写复杂协议支持短信收发Text模式和PDU模式我最终用的是Text模式ASCII字符直接读中文用Unicode编码处理。接线上有一个坑要提前说SIM800C峰值电流可以达到2A普通的AMS1117稳压芯片根本扛不住。如果电源供电不足SIM800C会在发短信瞬间掉电重启表现就是“AT指令发出去没反应”、“明明收到短信了但是主控没解析到”。我用的是5V/2A的USB适配器加一个MP1584降压模块调到4.1V给SIM800C供电。为什么不直接3.3V因为SIM800C标准供电电压是3.4V~4.4V3.3V偏低可能不稳定。STM32核心板自带稳压芯片直接USB取5V即可两者共地就行。接线表SIM800C引脚接STM32引脚说明VCCMP1584输出4.1V单独供电保证稳定GNDGND必须共地TXDPA10USART1_RXSIM800C发数据给MCURXDPA9USART1_TXMCU发数据给SIM800CSIM卡座SIM卡支持1.8V/3V SIM卡另外注意SIM800C的RXD和TXD引脚是2.8V电平STM32的USART1 TX是3.3V高电平直接接问题不大实测稳定。如果你追求完美可以加两个电阻分压做电平匹配我这里没加跑了三个月没出过问题。2.3 传感器——土壤湿度与光照检测土壤湿度传感器我用的是电容式土壤湿度传感器不是那种两个裸露金属探针的电阻式。为什么电阻式传感器靠测量土壤导电率用久了金属探针会电解腐蚀而且每次测完还要擦干否则读数漂移厉害。电容式测的是介质介电常数变化不会电解寿命长得多测量原理类似电容触摸按键只是检测的是土壤水分导致的等效电容变化。传感器输出是模拟电压范围大概在1.5V干燥到3.2V湿润之间直接接STM32的ADC引脚PA0即可。光照检测更简单一个光敏电阻串联10K电阻做分压分压点接PA1。光照强时光敏电阻阻值小分压点电压低光照弱时阻值大分压点电压高。这就是一个低成本光照传感器。2.4 执行器——水泵与补光灯控制水泵用的是3~5V微型潜水泵额定电流约300mA流量大约90L/H浇一个小型花盆足够。驱动方案用NPN三极管继电器继电器型号是SRD-05VDC-SL-C5V线圈10A/250VAC触点。STM32的PA0输出高电平通过S8050三极管驱动继电器吸合然后水泵通电浇水。注意继电器线圈必须并联续流二极管1N4007否则断开瞬间的反向电动势会打坏三极管。这是我第一次做继电器电路时踩过的坑——没加续流二极管结果继电器吸合断开十几次后三极管就烧了。补光灯我用的是一块5W的LED植物灯板红蓝光谱驱动用AO3400 N-MOS管PWM频率设为1kHz可以通过调节占空比来控制亮度省电而且对植物光合作用更友好。AO3400是逻辑电平MOS管3.3V栅极电压就能完全导通直接用STM32的PB1驱动即可。电源整体架构是这样的USB 5V/2A适配器 ├── STM32核心板板载稳压到3.3V ├── SIM800C模块通过MP1584降压到4.1V ├── 继电器模块5V驱动 ├── 水泵5V驱动继电器控制 └── 补光灯LED5V驱动MOS管PWM控制3. 软件核心逻辑与代码实现3.1 整体软件架构代码用STM32标准外设库写的工程结构大概分这几个模块main.c主循环状态机调度sim800c.c/hAT指令封装、短信解析sensor.c/hADC采集、数据滤波control.c/h水泵、补光灯控制逻辑timer.c/h定时器中断负责定时任务调度主循环的设计思路不搞RTOS没必要用超级循环定时器标志位的方式。每个任务分配一个标志定时器中断里置位主循环查询到标志位就执行相应任务。为什么要这样设计因为GSM短信收发是一个“慢动作”过程发送一条短信从AT指令到模块执行完需要几秒钟。如果主循环里阻塞等待模块回复传感器采集和浇水控制都会被卡住。用状态机非阻塞的方式主循环转一圈就几毫秒任何一步等待超时都不会影响其他功能。3.2 SIM800C初始化与短信收发SIM800C的初始化流程非常固定按顺序挨个发AT指令就行void SIM800C_Init(void) { // 1. 同步检测先发一个AT等模块回OK SIM800C_SendCmd(AT\r\n, OK, 2000); // 2. 关闭回显减少串口垃圾数据 SIM800C_SendCmd(ATE0\r\n, OK, 1000); // 3. 设置为Text短信模式比PDU简单纯ASCII好解析 SIM800C_SendCmd(ATCMGF1\r\n, OK, 1000); // 4. 设置字符集为GSM标准字符集 SIM800C_SendCmd(ATCSCS\GSM\\r\n, OK, 1000); // 5. 设置短信接收提示新短信自动通过串口推送 // ATCNMI2,1,0,0,0 - 收到短信后直接通过串口输出内容 SIM800C_SendCmd(ATCNMI2,1,0,0,0\r\n, OK, 1000); }这里最关键的就是第五步ATCNMI2,1,0,0,0。这个指令的意思是当SIM卡收到新短信时SIM800C会自动把短信内容通过串口推送出来不需要主控主动去查询。这样主控只需要在串口中断里接收数据判断是否包含特定关键词就可以实现“短信遥控”。收到短信后串口收到的数据大概是这个格式CMTI: SM,0 \r\nRXD: 8613800138000 CMT: 8613800138000,,25/05/12,15:30:2232 ON解释一下各行的含义CMTI: SM,0SIM卡存储位置提示说明有一条新短信存入CMT: ...,...,...短信内容头包含发送方号码、时间戳ON短信正文内容在串口中断里收到CMT:开头的一帧后先把整个数据帧缓冲起来等收到完整帧后解析电话号码和正文内容。3.3 短信协议设计与白名单验证短信协议我设计得很简单方便记忆和解析。核心指令一共有五个短信内容功能说明ON打开水泵立即浇水持续10秒后自动关闭OFF关闭水泵立即停止浇水LIGHT打开补光灯常亮模式LIGHTOFF关闭补光灯手动关闭补光灯STATUS查询状态返回土壤湿度、光照度、工作状态等最关键的安全环节是白名单验证。如果任何号码都能发短信控制家里的水泵和灯光那风险太大了。我的做法是在解析短信内容之前先比对发送方号码——只响应白名单里存储的号码其他号码一律忽略并回复“未经授权的号码”。白名单保存在一个数组中最多支持5个号码char allowedNumbers[5][20] { 8613800138000, 8613901234567 }; bool CheckAuth(char *phoneNumber) { for (int i 0; i 5; i) { if (strcmp(phoneNumber, allowedNumbers[i]) 0) { return true; } } return false; }这里有一个细节国内手机号在短信的CMT:头里显示为86开头的国际格式比如8613800138000而你在手机通讯录里存的是13800138000所以白名单里要存86开头的格式否则比对永远失败。收到了合法指令后初始化水泵或补光灯的控制函数同时发一条回执短信给用户比如已收到指令打开水泵浇水10秒。回执短信用ATCMGS指令发送void SIM800C_SendSMS(char *phoneNumber, char *message) { char cmd[64]; sprintf(cmd, ATCMGS\%s\\r\n, phoneNumber); SIM800C_SendCmd(cmd, , 2000); // 等模块返回提示符 SIM800C_SendRaw(message); // 发送短信内容 SIM800C_SendRaw(\r\n); // 结束内容 SIM800C_SendRaw(\x1A); // 发送CtrlZ表示短信内容结束触发发送 }发送短信的时序是先发ATCMGS号码等待模块返回提示符然后输入短信内容最后用CtrlZ0x1A结束。不能用回车结束否则模块会认为短信内容为空。3.4 土壤湿度采集与自动浇水逻辑ADC采集土壤湿度我用的是连续采样平均值滤波。程序里做了10次采样去掉最大值和最小值然后取平均这样可以滤掉土壤中水分分布不均带来的跳动。uint16_t ReadSoilMoisture(void) { uint32_t sum 0; uint16_t maxVal 0; uint16_t minVal 4095; uint16_t values[10]; for (int i 0; i 10; i) { values[i] ADC_GetValue(ADC1, ADC_Channel_0); if (values[i] maxVal) maxVal values[i]; if (values[i] minVal) minVal values[i]; sum values[i]; delay_ms(10); } return (uint16_t)((sum - maxVal - minVal) / 8); }注意这是12位ADC0~4095值越小代表越湿润值越大代表越干燥。我实测数据刚浇完水约1600放两天约2800完全干透约3500。所以我设置了两个阈值土壤湿度低于2200判定为偏干需要浇水土壤湿度高于2000判定为湿润不需要浇水这两个阈值之间存在一个“死区”就是2000~2200这个区间。为什么要留死区如果设置单一阈值比如低于2100就浇水、高于2100就停土壤湿度在阈值附近波动时水泵会出现频繁开关的“抖动现象”反而对植物根系不好。留死区是工程里的常用做法类似温控器的滞回控制。自动浇水逻辑在定时器中断里维护一个状态变量if (autoWateringEnabled soilMoisture 2200) { WateringStart(10); // 浇水10秒 }浇水10秒够不够我算过水泵流量90L/H也就是每秒25mL10秒约250mL水。对于直径20cm的花盆这个量刚好浇透又不会积水烂根。你如果花盆更大可以直接改参数公式就是浇水时间秒 花盆需要的水量mL÷ 水泵流量mL/s。3.5 补光灯逻辑与PWM调光补光灯用小夜灯模式检测到环境光不足光敏电阻分压点电压高于3.0V且时间在晚上就自动打开补光灯。PB1引脚输出PWM控制亮度。PWM初始化用定时器2的通道1void LED_PWM_Init(void) { TIM_TimeBaseInitTypeDef TIM_InitStructure; TIM_OCInitTypeDef TIM_OCInitStructure; // 开启时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); // PB1 复用为TIM2_CH3 GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE); GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Pin GPIO_Pin_1; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOB, GPIO_InitStructure); // TIM2 配置 TIM_InitStructure.TIM_Period 999; // 1kHz TIM_InitStructure.TIM_Prescaler 71; // 72MHz/721MHz, 1MHz/10001kHz TIM_InitStructure.TIM_ClockDivision TIM_CKD_DIV1; TIM_InitStructure.TIM_CounterMode TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, TIM_InitStructure); // PWM1模式 TIM_OCInitStructure.TIM_OCMode TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse 500; // 50%初始占空比 TIM_OCInitStructure.TIM_OCPolarity TIM_OCPolarity_High; TIM_OC3Init(TIM2, TIM_OCInitStructure); TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable); TIM_ARPPreloadConfig(TIM2, ENABLE); TIM_Cmd(TIM2, ENABLE); }定时器2预分频71计数周期999这样PWM频率是 72MHz ÷ (711) ÷ (9991) 1kHz。植物灯不需要高频PWM1kHz完全足够而且不会产生可闻噪音。补光灯的触发逻辑我加入了时间判断RTC时钟模块DS1302只在晚上18:00到早上6:00之间允许补光灯自动点亮。白天光照充足时即使光敏电阻检测到光线波动也不会误触发补光。3.6 定时自动浇水实现定时自动浇水是另一个实用的功能类似“定时器”模式。设定好每天浇水的时间点到了就自动执行。我用DS1302时钟模块来维护当前时间。DS1302是一个很老的RTC芯片3线接口CE、SCLK、IO功耗极低用CR2032纽扣电池可以撑好几年。初始化时读取时间之后在主循环里每秒刷新一次。typedef struct { uint8_t hour; uint8_t minute; uint8_t second; } TimeStruct; TimeStruct wateringSchedule[3] { {8, 0, 0}, // 早上8点 {14, 0, 0}, // 下午2点 {20, 0, 0} // 晚上8点 }; void Timer_Task(void) { TimeStruct now; DS1302_GetTime(now); for (int i 0; i 3; i) { if (now.hour wateringSchedule[i].hour now.minute wateringSchedule[i].minute now.second 10 !scheduleTriggered[i]) { WateringStart(8); // 定时浇水8秒 scheduleTriggered[i] true; } // 重置触发标志 if (now.second 30) { scheduleTriggered[i] false; } } }这里有个细节为了让定时触发不会在一分钟内重复执行多次我加了scheduleTriggered标志位。秒数在0~9之间才允许触发超过30秒后复位标志位这样每天只会触发一次。4. 实测数据、常见问题与排查实录4.1 实测效果数据我做了两周的阳台实测环境条件阳台朝南白天直射光照充足晚上全黑。测试对象是一盆绿萝。指标数据远程短信控制延迟5~15秒视运营商网络而定浇水指令成功率48/50次96%失败2次均为SIM800C未注册到网络自动浇水土壤湿度触发准确率100%28次触发每次浇筑后湿度都恢复到正常区间补光灯自动触发准确率100%12次触发均在天黑后待机功耗约0.5WSTM32传感器SIM800C休眠模式浇水和补光同时工作功耗约7W需要注意短信控制有5~15秒的延迟这个不是系统处理慢而是短信网关本身的传输延迟——短信从手机发出经过运营商短信中心再推送到SIM800C这中间的链路延迟不可避免。所以别指望像WiFi方案那样“秒控”这不是GSM的短板是技术特性。4.2 SIM800C网络注册问题SIM800C刚开始上电时需要10~30秒搜索网络并注册。在这个时间段内AT指令可以正常回复但发短信会返回错误。我踩过的坑是主控上电后立刻初始化SIM800C并尝试发短信结果前几次都失败了。解决办法是上电后先等SIM800C的NETLIGHT指示灯出现“慢闪”约1秒亮、2秒灭表示已注册网络然后再执行短信相关操作。初始化代码里加一个等待循环void SIM800C_WaitForNetwork(void) { for (int i 0; i 30; i) { if (SIM800C_SendCmd(ATCREG?\r\n, CREG: 0,1, 1000) || SIM800C_SendCmd(ATCREG?\r\n, CREG: 0,5, 1000)) { break; // 已注册 } delay_ms(1000); } }ATCREG?返回的第二个参数如果是1表示已注册到家庭网络如果是5表示漫游如果是0或2表示未注册或正在搜索需要继续等待。另外SIM卡没插好或者SIM卡欠费也会导致注册失败。有一次我排查了很久最后发现是剪卡的时候卡槽接触不良换了一张标准SIM卡就好了。4.3 短信中文乱码问题刚开始用Text模式收发中文短信发现收到的短信正文是乱码。后来查资料才知道Text模式只支持GSM 7-bit编码的字符中文需要用Unicode编码也就是PDU模式。但我设计短信指令时用的都是英文单词ON、OFF、LIGHT、STATUS所以Text模式完全够用。回执短信我也用英文拼写避免中文编码的麻烦。如果确实需要发中文就得用PDU模式编码方式是以UCS2编码存储中文。我之前写过PDU模式的中文短信发送函数代码量大概是Text模式的3倍逻辑也更复杂但效果是能正常收发中文。不是特别必要的话建议用英文指令简化开发。4.4 电源干扰导致系统重启这可能是整个项目里最阴间的一个问题。现象是水泵一启动STM32就重启补光灯调到100%亮度时STM32也会偶发重启。排查过程用万用表量了水泵启动时电源电压发现5V总线会被拉到4.2V左右——水泵和继电器同时启动的瞬间电流太大电源压降严重。把水泵和补光灯独立供电不共用STM32的5V——问题依旧。最后用示波器一看根本不是电压跌落问题是水泵电机产生的反向EMF尖峰干扰了电源线尖峰直接打到了STM32的复位引脚上。解决方案在STM32的复位引脚和GND之间并联一个100nF电容滤除高频干扰在水泵电机两端并联一个47μF电解电容和0.1μF陶瓷电容吸收反向电动势信号线和电源线分开走线不要并排这三个措施做完之后问题彻底消失。4.5 常见问题速查表问题现象可能原因解决方法SIM800C不回复AT指令电源不足、串口接反、SIM800C没开机检查电源是否稳定确认TXD/RXD交叉连接长按PWRKEY开机发短信返回ERROR模块未注册网络、SIM卡问题检查NETLIGHT指示灯状态查看是否欠费重新插拔SIM卡收到短信但主控没反应串口中断接收数据不全白名单比对失败检查ATCNMI设置检查号码格式是否带86水泵一启动主控重启电源压降或EMI干扰增加滤波电容独立供电复位引脚加104电容土壤湿度读数一直不变ADC引脚配置错误、传感器接线松动检查PA0是否复用为ADC模式万用表量传感器输出端电压补光灯不亮MOS管接反、PWM未初始化确认AO3400引脚顺序检查PB1是否复用为TIM2_CH34.6 几个提升稳定性的细节在实际制作中有几个小细节能让稳定性和安全性显著提升。第一SIM800C的VCC引脚旁一定要并联一个大容量的电解电容比如470μF和100nF的组合。原因是GSM模块在发射时电流会瞬间飙升到2A如果电源不能迅速响应电压就会跌落导致模块重启。这个电容起到“储能”作用能扛住发射瞬间的电流尖峰。第二STM32的BOOT0引脚要接10K下拉电阻到GND否则上电可能进入ISP模式程序不跑表现为“板子没反应”。这板子出厂时通常已经接好了但如果是自己焊接的最小系统板一定要记得加。第三水泵不能长时间干转。我在程序里加了一个保护逻辑如果浇水指令执行后60秒内土壤湿度没有明显上升判定可能是传感器故障或者水泵空转就自动停止水泵并发送一条告警短信。这能防止泵干烧损坏。第四SIM卡最好用一个月保底几块钱的套餐不用开通流量只要短信功能就行。实测一个月发不了多少条短信费用几乎可以忽略。第五所有发送给用户的回执短信都加上系统当前状态这样用户不仅知道指令执行结果还能了解花盆的实时状况。比如ON指令已执行水泵开启10秒。 当前土壤湿度干燥2600/4095 当前光照强度较弱3.1V 补光灯状态开启这些信息对远程用户来说特别有价值——你出差在外发一条STATUS短信就能知道家里的植物需不需要浇水。5. 壳体的设计与避坑经验硬件调试通了之后还得考虑怎么把这一堆东西装起来。不能裸着放阳台上淋雨就完蛋了。我用的是一个防水接线盒尺寸大概200×120×70mm在侧面开了一小孔把土壤湿度传感器的线穿出来走线孔用AB胶封住。接线盒固定在花盆旁边的栏杆上SIM800C的天线朝上保证信号接收。要注意的是天线不能塞在金属盒子里会严重屏蔽信号。接线盒的盖子我换成了塑料材质用3D打印了一个这样天线可以贴在盖子内侧。水泵的出水管要加一节软管用扎带固定在花盆边缘不要让水管弯折堵住。土壤湿度传感器插在花盆土壤里时插入深度保持在5cm左右太浅了测不准太深了容易碰到根系。壳体的散热也要考虑。虽然是低功耗设计但GSM模块在发射时发热比较明显我在盒子的侧壁开了几排小孔用于通风又在底部加了一个小风扇5V0.1A温度超过40℃时自动开启。这个温度阈值在程序里就用DS18B20温度传感器读取超过就开风扇低于就关。6. 优化扩展方向这块板子目前的功能已经能满足日常使用了但我自己计划做一些后续优化第一个方向是增加太阳能供电。现在用的是USB适配器供电阳台没有插座的话会很不方便。太阳能板锂电池充放电管理模块的方案我已经在画电路图了。选型上太阳能板用6V/5W的单晶硅板锂电池用18650两节串联充放电管理模块用CN3065负责太阳能MPPT充电TP4056负责USB应急充电。整个系统依然是5V供电电池电压3.7V升压到5V后给系统供电。难点在于功耗预算。待机时好办系统整体0.5W锂电池能扛好几天。但水泵工作那十秒要近4W如果赶上连阴天太阳能充不满两次自动浇水之间的电量能不能撑住是核心问题。我算了一下4000mAh锂电池去掉保护板最低截止电压3.0V那部分实际可用容量约12Wh。每天最多自动浇水3次补光灯6小时平均功耗大约1.5W撑一整天没问题。太阳能板在晴天一天能充入约25Wh的电还是有富余的。不过这只是理论计算实际能不能扛住连续阴天还得等做好了实测验证。第二个方向是增加温湿度检测和本地显示。加一块OLED显示屏0.96寸I2C接口实时显示土壤湿度、光照强度、温度、工作状态方便家人路过时看一眼。再加一个DHT22温湿度传感器既能测环境温度也能给植物提供生长环境参考数据。这块屏还有一个用途调试时不用连电脑看串口日志了直接屏上显示关键参数方便很多。第三个方向是本地按键复位和手动控制。除了远程短信控制面板上加两个实体按键一个强制浇水一个紧急停止。强制浇水键在系统卡死或远程无法控制时可以手动操作相当于一个物理后备手段。这个我觉得很实用。第四个方向是太阳能供电低功耗模式。利用STM32的STOP模式在非浇水时段让MCU进入低功耗状态电流可以降到几十微安。SIM800C也可以设成休眠模式这样整个系统在待机时的电流能降到5mA以内对电池供电方案特别重要。我后面打算做一个结合太阳能供电和低功耗休眠的完整版本做成一个能长期无人值守放在户外花园里的智能灌溉节点。整个系统的难点就不再是“怎么控制水泵”而是“如何用有限的电量长期稳定运行”这对低功耗设计、电源管理、任务调度都会是更大的考验。最后分享一个我自己调试时的小技巧把所有AT指令的交互过程都通过调试串口打印出来每次执行指令前后都打印当前状态和完整响应。调试短信功能时你会看到完整的交互记录能快速定位是发送失败、接收失败还是解析失败。我这个习惯是在被各种“阴间Bug”折磨之后养成的强烈建议你也这么做。本文还有配套的精品资源点击获取

最新新闻

日新闻

周新闻

月新闻