基于stm32的温湿度检测案例串口通信屏显示

Posted 旭日初扬

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于stm32的温湿度检测案例串口通信屏显示相关的知识,希望对你有一定的参考价值。

文章目录

前言

一、串口通信屏幕

二、DHT11测试效果与说明

 三、读入数据

四、串口及中断配置

五、屏幕上显示数据

5.1、屏幕内嵌指令

5.2、静态数据

5.3、动态数据

六、效果


前言

因为stm32f042最小单片机系统外部引脚资源较少,故选取另外一款最小单片机系统stm32f103c8t6,承接前一章基于stm32的温湿度检测案例(一),加入串口通信屏幕将DHT11采集的数据在串口屏幕上显示。使用USART2向屏幕发送数据,屏幕将接收到的数据解析并显示。

一、串口通信屏幕

1.44 寸集成串口屏是一款串口屏模块,点阵分辨率是 128x128。其内置国标一级、二级简 体中文字库和英文 ASCII 字符集,同时开放内部点阵 DDRAM,能够在屏幕上的任意位置显示 图片及图形。硬件上它提供 UART 接口方式,接线简单。

二、DHT11测试效果与说明

DHT11温度湿度检测模块,是检测不到温湿度的小数位滴。

 三、读入数据

#include "public.h"

/*********************************************局部方法声明*********************************************/
void DHT11_GPIO_Out(void);
void DHT11_GPIO_In(void);
void DHT11_StructInit(void);
st_u8 DHT11_ReadByte ( void );

/*********************************************方法定义*********************************************/
/*********************************************初始化部分*********************************************/
void DHT11_StructInit(void)

    DHT11_Data.humi_int=0x00;
	  DHT11_Data.humi_deci = 0x00;
	  DHT11_Data.humi_int = 0x00;
	  DHT11_Data.temp_deci=0x00;
	  DHT11_Data.check_sum = 0x00;


void DHT11_Init(void)

	DHT11_StructInit();
  DHT11_GPIO_Out();
	//GPioset(Debug1_DHT11_PORT, Debug1_DHT11_PIN,1);
	DHT11_H;

/*********************************************方法定义*********************************************/
//  输出配置
void DHT11_GPIO_Out(void)

	//  时钟   端口  引脚  输出模式  通用推挽输出  
GPIOxInit(Debug1_DHT11_RCC,Debug1_DHT11_PORT,Debug1_DHT11_PIN,GPIO_Mode_Out_PP);


//  输入配置
void DHT11_GPIO_In(void)

	//   时钟  端口  引脚  输入模式   GPIO_Mode_IN_FLOATING
  // GPIOxInit(Debug1_DHT11_RCC,Debug1_DHT11_PORT,Debug1_DHT11_PIN,GPIO_Mode_IN_FLOATING);
	
	// GPIO_Mode_IPU
	GPIOxInit(Debug1_DHT11_RCC,Debug1_DHT11_PORT,Debug1_DHT11_PIN,GPIO_Mode_IPU);


/* 
 * 从DHT11读取一个字节,MSB先行
 */
 st_u8 DHT11_ReadByte ( void )

	st_u8 i, temp=0;
	for(i=0;i<8;i++)    
		 
		/*每bit以50us低电平标置开始,轮询直到从机发出 的50us 低电平 结束*/  
		while(DHT11_Input==Bit_RESET);
		/*DHT11 以26~28us的高电平表示“0”,以70us高电平表示“1”,
		 *通过检测 x us后的电平即可区别这两个状 ,x 即下面的延时 
		 */
		delay_us(40); //延时x us 这个延时需要大于数据0持续的时间即可	   	  
		if(DHT11_Input==Bit_SET)/* x us后仍为高电平表示数据“1” */
		
			/* 等待数据1的高电平结束 */
			while(DHT11_Input==Bit_SET);

			temp|=(st_u8)(0x01<<(7-i));  //把第7-i位置1,MSB先行 
		
		else	 // x us后为低电平表示数据“0”
					    
			temp&=(st_u8)~(0x01<<(7-i)); //把第7-i位置0,MSB先行  高位先出。  高位 1111 1111  地位  左边高位,右边地位  
		
	
	return temp;


