野火STM32F429开发板温湿度LED点阵显示系统
- 一、测试项目内容:
拿到野火STM32F429开发板有一段时间了,经过测试,对开发板自带的5.0寸显示屏还是印象非常深刻,触摸灵敏,显示细腻,但是对于常用的数据显示来说,采用LED点阵大屏还是比较合适,显示的内容多,数据丰富,可红绿蓝三色显示。咱们今天就利用STM32F429开发板来做一个大屏的温湿度显示系统。
- 二、HT11温湿度模块:
本项目的温湿度传感器采用DHT11温湿度传感器,DHT11是一款有已校准数字信号输出的温湿度传感器。 其精度湿度+-5%RH,温度+-2℃,量程湿度20-90%RH, 温度0~50℃。野火的开发板上直接有DHT11的插座,直接把温湿度传感器插在开发板J6端子上即可。
DTH11的数据管脚和STM32F429的PE2端口相连接,原理图如下:
DHT驱动代码如下: /**************************************************************************************
* 描 述 : 从DHT11读取一个字节,MSB先行
* 入 参 : 无
* 返回值 : u8
**************************************************************************************/
static u8 Read_Byte(void)
{
u8 i, temp=0;
for(i=0;i<8;i++)
{
while(DHT11_DATA_IN()==Bit_RESET); //每bit以50us低电平标置开始,轮询直到从机发出 的50us 低电平 结束
/*DHT11 以26~28us的高电平表示“0”,以70us高电平表示“1” */
delay_us(40); //延时40us,这个延时需要大于数据0持续的时间即可
if(DHT11_DATA_IN()==Bit_SET) // 40us后仍为高电平表示数据“1”
{
while(DHT11_DATA_IN()==Bit_SET); //等待数据1的高电平结束
temp|=(u8)(0x01<<(7-i)); //把第7-i位置1,MSB先行
}
else // 40us后为低电平表示数据“0”
{
temp&=(u8)~(0x01<<(7-i)); //把第7-i位置0,MSB先行
}
}
return temp;
}
/**************************************************************************************
* 描 述 : 一次完整的数据传输为40bit,高位先出
* 入 参 : 8bit 湿度整数 + 8bit 湿度小数 + 8bit 温度整数 + 8bit 温度小数 + 8bit 校验和
* 返回值 : u8
**************************************************************************************/
u8 Read_DHT11(DHT11_Data_TypeDef *DHT11_Data)
{
DHT11_Mode_Out_PP(); //输出模式
DHT11_DATA_OUT(LOW); //主机拉低
delay_ms(18); //延时18ms
DHT11_DATA_OUT(HIGH); //总线拉高 主机延时30us
delay_us(30); //延时30us
DHT11_Mode_IPU(); //主机设为输入 判断从机响应信号
if(DHT11_DATA_IN()==Bit_RESET) //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
{
while(DHT11_DATA_IN()==Bit_RESET); //轮询直到从机发出 的80us 低电平 响应信号结束
while(DHT11_DATA_IN()==Bit_SET); //轮询直到从机发出的 80us 高电平 标置信号结束
/*开始接收数据*/
DHT11_Data->humi_int= Read_Byte();
DHT11_Data->humi_deci= Read_Byte();
DHT11_Data->temp_int= Read_Byte();
DHT11_Data->temp_deci= Read_Byte();
DHT11_Data->check_sum= Read_Byte();
DHT11_Mode_Out_PP(); //读取结束,引脚改为输出模式
DHT11_DATA_OUT(HIGH); //主机拉高
/*检查读取的数据是否正确*/
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;
}
}
- 三、LED点阵模块:
LED点阵显示模块:本项目采用4块3.75高亮红绿双色表贴双色单元板组成的128X64大小的点阵显示模块。
LED控制卡:常用大屏一般都是通过LED控制卡来控制点阵显示内容,控制卡厂家提供了丰富的菜单方便我们生成显示各式各样的数据。本项目采用的是串口控制卡,STM32F429的串口和控制卡直接进行串口通信,STM32F429开发板采集DHT11温湿度传感器的温湿度数据,然后通过串口发送给LED控制卡,控制卡再把数据显示到点阵大屏上。
STM32F429开发板的串口6和LED控制卡的串口通过串口线连接,注意选择RXD和TXD交叉的线缆即可。LED控制卡和STM32F429之间的串口通信遵守 Modbus-RTU 协议通信
其中CRC校验采用的是CRC16校验方式,其C语言代码如下:
/* \brief Modbus 校验值计算
* \param [in] ptr : 数据流指针(报文的起始字节)
* \param [in] len : 要计算的数量流长度(报文长度-2)
* \return CRC校验值 */
uint16_t CRC16_Modbus(const uint8_t *ptr,uint8_t len)
{
uint16_t crc = 0xFFFF;
uint8_t i;
while(len--)
{
crc ^= *ptr;
for(i=0; i<8; i++)
{
if(crc&1)
{
crc >>= 1;
crc ^= 0xA001;
}
else crc >>= 1;
}
ptr++;
}
return(crc);
}
STM32F429的串口6初始化一定记得把校验设置成偶校验,否则会和控制卡通信不上。
USART_InitStructure.USART_Parity = USART_Parity_Even;//偶校验位
STM32F429串口发送函数如下:
/***************** 发送一个字节 **********************/
void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch)
{
/* 发送一个字节数据到USART */
USART_SendData(pUSARTx,ch);
/* 等待发送数据寄存器为空 */
while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);
}
STM32F429把采集到的温湿度数据按该协议定时通过串口发送给控制卡,控制卡把收到的数据进行刷新显示,实现温湿度数据的大屏显示。显示效果如下:
实际显示效果很棒,很醒目。测试的时候正好下雨,所以湿度比较大。
- 四、总结:
通过本项目,测试了野火STM32开发板的温湿度读取功能及STM32串口数据收发功能,同时也学会了如何在LED大屏上显示温湿度。大屏显示在一些公共场合用的比较多,如公园温湿度、负氧离子浓度、商场户外广告、工厂展示板等。我们就可以把自己想显示的任何数据通过大屏显示,提高产品的整体效果。