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相关推荐

  1. 技能梳理37@stm32+按键+光耦+锁存+串行转并行+继电器

    技能梳理37@stm32+按键+光耦+锁存+串行转并行+继电器 1.项目简介 2.实现逻辑 3.应用场景 #主从机有线控制 #开关操作 4.核心代码梳理 //根据按下的按键执行相应的操作 void h ...

  2. Raspberry Pi 3B 安装Miniconda

    Raspberry Pi 4B 安装 Miniconda 查看内存信息 查看系统信息 查看树莓派的Linux版本 下载 miniconda 安装 Miniconda3 更新配置文件 查看安装的 con ...

  3. raspberry pi 3B 树莓派 安装tensorflow

    raspberry pi 3B 树莓派 安装tensorflow 这两天买了raspberry pi 3b回来折腾着玩,拿到手装好系统后就开始安装树莓派版本的TensorFlow,这个安装过程也是踩了 ...

  4. Raspberry Pi 3B 安装NoneBot2

    Raspberry Pi 3B 安装NoneBot2 查看系统信息 下载 go-cqhttp release文件 解压并运行 修改 config.yml 配置文件 安装 nonebot2 需要解决的问 ...

  5. 树莓派python3.6 tensorflow_raspberry pi 3B 树莓派 安装tensorflow

    这两天买了raspberry pi 3b回来折腾着玩,拿到手装好系统后就开始安装树莓派版本的TensorFlow,这个安装过程也是踩了无数的坑,折腾了两天才装好.一开始用pip安装,但是pip2,pi ...

  6. 树莓派要mysql的密码_树莓派raspberry Pi 3B+系统中安装mysql过程中不提示输入密码,安装完后如何设置密码...

    树莓派raspberry Pi 3B+安装mysql未提示输入密码,安装后修改mysql密码默认密码 使用mysql -uroot -p 命令连接mysql时,报错 pi@raspberrypi:/ ...

  7. 【业务建模_5】数据分析师技能梳理

    [业务建模_5]数据分析师技能梳理 大纲 1.固定报表提炼 产品侧 活动侧 重点功能侧 2.固有分析模块工具 事件+多维度 漏斗+多维度 留存+多维度 3.临时需求+SQL模板+临时报表 4.用户画像 ...

  8. 树莓派3B Qt+dht11读取温湿度并写入数据库202005(8)

    内容 本文介绍:使用树莓派3B Qt+dht11读取温湿度,以一定时间间隔更新数据,显示于界面,并写入数据库 硬件:树莓派3B,温湿度传感器dht11,杜邦线 1.建工程 建立工程后点击mainwin ...

  9. 树莓派 Raspberry Pi 3B+ 无线路由器, WEB 服务器(Nginx,PHP,Sqlite3),UART 串口数据采集

    目标: 测试四核 A53 树莓派 Raspberry Pi 3B+ 无线路由器, 轻量级WEB 服务器(Nginx,PHP,Sqlite3),UART 串口数据采集性能 初始配置,部分选项需要sudo ...

最新文章

  1. python回归分析预测模型_Python与线性回归模型预测房价
  2. 最简单的基于FFMPEG的视频编码器(YUV编码为H.264)
  3. 前端知识区别和学习路线_个人收藏
  4. D - 邂逅明下 HDU - 2897(有点水平的巴什博奕)
  5. django20:BBS网页设计/注册功能/验证码代码
  6. 1079. Total Sales of Supply Chain (25)
  7. 图谱实战 | 安全领域知识图谱建设与典型应用场景总结
  8. Java工作笔记-类型转换的一种思路(前后端分离、反射)
  9. JS中的关于类型转换的性能优化
  10. Registry新建以及版本
  11. angularjs指令(一)
  12. Linux 查看本机串口方法
  13. 2021 年高教社杯全国大学生数学建模竞赛题目
  14. 用acdess制作html文件,使用ACDSee制作图片注释
  15. 单片机之硬件 软件仿真
  16. Mybatis 札记(三、分页、注解开发)麻雀虽小,五脏俱全
  17. Web中间件常见安全漏洞
  18. 如何冻结Excel中的行
  19. 《Optimising the selection of samples for robust lidar camera calibration》论文解读
  20. 低代码和无代码开发的4个安全问题

热门文章

  1. EXCEL的绝对定位,相对定位
  2. 点云压缩现状及发展趋势
  3. 人脸识别进课堂?印度学生:不新鲜了!
  4. 基于STM32的BMS电池管理系统源代码配官方参考原理图-带实时操作系统
  5. 【每日新闻】就在年底!北京五环内将实现5G信号全覆盖!
  6. Navicat之服务器监控,进行查询进程监控
  7. PCI设备驱动与虚拟网卡驱动源码分析
  8. YARN, MR History Server和Spark History Server
  9. 看了一下bootstrap css
  10. 云服务器 Redis 集群搭建