代码编织梦想

项目需求

使用温湿度传感器模块(DHT11)获取温度及湿度,并将值显示在LCD1602上,同时通过蓝牙模 块透传到手机

项目框图

4985a05a21abae06d4f48f6c3028feeb.png

硬件清单

DHT11 LCD1602 HC-08 继电器 杜邦线

a. LCD1602介绍及实战

硬件接线

e2dbb700bf4ddf5b1a7bfa467c85953e.png

引脚封装

RS、RW、EN三根信号线经常需要进行拉高/拉低操作,可以进行封装

#define RS_GPIO_Port GPIOB
#define RW_GPIO_Port GPIOB
#define EN_GPIO_Port GPIOB
#define RS_Pin GPIO_PIN_1
#define RW_Pin GPIO_PIN_2
#define EN_Pin GPIO_PIN_10

#define RS_HIGH HAL_GPIO_WritePin(RS_GPIO_Port, RS_Pin, GPIO_PIN_SET)
#define RS_LOW HAL_GPIO_WritePin(RS_GPIO_Port, RS_Pin, GPIO_PIN_RESET)
#define RW_HIGH HAL_GPIO_WritePin(RW_GPIO_Port, RW_Pin, GPIO_PIN_SET)
#define RW_LOW HAL_GPIO_WritePin(RW_GPIO_Port, RW_Pin, GPIO_PIN_RESET)
#define EN_HIGH HAL_GPIO_WritePin(EN_GPIO_Port, EN_Pin, GPIO_PIN_SET)
#define EN_LOW HAL_GPIO_WritePin(EN_GPIO_Port, EN_Pin, GPIO_PIN_RESET)

如何将一个字节的数据按位一次性发送到GPIOA的8个管脚?

GPIOA->ODR = cmd;

代码实现

#define RS_GPIO_Port GPIOB
#define RW_GPIO_Port GPIOB
#define EN_GPIO_Port GPIOB
#define RS_Pin GPIO_PIN_1
#define RW_Pin GPIO_PIN_2
#define EN_Pin GPIO_PIN_10
#define RS_HIGH HAL_GPIO_WritePin(RS_GPIO_Port, RS_Pin, GPIO_PIN_SET)
#define RS_LOW HAL_GPIO_WritePin(RS_GPIO_Port, RS_Pin, GPIO_PIN_RESET)
#define RW_HIGH HAL_GPIO_WritePin(RW_GPIO_Port, RW_Pin, GPIO_PIN_SET)
#define RW_LOW HAL_GPIO_WritePin(RW_GPIO_Port, RW_Pin, GPIO_PIN_RESET)
#define EN_HIGH HAL_GPIO_WritePin(EN_GPIO_Port, EN_Pin, GPIO_PIN_SET)
#define EN_LOW HAL_GPIO_WritePin(EN_GPIO_Port, EN_Pin, GPIO_PIN_RESET)

void Write_Cmd_Func(uint8_t cmd)
{
    RS_LOW;
    RW_LOW;
    EN_LOW;
    GPIOA->ODR = cmd;
    HAL_Delay(5);
    EN_HIGH;
    HAL_Delay(5);
    EN_LOW;
}
void Write_Data_Func(uint8_t dataShow)
{
    RS_HIGH;
    RW_LOW;
    EN_LOW;
    GPIOA->ODR = dataShow;
    HAL_Delay(5);
    EN_HIGH;
    HAL_Delay(5);
    EN_LOW;
}
void LCD1602_INIT(void)
{
    //(1)延时 15ms
    HAL_Delay(15);
    //(2)写指令 38H(不检测忙信号)
    Write_Cmd_Func(0x38);
    //(3)延时 5ms
    HAL_Delay(5);
    //(4)以后每次写指令,读/写数据操作均需要检测忙信号
    //(5)写指令 38H:显示模式设置
    Write_Cmd_Func(0x38);
    //(6)写指令 08H:显示关闭
    Write_Cmd_Func(0x08);
    //(7)写指令 01H:显示清屏
    Write_Cmd_Func(0x01);
    //(8)写指令 06H:显示光标移动设置
    Write_Cmd_Func(0x06);
    //(9)写指令 0CH:显示开及光标设置}
    Write_Cmd_Func(0x0c);
}
void LCD1602_showLine(char row, char col, char *string)
{
    switch(row){
    case 1:
        Write_Cmd_Func(0x80+col);
        while(*string){
            Write_Data_Func(*string);
            string++;
        }
        break;
    case 2:
        Write_Cmd_Func(0x80+0x40+col);
        while(*string){
            Write_Data_Func(*string);
            string++;
        }
        break;
    }
}
main函数里:
//char position = 0x80 + 0x05;
//char dataShow = 'C';
LCD1602_INIT();
//Write_Cmd_Func(position);//选择要显示的地址
//Write_Data_Func(dataShow);//发送要显示的字符
LCD1602_showLine(1,5,"NO.2");
LCD1602_showLine(2,0,"LX handsome");

