Labview+STM32无线温湿度采集

news2025/7/23 15:19:32

一.介绍

该项目采用正点原子的STM32ZET6精英板+DHT11温湿度模块+泽耀科技的无线串口作为下位机,Labview+无线串口作为上位机读取下位机发来的数据并处理。

泽耀科技的产品是我在开发过程中经常用到的,他们不仅产品做的非常不错,而且资料齐全售后也非常给力,后期有技术支持,大大减少开发难度。这个项目中就用到了泽耀科技提供的STM32的驱动代码,不仅有STM32的例程,还有STM8,51,arduino的都有,主流单片机的例程几乎全覆盖,非常友好!!!

 


二.STM32代码讲解

无线串口型号:AS32-TTL-1W

无线串口波特率:115200

工作模式:透传模式(发送端和接收端的模块地址和信道必须相同)

这里dht11相关的就不多做赘述了,主要的问题就在与泽耀科技提供的例程中的发送数据的函数的第一个参数是发送数据的首地址,这个地方一开始没太注意,卡了好几天。所以在接收到无线串口发来的温湿度数据后不能在无线串口发送函数中处理数据。

想了解dht11的可以参考我之前的文章:(326条消息) DHT11温湿度模块入门_LJX的博客-CSDN博客

LoRa.c(选自泽耀科技例程)

#include "LoRa.h"

//串口发送函数
void drv_uart_tx_bytes( uint8_t* TxBuffer, uint8_t Length )
{
	while( Length-- )
	{
		while( RESET == USART_GetFlagStatus( UART_PORT, USART_FLAG_TXE ));
		UART_PORT->DR = *TxBuffer;
		TxBuffer++;
	}
}

//串口接收函数
uint8_t drv_uart_rx_bytes( uint8_t* RxBuffer )
{
	uint8_t l_RxLength = 0;
	uint16_t l_UartRxTimOut = 0x7FFF;
	
	while( l_UartRxTimOut-- )			
	{
		if( RESET != USART_GetFlagStatus( UART_PORT, USART_FLAG_RXNE ))
		{
			*RxBuffer = (uint8_t)UART_PORT->DR;
			RxBuffer++;
			l_RxLength++;
			l_UartRxTimOut = 0x7FFF;	
		}
		if( 100 == l_RxLength )
		{
			break;		
		}
	}
	
	return l_RxLength;					
}


DHT11.c

#include "stm32f10x.h"
#include "DHT11.h"c
#include "delay.h"
#include "stdio.h"
#include "usart.h"
#include "led.h"
#include "LoRa.h"
#include <string.h> 

uint16_t Rxbuff[5]={0};   //接收温湿度数据
uint8_t head[1] = {0xFF};  //帧头
uint8_t tail[1] = {0xEE};  //帧尾

uint8_t data2[1] = {0}; //接收到温湿度数据后进行处理
uint8_t data3[1] = {0};
uint8_t data4[1] = {0};
uint8_t data5[1] = {0};

void DHT11_GPIO_Init(void)   //IO输出模式
{
    GPIO_InitTypeDef  GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB,  ENABLE);

	GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin  =  GPIO_Pin_11;
	GPIO_InitStructure.GPIO_Speed =  GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    GPIO_SetBits(GPIOB,  GPIO_Pin_11);
}

void DHT11_GPIO_Init1(void)  //IO输入模式
{
    GPIO_InitTypeDef  GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB,  ENABLE);

	GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_IPD;
	GPIO_InitStructure.GPIO_Pin  =  GPIO_Pin_11;
	GPIO_InitStructure.GPIO_Speed =  GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    GPIO_SetBits(GPIOB,  GPIO_Pin_11);

}

static uint8_t DHT11_Back()
{
   uint8_t i =200;
	
	 while(read_data && i--); //等待低电平到来
	 i= 200;
	 while(!read_data && i--); //等待高电平到来
   return 0;
}

void DHT11_Start(void)
{
     data0;
	 delay_ms(20);
	
     data1;
	 delay_us(10);
     DHT11_GPIO_Init1();
     while(DHT11_Back());

}


void DHT11_ReceptionBuff(void)
{
   uint8_t y=1;
	 uint16_t i;
	 uint8_t x;
	 LED1 = 0;
   for(x=0;x<5;x++)
	{
	    i=0;
		  for(y=1;y<9;y++)
		{
		   while(read_data)
			 {
			    __nop();
			 
			 }
			 delay_us(40);
			  while(!read_data)
			 {
			    __nop();
			 
			 }
		    i= i<<1;
			 delay_us(30);
       if(read_data)
			 {
			    i |=1;
			 
			 }
			 while(read_data);
			 
		}
	
	   Rxbuff[x] =i;
		 data2[0] = Rxbuff[0]/10 + 0x30; //处理接收到的数据并赋给要发送的数组
		 data3[0] = Rxbuff[0]%10 + 0x30;
		 data4[0] = Rxbuff[2]/10 + 0x30;
		 data5[0] = Rxbuff[2]%10 + 0x30;
	}
	
}

