嘿,欢迎来到我的小站 ✨

这里记录一些生活碎片、学习笔记和折腾的项目

最近动态

更多

今天天气不错 ☀️

开心 04-23 02:12

调试了一整天的bug,终于找到问题了!

兴奋 04-23 02:12

最近在折腾

看看其他
4G物联网遥控终端

4G物联网遥控终端

物联网

一、项目说明 本项目是一套基于 阿里云IoT平台云产品流转 的物联网远程控制解决方案。Android APP 和 Air780EP 4G模组作为 同一产品下的两个不同设备 注册在阿里云平台上,通过云产品流转规则实现双向消息路由,无需额外搭建中转服务器。 Air780EP 端:运行在 RTOS 实时操作系统 上的 LuatOS Lua 固件,负责GPIO控制、LBS基站定位、数据采集与上报 Android APP 端:Java 开发的控制终端,负责设备状态显示、远程控制指令下发、历史数据查询 通信链路:APP ←→ 阿里云IoT(云产品流转)←→ Air780EP,全程经过阿里云平台鉴权和路由 应用场景 远程设备开关控制(如灯光、电机、继电器等) 4G设备位置追踪(LBS基站定位) 设备租赁/计费管理(到期自动停机) 无人值守设备远程运维 核心特性 双路GPIO远程控制(开关A / 开关B) LBS基站定位,每60秒上报经纬度,APP端可跳转高德地图查看位置 设备到期管理:设定截止时间后到期自动关闭设备,续期后自动恢复 断网保护:断网超过300秒自动停止设备,恢复网络后自动续期 多用户体系:管理员 + 普通用户,管理员可管理所有设备和用户 历史数据查询:SQLite本地存储所有设备参数变化记录,支持时间范围筛选 设备离线计时:断网期间软件模拟时间递进,保证到期判断准确性 二、阿里云架构 2.1 设备关系 在阿里云IoT平台上,Android APP 和 Air780EP 属于 同一个产品下的两个不同设备 2.2 云产品流转机制 通过阿里云 云产品流转 功能实现设备间消息转发: Android APP (设备A) Air780EP (设备B) │ │ │── 发布到 property/set ──>│ │ │ │ │ │ ┌─────┴─────┐ │ │ │ 阿里云IoT │ │ │ │ 云产品流转 │ │ │ └─────┬─────┘ │ │ │ │ │ │── 转发到 ──>│── 接收 property/set │ │ │── 执行GPIO控制 │ │ │── 上报 property/post │ │ │ │ ┌─────┴─────┐ │ │ │ 阿里云IoT │ │ │ │ 云产品流转 │ │ │ └─────┬─────┘ │ │ │ │ │<── 转发到 ───────────────│ │ │── 接收 property/post │ │ │── 更新UI/存入SQLite │ │ 云产品流转配置要点: 阿里云IoT控制台 → 产品详情 → 云产品流转 配置数据流转规则: 数据源:设备A(APP)发布的 property/set 主题 数据目的:设备B(Air780EP)订阅的 property/set 主题 反向同理:设备B的 property/post 流转到设备A 两个设备共享同一个产品,通过产品内流转实现消息互通 无需额外搭建服务器,阿里云平台内部完成消息路由 2.3 与直连方式的区别 对比项 本项目方式(云产品流转) 直连方式 设备关系 同产品不同设备,云平台转发 不同产品,各自独立连接 消息路由 阿里云内部流转,低延迟 需要额外中转服务器 配置复杂度 阿里云控制台配置流转规则 需开发中转服务 扩展性 添加设备只需配置新流转规则 需修改中转逻辑 安全性 阿里云平台统一鉴权 需自行实现鉴权 三、项目结构 安卓-阿里云-AIR780/ │ ├── Air780EP_Aliyun_LBS/ # Air780EP 4G模组固件 (LuatOS/RTOS) │ ├── main.lua # 主程序入口 │ │ ├── LBS基站定位任务(每60秒) │ │ ├── 设备到期检测(每6秒) │ │ ├── 断网监测与离线计时(每1秒) │ │ ├── 网络时间获取与fskv持久化 │ │ ├── 数据上报主循环(每5秒) │ │ └── GPIO控制与状态管理 │ │ │ ├── aliyun.lua # 阿里云IoT SDK库 │ │ ├── MQTT连接管理(自动重连20秒间隔) │ │ ├── 一机一密 / 一型一密认证 │ │ ├── 消息发布/订阅 │ │ └── OTA固件升级(libfota) │ │ │ ├── testEvt.lua # MQTT消息接收处理 │ │ ├── Switch_A / Switch_B 开关控制 │ │ ├── Upload_count 上传次数设置 │ │ ├── Device_Get_New_T 时间获取次数 │ │ └── Devicestoptime_ 截止时间设定 │ │ │ ├── testYjym.lua # 一机一密认证配置 │ │ ├── ProductKey / DeviceName / DeviceSecret │ │ └── 区域:cn-shanghai,非SSL │ │ │ ├── testPm.lua # 电源管理 │ │ └── 连接成功后进入低功耗模式(LIGHT),关闭USB │ │ │ └── netready.lua # 网络初始化 │ └── SIM卡自动切换(simid 2),等待IP_READY │ └── Remote_Control/ # Android 控制端APP └── app/src/main/java/com/example/remote_control/ │ ├── 【用户认证模块】 │ ├── LoginActivity.java # 登录界面 │ │ ├── 用户名/密码验证(6-12位可见ASCII) │ │ ├── 管理员账户硬编码验证 │ │ ├── 记住密码 / 自动登录 │ │ └── 密码可见性切换 │ │ │ └── RegisterActivity.java # 注册界面 │ ├── 注册码验证(registerlzy) │ ├── 用户名唯一性检查 │ ├── 密码一致性验证 │ └── 输入过滤(仅可见ASCII) │ ├── 【主界面模块】 │ ├── MainActivity.java # 普通用户主界面 │ │ ├── 设备控制入口 │ │ ├── 添加设备 │ │ ├── 数据查询 │ │ └── 退出登录 │ │ │ └── MainActivityAdmin.java # 管理员主界面 │ ├── 设备控制(跳转设备管理) │ ├── 添加设备(含用户分配) │ ├── 数据查询(无归属限制) │ ├── 用户管理 │ └── 退出登录 │ ├── 【设备管理模块】 │ ├── DeviceControlActivity.java # 设备控制列表(普通用户) │ │ ├── 按当前用户过滤设备 │ │ ├── 按添加时间倒序排列 │ │ └── 点击设备发起MQTT连接 │ │ │ ├── DeviceManagerActivity.java # 设备管理(管理员) │ │ ├── 设备列表展示 │ │ ├── 设备详情编辑(归属用户、设备名) │ │ ├── 设备连接 │ │ └── 设备删除 │ │ │ └── AliyunDeviceConnect.java # 设备连接流程 │ ├── 15秒连接超时检测 │ ├── 连接成功后自动请求数据 │ ├── 进度对话框显示 │ └── 连接回调接口 │ ├── 【MQTT通信模块】 │ ├── AliyunOperate.java # MQTT核心操作(单例) │ │ ├── MQTT连接/断开/重连 │ │ ├── 消息发布/订阅 │ │ ├── 消息解析与UI更新 │ │ ├── 数据插入SQLite │ │ └── ScheduledExecutorService自动重连(10秒) │ │ │ ├── AliyunIoTSignUtil.java # HMAC-SHA1签名工具 │ │ ├── 参数字典序排序 │ │ ├── 规范化请求字符串拼接 │ │ └── HMAC-SHA1加密 │ │ │ └── AliyunDataService.java # 后台MQTT服务 │ ├── START_STICKY保活策略 │ ├── Service绑定/解绑 │ └── 资源清理 │ ├── 【数据展示模块】 │ ├── AliyunDataDisp.java # 设备数据显示/控制界面 │ │ ├── 11项数据实时显示 │ │ ├── 开关A/B切换控制 │ │ ├── 手动数据请求 │ │ ├── 时间同步请求 │ │ ├── 截止时间设定(日期+时间+秒) │ │ ├── 高德地图跳转 │ │ └── 历史查询入口 │ │ │ ├── AliyunData_Tx.java # UI数据绑定单例 │ │ └── 11个TextView引用 + MyHelper实例 │ │ │ └── SecondPickerDialog.java # 秒数选择器Dialog │ └── NumberPicker 0-59秒选择 │ ├── 【数据查询模块】 │ └── HistoryQuery.java # 历史数据查询 │ ├── 设备ID + 数据类型 + 时间范围筛选 │ ├── 8种数据类型查询 │ ├── 长按复制数据(500ms阈值) │ ├── 管理员无归属限制 │ └── 触摸事件有效性验证 │ ├── 【用户管理模块】 │ └── UserManagementActivity.java # 用户管理(管理员专用) │ ├── 用户列表(倒序显示) │ ├── 添加/编辑用户 │ ├── 长按删除用户 │ └── 管理员账户保护 │ └── 【数据库模块】 └── MyHelper.java # SQLite数据库 ├── 数据库:DeviceData.db ├── 表:Device_Data └── 字段:_id, deviceId, parameterName, parameter, parameterGetTime 四、Air780EP 运行环境 4.1 RTOS 与 LuatOS Air780EP 模组运行在 RTOS(实时操作系统) 上,具体为合宙自研的 LuatOS 框架,基于底层 RTOS 内核构建。应用层使用 Lua 脚本开发,由 LuatOS 框架解释执行。 ┌─────────────────────────────────────────┐ │ Lua 应用层 │ │ main.lua / testEvt.lua / testYjym.lua │ ├─────────────────────────────────────────┤ │ LuatOS 框架层 │ │ sys / aliyun / gpio / uart / fskv │ │ lbsLoc / mobile / json / zbuff │ ├─────────────────────────────────────────┤ │ RTOS 内核层 │ │ 任务调度 / 定时器 / 信号量 / 消息队列 │ ├─────────────────────────────────────────┤ │ 硬件驱动层 │ │ 4G基带 / UART / GPIO / SPI / I2C │ ├─────────────────────────────────────────┤ │ Air780EP 硬件 │ │ ASR1606 主芯片 + 4G射频 + 外设 │ └─────────────────────────────────────────┘ 4.2 RTOS 特性 RTOS特性 本项目应用 说明 多任务并行 sys.taskInit 创建多个任务 LBS定位任务、主循环任务、网络监测任务并行运行 定时器 sys.timerLoopStart 1秒/6秒/5秒周期任务,基于RTOS硬件定时器 信号量/消息 sys.waitUntil / sys.wait 任务间同步,如等待"IP_READY"信号 协程调度 sys.wait() 非阻塞等待 Lua协程让出CPU,RTOS调度其他任务 看门狗 wdt.init(9000) RTOS级硬件看门狗,防止程序死锁 低功耗管理 testPm.lua RTOS支持LIGHT休眠模式,降低功耗 Flash存储 fskv RTOS提供的Key-Value持久化存储接口 4.3 与传统单片机开发的区别 对比项 Air780EP (RTOS/LuatOS) 传统单片机 (如ESP8266 Arduino) 开发语言 Lua脚本 C/C++ 任务模型 多任务RTOS,协程调度 单任务loop轮询 并发处理 多任务并行,sys.wait非阻塞 需手动管理状态机 网络栈 4G蜂窝网络,原生TCP/IP WiFi,需外部模块 固件更新 OTA远程升级(libfota) 需本地烧录 内存管理 RTOS自动管理,Lua GC 手动管理 启动速度 Lua解释执行,毫秒级启动 编译执行 4.4 LuatOS 主要模块使用 模块 用途 本项目调用 sys 任务管理、定时器、消息 taskInit, timerLoopStart, waitUntil, wait, run aliyun 阿里云IoT SDK connect, subscribe, publish, on gpio GPIO控制 setup, set, get uart 串口通信 setup, write fskv Flash键值存储 init, get, set lbsLoc LBS基站定位 request mobile 蜂窝网络管理 status, reqCellInfo, setAuto json JSON编解码 encode, decode zbuff 字节缓冲区 create, seek, write wdt 看门狗 init, feed 五、技术参数总表 5.1 Air780EP 4G模组固件参数 参数类别 参数名 值/说明 模组型号 Air780EP 合宙4G Cat.1模组 运行系统 RTOS 实时操作系统 开发框架 LuatOS Lua脚本开发,基于RTOS内核 主芯片 ASR1606 固件版本 1.0.2 PROJECT = "aliyundemo_lbsLoc" 调试串口 UART1 波特率 921600 GPIO配置 BOOT_PIN = 0 GPIO0,上拉输出,默认低电平 LED__PIN = 27 GPIO27,上拉输出,默认低电平 看门狗 WDT 超时9000ms,喂狗间隔3000ms MQTT协议 非SSL 端口1883 MQTT区域 cn-shanghai 阿里云华东2 MQTT保活 300秒 keepalive MQTT重连 20秒间隔 aliyun.lua内置 SIM卡 simid 2 自动切换,需插SIM卡 网络模式 mobile.setAuto 6秒注册,60秒搜网超时 定位方式 LBS基站定位 非GPS 定位周期 60秒 lbsLoc.request(getLocCb) 定位超时 3秒 CELL_INFO_UPDATE等待 数据上报周期 5秒 主循环sys.wait(5000) 上报次数限制 每天10次 每6小时刷新+3次 到期检测周期 6秒 timerLoopStart 6000ms 断网检测周期 1秒 timerLoopStart 1000ms 断网容忍时间 300秒(5分钟) 超时后停止设备 时间同步 每6小时 get_New_time=5次 持久化存储 fskv Flash Key-Value存储 时区 UTC+8 所有时间按北京时间处理 时间基准偏移 28800秒 UTC与北京时间差值 5.2 Android APP参数 参数类别 参数名 值/说明 开发语言 Java Android SDK 数据库 SQLite DeviceData.db,版本1 数据存储 SharedPreferences UserPrefs + Aliyun_Triplet MQTT客户端 Eclipse Paho org.eclipse.paho.client.mqttv3 MQTT连接 TCP 1883端口,非SSL MQTT区域 cn-shanghai 华东2 MQTT保活 300秒 MqttConnectOptions MQTT超时 10秒 connectionTimeout 自动重连 10秒间隔 ScheduledExecutorService 连接超时 15秒 AliyunDeviceConnect 签名算法 HMAC-SHA1 AliyunIoTSignUtil 管理员账户 lzyadmin / lzy0424 硬编码,不保存登录态 注册码 registerlzy 预设,注册时校验 用户名规则 6-12位 仅可见ASCII字符 密码规则 6-12位 仅可见ASCII字符 设备物理ID 10位数字 自增,如0000000001 长按阈值 500ms HistoryQuery数据复制 最大移动距离 10px 长按判定容差 地图 高德地图 androidamap:// URI Scheme 时区 Asia/Shanghai UTC+8 5.3 阿里云IoT通信参数 参数类别 参数名 值/说明 认证方式 一机一密 ProductKey + DeviceName + DeviceSecret 连接地址 tcp://{productKey}.iot-as-mqtt.cn-shanghai.aliyuncs.com:1883 Client ID {productKey}.{deviceName}|securemode=2,signmethod=hmacsha1| 用户名 {deviceName}&{productKey} 密码 HMAC-SHA1签名值 参数按字典序拼接后加密 订阅主题 /sys/{productKey}/{deviceName}/thing/event/property/post 设备上报 发布主题 /sys/{productKey}/{deviceName}/thing/event/property/set APP控制 自定义主题 /hy5iV6QRUu4/868327073962407/user/control_2 testEvt.lua订阅 消息路由 云产品流转 同产品不同设备间消息转发 5.4 数据交互参数表 参数标识 数据类型 方向 范围/格式 说明 Switch_A int 双向 0/1 开关A(LED_PIN 27)状态 Switch_B int 双向 0/1 开关B(BOOT_PIN 0)状态 Upload_count int 双向 0~50 剩余上传次数,APP设置时传1 Device_Get_New_T int 双向 0~50 获取时间次数,APP设置时传1 Devicestoptime_ long 双向 毫秒时间戳 设备截止时间 Longitude_Z string 上行 整数3位+小数7位 经度(LBS定位) Latitude_Z string 上行 整数3位+小数7位 纬度(LBS定位) Location_Time string 上行 毫秒时间戳 定位时间 Air780EP_Sys_Time string 上行 毫秒时间戳 设备系统时间 Device_Sign_now int 上行 0/1 设备使能状态(1=正常,0=到期/停机) 5.5 SharedPreferences存储结构 UserPrefs(用户数据): Key 类型 说明 {username} String 用户名=密码(key-value存储) remember boolean 是否记住密码 autoLogin boolean 是否自动登录 username String 当前保存的用户名 password String 当前保存的密码 Aliyun_Triplet(设备数据): Key 类型 说明 AliyunDeviceName_{name} String 设备显示名称 productKey_{name} String 阿里云ProductKey deviceName_{name} String 阿里云DeviceName deviceSecret_{name} String 阿里云DeviceSecret BelongingUser_{name} String 设备归属用户名 DevicePhysicalID_{name} String 设备物理ID(10位) AddTime_{name} long 设备添加时间戳(毫秒) 5.6 SQLite数据库结构 数据库名: DeviceData.db,版本1 表名: Device_Data 列名 类型 说明 _id INTEGER 自增主键 deviceId TEXT 设备物理ID parameterName TEXT 参数名(Longitude/Latitude/Switch1/Switch2/LocationTime/DeviceTime/Deadline/DeviceStatus) parameter TEXT 参数值 parameterGetTime TEXT 获取时间(yyyy-MM-dd HH:mm:ss) 5.7 fskv持久化存储(Air780EP端) Key 类型 说明 Fskv_Init boolean 首次初始化标志 Dis_time int 断网累计时间(秒) aliyun_Up int 剩余上传次数 get_New_time_ int 剩余获取时间次数 Sys_Ena int 系统使能状态 L_GPIO_27 int LED_PIN状态 B_GPIO_00 int BOOT_PIN状态 time_year/mon/day/hour/min/sec int 当前时间 time_year_S/mon_S/day_S/hour_S/min_S/sec_S int 截止时间 get_timeY/M/D/H int 下次获取时间触发点 Comp_timeY/M/D int 下次每日重置触发点 更多详情及代码信息请点击项目文件夹查看