/*
 * 一次完整的数据传输为40bit,高位先出
 * 8bit 湿度整数 + 8bit 湿度小数 + 8bit 温度整数 + 8bit 温度小数 + 8bit 校验和 
 */
st_u8 DHT11_Read_TempAndHumidity(DHT11_Data_TypeDef *DHT11_Data)
  
	/*输出模式*/
	DHT11_GPIO_Out();
	/*主机拉低*/
	DHT11_L;
	/*延时18ms*/
	delay_ms(18);
	/*总线拉高 主机延时30us*/
	DHT11_H; 
	delay_us(30);   //延时30us
	/*主机设为输入 判断从机响应信号*/ 
	DHT11_GPIO_In();
	/*判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行*/   
	if(DHT11_Input==Bit_RESET)     
	
		/*轮询直到从机发出 的80us 低电平 响应信号结束*/  
		while(DHT11_Input==Bit_RESET);
		/*轮询直到从机发出的 80us 高电平 标置信号结束*/
		while(DHT11_Input==Bit_SET);
		/*开始接收数据*/   
		DHT11_Data->humi_int= DHT11_ReadByte();
		DHT11_Data->humi_deci= DHT11_ReadByte();
		DHT11_Data->temp_int= DHT11_ReadByte();
		DHT11_Data->temp_deci= DHT11_ReadByte();
		DHT11_Data->check_sum= DHT11_ReadByte();
		/*读取结束,引脚改为输出模式*/
		DHT11_GPIO_Out();
		/*主机拉高*/
		DHT11_H;
		/*检查读取的数据是否正确*/
		// 一次完整的数据传输为40bit,高位先出。数据格式:8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据+8bit校验和
		if(DHT11_Data->check_sum == DHT11_Data->humi_int + DHT11_Data->humi_deci + DHT11_Data->temp_int+ DHT11_Data->temp_deci)
			return SUCCESS;
		else 
			return ERROR;
	
	else
		return ERROR;

/*********************************************测试部分*********************************************/
void DHT11_Test1(void)

	   //int humi_buf[3];  //  湿度
	   //int temp_buf[3];  //  温度
  /*调用DHT11_Read_TempAndHumidity读取温湿度,若成功则输出该信息*/
			if( DHT11_Read_TempAndHumidity (&DHT11_Data) == SUCCESS)
			
				//printf("\\r\\n读取DHT11成功!\\r\\n\\r\\n湿度为%d.%d %RH ,温度为 %d.%d℃ \\r\\n",\\
				// DHT11_Data.humi_int,DHT11_Data.humi_deci,DHT11_Data.temp_int,DHT11_Data.temp_deci);
				//  湿度转 十六进制转换为十进制
				//humi_buf[0]= DHT11_Data.humi_int/100+0x30;
				//humi_buf[0]= DHT11_Data.humi_int/10+0x30;
			//	humi_buf[1]= DHT11_Data.humi_int%10+0x30;
				//humi_buf[2]= '0';
					printf("湿度:%d\\r\\n 温度:%d\\r\\n",DHT11_Data.humi_int,DHT11_Data.temp_int);
				//  湿度 十六进制转换为十进制
			 	//temp_buf[0]= DHT11_Data.humi_int/100+0x30;
				//temp_buf[1]= DHT11_Data.humi_int/10+0x30;
				//temp_buf[2]= DHT11_Data.humi_int%10+0x30;
			
				//printf("温度:%d\\r\\n",DHT11_Data.humi_int);
						
			else
			
				printf("Read DHT11 ERROR!\\r\\n");
			
			
		 delay_ms(20000);

四、串口及中断配置

/********************************************* 中断优先级配置*********************************************/
//  中断分组配置  NVIC_PriorityGroupConfig
void NVIC_PG_Config(st_u32 PG)

/*
	中断分组号      抢占式优先级    子优先级配置/响应式优先级     分配位数
	0               0                  0-15                      抢0bit  响4bit(1111)
	1               0~1                0~7                       抢1bit  响3bit(0111) 
	2               0~3                0~3                       抢2bit  响2bit(0011)
	3               0~7                0~1                       抢3bit  响1bit(0001)
	4               0~15               0                         抢4bit  响0bit(0000)
  特征:在抢占式优先级相同的情况下,高响应优先级的中断优先被响应。
        抢占式优先级数值越小,优先级越高
	*/
  if(PG==NVIC_PriorityGroup_0)
	
	   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
	else if(PG==NVIC_PriorityGroup_1)	
		 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
	else if(PG==NVIC_PriorityGroup_2) 
		 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
		else if(PG==NVIC_PriorityGroup_3) 
	  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
	else if(PG==NVIC_PriorityGroup_4)    
	  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
	else
	    printf("%s","没有使用中断分组\\r\\n");
	