void DHT11_Check(void)  //检测DHT11是否存在
{ 
	DHT11_GPIO_Init(); //切换成发送模式
	data1;
	data0;
	delay_ms(30);
	data1;
	delay_us(60);        //在60us后读取DHT11状态,如果是低电平则模块存在
	DHT11_GPIO_Init1(); //切换成接收模式
	if(read_data == 0){
		LED0 = 0; //模块存在
	}
}	


void DHT11_UpdateData(void)
{
    DHT11_GPIO_Init();
	DHT11_Start();
	DHT11_ReceptionBuff();
	DHT11_LoRaSend();
}



void DHT11_LoRaSend(void)
{

	drv_uart_tx_bytes((uint8_t*)head,1);  //发送帧头
	drv_uart_tx_bytes((uint8_t*)data2,1); //发送湿度整数位
	drv_uart_tx_bytes((uint8_t*)data3,1);
	drv_uart_tx_bytes((uint8_t*)data4,1); //发送温度整数位
	drv_uart_tx_bytes((uint8_t*)data5,1);
	drv_uart_tx_bytes((uint8_t*)tail,1);  //发送帧尾

	memset(Rxbuff,'\0',5);
}

我的main函数的参考意义不大,直接在例程上改的,对于想做这个项目的小伙伴可以多借鉴DHT11.c的代码。

main.c

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "DHT11.h"
#include "LoRa.h"

#define __AS62_TX_MODE__	//½«ÎÞÏß´®¿ÚÉèÖÃΪ·¢ËÍģʽ.ÆÁ±ÎÔòΪ½ÓÊÕģʽ

#ifdef __AS62_TX_MODE__
	char *pAshining = "ashining";
#else
  uint8_t g_ashining[ 8 ] ={ 'a', 's', 'h', 'i', 'n', 'i', 'n', 'g' };
	uint8_t g_As62_rx_buffer[ 100 ] = { 0 };
	uint8_t g_RxLength = 0;
#endif
	
	
 int main(void)
{		
	initSysTick();
	usart_init();
	LED_Init();	
	delay_ms(2000);
	
	
	while(1)
	{
		DHT11_UpdateData();
		delay_ms(2000);  //小于2s数据无法传输
		
	}	 
}

三.Labview上位机

这个温湿度的上位机大概流程就是打开串口,接收数据,判断帧头帧尾和数据长度,帧头帧尾和数据长度符合设定的要求后截取字符串,转化成数字数值。

串口配置

判断数据长度 

处理数据:首先判断帧头帧尾是否和设定的一样,判断成功后把温度和湿度的数据分离开分别处理,由于数据是不断发送的(每隔两秒发送一次),所以要注意截取字符串的时候也需要动态地取截取,不然你只能收到一次数据。

调用labview中的控件,最终得到可视化数据分析。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/16896.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

远离cmd,拥抱powershell

简介&#xff1a;cmd命令提示符是在操作系统中&#xff0c;提示进行命令输入的一种工作提示符。在不同的操作系统环境下&#xff0c;命令提示符各不相同。 在windows环境下&#xff0c;命令行程序为cmd.exe&#xff0c;是一个32位的命令行程序&#xff0c;微软Windows系统基于W…

动态规划--区间dp

区间dp题目列表&#xff1a;(1)石子合并(2)环形石子合并(3)能量项链(4)加分二叉树(5)凸多边形的划分(6)棋盘分割题目列表&#xff1a; (1)石子合并 在复习石子合并之前&#xff0c;为了直接进入专题“区间dp“&#xff0c;做一个区间dp的基础题&#xff0c;这个题目具有代表性…

1.2 Android 5.0 的特点

和其他版本相比&#xff0c; Android 5.0 的突出特性如下所示。 &#xff08;1&#xff09;全新的 Material 界面设计 Android 5.0 Lollipop 界面设计的灵感来源于自然、 物理学 以及基于打印效果的粗体、图标化的设计&#xff0c;换句话说&#xff0c;它的设 计是一种基于高品…

智慧建筑BIM解决方案-最新全套文件

智慧建筑BIM解决方案-最新全套文件一、建设背景为什么要发展智慧建筑二、思路架构三、建设方案智慧建筑建设时应考虑下面3个方面&#xff1a;1、减少耗能&#xff0c;促进资源利用效率2、优化工作和生活环境3、确保运营安全可靠四、获取 - 智慧建筑BIM全套最新解决方案合集一、…

m超外差单边带接收机的simulink仿真

目录 1.算法概述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法概述 超外差是利用本地产生的振荡波与输入信号混频&#xff0c;将输入信号频率变换为某个预先确定的频率的方法。这种方法是为了适应远程通信对高频率、弱信号接收的需要&#xff0c;在外差原…

基于springboot在线玩具商城交易平台的设计与实现

随着科技创新不断突破玩具界限&#xff0c;特别是随着智能时代到来&#xff0c;电子游戏的兴起对传统玩具行业带来了冲击&#xff0c;智能玩具应运而生&#xff0c;成为新产品方向。智能玩具受消费者青睐&#xff0c; 随着电子商务的发展&#xff0c;其在我国的经济地位越来越…