STM32 RFID手持式物品借还管理系统

STM32 RFID手持式物品借还管理系统

嵌入式

一、项目简介 本项目是一套基于 STM32F103ZET6微控制器的 RFID 手持式物品借还管理系统,包含嵌入式固件和PC端上位机软件两个子系统。 嵌入式端:手持设备通过 MFRC522 模块读取 Mifare 射频卡 UID,配合 13 键键盘和 LCD12864 显示屏(SSD1306 驱动,128×64),实现物品借出、归还、会员/物品登记、信息查询等功能。所有数据以 CSV 格式存储在 SD 卡的 .xls 文件中。 PC端上位机:C# WinForms 桌面应用,将 SD 卡中的 .xls 文件导入 SQL Server 数据库,提供数据浏览和搜索功能。 数据流:手持设备写入 SD 卡 .xls 文件 → 物理取出 SD 卡 → PC 端上位机导入数据库 二、技术参数 参数 规格 主控芯片 STM32F103ZET6 (ARM Cortex-M3, LQFP144) Flash / SRAM 512KB / 64KB 系统时钟 72MHz (8MHz HSE × 9 PLL) RFID 模块 MFRC522, 13.56MHz, ISO 14443A (Mifare S50/S70) 射频卡 UID 4 字节 显示屏 LCD12864 (SSD1306 驱动, 128×64, 软件 I2C) 存储 SD 卡 (SPI2 硬件接口, FatFS 文件系统) 键盘 13 键 (0-9 数字键 + Mode/In/Out 功能键) LED 指示灯 PB8, 低电平有效 会员容量 最多 99 人 物品容量 最多 599 件 管理员数量 2 个 (支持密码或管理员卡解锁) 管理员密码 6 位数字, 默认 987654 三、使用的技术与组件 嵌入式固件 类别 技术/组件 编程语言 C 语言 目标芯片 STM32F103ZE (STM32F10X_HD 系列) 固件库 STM32 标准外设库 (StdPeriph Lib) 文件系统 FatFS R0.10a (支持 FAT32) RFID 驱动 MFRC522 软件 SPI 驱动 显示驱动 SSD1306 软件 I2C 驱动 SD 卡驱动 硬件 SPI2 驱动 内存管理 自定义内存池分配器 (malloc.c) 调试工具 USMART 串口调试 Shell, USART1 printf PC 端上位机 类别 技术/组件 编程语言 C# 框架 .NET Framework 4.7.2 UI 框架 Windows Forms (WinForms) 数据库 Microsoft SQL Server Excel 读取 OLE DB (Microsoft.Jet.OLEDB.4.0) 第三方库 Spire.XLS 12.11.3 IDE Visual Studio 2022 四、引脚分配 RC522 RFID (软件 SPI): 信号 引脚 SDA (CS) PA4 SCK PA5 MOSI PA6 MISO PA7 RST PC4 LCD12864 (软件 I2C): 信号 引脚 SCL PF8 SDA PF7 RES PD4 SD 卡 (硬件 SPI2): 信号 引脚 CS PB12 SCK PB13 MISO PB14 MOSI PB15 键盘 (GPIO 输入,上拉,低电平有效): 按键 引脚 按键 引脚 0 PD8 5 PD14 1 PD11 6 PG4 2 PD15 7 PD9 3 PG5 8 PD13 4 PD10 9 PG3 Mode PG6 In PG2 Out PD12 五、运行模式 模式 说明 游客模式 (默认) 刷卡查看物品借还状态,可进入借出流程 管理员模式 输入 6 位密码或刷管理员卡解锁。支持借出、归还、按编号查询、会员/物品登记 录入模式 刷新 RFID 卡注册会员或物品,分配类别和编号