//  中断优先级配置
void NVIC_Config(st_u8 IRQn,st_u8 IRQChannelPriority,st_u8 IRQChannelSubPriority)

  NVIC_InitTypeDef NVIC_InitStructure;
  NVIC_InitStructure.NVIC_IRQChannel = IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =IRQChannelPriority;   //  抢占式优先级 0~15
	NVIC_InitStructure.NVIC_IRQChannelSubPriority =IRQChannelSubPriority ;      //  子优先级 0~15
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);


/*********************************************串口配置*********************************************/
void USART_Config(st_u32 BaudRate,USART_TypeDef* USARTx)

	USART_InitTypeDef USART_InitStructure;
	if(USARTx==USART1)RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
	if(USARTx==USART2)RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
	/* USART1工作模式配置 */
	USART_InitStructure.USART_BaudRate = BaudRate;	//波特率设置:
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;	//数据位数设置:8位
	USART_InitStructure.USART_StopBits = USART_StopBits_1; 	//停止位设置:1位
	USART_InitStructure.USART_Parity = USART_Parity_No ;  //是否奇偶校验:无
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;	//硬件流控制模式设置:没有使能
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//接收与发送都使能
	USART_Init(USARTx, &USART_InitStructure);  //初始化USART1
	// 使能串口接收中断
	USART_ITConfig(USARTx, USART_IT_RXNE, ENABLE);	
	//  使能中断发送
	USART_ITConfig(USARTx, USART_IT_TXE, ENABLE);
	USART_Cmd(USARTx, ENABLE);       // USART使能


五、屏幕上显示数据

5.1、屏幕内嵌指令

//  清屏背景颜色
void LCD_CLR(void)

    st_u8 LCDDIR[]="CLR(15);";
		LCDUSART2_TX(LCDDIR);
	  delay_ms(100);


//  背景颜色
void LCD_SBC(void)

  st_u8 LCDSBC[] = "SBC(15);";
	LCDUSART2_TX(LCDSBC);
	delay_ms(100);


//  设置背景灯光的亮度
void LCDBL(void)

	// 0~255  0亮度最高  255 关闭显示
  st_u8 LCDBL[]="BL(30);";
	LCDUSART2_TX(LCDBL);
	delay_ms(100);

5.2、静态数据

//  静态数据
void TempHumi_static(void)

	   //unsigned char i;
	//  指令设置  清除背景内容   竖向布局   白色背景颜色
  	 unsigned char PreInit[] = "CLR(15);DIR(0);SBC(15)";
		 unsigned char PreInit1[] = "CLR(15);DIR(0);SBC(15)";
		 
		 LCDUSART2_TX(PreInit);
	   delay_ms(100);
		 
		 LCDUSART2_TX(PreInit1);
	   delay_ms(100);
		 
		 
//		 TempHumi_STPE(0x09);
//		  delay_ms(100);
//		 
//		 TempHumi_STPE(0x0A);
//		  delay_ms(100);
//		 
//	   TempHumi_STPE(0x0B);
//	   delay_ms(100);
//		 
//		 TempHumi_STPE(0x0C);
//	   delay_ms(100);
//		 
//	   TempHumi_STPE(0x0D);
//     delay_ms(100);
//		 
//     TempHumi_STPE(0x0E);
//  	 delay_ms(100);
//		 
//     TempHumi_STPE(0x0F);
//	   delay_ms(100);
      for(unsigned char i=0x09;i<=0x0F;i++)
		 
		 TempHumi_STPE(i);
      delay_ms(100);
		 
