技能梳理17@Rasphberry Pi 3B+stm32+dht11+lora+onenet
dht11检测出到温湿度,通过lora传输到树莓派,树莓派传输到onenet,收发处理用了两块stm32开发板
1、项目简介
2、实现逻辑
#从机stm32检测到温湿度通过lora传给主机stm32
#主机stm32将数据通过串口发送给树莓派
#树莓派将数据发送给onenet
3、应用场景
#远程线上检测温湿度
#近程(几公里)检测温湿度
4、核心代码梳理
//stm32主从机程序(比较简答)
/* USER CODE BEGIN 0 */
//temp hump
void DHT11_IO_IN(void) {GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.Pin = DHT11_Pin;GPIO_InitStructure.Mode = GPIO_MODE_INPUT;HAL_GPIO_Init(GPIOA,&GPIO_InitStructure);
}void DHT11_IO_OUT(void) {GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.Pin = DHT11_Pin;GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOA,&GPIO_InitStructure);
}void DHT11_Rst(void) {DHT11_IO_OUT(); //DHT11_DQ_OUT_LOW; //HAL_Delay(20); //DHT11_DQ_OUT_HIGH; //delay_us(30); //
}uint8_t DHT11_Check(void) {uint8_t retry=0;DHT11_IO_IN();while (DHT11_DQ_IN && retry<100) {retry++;delay_us(1);};if(retry>=100)return 1;else retry=0;while (!DHT11_DQ_IN&&retry<100) {retry++;delay_us(1);};if(retry>=100)return 1;return 0; //???DHT11??0
}uint8_t DHT11_Read_Bit(void) {uint8_t retry=0;while(DHT11_DQ_IN&&retry<100) {retry++;delay_us(1);}retry=0;while(!DHT11_DQ_IN&&retry<100) {retry++;delay_us(1);}delay_us(40);if(DHT11_DQ_IN)return 1;else return 0;
}uint8_t DHT11_Read_Byte(void) {uint8_t i,dat;dat=0;for (i=0; i<8; i++) {dat<<=1;dat|=DHT11_Read_Bit();}return dat;
}uint8_t DHT11_Read_Data(uint16_t *temp,uint16_t *humi) {uint8_t buf[5];uint8_t i;DHT11_Rst();if(DHT11_Check()==0) {for(i=0; i<5; i++) {buf[i]=DHT11_Read_Byte();}if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4]) {*humi=(buf[0]<<8) + buf[1];*temp=(buf[2]<<8) + buf[3];}} else return 1;return 0;
}uint8_t DHT11_Init(void) {DHT11_Rst();return DHT11_Check();
}
/* USER CODE END 0 *//*** @brief The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_USART1_UART_Init();MX_USART2_UART_Init();/* USER CODE BEGIN 2 */
#ifdef TXwhile(DHT11_Init()) {HAL_Delay(500);}
#endif__HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);//open uart1 RXNE/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */
#ifdef TX
//check temp humpDHT11_Read_Data(&temperature,&humidity);tx_data[6] = temperature>>8;tx_data[7] = temperature&0xff;tx_data[8] = humidity>>8;tx_data[9] = humidity&0xff;HAL_UART_Transmit(&huart1, (uint8_t *)&tx_data, 10, 0xFFFF);HAL_Delay(2000);
#endif#ifdef RXif(rx_flag){rx_flag = 0;HAL_UART_Transmit(&huart2, (uint8_t *)&tx_data, 10, 0xFFFF);__HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);//open uart1 RXNE}#endifHAL_Delay(100);HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);}/* USER CODE END 3 */
}//树莓派端程序
def build_payload(type, payload):datatype = typepacket = bytearray()packet.extend(struct.pack("!B", datatype))if isinstance(payload, str):udata = payload.encode('utf-8')length = len(udata)packet.extend(struct.pack("!H" + str(length) + "s", length, udata))return packet# 当客户端收到来自服务器的CONNACK响应时的回调。也就是申请连接,服务器返回结果是否成功等
def on_connect(client, userdata, flags, rc):global temglobal humprint("连接结果:" + mqtt.connack_string(rc))#上传数据# 定义上传数据的json格式 该格式是oneNET规定好的 按格式修改其中变量即可body = {"datastreams": [{"id": "temp", # 对应OneNet的数据流名称"datapoints": [{"value": tem # 数据值}]},{"id": "hump", # 对应OneNet的数据流名称"datapoints": [{"value": hum # 数据值}]}]}json_body = json.dumps(body)packet = build_payload(TYPE_JSON, json_body)client.publish("$dp", packet, qos=1) #qos代表服务质量# 从服务器接收发布消息时的回调。
def on_message(client, userdata, msg):print("温度:"+str(msg.payload,'utf-8')+"°C")#当消息已经被发送给中间人,on_publish()回调将会被触发
def on_publish(client, userdata, mid):print("mid:" + str(mid))# 发送和保存传感器数据相关程序 #
def threadDATAPRO(): # 线程数据处理threaddatapro = threading.Thread(target=dataCheck)threaddatapro.start()while True:if not threaddatapro.is_alive(): # 如果发送和保存线程卡死 隔60s再次开启threaddatapro = threading.Thread(target=dataCheck)threaddatapro.start()time.sleep(60)def dataCheck(): # 检测global temglobal hums0=serial.Serial("/dev/ttyAMA0",9600) # 树莓派端# s0=serial.Serial("/dev/ttyUSB1",9600) # 树莓派USB端# s0 = serial.Serial("COM9", 9600) # PC端dataarr = []datagdellStage = 0charcount = 0temp = 0while True:while s0.inWaiting():try:temp = s0.read()except Exception as e:passif datagdellStage == 2 and temp: # 如果有数据 存到dataarrdataarr.append(temp)if len(dataarr) >= charcount:print('main line 50 收到的数据:', dataarr)if dataarr[1] == b'a':tem = dataarr[6][0] + dataarr[7][0]*0.1hum = dataarr[8][0] + dataarr[9][0]*0.1if datagdellStage == 1 and temp: # 如果有数据if temp == b'a': # data:datagdellStage = 2charcount = 10dataarr.append(temp)passif datagdellStage != 2:datagdellStage = 0charcount = 0dataarr = []temp = '\x00'if temp == b'd': # 收到帧头datagdellStage = 1charcount = 0dataarr = []dataarr.append(temp)time.sleep(0.01)if __name__ == '__main__':global temglobal humtem = 0hum = 0threadDataPro = threading.Thread(target=threadDATAPRO)threadDataPro.setDaemon(True) # 守护线程threadDataPro.start()client = mqtt.Client(client_id=DEV_ID, protocol=mqtt.MQTTv311)client.on_connect = on_connectclient.on_publish = on_publishclient.on_message = on_messageclient.username_pw_set(username=PRO_ID, password=AUTH_INFO)client.connect('183.230.40.39', port=6002, keepalive=120)# client.loop_forever()client.loop_start()# schedule.every(3).seconds.do(dataSend) # 每几秒发送一次数据while True:#schedule.run_pending() #定时器,在while True死循环中,schedule.run_pending()是保持schedule一直运行,# 去查询上面那一堆的任务,在任务中,就可以设置不同的时间去运行# 定义上传数据的json格式 该格式是oneNET规定好的 按格式修改其中变量即可body = {"datastreams": [{"id": "temp", # 对应OneNet的数据流名称"datapoints": [{"value": tem # 数据值}]},{"id": "hump", # 对应OneNet的数据流名称"datapoints": [{"value": hum # 数据值}]}]}json_body = json.dumps(body)packet = build_payload(TYPE_JSON, json_body)client.publish("$dp", packet, 1)time.sleep(3)
5、部分参考资料
#要熟悉树莓派的烧录、编译及其它环境配置相关基础知识
#用到的硬件是stm32最小开发板
6、注意事项
#主从机程序用的一套,通过宏定义区分//#define TX #define RX
#树莓派那端使用的是python编写
#树莓派和onenet端通信是mqtt方式
#lora直接用的透传模块,不需要二次开发
完整可运行项目地址
技能梳理17@Rasphberry Pi 3B+stm32+dht11+lora+onenet相关推荐
- 技能梳理37@stm32+按键+光耦+锁存+串行转并行+继电器
技能梳理37@stm32+按键+光耦+锁存+串行转并行+继电器 1.项目简介 2.实现逻辑 3.应用场景 #主从机有线控制 #开关操作 4.核心代码梳理 //根据按下的按键执行相应的操作 void h ...
- Raspberry Pi 3B 安装Miniconda
Raspberry Pi 4B 安装 Miniconda 查看内存信息 查看系统信息 查看树莓派的Linux版本 下载 miniconda 安装 Miniconda3 更新配置文件 查看安装的 con ...
- raspberry pi 3B 树莓派 安装tensorflow
raspberry pi 3B 树莓派 安装tensorflow 这两天买了raspberry pi 3b回来折腾着玩,拿到手装好系统后就开始安装树莓派版本的TensorFlow,这个安装过程也是踩了 ...
- Raspberry Pi 3B 安装NoneBot2
Raspberry Pi 3B 安装NoneBot2 查看系统信息 下载 go-cqhttp release文件 解压并运行 修改 config.yml 配置文件 安装 nonebot2 需要解决的问 ...
- 树莓派python3.6 tensorflow_raspberry pi 3B 树莓派 安装tensorflow
这两天买了raspberry pi 3b回来折腾着玩,拿到手装好系统后就开始安装树莓派版本的TensorFlow,这个安装过程也是踩了无数的坑,折腾了两天才装好.一开始用pip安装,但是pip2,pi ...
- 树莓派要mysql的密码_树莓派raspberry Pi 3B+系统中安装mysql过程中不提示输入密码,安装完后如何设置密码...
树莓派raspberry Pi 3B+安装mysql未提示输入密码,安装后修改mysql密码默认密码 使用mysql -uroot -p 命令连接mysql时,报错 pi@raspberrypi:/ ...
- 【业务建模_5】数据分析师技能梳理
[业务建模_5]数据分析师技能梳理 大纲 1.固定报表提炼 产品侧 活动侧 重点功能侧 2.固有分析模块工具 事件+多维度 漏斗+多维度 留存+多维度 3.临时需求+SQL模板+临时报表 4.用户画像 ...
- 树莓派3B Qt+dht11读取温湿度并写入数据库202005(8)
内容 本文介绍:使用树莓派3B Qt+dht11读取温湿度,以一定时间间隔更新数据,显示于界面,并写入数据库 硬件:树莓派3B,温湿度传感器dht11,杜邦线 1.建工程 建立工程后点击mainwin ...
- 树莓派 Raspberry Pi 3B+ 无线路由器, WEB 服务器(Nginx,PHP,Sqlite3),UART 串口数据采集
目标: 测试四核 A53 树莓派 Raspberry Pi 3B+ 无线路由器, 轻量级WEB 服务器(Nginx,PHP,Sqlite3),UART 串口数据采集性能 初始配置,部分选项需要sudo ...
最新文章
- python回归分析预测模型_Python与线性回归模型预测房价
- 最简单的基于FFMPEG的视频编码器(YUV编码为H.264)
- 前端知识区别和学习路线_个人收藏
- D - 邂逅明下 HDU - 2897(有点水平的巴什博奕)
- django20:BBS网页设计/注册功能/验证码代码
- 1079. Total Sales of Supply Chain (25)
- 图谱实战 | 安全领域知识图谱建设与典型应用场景总结
- Java工作笔记-类型转换的一种思路(前后端分离、反射)
- JS中的关于类型转换的性能优化
- Registry新建以及版本
- angularjs指令(一)
- Linux 查看本机串口方法
- 2021 年高教社杯全国大学生数学建模竞赛题目
- 用acdess制作html文件,使用ACDSee制作图片注释
- 单片机之硬件 软件仿真
- Mybatis 札记(三、分页、注解开发)麻雀虽小,五脏俱全
- Web中间件常见安全漏洞
- 如何冻结Excel中的行
- 《Optimising the selection of samples for robust lidar camera calibration》论文解读
- 低代码和无代码开发的4个安全问题