b. DHT11介绍及实战

硬件接线

DAT -- PB7

注意:PB7既作为输入,也作为输出,则不能直接在CubeMX里配置,需要自己写代码

引脚封装

#define DHT_HIGHT HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET)
#define DHT_LOW HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET)
#define DHT_VALUE HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_7)

代码实现

#define DHT_HIGHT HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET)
#define DHT_LOW HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET)
#define DHT_VALUE HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_7)
uint8_t datas[5];
void delay_us(uint16_t cnt) {
  uint8_t i;
  while (cnt) {
    for (i = 0; i < 10; i++) {}
    cnt--;
  }
}
void DHT_GPIO_Init(uint32_t Mode) {
  GPIO_InitTypeDef GPIO_InitStruct = {
    0
  };
  __HAL_RCC_GPIOB_CLK_ENABLE();
  GPIO_InitStruct.Pin = GPIO_PIN_7;
  GPIO_InitStruct.Mode = Mode;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
void DHT11_Start(void) {
  DHT_GPIO_Init(GPIO_MODE_OUTPUT_PP);
  DHT_HIGHT;
  DHT_LOW;
  HAL_Delay(30);
  DHT_HIGHT;
  DHT_GPIO_Init(GPIO_MODE_INPUT);
  while (DHT_VALUE);
  while (!DHT_VALUE);
  while (DHT_VALUE);
}
void Read_Data_From_DHT() {
  int i; //轮
  int j; //每一轮读多少次
  char tmp;
  char flag;
  DHT11_Start();
  DHT_GPIO_Init(GPIO_MODE_INPUT);
  for (i = 0; i < 5; i++) {
    for (j = 0; j < 8; j++) {
      while (!DHT_VALUE); //等待卡g点
      delay_us(40);
      if (DHT_VALUE == 1) {
        flag = 1;
        while (DHT_VALUE);
      } else {
        flag = 0;
      }
      tmp = tmp << 1;
      tmp |= flag;
    }
    datas[i] = tmp;
  }
}
int fputc(int ch, FILE * f) {
  unsigned char temp[1] = {
    ch
  };
  HAL_UART_Transmit( & huart1, temp, 1, 0xffff);
  return ch;
}
int main(void) {
  /* USER CODE BEGIN 1 */
  /* USER CODE END 1 */
  /* MCU Configuration--------------------------------------------------------*/
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
  /* USER CODE BEGIN Init */
  /* USER CODE END Init */
  /* Configure the system clock */
  SystemClock_Config();
  /* USER CODE BEGIN SysInit */
  /* USER CODE END SysInit */
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
  printf("hello world\r\n");
  HAL_Delay(2000);
  /* USER CODE END 2 */
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1) {
    /* USER CODE END WHILE */
    /* USER CODE BEGIN 3 */
    //DHT_Get_Temp_Humi_Data(datas);
    Read_Data_From_DHT();
    printf("Temp: %d.%d ", datas[2], datas[3]);
    printf("Humi: %d.%d\r\n", datas[0], datas[1]);
    HAL_Delay(2000);
  }
  /* USER CODE END 3 */
}

项目设计及实现

项目设计

继电器数据线插在PB6上,DHT11及LCD1602接线与上述相同,大于25度继电器闭合

