描述:
1、DHT11监测温室度,并显示到1602液晶上
2、通过串口打印(或通过蓝牙模块在手机上查看)
3、当温度大于24度时,开启继电器。小于时关闭继电器(继电器可连接风扇---假想O(∩_∩)O哈哈~)
一、配置
1602引脚:
- D0...D7 <---> A0...A7
- RS <---> B1
- RW <---> B2
- EN <---> B10
- V0 <---> GND(正视看不到显示结果,需要侧着看。否则需要接可调电阻)
DHT11引脚:
- DATA <---> B7
继电器引脚:
- IN<--->B6
二、main函数
int main(void)
{
char msg[16];
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
lcd_1602_init();
show_line(0, 0, "loading...");
while (1)
{
// 根据温度决定是否开启继电器
if(datas[2] >= 24)
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);
else
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);
// 开启温湿度检测
trig_dht();
receive_data();
memset(msg, 0, sizeof(msg));
sprintf(msg, "Temp: %d.%d", datas[2], datas[3]);
show_line(0, 0, msg);
sprintf(msg, "Temp: %d.%d\r\n", datas[2], datas[3]);
printf(msg);
sprintf(msg, "Humi: %d.%d", datas[0], datas[1]);
show_line(1, 0, msg);
sprintf(msg, "Humi: %d.%d\r\n", datas[0], datas[1]);
printf(msg);
HAL_Delay(1000);
}
}
项目很简单,这里不过度解释。。。
三、问题点总结
- 继电器不要接到5V,要接到3v3,否则不管电平高低都会开启
- DHT11引脚在cubeMX 中配置成输入,否则不工作
- 通过GPIOA->ODR,可以直接往寄存器写数据
- 1602可以不加忙时检测,依然可以正常工作
- 1602的写时序和51的部分延时时间不太一样,必须要加长时间才能保证正常显示
void write_cmd(char cmd) {
RS_W_0();
RW_W_0();
EN_W_0();
WRITE_DATA(cmd);
delay_us(1); // 这里保持1us即可
EN_W_1();
delay_us(1000); // 这里时间要设置长些,否则不会显示,和51还有些不同
EN_W_0();
}
完整代码Github