首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
AI 模拟面试
简历
求职
学习
基础学习课
实战项目课
求职辅导课
专栏&文章
竞赛
搜索
我要招人
发布职位
发布职位、邀约牛人
更多企业解决方案
AI面试、笔试、校招、雇品
HR免费试用AI面试
最新面试提效必备
登录
/
注册
牛客牛客牛牛客a
门头沟学院 Java
发布于湖北
关注
已关注
取消关注
@IaiY:
【嵌入式项目-1】智能家居管理系统
作者简介和专栏内容见专栏介绍:https://www.nowcoder.com/creation/manager/columnDetail/0eL5bM 麻烦看到贴子的伙伴点点赞大家点赞订阅支持下,提前祝各位offer多多,有问题评论区见~~ 来源:牛客网项目描述 通过STM32单片机、ESP8266无线模块和阿里云物联网平台,基于MQTT协议实现上位机对电器的远程控制和实时监测功能。主要工作包括: 实现单片机通过串口连接ESP8266,使用AT指令自动配置wifi模块并和云服务器建立TCP连接; 基于MQTT协议实现Connect报文、Subscribe报文、Publish报文的封装、发送和响应,实现设备开关的远程控制; 通过定时器获取各类传感器(DHT11)实时数据,并上传至云服务器实现实时监测。 背景:这个项目是在参与了学校课程的一项大作业,大概用时一个月的时间,通过STM32单片机、ESP8266无线模块和阿里云物联网平台,基于MQTT协议实现上位机对电器的远程控制和实时监测功能。 思路:整个的重点就在实现单片机和开发板之间的通信和数据交互的处理。这里的数据交互根据MQTT协议实现Connect报文、Subscribe报文、Publish报文的封装、发送和响应,实现设备开关的远程控制;另一方面通过定时器获取各类传感器(DHT11)实时数据,并上传至云服务器实现实时监测。 逻辑图 项目难点与解决方案 环形缓冲区:一开始用数组保存发送的数据和接收的数据,但测试时发现会出现数据覆盖的问题。缓冲区这里使用二维数组和指针来构造和控制大小为7,每一条命令放置在一个格子中,前两位用16进制表示命令长度方便分析和计算。主函数中通过两个指针指向是否相同判断是否存在待发送或待接收的数据,执行后续发送和响应的动作。 多组数据接收:通过USART2中断接收wifi模块返回的信息,云服务器通过wifi返回的是多组数据,需要分隔开依次接收防止覆盖。为了避免阻塞和丢失使用多个二维数组接收缓冲区,利用时间间隔分隔不同命令,故在串口中断中引入计时器time4。若间隔小于40ms说明是同一组数据则不断重置时间,超过40ms说明一组数据发送完毕,进入定时器中断事件,将接收到的数据放入缓冲区,并清空标志位和重置计时。 保活机制:使用中发现一段时间不使用后远程控制失效,发现建立的TCP连接100s后无数据就会断开,为此引入心跳机制(TCP保活机制),使用定时器+Ping报文保活:30s发送一次报文,如果响应成功就维持并修改flag=1,不成功flag++,定时器中检测到flag==1时说明上次未响应,改变发送间隔再重新发送,收到就置0,还没收到继续++,3的话就置connectflag = 0主函数就会重启 connectflag:在主函数中根据连接是否成功执行不同操作;在检查返回报文时返回失败可至标志位为0重启连接;在串口2中断中判断接收的数据来自哪里选择放到不同缓冲区 模拟常见问题 为什么缓冲区人工设置前两位放大小,哪里用到了? 项目详述 项目开始前需要准备什么? 安装Keil5 MDK 并注册(盗版) 安装器件支持包并在keil中选择:arm芯片型号太多 安装STLink/jlink驱动:keil5自带:arm/stlink/usbdriver 安装USB转串口驱动:CH340驱动 stm32F10x固件库放置项目目录:封装了库函数 stm32启动文件.s:程序从启动文件开始 system文件:配置时钟的 内核寄存器描述文件core.cm3 库函数:内核/外设库函数放lib conf, it:库函数包含关系,中断 放user 建立不同文件夹放不同类文件 在include path中添加各个文件夹路径 工程选项define添加宏定义 USE_STDPERIPH_DRIVER 如何进行调试? 写OELD语句进行调试 用串口工具使用printf来调试 fputc:重定向c库函数printf 到串口 fgetc:重定向c库函数scanf 到串口 禁止使用半主机模式 主函数 初始化:delay + 两个串口引脚 + LED + TIM4 + DHT11 + 云服务器 + NVIC中断 wifi连接前:清空wifi缓冲区,关闭定时器开始连接。 wifi连接后:至连接标志位,清空wifi缓冲区,构建connect和subscribe报文 发送阶段:检查缓冲区固定报头,有相关数据就通过串口发送(mqtt_TxData == u2_TxData),并移动mqtt_TxOutPtr。 接收阶段:检查接收缓冲区中的固定报头对各个报文确认信号作出回应 命令响应:对服务器发来的publish报文进行处理,根据指令完成对应单片机操作。 标志位 Connect_flag:初始至0,连接后至1,中间发送需要重启时至0. ConnectPack_flag:Connect确认报文标志位,初始置为0,连接成功置为1。 Ping_flag:使用中发现一段时间不使用后远程控制失效,发现建立的TCP连接100s后无数据就会断开,为此引入心跳机制(TCP保活机制),使用定时器+Ping报文保活:30s发送一次报文,如果响应成功就维持并修改flag=1,不成功flag++,定时器中检测到flag==1时说明上次未响应,改变发送间隔再重新发送,收到就置0,还没收到继续++,3的话就置connectflag = 0主函数就会重启。 DHT11相关 引脚怎么接 Data单总线协议,输入输出时需要转换引脚输入输出,GPIO PA5 推挽输出至高低电平即可 具体操作 数据包由 5Byte(40Bit)组成。数据分小数部分和整数部分,一次完整的数据传输为40bit,高位先出。主机只需要读即可。 初始化(DHT11_RST) 复位:引脚变输出-> 主机拉低至少18ms(输出低电平)->释放总线(输出高电平)->延时20-40us(复位信号发送完毕) 响应:DHT11检测到复位信号后会自动拉低总线80us再拉高80us表示响应->主机分别在100us内检测是否有低电平信号+高电平信号到达确认是否响应。都有响应表示初始化成功。 读时序(Read_Bit, Read_Byte, Read_Data):以高电平长短定义数据位是0是1。首先拉低电平50us,拉高26-28us表示0;持续70us表示1。 Read_Bit:依次检测低电平和高电平后,延迟35us(28 <35<70)检测是0还是1 读取1位 Read_Byte:由于高位先出,不断左移读到的数据并和新的数据做 | 运算 Read_Data:调用DHT11_RST启动读取,调用read_Byte一次接收5个字节,最后一位校验位,成功后赋值给变量。 定时发送(Sensor_DHT11):此函数调用readdata, 放在time2的中断函数中30s调用一次获取一次传感器数据,按格式封装后放入发送缓冲区(mqtt_PublishQs0:计算剩余长度拼接好publish报文)。 最后1位传送完后,DHT11拉低总线50us表示数据传输完毕,随后总线由上拉电阻拉高进入空闲状态。 函数调用关系 TIM2_IRQHandler(定时器中断函数) -> Sensor_DHT11 -> Read_Data -> DHT11_RST + Read_Byte(Read_Bit) ESP8266相关 使用指南 工作模式 station:作为终端连接其他路由器,不能被其他设备连接(无热点功能的手机) AP:允许其他设备接入,不能连其他路由器。(等价于路由器) AP+Station 透传模式(SerialNet)将本地异步串口通信转换成基于TCP/UDP协议的网络通信。其主要目的是将串行通信的简单设备实现在网络上的通信,而这些设备不需要做任何改变。 引脚怎么接 共8个引脚 3V3接电, GND共地,烧固件时GPIO0接地 USART2_TX-WIFI_RXT USART2_RX-WIFI_TXD 其他不接 把esp当单片机时,就用USB_TTL接他的TX和RX 具体操作 使用USB-TTL (下载器)给ESP8266刷固件 连接STM32后使用AT指令由单片机通过串口发送指令(u2_printf)给esp,根据返回值(WiFi_RX_BUF == USART2_RxBuff:在串口中断中捕获模块的返回值)一步步发送上边8条语句。 WIFI_Config0:对复位后(第一条)返回语句ready的检测,检测到后依次发送上述指令 WIFI_Config:发送指定指令并检测返回值是否为规定值 WIFI_Router & WIFI_ConnectTCP:配置路由器和TCP的输入不统一,且需要的时间较久,故单独处理 WIFI_Connect:依次执行9条指令输出当前状态,返回0为成功 函数调用关系 main -> WIFI_Connect -> 其他所有 串口相关 相关知识 名称 引脚 双工 时钟 电平 设备 USART TX、RX 全双工 异步 单端 点对点 I2C SCL、SDA 半双工 同步 单端 多设备 SPI SCLK、MOSI、MISO、CS 全双工 同步 单端 多设备 CAN CAN_H、CAN_L 半双工 异步 差分 多设备 USB DP、DM 半双工 异步 差分 点对点 没有时钟线的通信只能异步:约定好采样频率,帧头帧尾来对齐 波特率:串口通信速率 异步时序要求严格,一般不用软件模拟串口 单端电平必须共地,才能找到相对地的电平 USART是个硬件外设,按照串口协议产生和接收电平信号 串口参数与时序 数据的发送和接收都是外设自动完成, 只需要调用send_data和receive_data发送和接收即可uint16_t TX引脚输出定时翻转的高低电平,RX引脚定时读取引脚的高低电平,发送前要加上起始停止校验 八股中可按江协视频补充hex和文本数据包等其他知识点 使用情况 引脚编号 引脚名称 默认复用功能 项目中使用 12 PA2-WIFI_RXT USART2_TX 连接wifi模块收发报文和wifi配置 13 PA3-WIFI_TXD USART2_RX 21 PB10 USART3_TX 22 PB11 USART3_RX 30 PA9-RXD USART1_TX 通过USB_TTL连接电脑用来调试 31 PA10-TXD USART1_RX 江协那边用的是STLink.,在串口实验部分检测发送时也使用了重定向,不过调用了自己的send_string 串口1实现和电脑的通信,用来调试,没有用到串口接收,所以没有中断调用receive_data TXE是TDR寄存器数据转移到移位寄存器后置位;TC是在TXE置位后,并且数据帧传输完成;在串口中断中使用了 中断 开启RXNE标志位到NVIC的输出:USART_ITConfig(USART2,USART_IT_RXNE,ENABLE); 即RDR寄存器有值,不为空就会产生中断 配置NVIC:分组;通道;使能;优先级 具体操作 开启串口1和GPIO的时钟 GPIO结构体:TX为外设输出脚,配置为复用推挽输出;RX为外设输入脚,配置为浮空输入模式(串口波形空闲状态为高电平,不使用下拉输入) 串口结构体:波特率(init会计算对应分频系数并写入BRR寄存器);硬件流控制不开启;串口模式为发送和接收;不要校验;停止位1位;不要校验字长就为8 串口1 实现和电脑通信,为了调试在串口助手显示信息 实现发送数据函数并重定向到串口 串口2 在中断函数中接收wifi发来的数据放至USART2_RxBuff缓冲区中 在串口中断中设置定时器分割不同组数据,并把接收到的数据放到mqtt_RxBuf容器的每一行 主函数中会检测mqtt_RxBuf是否有接收到的数据要处理,有的话就根据信息进行后续操作,最后会移动接收缓冲区指针。(后边来的会覆盖) u2_printf : 向wifi模块发送AT指令 u2_TxData:向服务器发送封装好的报文 ,2之后开始,前两个是计数的 函数调用 main -> u2_TxData -> USART_SendData USART2_IRQHandler -> USART2_RxBuff WIFI_Config -> u2_printf -> USART_SendByte OLED相关 相关知识 使用IIC协议进行通信,单片机发送数据并进行应答接收 分辨率为128(128seg)*64(8页),1个seg对应1Byte数据,每页128Byte; 低位在上,高位在下,一个字符占16*8(2页8seg列) 显示字符时调用ascii码表 OLED_WriteData(OLED_F8x16[Char - ' '][i]) 前8位对应页0的seg,后八位对应页1的seg,分两步发送完成字符的显示。 每一步开始前需要移动光标位置OLED_SetCursor到起始对应的页和
点赞 12
评论 7
全部评论
推荐
最新
楼层
暂无评论,快来抢首评~
相关推荐
05-05 11:47
三江学院 C++
AI Agent面经 1(持续更新)
Q1:⼀句话说明什么是 AI Agent?答案:AI Agent 是以⼤模型为认知核⼼,结合规划、记忆与⼯具调⽤,能在多步交互中根据环境反馈持续决策并完成任务的系统;其本质是 闭环的感知—思考—⾏动 循环,⽽不仅是单次⽂本⽣成。Q2:为什么说 Agent = LLM + Planning + Memory + Tools?缺⼀块会怎样?答案:缺 Planning:容易变成「只会接话」的聊天,⻓任务易跑偏或⼀步登天完不成。缺 Memory:⻓对话会丢线索,多会话⽆法延续⽤户偏好与任务状态。缺 Tools:只能「空谈」,⽆法查实时信息、执⾏代码、改系统状态。LLM 仍是中枢,但单靠 LLM 没有外...
查看3道真题和解析
点赞
评论
收藏
分享
05-07 08:57
门头沟学院 Java
实习第一天不知道干什么?保姆级教学
实习第一天,从来不是“走个流程、搭个环境、看一天文档”就完事了,它决定了你在团队里的初印象,甚至决定了你整个实习的成长上限。今天就给所有开发岗的实习生,整理了这份实习第一天保姆级指南,8件必做的事+5个绝对不能踩的红线,新人直接照着做就行,帮你稳稳度过第一天,给团队留下满分初印象。一、实习第一天,8件必须做的事(按优先级排序)1. 提前做好准备,不打无准备的仗这是所有事情的前提,提前做好准备,能帮你消除90%的紧张感,也能避免第一天手忙脚乱。提前1天确认:入职需要带的材料(身份证、学生证、银行卡复印件等)、上班时间、公司地址、对接人联系方式,别当天迟到、忘带材料,第一印象直接打折扣;提前了解:...
实习第一天,你在干什么
点赞
评论
收藏
分享
05-04 17:20
武汉大学
后端开发简历求拷打
27届,双9后端开发简历求拷打,0实习经历,感觉自己行动太慢了,还有哪的暑期或日常能投吗,还是说直接等秋招找个中小厂😭😭
如何写一份好简历
点赞
评论
收藏
分享
03-20 20:48
字节跳动_测开(实习员工)
六面字节终oc 我的暑期结束了
timeline过年前就约的年后三月份的面试2026 3.05 一面2026 3.10 二面(挂)2026 3.13 二面2026 3.16 hr面2026 3.19 口头oc2026 3.20 offer两道手撕无重复字符最长子串数组中能组成小于n的最大数字记录一下 不多写什么了 同时也感谢平台上以前发面经的佬们记录的一些手撕题目 刷一刷颇有成长
在人才库的椰子很可爱:
看来字节很喜欢出 无重复字符最长子串,我前几天社招一面也是这题
我的OC时间线
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
毕业啦!我们要一起去广州打拼啦!
1.8W
2
...
毕业了,有些话只能藏在心里了
1.5W
3
...
2026春招到底卷成什么样了?填问卷说出真相,最高领200元现金红包
1.3W
4
...
字节 中国交易与广告 后端一面
1.0W
5
...
从阿里被裁到快手升P6,我花了四年
7937
6
...
211本,130投0面,agent应用开发,简历求助!
7918
7
...
别人:阿里 字节 腾讯
6752
8
...
在携程的一天
6307
9
...
从腾讯到阿里感,谢一路走来的自己
5809
10
...
华为暑期实习
5156
创作者周榜
更多
正在热议
更多
#
这个offer值得去吗?
#
32035次浏览
232人参与
#
校招薪资来揭秘
#
960836次浏览
4063人参与
#
在爱玛,骑向未来
#
20447次浏览
395人参与
#
如果春招能重来,我会___
#
29565次浏览
296人参与
#
24秋招避雷总结
#
1020210次浏览
7098人参与
#
你会因为行情,降低找工作标准吗?
#
45392次浏览
328人参与
#
机械人还在等华为开奖吗?
#
339258次浏览
1652人参与
#
米哈游求职进展汇总
#
688749次浏览
3348人参与
#
华为池子有多大
#
178149次浏览
931人参与
#
26届春招投递记录
#
8717次浏览
72人参与
#
25届网易互娱暑实进度
#
109123次浏览
802人参与
#
通信/硬件求职避坑tips
#
172097次浏览
1170人参与
#
记录我的毕业季
#
4760次浏览
120人参与
#
机械人,你的秋招第一份简历被谁挂了
#
268806次浏览
2451人参与
#
远程面试的尴尬瞬间
#
363913次浏览
2062人参与
#
大学最后一个寒假,我想……
#
103324次浏览
846人参与
#
机械求职避坑tips
#
103703次浏览
589人参与
#
你认为小厂实习有用吗?
#
145082次浏览
763人参与
#
运营商笔面经互助
#
219671次浏览
1833人参与
#
美团秋招笔试
#
216449次浏览
1192人参与
#
网易求职进展汇总
#
213195次浏览
1524人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务