项目实现

注意点:

  • 1. 不要忘记将Use MicroLIB的勾打上;

  • 2. 不要忘记在main函数把串口中断打开;

  • 3. 使用蓝牙模块时,记得将波特率设置为9600

char message[16];
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
    Read_Data_From_DHT();
    if (datas[2] >= 25)
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);
    else
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);
    memset(message, 0, sizeof(message));
    sprintf(message, "Temp: %d.%d", datas[2], datas[3]);
    LCD1602_showLine(1,0,message);
    memset(message, 0, sizeof(message));
    sprintf(message, "Humi: %d.%d", datas[0], datas[1]);
    LCD1602_showLine(2,0,message);
    HAL_Delay(1000);
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_65346989/article/details/129602732

机房温湿度环境监控系统专用poe供电tcp/ip网络温湿度传感器_honsor的博客-爱代码爱编程

产品关键词:RJ45网口温湿度传感器,TCP/IP协议温湿度变送器,网口网络型温湿度计,机房POE交换机供电型温湿度传感器 H-THRJ45网络型温湿度传感器简介:        H-THRJ45网口温湿度传感器是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以

tpyboard v102+v202 家庭无线温湿度检测_weixin_33725722的博客-爱代码爱编程

2019独角兽企业重金招聘Python工程师标准>>> 一、实验器件    1、TPYBoard v102 1块    2、TPYBoard v202 1块    3、Nokia 5110LCD显示屏 1块    4、DHT11温湿度传感器 1个    5、micro USB 数据线 2根    6、面包板 1

正点原子w601 wifi 物联网开发板应用——基于mqtt协议的远程温湿度监控demo_eehaha的博客-爱代码爱编程

应用介绍 本Demo利用传感器采集环境的温度和湿度,通过MQTT协议传给服务器。以JS编写了一个MQTT Web客户端程序,接收上述温湿度数据,并将这些数据显示在网页上。用户可以在远程登录网站,查看传感器采集的温湿度数据。 开发环境介绍 正点原子W601 WIFI 物联网开发板 正点原子W601开发板是由正点原子,RTThread和联盛德三方联合开发

通过简单的温湿度传感器进行简单的物联网设计(二)电路连接上-爱代码爱编程

对于(一)的说明以及部分: 传感器补充:在第一部分给出的是:温湿度传感器,烟雾传感器,(六轴,九轴)加速度传感器,GPS,人体红外传感器,指纹传感器;这儿我再补充一些其它类型的传感器,这些传感器都是我看见过别人用过的,但是自己没有用过这些。 补充:水位传感器、振动传感器、CO传感器、CO2传感器、可燃气体传感器、压力传感器、热敏传感器、湿敏传感器、速度

通过简单的温湿度传感器进行简单的物联网设计(二)电路连接下-爱代码爱编程

接上一篇: 以下给出的代码都是能够完美运行的,注意的是可能每次用到引脚不同,要注意一下,在每个注释中都写的很清楚!! 我先设计的顺序是: DHT11连接:(注意,这儿的与上面不一样,这是单独测试dht11的部分) #include <dht11.h>

NodeMCU实现温湿度数据采集并发送至手机App-爱代码爱编程

NodeMCU实现温湿度数据采集并发送至手机App 由于是之前Arduino项目中的一个分支,又刚巧看到了NodeMCU这款小型WiFi开发板,于是就有了这篇文章。 硬件清单 NodeMCU开发板DHT11温湿度传感器LCD1602安卓手机软件清单 ArduinoIDEAndroid Studio一些重要的知识 NodeMCU 基于乐鑫 ESP

借助onenet平台,温湿度远端采集-爱代码爱编程

      对传感器什么的感兴趣有一段时间了,入手了adiuno初级的配套零件,对着B站有模有样的学了起来。 一、本地回显           我买的是国产的Arduino uno板子,意大利的板子会贵些。先是安装Arduino IDE,就是板子的开发软件,再安装CH340G芯片USB的驱动,就可以对Arduino板写程序了,Arduino板上有许多供

ESP8266连接DHT11收集数据上传微信小程序实现实时温湿度监测-爱代码爱编程

