当前位置: 首页 > news >正文

【代码开源】基于STM32的智能路灯控制系统设计

项目说明

本项目以 STM32 为核心控制器,构建智能路灯控制系统。系统利用 BH1750 采集环境光照强度,结合人体红外传感器(如 HC-SR501)判断人员活动情况,从而实现“按需照明”。

控制策略为:当环境光照强度低于设定阈值且检测到有人活动时,开启路灯;当光照强度高于阈值或长时间无人时,自动关闭路灯。

在通信方面,引入 ESP-01S 模块,通过 MQTT 协议将设备运行状态(包括光照值、人员检测状态及路灯开关状态)实时上报至服务器,实现远程监控与数据采集。

项目开源链接见文章结尾。

项目硬件连接

系统以 STM32 为核心控制单元,各外设模块连接关系如下:

  • 人体红外传感器(HC-SR501)
    信号输出端连接至 STM32 的PA0 引脚,用于检测人体活动并产生中断或状态输入信号。工作跳帽接到 L上,不重复触发。

  • 光照传感器(BH1750)
    SCL → PB6
    SDA → PB7
    ADDR 引脚接地,器件地址配置为低地址模式。

  • Wi-Fi 通信模块(ESP-01S)
    连接至 STM32 的USART3 串口,用于 MQTT 数据通信;
    同时使用USART1作为调试串口,便于系统调试与日志输出。

  • LED 指示灯(模拟路灯)
    连接至 STM32 的PC13 引脚,用于模拟路灯的开关状态输出。

ESP01S固件状态

ESP01S 需要使用带 MQTT 固件的版本。在安信可的官网可以找到,使用1471号固件,他也有对应的说明文档。如果嫌麻烦,可以直接看我文件中提供的文档和说明。
ESP01S官网:docs.ai-thinker.com/esp8266/

软件设计

软件设计的整体流程是:
1、初始化各个设备。
2、外部中断触发检测人体红外状态。每次状态保存一段时间。
3、每隔1S检测一次光照强度。并且使用MQTT上报数据。

voidmain_control_init(void){intret=0;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);// 常用外设初始化bsp_usart1_init(115200);bsp_usart3_init(115200);delay_init();led_init();hc_sr50x_init();soft_i2c_init(SOFT_I2C1);bh1750_init(BH1750_ADDR_L,BH1750_CONT_H_RES);bh1750_set_mtreg(BH1750_ADDR_L,69);printf("SmartLed V1.2 Build Time: %s %s\r\n",__DATE__,__TIME__);esp_init();ret=esp_at_cmd(&esp01s_device,"AT+RST","OK",2000);printf("AT+RESET resp: %s\n",esp01s_device.resp_buf);if(ret!=0)while(1);delay_ms(500);ret=esp_at_cmd(&esp01s_device,"AT","OK",2000);printf("AT resp: %s\n",esp01s_device.resp_buf);if(ret!=0)while(1);ret=esp_at_cmd(&esp01s_device,"AT+CWMODE=1","OK",2000);printf("AT+CWMODE resp: %s\n",esp01s_device.resp_buf);if(ret!=0)while(1);ret=esp_at_cmd(&esp01s_device,"AT+CWJAP=\"CMCC-XJmL\",\"sR62HiPv\"","OK",5000);printf("AT+CWJAP resp: %s\n",esp01s_device.resp_buf);if(ret!=0)while(1);ret=esp_at_cmd(&esp01s_device,"AT+MQTTUSERCFG=0,1,\"lqh\",\"lqh\",\"123\",0,0,\"\"","OK",2000);printf("AT+MQTTUSERCFG resp: %s\n",esp01s_device.resp_buf);if(ret!=0)while(1);ret=esp_at_cmd(&esp01s_device,"AT+MQTTCONN=0,\"broker.emqx.io\",1883,0","OK",5000);printf("AT+MQTTCONN resp: %s\n",esp01s_device.resp_buf);if(ret!=0)while(1);ret=esp_at_cmd(&esp01s_device,"AT+MQTTSUB=0,\"/lqh/mqtttest/led\",0","OK",2000);printf("AT+MQTTSUB resp: %s\n",esp01s_device.resp_buf);if(ret!=0)while(1);}voidmain_control_loop(void){uint16_tcount=0;floatlux;uint8_thc_sr50x_delay_state=0;uint32_thc_sr50x_state_delay_count=0;charmqtt_put_message[256]={0};uint8_tled_state=0;while(1){count++;// 如果有人 hc_sr50_state 这个状态在中断中置 1if(hc_sr50_state==1){// 有人就处于状态延迟状态hc_sr50x_delay_state=1;hc_sr50x_state_delay_count=0;hc_sr50_state=0;printf("Someone has entered the area\r\n");}// 如果处于状态延迟状态if(hc_sr50x_delay_state==1){hc_sr50x_state_delay_count++;if(hc_sr50x_state_delay_count>200)// 将每次的有人进入状态至少保持 2S{// 2S后清空这个 状态延迟状态hc_sr50x_state_delay_count=0;hc_sr50x_delay_state=0;}}if(count%100==0)// 1S 读取一次光照强度{if(bh1750_read_lux(BH1750_ADDR_L,BH1750_CONT_H_RES,&lux)==0){printf("continuous Light = %.2f lux hc_sr50x_delay_state:%d\r\n",lux,hc_sr50x_delay_state);}// 光照小于一定值,且有人处于状态延迟状态时,打开灯if(lux<500&&hc_sr50x_delay_state==1){led_on();led_state=1;}else{// 其他情况关灯led_off();led_state=0;}// 上报状态信息sprintf(mqtt_put_message,"AT+MQTTPUB=0,\"/lqh/mqtttest/led_state\",\"%d\",0,0",led_state);esp_at_cmd(&esp01s_device,mqtt_put_message,"OK",2000);printf("AT+MQTTSUB resp: %s\n",esp01s_device.resp_buf);sprintf(mqtt_put_message,"AT+MQTTPUB=0,\"/lqh/mqtttest/lux\",\"%.2f\",0,0",lux);esp_at_cmd(&esp01s_device,mqtt_put_message,"OK",2000);printf("AT+MQTTSUB resp: %s\n",esp01s_device.resp_buf);sprintf(mqtt_put_message,"AT+MQTTPUB=0,\"/lqh/mqtttest/hc_sr50x_delay_state\",\"%d\",0,0",hc_sr50x_delay_state);esp_at_cmd(&esp01s_device,mqtt_put_message,"OK",2000);printf("AT+MQTTSUB resp: %s\n",esp01s_device.resp_buf);}// 读取 ESP 接收intret=esp_read_line(&esp01s_device);if(ret==0){printf("Received line: %s",esp01s_device.resp_buf);esp_dispatch_line(&esp01s_device,(char*)esp01s_device.resp_buf);}else{// 没有完整行数据,继续等待}delay_ms(10);}}voidUSART3_IRQHandler(void){if(USART_GetITStatus(USART3,USART_IT_RXNE)!=RESET){uint8_tdata=USART_ReceiveData(USART3);ringbuffer_putchar(&esp01s_device.rx_rb,data);USART_ClearITPendingBit(USART3,USART_IT_RXNE);}}

