尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

STM32F103C8T6自动伸缩雨伞:雨滴检测、舵机控制与阿里云IoT

发布时间:2026/9/17 20:59:42

资讯中心
01
ARTICLE

STM32F103C8T6自动伸缩雨伞:雨滴检测、舵机控制与阿里云IoT

STM32F103C8T6自动伸缩雨伞:雨滴检测、舵机控制与阿里云IoT
简介本资源为基于STM32的自动伸缩雨伞设计与实现完整毕业论文面向电子信息、自动化、物联网等专业的本科毕业生及单片机课程设计者可用于毕业设计选题参考、方案复现与论文写作对照。论文以STM32F103C8T6为主控配合雨滴传感器、GPS定位模块、ESP8266 WiFi模块、舵机与红外传感器接入阿里云物联网平台实现远程监控。系统支持自动与手动两种开关伞模式自动模式下检测到下雨即自动开合手动模式由按键控制并通过红外传感器检测人体与伞面距离以调节开伞角度同时借助GPS定位防止雨伞丢失。资源包内仅1个doc文档约1.3MB内容涵盖绪论、方案设计与硬件选型、系统硬件电路设计、软件程序设计、系统调试等完整章节含摘要与目录结构规范、硬件选型与电路模块说明较为细致。已有255人学习适合需要完整毕设框架、硬件方案与论文结构参照的读者参考借鉴。1. 下雨检测到舵机开伞自动伸缩雨伞的系统边界突然降雨时人还在找伞仓库门口的大伞已经因为没人拉而淋湿货物——这类场景就是自动伸缩雨伞要解决的问题。乍看核心是舵机扭矩和伞骨结构实际调试时最先翻车的往往是雨滴传感器阈值漂移以及自动/手动模式切换的状态机没写严。整套设计围绕 STM32F103C8T6 展开雨滴传感器负责“有没有雨”NEO-6M 负责“伞在哪”ESP8266 把状态推到阿里云 IoTSG90 舵机模拟开伞关伞红外对管限制伞面与人的距离按键做模式切换。适合做毕业设计、课程设计或者想用一块 F103 把 ADC、PWM、串口、MQTT 串起来练手的人。硬件不复杂难在信号滤波和云端指令的时序。2. STM32F103C8T6 最小系统与雨滴/红外传感器接口电路2.1 主控选型与最小系统供电、时钟、复位、SWD选 STM32F103C8T6 不是因为它性能强到离谱而是 72MHz 主频、64KB Flash、20KB SRAM、3 个 USART、2 个 SPI、2 个 I2C、1 个 ADC 多通道正好覆盖雨滴采样、GNSS 串口、ESP8266 串口和舵机 PWM。最小系统至少要有 3.3V 稳压、8MHz 高速晶振、32.768kHz 低速晶振、复位电路和 SWD 下载口。我一般用 AMS1117-3.3 从 5V 降到 3.3V注意在输入端和输出端各放 10μF 和 0.1μF 电容舵机启动电流大时电源脚再并一个 470μF 电解电容否则 ADC 采样会被拉低。模块型号/参数接口备注主控STM32F103C8T6—72MHz64KB Flash20KB SRAM稳压AMS1117-3.35V 转 3.3V输出 1A加散热高速晶振8MHzOSC_IN/OSC_OUTHSEPLL 倍频到 72MHz低速晶振32.768kHzPC14/PC15RTC 可选下载SWDPA13/PA14比 JTAG 省引脚// 使能 GPIOA、GPIOB、AFIO 时钟配置按键和红外输入 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); GPIO_InitTypeDef gpio; gpio.GPIO_Pin GPIO_Pin_1 | GPIO_Pin_2; // PA1、PA2 接按键 gpio.GPIO_Mode GPIO_Mode_IPU; // 上拉输入按键按下为低 gpio.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOA, gpio); gpio.GPIO_Pin GPIO_Pin_1; // PB1 接红外对管 OUT gpio.GPIO_Mode GPIO_Mode_IN_FLOATING; // 浮空输入模块内部有电平输出 GPIO_Init(GPIOB, gpio);这里把 PA1、PA2 设成上拉输入按键另一端接地按下读 0松开读 1。PB1 接红外对管输出红外对管在检测到近距离时输出低电平远距离输出高电平所以用浮空输入即可不要重复加外部上拉否则可能和模块内部上拉打架。GPIO 速度设 50MHz 对按键和红外没有实际意义但保持统一配置方便后续改复用功能。2.2 雨滴传感器 ADC 与数字输出接口雨滴传感器模块通常有 4 个引脚VCC、GND、DO、AO。AO 输出随雨量变化的模拟电压DO 输出经过电位器比较后的数字电平。自动开伞只靠 DO 容易在毛毛雨时反复跳变所以我一般把 AO 接 STM32 的 ADC 通道DO 作为备用快速触发。以 PA0 接 AO、PB0 接 DO 为例ADC1_IN0 对应 PA0配置成 12 位分辨率、单次转换或连续转换。传感器引脚接 STM32配置说明VCC3.3V电源模块一般 3.3-5V 供电GNDGND地与主控共地DOPB0浮空输入电位器调阈值越湿越低AOPA0ADC1_IN012 位采样0-4095// PA0 配置为模拟输入 GPIO_InitTypeDef gpio; gpio.GPIO_Pin GPIO_Pin_0; gpio.GPIO_Mode GPIO_Mode_AIN; GPIO_Init(GPIOA, gpio); // ADC1 初始化独立模式12 位软件触发 ADC_InitTypeDef adc; RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); ADC_DeInit(ADC1); adc.ADC_Mode ADC_Mode_Independent; adc.ADC_ScanConvMode DISABLE; adc.ADC_ContinuousConvMode DISABLE; adc.ADC_ExternalTrigConv ADC_ExternalTrigConv_None; adc.ADC_DataAlign ADC_DataAlign_Right; adc.ADC_NbrOfChannel 1; ADC_Init(ADC1, adc); ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5); ADC_Cmd(ADC1, ENABLE); ADC_ResetCalibration(ADC1); while (ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1); while (ADC_GetCalibrationStatus(ADC1)); // 读取一次雨滴模拟量 uint16_t Rain_ReadRaw(void) { ADC_SoftwareStartConvCmd(ADC1, ENABLE); while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); return ADC_GetConversionValue(ADC1); }ADC 参考电压是 VDDA也就是 3.3V12 位满量程 4095。雨滴板越干燥AO 电压越高读数越接近 4095水滴越多读数越低。代码里用软件触发每次读取前启动一次转换适合主循环 100ms 调一次。采样时间设 55.5 周期是因为雨滴传感器输出阻抗不低采样时间太短会导致读数跳。校准步骤不能省F103 的 ADC 不校准冷启动和热启动的零点会差几十个码值。2.3 红外对管、按键与舵机 PWM 接口红外对管用来检测人体距离伞面的距离输出是开关量接 PB1。两个独立按键接 PA1、PA2一个切换自动/手动一个在手动模式下开关伞。舵机信号线接 PA8对应 TIM1_CH1用 50Hz PWM脉宽 0.5ms 到 2.5ms 对应 0 到 180 度。舵机电源不要直接从 STM32 的 3.3V 取SG90 堵转电流能到 700mA 以上接 5V 独立电源地和主控共地。外设STM32 引脚定时器/功能参数红外对管 OUTPB1GPIO 输入近低远高按键 1PA1GPIO 上拉输入模式切换按键 2PA2GPIO 上拉输入手动开关舵机信号PA8TIM1_CH1 PWM50Hz0.5-2.5ms// PA8 复用推挽输出TIM1_CH1 GPIO_InitTypeDef gpio; gpio.GPIO_Pin GPIO_Pin_8; gpio.GPIO_Mode GPIO_Mode_AF_PP; gpio.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOA, gpio); // TIM1 时基72MHz / (711) 1MHz计数周期 20000 - 20ms TIM_TimeBaseInitTypeDef tim; RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); tim.TIM_Prescaler 71; tim.TIM_Period 19999; tim.TIM_ClockDivision TIM_CKD_DIV1; tim.TIM_CounterMode TIM_CounterMode_Up; TIM_TimeBaseInit(TIM1, tim); // PWM1 模式初始脉宽 1500us TIM_OCInitTypeDef oc; TIM_OCStructInit(oc); oc.TIM_OCMode TIM_OCMode_PWM1; oc.TIM_OutputState TIM_OutputState_Enable; oc.TIM_Pulse 1500; oc.TIM_OCPolarity TIM_OCPolarity_High; TIM_OC1Init(TIM1, oc); TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIM1, ENABLE); TIM_Cmd(TIM1, ENABLE); TIM_CtrlPWMOutputs(TIM1, ENABLE);预分频 71 把 72MHz 降到 1MHz周期 19999 对应 20ms也就是 50Hz。TIM_Pulse 直接写 1500 表示 1.5ms 高电平舵机在中位。要转角度时改 TIM_Pulse0 度约 500180 度约 2500。注意 TIM1 是高级定时器必须调用 TIM_CtrlPWMOutputs 使能输出否则 PA8 没有波形。调试时先用示波器看 PA8确认周期和脉宽再接舵机避免烧舵机。3. 自动/手动模式状态机与舵机 PWM 驱动实现3.1 主循环状态机与按键消抖主循环不要把所有 if 堆在一起先定义两个状态工作模式自动/手动和伞面状态开/关。自动模式下雨滴阈值触发开伞雨停延迟关伞手动模式下按键直接控制。模式切换按键在自动和手动之间切换切换时保持当前伞面状态避免突然反转。按键消抖用 20ms 周期扫描连续两次读到同电平才确认。当前模式事件动作下一状态自动雨滴 ADC 低于阈值舵机开伞自动开伞自动雨滴 ADC 高于阈值持续 30s舵机关伞自动关伞手动按键 2 按下开/关翻转保持手动任意按键 1 按下切换模式自动/手动typedef enum { MODE_AUTO 0, MODE_MANUAL } WorkMode; typedef enum { UMB_CLOSED 0, UMB_OPEN } UmbrellaState; WorkMode work_mode MODE_AUTO; UmbrellaState umb_state UMB_CLOSED; uint16_t rain_raw 0; uint32_t rain_clear_tick 0; // 20ms 调用一次返回键值1 模式键2 开关键 uint8_t Key_Scan(void) { static uint8_t last1 1, last2 1; static uint8_t cnt1 0, cnt2 0; uint8_t now1 GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1); uint8_t now2 GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2); uint8_t key 0; if (now1 0) { if (cnt1 2 last1 1) key 1; } else cnt1 0; if (now2 0) { if (cnt2 2 last2 1) key 2; } else cnt2 0; last1 now1; last2 now2; return key; }这段扫描每 20ms 调用一次cnt 累到 2 表示连续 40ms 低电平才认一次按下避免机械抖动。last 变量记录上一次电平实现“按下瞬间触发一次”长按不会连续翻转。如果按键反应太慢可以把 20ms 改成 10ms但 cnt 阈值也要相应调整。模式切换只改 work_mode不直接动舵机舵机动作留给状态机统一处理这样手动和自动不会互相抢输出。3.2 雨滴 ADC 滑动滤波与开伞阈值判定雨滴传感器输出受板面水滴分布影响单次 ADC 采样会抖。我一般用 8 点滑动平均再配一个回差阈值开伞阈值设为 1800关伞阈值设为 2600中间留 800 码值回差。这样小雨时读数降到 1800 以下才开伞雨停后读数回到 2600 以上并且持续 30s 才关伞避免阵雨时反复开合。ADC 原始值越小越湿代码里要分清方向。参数建议值说明采样周期100ms主循环调用滤波窗口8滑动平均开伞阈值1800ADC 低于此值判定有雨关伞阈值2600ADC 高于此值且持续 30s关伞延时30000ms防阵雨抖动#define RAIN_WIN 8 uint16_t rain_buf[RAIN_WIN]; uint8_t rain_idx 0; uint16_t Rain_Filter(uint16_t raw) { uint32_t sum 0; rain_buf[rain_idx] raw; if (rain_idx RAIN_WIN) rain_idx 0; for (uint8_t i 0; i RAIN_WIN; i) sum rain_buf[i]; return (uint16_t)(sum / RAIN_WIN); } void Rain_Task(void) { rain_raw Rain_Filter(Rain_ReadRaw()); if (work_mode ! MODE_AUTO) return; if (rain_raw 1800 umb_state UMB_CLOSED) { Servo_SetAngle(90); // 开伞到 90 度 umb_state UMB_OPEN; rain_clear_tick 0; } else if (rain_raw 2600) { if (rain_clear_tick 0) rain_clear_tick HAL_GetTick(); if (HAL_GetTick() - rain_clear_tick 30000 umb_state UMB_OPEN) { Servo_SetAngle(0); // 关伞 umb_state UMB_CLOSED; rain_clear_tick 0; } } else { rain_clear_tick 0; } }滑动平均窗口 8 个点按 100ms 一次采样相当于 800ms 的平滑能压掉水滴飞溅造成的尖峰又不会延迟到雨停后还开伞。开伞阈值 1800 和关伞阈值 2600 不是固定值需要根据雨滴板实际输出标定。代码里 HAL_GetTick 返回毫秒计数用来做 30s 延时。注意 rain_clear_tick 在读数回到中间区时清零表示雨还没完全停重新计时。3.3 舵机 PWM 角度映射与红外对管伞面限位舵机角度不能直接写 0 到 180 的占空比要按脉宽映射。SG90 的典型参数0.5ms 对应 0 度1.5ms 对应 90 度2.5ms 对应 180 度。开伞时如果红外对管检测到人离伞面太近就把目标角度压低比如从 90 度降到 60 度避免伞面碰到人。红外对管输出低电平表示近高电平表示远所以检测到低电平就限制角度。目标角度脉宽TIM_Pulse场景0 度0.5ms500关伞60 度1.0ms1000近人限位90 度1.5ms1500正常开伞180 度2.5ms2500全开本设计不用void Servo_SetPulse(uint16_t pulse) { if (pulse 500) pulse 500; if (pulse 2500) pulse 2500; TIM_SetCompare1(TIM1, pulse); } void Servo_SetAngle(uint8_t angle) { uint16_t pulse 500 (uint32_t)angle * 2000 / 180; Servo_SetPulse(pulse); } void Umbrella_Open_Safe(void) { // PB1 低电平表示人体距离伞面过近 if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) 0) { Servo_SetAngle(60); } else { Servo_SetAngle(90); } }Servo_SetAngle 把 0 到 180 映射到 500 到 2500公式是 500 angle * 2000 / 180。Servo_SetPulse 里做上下限保护防止异常值把舵机打到堵转。Umbrella_Open_Safe 在开伞时读 PB1近人时只开到 60 度远人时开到 90 度。这里没有做闭环 PID因为红外对管是开关量只能分两档毕业设计够用如果要更细腻可以换超声波或红外测距模块把距离换算成角度。4. ESP8266 阿里云 IoT 接入与 NEO-6M 定位数据解析4.1 ESP8266 AT 指令连接阿里云 MQTTESP8266 跑 AT 固件时STM32 通过串口发 AT 指令控制。阿里云 IoT 需要三元组ProductKey、DeviceName、DeviceSecret。先连 WiFi再配置 MQTT 参数最后连接。不同 AT 固件版本指令略有差异常见的是 ATMQTTUSERCFG 和 ATMQTTCONN。ClientID 一般用 DeviceName 加时间戳Username 用 DeviceNameProductKeyPassword 用 HMAC-SHA1 对 ClientID、时间戳等签名。STM32 端算 HMAC 麻烦我一般预生成或者用简单密码认证但正式项目建议在 ESP8266 端用 SDK 算。AT 指令参数示例作用ATCWMODE11Station 模式ATCWJAPSSID,PASSWiFi 名和密码连路由器ATMQTTUSERCFG0,1,ClientID,Username,Password,0,0,三元组和签名配置 MQTTATMQTTCONN0,iot-as-mqtt.cn-shanghai.aliyuncs.com,1883,0域名端口连接阿里云ATMQTTPUB0,topic,payload,0,0Topic 和 JSON发布属性# 复位并连 WiFi ATRST ATCWMODE1 ATCWJAPyour_ssid,your_password # 配置阿里云 MQTT 参数ClientID 可带时间戳 ATMQTTUSERCFG0,1,device01|securemode3,signmethodhmacsha1|,device01a1B2c3D4e5,your_password,0,0, # 连接阿里云 IoT 华东2节点 ATMQTTCONN0,iot-as-mqtt.cn-shanghai.aliyuncs.com,1883,0 # 订阅属性设置 Topic用于云端下发 ATMQTTSUB0,/sys/a1B2c3D4e5/device01/thing/service/property/set,0每条指令后要等 ESP8266 返回 OK不能连续猛发。ATCWJAP 可能耗时几秒STM32 串口接收要设超时。MQTTUSERCFG 里的 ClientID、Username、Password 必须和阿里云控制台生成的一致否则返回 3 或者直接断开。ATMQTTCONN 的域名按地域换端口 1883 是明文正式产品换成 8883 走 TLS但对 F103 来说资源紧张毕业设计常用 1883。4.2 阿里云物模型 Topic 与属性上报阿里云物模型把设备能力抽象成属性、事件、服务。自动伸缩雨伞可以定义四个属性rain_status雨滴状态、umbrella_state伞面状态、gps_lat纬度、gps_lon经度。上报 Topic 是 /sys/{ProductKey}/{DeviceName}/thing/event/property/postpayload 是 JSON。云端下发用 /sys/{ProductKey}/{DeviceName}/thing/service/property/set。手机 APP 调阿里云 IoT 的 API 或者用现成 APP 看数据。属性标识符类型单位说明rain_statusbool—true 表示有雨umbrella_stateint—0 关1 开gps_latdouble度纬度gps_londouble度经度void Aliyun_Post_Property(void) { char json[192]; char topic[128]; snprintf(topic, sizeof(topic), /sys/a1B2c3D4e5/device01/thing/event/property/post); snprintf(json, sizeof(json), {\id\:\123\,\version\:\1.0\,\params\:{ \rain_status\:%s,\umbrella_state\:%d, \gps_lat\:%.6f,\gps_lon\:%.6f}}, (rain_raw 1800) ? true : false, (umb_state UMB_OPEN) ? 1 : 0, gps_lat, gps_lon); ESP8266_SendAT(ATMQTTPUB0,\%s\,\%s\,0,0\r\n, topic, json); }JSON 里的 id 可以是递增序号version 固定 1.0params 里放属性。gps_lat 和 gps_lon 用 %.6f 保留 6 位小数定位精度大约米级。MQTTPUB 的 payload 里如果有双引号要转义成 否则 AT 解析会截断。发送频率不要太高5 秒一次足够太频繁会把串口和云端连接压垮。收到 property/set 后要解析 JSON 里的 params再更新 work_mode 或 umb_state。4.3 NEO-6M NMEA 语句解析与定位有效性判断NEO-6M 默认波特率 9600输出 NMEA 0183 语句。常用 GNRMC 或 GPRMC包含定位状态、纬度、经度、速度、日期。STM32 用串口 3 接收最好用空闲中断加 DMA把一整句存到缓冲区。解析时先判断 $GNRMC 或 $GPRMC再看定位状态 A 表示有效V 表示无效。纬度格式 ddmm.mmmm经度 dddmm.mmmm要转成十进制度。定位有效性判断不能只看有没有数据冷启动前几分钟可能输出空字段。字段含义示例$GNRMC推荐定位信息—状态A 有效V 无效A纬度ddmm.mmmm3112.3456纬度方向N/SN经度dddmm.mmmm12134.5678经度方向E/WE校验和* 后两位1Avoid NMEA_Parse(char *line, double *lat, double *lon) { char *p; if ((p strstr(line, $GNRMC)) NULL (p strstr(line, $GPRMC)) NULL) return; // 跳过语句头和时间定位状态在第 2 个逗号后 p strchr(p, ,) 1; // 时间 p strchr(p, ,) 1; // 状态 if (*p ! A) return; // 定位无效直接退出 p strchr(p, ,) 1; // 纬度 ddmm.mmmm double raw_lat atof(p); int lat_deg (int)(raw_lat / 100); *lat lat_deg (raw_lat - lat_deg * 100) / 60.0; p strchr(p, ,) 1; // 纬度方向 N/S if (*p S) *lat -*lat; p strchr(p, ,) 1; // 经度 dddmm.mmmm double raw_lon atof(p); int lon_deg (int)(raw_lon / 100); *lon lon_deg (raw_lon - lon_deg * 100) / 60.0; p strchr(p, ,) 1; // 经度方向 E/W if (*p W) *lon -*lon; }解析函数按逗号依次跳字段。纬度 ddmm.mmmm 转十进制度先除以 100 取整数部分作为度余数部分除以 60 作为分。经度同理只是整数部分可能是三位数。定位状态为 A 才继续V 表示数据无效。校验和可以先不查但正式项目建议 XOR 校验避免串口干扰导致解析出错误坐标。NEO-6M 要放在室外或者窗边冷启动首次定位可能要 30s 以上热启动几秒就够。5. 雨滴阈值标定、ESP8266 断线重连与联调排错技巧5.1 雨滴阈值现场标定与舵机抖动处理雨滴传感器的阈值不要照抄代码里的 1800 和 2600。先把串口打印打开把 Rain_ReadRaw 的滤波值打到上位机观察干燥时读数、滴水时读数、大雨时读数。通常干燥在 3800-4095滴水在 1000-2000小雨可能在 2500 左右。开伞阈值取干燥和滴水之间的偏湿侧关伞阈值取干燥侧再低一点。舵机抖动多数是电源问题SG90 和 STM32 共用 5V 时舵机启动瞬间电压跌落会让 ESP8266 重启所以舵机电源单独走一路地线单点共地信号线串 100Ω 电阻。故障现象可能原因处理没雨也开伞阈值太低或雨滴板有露水调高开伞阈值加 8 点滤波小雨不开伞阈值太高或采样周期太长调低阈值采样改 50ms舵机抖动或复位电源跌落地线干扰舵机独立 5V加 470μF 电容ESP8266 掉线WiFi 信号弱或 MQTT 心跳丢失加 30s 重连检查 CWJAP5.2 ESP8266 掉线重连与心跳保活ESP8266 在 WiFi 信号波动时会掉 MQTT 连接STM32 不能一直等。常见做法是每 30s 用 ATMQTTCONN 的状态查询或者直接重新连接连续失败 3 次就复位 ESP8266。重连时先发 ATMQTTCLEAN0 清理会话再走 MQTTUSERCFG 和 MQTTCONN。下面是一个重连计数片段。uint8_t mqtt_fail_cnt 0; void MQTT_KeepAlive(void) { if (ESP8266_MQTT_IsConnected() 0) { mqtt_fail_cnt; if (mqtt_fail_cnt 3) { ESP8266_HardReset(); // 拉低 RST 或发 ATRST ESP8266_ConnectWiFi(); ESP8266_ConfigMQTT(); mqtt_fail_cnt 0; } } else { mqtt_fail_cnt 0; } // 每 30 秒发布一次属性兼作心跳 if (HAL_GetTick() % 30000 100) { Aliyun_Post_Property(); } }重连计数放在主循环里每 1s 调一次连续 3 次检测断开才复位避免偶发丢包就重启。ATMQTTCONN 查询可以用 ATMQTTCONN?但有些固件不支持那就靠 MQTTPUB 的返回值判断。心跳不要只依赖 MQTT 自身 keepalive应用层每 30s 发一次属性云端能看到设备在线APP 也不会显示离线。5.3 GNSS 定位漂移与整体联调顺序NEO-6M 首次上电冷启动输出里状态多为 V纬度经度是空或者 0程序要过滤掉。室外固定 5 分钟后再看状态变 A坐标才可信。联调顺序建议先单独调雨滴 ADC 和串口打印再调舵机 PWM再接红外限位最后接 ESP8266 和阿里云。每接一个模块用串口把关键变量打出来比如 rain_raw、umb_state、gps_lat。不要把全部模块一次焊完再调试否则分不清是电源还是代码问题。定位漂移在静止时十几米内正常如果要防丢可以在 APP 端画轨迹而不是指望单点坐标。联调时把串口助手波特率设成 115200 看 STM32 日志ESP8266 和 NEO-6M 分别用 9600不要混在一个串口上。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。