spring boot酒店会员点餐系统毕业设计源码072005

Springboot酒店会员点餐系统 摘 要 进入21世纪以来&#xff0c;计算机有了迅速的发展。计算机应用、信息技术全面渗透到了人类社会的各个方面&#xff0c;信息化已成为世界经济和社会发展的大趋势。―企业的管理也从人工操作变得更加自动化、智能化和高效化。如果复杂的工作光靠…

PMP大家都是怎么备考的?使用什么工具可以分享一下吗?

这里分享PMP理论中的4个工具&#xff0c;在人生管理和项目管理中是通用的。所有的工具&#xff0c;只有在对的时间&#xff0c;用在对的地方&#xff0c;才能真正指导实践。 项目经理应符合PMI人才三角。分别为&#xff1a;技术项目管理&#xff1b;领导力&#xff1b;战略和…

腾讯云服务器后台重装后需要配置的一些东西

1、adduser 用户名&#xff08;创建普通用户&#xff09; 2、passwd 用户名&#xff08;给普通用户设置密码&#xff09; 3、userdel -r 用户名&#xff08;删除普通用户&#xff09; 4、修改/etc/sudoers文件&#xff08;给普通用户可以提权的机会&#xff09; 5、sudo yum in…

Hive——Hive常用内置函数总结

✅作者简介&#xff1a;最近接触到大数据方向的程序员&#xff0c;刚入行的小白一枚 &#x1f34a;作者博客主页&#xff1a;皮皮皮皮皮皮皮卡乒的博客 &#x1f34b;当前专栏&#xff1a;Hive学习进阶之旅 &#x1f352;研究方向&#xff1a;大数据方向&#xff0c;数据汇聚&a…

vdsm:添加接口调试demo

目录 添加API接口 2.添加api方法 3.Vdsm-api.yml添加参数 暴露jsonrpc接口&#xff1a; 需要重启vdsmd vdsm-client 调试 本文通过添加一个配置ovs全局参数的接口 添加API接口 文件路径&#xff1a;API.py 2.添加api方法 文件路径&#xff1a;network/api.py 3.Vdsm-ap…

4.2——Node.js的npm和包

目录初识node.jsnode.js的安装和查看版本使用node命令对js文件运行窗口的快捷键fs 文件系统模块fs.readFile() 方法写入文件fs.writeFile()案例——考试成绩整理路径问题path 路径模块路径拼接path.join()获取路径中的文件名path.basename()获取路径中的文件扩展名path.extname…

用Python的Django框架来制作一个RSS阅读器

Django带来了一个高级的聚合生成框架&#xff0c;它使得创建RSS和Atom feeds变得非常容易。 什么是RSS&#xff1f; 什么是Atom&#xff1f; RSS和Atom都是基于XML的格式&#xff0c;你可以用它来提供有关你站点内容的自动更新的feed。 了解更多关于RSS的可以访问 http://www…

[附源码]SSM计算机毕业设计足球队管理系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

[附源码]java毕业设计企业记账系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

QT 发布文章遇到问题解决方案

提供了两种可以发布 Qt 程序的方案&#xff0c;建议使用第二种直接生成对应的文件&#xff0c;直接打包就可以 1. 手动复制需要的文件到运行目录下 我们写完 QT 程序当然是要发布或者发给其他需要用到的人&#xff0c;由于找不到Qt6Core.dll,无法继续执行代码,打开 realease …

Python基础语法

一、字面量&#xff1a;在代码中&#xff0c;被写下来的固定的值 二、注释 /增加代码的可读性 单行注释 #空格注释文字内容 &#xff08;加空格只是规范&#xff09;#右边 多行注释 一对三个双引号 """注释内容""" 三、变量 -->程序运行时…

Linux基础内容(12)—— 程序地址空间

目录 1.误区和它的由来 2.虚拟地址的证明 3.虚拟地址的实现 1.虚拟空间的解释 2.操作系统管理和规划虚拟空间 3.虚拟地址与物理地址的联系 4.多进程的虚拟地址解释 5.磁盘中可执行文件的地址 6.进程地址空间出现的原因 接上面内容 Linux基础内容&#xff08;11&#…

在排序数组中查找元素的第一个和最后一个位置 - 力扣中等

在排序数组中查找元素的第一个和最后一个位置 题目链接 给你一个按照非递减顺序排列的整数数组 nums&#xff0c;和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target&#xff0c;返回 [-1, -1]。 你必须设计并实现时间…

2022 年 10 月 NFT 报告

Sept. 13, 2022, Daniel Data Source: October 2022 NFT Report (ENG) 10 月对于区块链来说是一个相对沉闷的月份&#xff0c;没有巨大的市场波动、项目启动或融资轮次。 由于宏观环境依然严峻&#xff0c;NFT 市场自夏末以来继续停滞不前。 从上个月的报告开始&#xff0c;F…