代码中使用需要修改的部分,一个是连接初始化,一个是MQTT部分。
首先连接WIFI需要是自己的WIFI。

ret=esp_at_cmd(&esp01s_device,"AT+CWJAP=\"CMCC-XJmL\",\"sR62HiPv\"","OK",1000);printf("AT+CWJAP resp: %s\n",esp01s_device.resp_buf);

还有就是MQTT的连接订阅主题,尽量使用自己的,如果你使用我代码中的,如果你是用的自己服务器还好,但是如果使用的是我这个公用的,那大家可能会冲突。

项目开源链接

本项目资料包单片机软件总工程开源,设计文档,使用文档部分开源。开源部分有讲解视频方便大家跑起来理解。可先查看代码下在自己环境中是否能够正常使用,再决定后续操作。
软件开源链接:https://gitee.com/snqx-lqh/ProjectOpenSourceReleasePage。
在发布页中,找到开源项目集,对应项目获取方式。

http://www.jsqmd.com/news/669626/

相关文章:

  • 2026年比较好的机场防护栅栏/金属网片防护栅栏/刺网防护栅栏厂家选择指南 - 品牌宣传支持者
  • 【Linux】进程(1)基础
  • Pixel Aurora Engine 算法原理浅析:从扩散模型到惊艳生成
  • 2026年知名的SJA丝杆升降机/非标丝杆升降机/伞齿轮丝杆升降机/SWL丝杆升降机生产厂家推荐 - 行业平台推荐
  • FlowState Lab 赋能智能运维:服务器异常波动检测与根因分析
  • 2026年口碑好的锥齿轮螺旋升降机/滚珠螺旋升降机/螺旋升降机/多台同步螺旋升降机品牌厂家推荐 - 品牌宣传支持者
  • Wan2.2-I2V-A14B一文详解:Diffusers pipeline定制与自定义scheduler实践
  • 一招解决 H5 远程收款:动态支付链接优势
  • FireRedASR-AED-L效果展示:同一人不同语速(慢速/常速/快速)识别对比
  • Kotaemon效果展示:实测文档问答,回答精准度惊艳
  • 项目做了一半想重写?这套前端架构让你少走3年弯路
  • Linux 的 runcon 命令
  • 别再只用RMSE了!用evo的绘图功能给你的SLAM论文加个“颜值Buff”
  • 2026年比较好的哈尔滨水泥制品/哈尔滨水泥制品彩砖/哈尔滨水泥制品流水槽实力工厂推荐 - 行业平台推荐
  • 云计算Linux——基础操作命令(一)
  • 事务四大特性(ACID)、四大隔离级别、Spring 七大事务传播行为
  • 一文讲清,排班管理系统是什么意思?排班管理系统如何优化企业用工?
  • 忍者像素绘卷参数详解:Steps=20/30/50对16-Bit像素块清晰度影响可视化分析
  • STM32F407驱动无刷电机:用CubeMX和HAL库快速实现SimpleFOC开环调速
  • 对于所有翻译从业者而言,唯有认清自身定位,敬畏信息、坚守操守、精进专业,才能在翻译之路上行稳致远。
  • 告别枯燥协议文档:用Wireshark抓包和Python脚本‘看见’JESD204B的链路建立过程
  • 2026年靠谱的哈尔滨步道板流水槽/哈尔滨步道板水泥盖板/黑龙江步道板水泥砖销售厂家推荐 - 品牌宣传支持者
  • Phi-3-vision多模态模型体验:用Chainlit前端轻松实现图片问答
  • AI开发-python-langchain框架(--提取pdf中的图片 )
  • Pi0机器人模型亲测体验:Web界面操作简单,动作生成快速
  • 别再手动算相位增量了!Vivado 2023.2里用Xilinx DDS IP核生成1MHz正弦波的保姆级教程
  • 前端手记(二):Axios 封装与 FastAPI 联调
  • 2026年靠谱的低噪音电机/电机定制/螺杆真空泵配套电机/定制化电机公司口碑推荐 - 行业平台推荐
  • AGI自主编写0day Exploit仅需23秒?实测GPT-5、Claude-4、Qwen-AGI在CVE-2024-XXXX系列漏洞上的武器化效率对比
  • 丹青幻境在儿童美育中的应用:AI辅助古诗配画与想象力激发教学实践