stm32之1602+DHT11+继电器

描述:

1、DHT11监测温室度,并显示到1602液晶上

2、通过串口打印(或通过蓝牙模块在手机上查看)

3、当温度大于24度时,开启继电器。小于时关闭继电器(继电器可连接风扇---假想O(∩_∩)O哈哈~)

stm32之1602+DHT11+继电器_第1张图片

一、配置

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

你可能感兴趣的:(stm32,嵌入式硬件,单片机)