STM32智慧大棚监控系统

STM32智慧大棚监控系统

嵌入式

项目说明 本项目是一个基于 STM32F103ZET6 + ESP-01S 双MCU架构的温室大棚环境监测与远程控制系统。STM32 负责本地传感器数据采集、LCD显示和执行器控制;ESP-01S 负责WiFi联网,通过 阿里云IoT平台(MQTT协议) 将数据上报云端,并接收远程控制指令。支持本地按键手动控制和云端远程控制两种模式。 通过连接ESP01S开启的WIFI,访问对应IP,进行配置WIFI连接参数和云平台连接参数,可以重置。 系统架构 [传感器群] --> [STM32F103ZE] --UART3(115200)--> [ESP-01S] --MQTT--> [阿里云IoT] ^ | | | +--- LED/蜂鸣器/LCD <-- 按键控制 / 远程指令 <---+ 核心功能 环境监测:温度、湿度、光照、土壤湿度、降雨、4种气体(H2S/CO2/PM2.5/CO) 本地显示:TFT LCD 实时显示所有传感器数值 本地控制:4个按键分别控制水泵、风扇、加湿器、LED灯 远程控制:阿里云IoT平台下发8路开关指令(Switc0-Switc7) 云端上报:所有传感器数据实时上传阿里云 WiFi配网:ESP-01S 内置 Captive Portal,首次使用连接AP 智能大棚网络配置 即可配置WiFi和阿里云凭证 技术参数总表 主控芯片 项目 参数 MCU STM32F103ZE (Cortex-M3, 72MHz) Flash / RAM 512KB / 64KB 开发板 ALIENTEK 战舰(WarShip) WiFi模块 ESP-01S (ESP8266, 80MHz, 802.11 b/g/n) 传感器参数 传感器 型号/类型 量程 接口 引脚 温湿度 DHT11 温度0-50°C / 湿度20-90%RH 单总线 PG11 光照 BH1750 1-65535 lx (分辨率0.5lx) 软件I2C PD6(SCL), PD7(SDA) 硫化氢 MQ-136 模拟量 (0-3.3V) ADC1_CH10 PC0 二氧化碳 MG811 模拟量 (0-3.3V) ADC1_CH11 PC1 PM2.5 GP2Y 模拟量 (0-3.3V) ADC1_CH12 PC2 (IR脉冲: PB1) 一氧化碳 CO传感器 模拟量 (0-3.3V) ADC1_CH13 PC3 土壤湿度 土壤传感器 模拟+数字 ADC2_CH5 + GPIO PA5(AO), PA4(DO) 降雨 雨滴传感器 模拟+数字 ADC2_CH6 + GPIO PA6(AO), PA1(DO) 执行器 设备 引脚 说明 LED0 PB5 补光灯/状态指示 LED1 PE5 补光灯/状态指示 蜂鸣器 PB8 报警 TFT LCD FSMC (NE4, A10=RS) 本地显示,背光PB0 用户输入 按键 引脚 功能 KEY0 PE4 切换开关4(加湿器) KEY1 PE3 切换开关3(风扇/通风) KEY2 PE2 切换开关2(水泵) WK_UP PA0 重置WiFi配置 通信协议 链路 协议 波特率 说明 STM32 ↔ ESP-01S 自定义UART帧协议 115200 16字节定长包,F开头#结尾,校验和 ESP-01S ↔ 阿里云 MQTT — 通过AliyunIoTSDK库 STM32 → LCD/存储 FSMC / SDIO / SPI — LCD、SD卡、W25Q128字库 上行数据帧格式(STM32 → ESP-01S) 字节0: 'F' (帧头) 字节1: 数据类型 ('0'=整型, '1'=浮点, '2'=电压) 字节2-7: 物模型ID (6字符, 如"Temper", "Humidi", "LightL") 字节8-13: 数据值 (6位ASCII数字) 字节14: 校验和 = (字节1-11之和) % 127 字节15: '#' (帧尾) 轮询通道(每600ms一帧):温度→湿度→土壤→雨量→光照→Switc0→Switc1→H2S→CO2→PM2.5→CO 阿里云物模型属性 属性 类型 方向 说明 Temper int 上报 温度 Humidi int 上报 湿度 LightL int 上报 光照 soilPH float 上报 土壤湿度电压 rainIO float 上报 雨量电压 sulfid float 上报 H2S电压 Datco2 float 上报 CO2电压 AQIaqi float 上报 PM2.5电压 Dataco float 上报 CO电压 Switc0-Switc7 int 双向 8路远程开关