ESP8266连接DHT11收集数据上传微信小程序实现实时温湿度监测 一、原理讲解 原理简述:利用发布订阅模式。第一步,先读取DHT11温湿度数值,第二步,新建主题,然后ESP8266往这个主题发送消息,第三步。小程序通过HTTP API接口获取数据。小程序控制原理:ESP8266订阅了一个主题,小程序往这个主题发控制消息,ESP8266就可以收到消息

基于以太网为基础的POE供电温湿度变送器解决方案-爱代码爱编程

    HONSOR以太网温湿度物联网监控系统V1.0解决方案 目录 一、以太网温湿度传感器简介: 二、以太网温湿度传感器概述: 三、以太网温湿度传感器适用范围 四、以太网温湿度传感器产品特点 五、以太网温湿度传感器主要技术参数 六、以太网温湿度传感器按键及设置操作说明 七、安装接线说明 八、以太网温湿度传感器系统结构图 九、以太网

ESP8266连接DHT11,开发微信小程序实时显示温湿度-爱代码爱编程

第一、原理讲解 原理简述:利用发布订阅模式。第一步,先读取DHT11温湿度数值,第二步,新建主题,然后esp8266往这个主题发送消息,第三步。小程序通过http API接口获取数据。小程序控制原理:esp8266订阅了一个主题,小程序往这个主题发消息,esp8266就可以收到消息,就可以执行相关控制指令了(开/关函数) 关于发布订阅: 订阅(

基于51单片机+DHT11温湿度模块+ESP8266模块+上传oneNET APP显示+LCD1602显示-爱代码爱编程

基于51单片机+ESP8266上传oneNET平台 APP显示 基本介绍器件51单片机ESP8266DHT11温湿度usb-ttl模块实现思路实现步骤1:注册oneNET平台2:测试ESP8266是否正常3:连接网络4:上传数据5:设置APP应用6:代码编写呈现(部分)mian.clcd1602.cesp8266.cuart.cdht11.c项目展

lcd和服务器同时显示温度,单片机+LCD1602上怎么同时实时显示温度和时间问题求救...-爱代码爱编程

把两个程序合在一起温度就只显示00.00了,按键是设置时间的,这是主函数,大家看看 void main() { unsigned char i; Int0Configuration(); LcdInit(); Ds1302Init(); while(1) { if(SetState==0) { Ds1302ReadTime();

基于STM32开发板和Web网页的蔬菜大棚温湿度、光照等变化的动态柱形图表-爱代码爱编程

前言:封校期间闲来无事,分享一个大三做过的一个项目(信息系统设计课程设计),本篇文章将大致介绍其原理和系统实现流程。另外附演示视频:基于STM32和Web的蔬菜大棚设计https://www.bilibili.com/video/BV1cp4y1Q7jW/ 1. 总体设计        本项目基于STM32开发板,通过云平台的应用,在前端Web实

温湿度项目--esp32_dsxcode的博客-爱代码爱编程

  通过DHT11获取温湿度数据  通过udp通信上传到服务器端保存   还可以通过lcd现场查看温湿度数据   /* tft_lcd接线 LCD 电源 3.3V #define TFT_MISO 19 //未接线 #define TFT_MOSI 23 // SDA D23 #define TFT_SCLK 18 // SCL D18 #

基于stm32的实时温湿度,蜂鸣器控制系统(温湿度,光敏数据上传 onenet(mqtt))_stm32温度采集蜂鸣器-爱代码爱编程

一、开发环境搭建 云品台:onenet 协议支持:MQTT 硬件部署:STM32F407 ESP8266 DHT11 光敏传感器 二、部分源码展示(源程序太多了,MQTT协议支持和部分函数没有出现在这) 1.main

【物联网毕设】基于stm32的森林土壤温湿度数据采集和存储系统_基于云采集的土壤数据分析系统-爱代码爱编程

目录导航 一、前言二、准备工作三、实现流程1.keil编程2.机智云台开发3.Android开发 四、数据可视化分析五、小结 一、前言     上一篇博客提到《正点原子STM32f103Z