//  温湿度界面  静态
void TempHumi_STPE(st_u8 TempHumi_SINFO)

  unsigned char Style[] = "PL(0,62,127,62,1);PL(60,0,60,128,1)";  
	unsigned char HD_V[]  = "DC16(0,0,'HD_V:',1)";
	unsigned char SF_V[]  = "DC16(64,0,'SF_V:',1)";
	unsigned char Temp[] = "DC16(0,64,'温度:',1)";
	unsigned char Temp_unit[] ="DC16(20,84,'℃',1)";
	unsigned char Humi[] = "DC16(64,64,'湿度:',1)";
	unsigned char Humi_unit[] = "DC16(100,84,'%',1)";

  switch(TempHumi_SINFO)

	  case 0x01:
		case 0x02:
		case 0x03:
		case 0x04:
		case 0x05:
		case 0x06:
		case 0x07:
		case 0x08:
		case 0x09:     //  湿度单位
		LCDUSART2_TX(Humi_unit);
	  TempHumi_SINFO++;
		break;
		
		case 0x0A:      //  温度单位
		LCDUSART2_TX(Temp_unit);
	  TempHumi_SINFO++;
		break;
		
		case 0x0B:      //  样式
		LCDUSART2_TX(Style);
	  TempHumi_SINFO++;
  	break;
		

	case 0x0C:    //  硬件版本
		//LCDUSART2_TX("DC16(0,0,'HD_V:',1);");
	LCDUSART2_TX(HD_V);
	TempHumi_SINFO++;
	break;
	
	case 0x0D:   //  软件版本
		LCDUSART2_TX(SF_V); 
	TempHumi_SINFO++;
	 break;
	
	case 0x0E:   //  温度
			LCDUSART2_TX(Temp);
	    TempHumi_SINFO++;
	break;
	
	case 0x0F:  //  湿度
		LCDUSART2_TX(Humi);
	  TempHumi_SINFO++;
	break;

	default:
	//LCD_Show=TempHumi_State;
	break;
	
 

5.3、动态数据

//  动态数据
void TempHumi_Dynamic_Step(st_u8 Debug_Data)

  switch(Debug_Data)
	
		case 0x01:
		case 0x02:
		case 0x03:
		case 0x04:
		case 0x05:
		case 0x06:
		
	  case 0x07:
		case 0x08:
		case 0x09:
		case 0x0A:
		case 0x0B:
		case 0x0C:   // 硬件版本显示
			    
			   	GetHD_ID(ChipUniqueID[0],0,20);
		      break;
		
		case 0x0D:   // 软件版本
			   LCDDisSfVersion();
		     break;
		
		case 0x0E:   // 温度显示
       //  TempHumi_Value(0,84,DHT11_Data.temp_int); 
       //  TempHumi_Data_DC16Boxf(DHT11_Data.temp_int,0,84);
			TempHumi_Data_DC16Boxf(Thic.Temp,0,84);    
			  break;
				
		case 0x0F:   // 湿度显示
      // TempHumi_Data_DC16Boxf(Thic.Humi,64,84);	
       //  TempHumi_Data_DC16Boxf(Thic.Humi,64,84);
     //  TempHumi_Value(64,84,DHT11_Data.humi_int);
		Data_Show_Position(Thic.Humi,64,84);
		    break;
	
			
		default:
			break;
	
//  动态数据
void TempHumi_Dynamic(void)

	   TempHumi_Dynamic_Step(0x0C);  //  硬件版本号
	   delay_ms(100);
	
	   TempHumi_Dynamic_Step(0x0D);  //  软件件版本号
	   delay_ms(100);
	
	   TempHumi_Dynamic_Step(0x0E);  //  温度显示
	   delay_ms(1000);               //  延时太短只上一个数据
	 
	   TempHumi_Dynamic_Step(0x0F);  //  湿度显示
	   delay_ms(1000);
	
	  
	 
//	 for(unsigned char i=0x0C;i<=0x0F;i++)
//	
//	 TempHumi_Dynamic_Step(i);
//		 delay_ms(100);
//	
	

	   

六、效果

效果视频

以上是关于基于stm32的温湿度检测案例串口通信屏显示的主要内容,如果未能解决你的问题,请参考以下文章

基于stm32的温湿度检测案例串口通信屏显示

基于stm32的温湿度检测案例

基于stm32的温湿度检测案例

基于stm32的温湿度检测案例

基于STM32的OLED屏显示AHT20采集的温湿度数据

如何利用STM32和迪文串口屏以及WIFI模组进行数据交互