WiFi 智能拨码显示终端

WiFi 智能拨码显示终端

嵌入式

本项目是一个基于 ESP8266 微控制器的工业级数字显示终端设备,应用于需要远程监控现场拨码设定值的场景。设备通过 4 位 BCD 拨码开关手动设定 0000~9999 的目标数值,经两片级联的 74HC165 并行转串行移位寄存器读取后,驱动外置 4 位 7 段数码管实时显示当前值及工作状态。设备通过 WiFi 接入阿里云 IoT 物联网平台,采用 MQTT 协议实现数据双向通信:一方面定时上报当前拨码数值和设备使能状态,另一方面接收云端下发的远程控制指令(启用/禁用设备)。支持 WiFi AP 模式 Captive Portal(门户劫持)配网,首次使用时用户可通过手机连接设备热点自动弹出配网页面,输入家庭/工厂 WiFi 密码即可完成联网配置,配置信息持久化存储于 EEPROM 中,断电不丢失。 系统架构 ┌─────────────┐ 并行数据 ┌──────────────┐ 串行数据 ┌──────────┐ │ 4位BCD拨码盘 │──────────────→│ 2×74HC165 │─────────────→│ ESP8266 │ │ (手动设定值) │ (4×4bit) │ (级联移位) │ (16bit) │ 主控MCU │ └─────────────┘ └──────────────┘ └────┬─────┘ │ ┌────────────┼────────────┐ │ │ │ ▼ ▼ ▼ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ 4位7段 │ │ 阿里云 │ │ 2个按键 │ │ 数码管 │ │ IoT平台 │ │ 2个LED │ │(UART驱动)│ │ (MQTT) │ │(状态指示)│ └──────────┘ └──────────┘ └──────────┘ 硬件详细说明 4.1 核心元器件清单 序号 元器件 型号/规格 数量 用途 1 主控芯片 ESP8266 (ESP-01/NodeMCU) 1 系统核心,WiFi 通信 2 移位寄存器 74HC165 2 并行转串行,读取 BCD 拨码 3 BCD 拨码开关 4 位 BCD 旋转拨码盘 1 手动设定 0~9999 数值 4 7 段数码管 4 位 LED 数码管(UART 驱动型) 1 显示数值和状态 5 按键 轻触按键 2 复位/确认操作 6 LED 指示灯 3mm/5mm LED 2 按键状态指示 7 上拉电阻 10KΩ 若干 按键和 74HC165 上拉 4.2 引脚分配表 ESP8266 引脚 GPIO 编号 连接目标 方向 说明 D0 GPIO16 复位按键 INPUT 内部下拉,按键接地 D1 GPIO5 确认按键 INPUT 内部下拉,按键接地 D2 GPIO4 复位 LED OUTPUT 复位模式指示灯 D3 GPIO0 确认 LED OUTPUT 确认模式指示灯 D5 GPIO14 74HC165 PL (锁存) OUTPUT LOW→HIGH 锁存数据 D6 GPIO12 74HC165 CP (时钟) OUTPUT 上升沿移位 D7 GPIO13 74HC165 Q7 (数据) INPUT 串行数据输出 RX (GPIO3) GPIO3 数码管 TX OUTPUT 软串口发送 (9600 baud) TX (GPIO1) GPIO1 数码管 RX — 软串口 (与烧录口冲突) 4.3 74HC165 级联电路 两片 74HC165 采用级联方式(第一片 Q7 接第二片 SER),共读取 16 位数据: 拨码盘位1 (千位): RegisterData[4~7] = 高4bit, RegisterData[0~3] = 低4bit 拨码盘位2 (百位): ───────────────────────────────────────────────────────── 拨码盘位3 (十位): RegisterData[12~15] = 高4bit, RegisterData[8~11] = 低4bit 拨码盘位4 (个位): ───────────────────────────────────────────────────────── 注意:74HC165 读出的数据需要取反(~)才是实际的 BCD 值。 BCD 拨码编码表 拨码盘采用加一码(偏移二进制编码),物理拨码位置与实际数字存在 +1 偏移: 物理拨码位置 BCD 二进制 (DCBA) 实际显示数字 0 0001 0 1 0010 1 2 0011 2 3 0100 3 4 0101 4 5 0110 5 6 0111 6 7 1000 7 8 1001 8 9 1010 9 超出 0001~1010 范围(含 0000)视为读取错误,触发错误状态(状态 0)。 技术参数总表 项目 参数 主控芯片 ESP8266 (ESP-01/NodeMCU) 开发框架 Arduino 程序语言 C/C++ (Arduino) 代码行数 约 840 行(优化后) 移位寄存器 2× 74HC165 级联(16 位并行转串行) BCD 输入 4 位拨码开关(加一码编码,00011010 对应 09) 采样策略 连续 10 次采样,多数表决去抖(≥5 次 LOW 判 LOW) 单次采样耗时 约 80ms(16bit × 250μs × 2 × 10) 数码管接口 UART 软串口(GPIO3 RX / GPIO1 TX),9600 baud,8N1 数码管帧长 13 字节(4 位显示)/ 8 字节(单位显示) 通信校验 Modbus CRC16(查表法,256 字节查找表) 云平台 阿里云 IoT(MQTT 协议) 上报周期 1 秒(由定时器中断驱动) 上报属性 Dialer_Number(拨码值)、Dialer_Switch_whole_Control(使能状态) 下行控制 Dialer_Switch_whole_Control(0=禁用, 1=启用) 配网方式 WiFi AP 模式 + Captive Portal(DNS 劫持) AP 名称 Network Configuration AP IP 192.168.4.1 WiFi 超时 20 秒(超时自动重启,不重新配网) 配网等待 上电 12 秒无操作自动进入 自动重连 WiFi.setAutoReconnect(true) 定时器 ESP8266 硬件定时器,1 秒中断 中断函数 IRAM_ATTR TimerHandler() 按键 2 个(复位 D0/GPIO16,确认 D1/GPIO5) 按键去抖 20ms 延时 + 状态标志位防冲突 指示灯 2 个 LED(D2/GPIO4 复位灯,D3/GPIO0 确认灯) 数据存储 EEPROM(WiFi 凭据 96 字节 + 控制标志 1 字节,起始地址 2448) 恢复出厂 双键长按 3 秒,清除 WiFi 配置并重启 依赖库 TimerInterrupt_Generic、SoftwareSerial、EEPROM、ESP8266WiFi、DNSServer、ESP8266WebServer、AliyunIoTSDK 代码及更多详情请看Code代码文件夹

最近写的

更多文章

函数指针和指针函数的区别与使用(C语言小白也能看懂)

C语言 2026-04-26 236 次浏览

本文用“先结论后示例”的方式讲清 C 语言中最容易混淆的两个概念:函数指针和指针函数。你将学会如何快速区分两者、正确声明与调用、在回调和函数表中的实际用法,以及常见错误(类型不匹配、返回局部变量地址等)的规避方法。文末附可直接编译运行的完整示例。