发作品签到
标准版

ESP32-nano 底座 多功能温湿度传感器

工程标签

1.9k
0
0
2

简介

这是一个esp32-nano底座,(内附代码)组装后成为一个多功能的温湿度传感器,实时显示折线图,温湿度异常报警

简介:这是一个esp32-nano底座,(内附代码)组装后成为一个多功能的温湿度传感器,实时显示折线图,温湿度异常报警

开源协议

GPL 3.0

创建时间:2022-09-08 12:42:07更新时间:2022-09-20 01:49:23

描述

这就是一个连接DHT11温湿度传感器和一个4P OLED显示屏的esp32-nano底座,技术含量不高,焊接也非常简单,一个贴片电阻,一个贴片电容,连接时注意对准方向。

连接引脚:OLED SDA:io26
OLED SCL:io27
DHT11:io25

以下是arduino 1.8.19 简单显示温湿度的代码
最新版可以显示温湿度折线,更直观观察温湿度
这里我参考网上数据将体感温度划分为"ice" "very cold" "cold" "a little cold" "comfortable" "best"等共11个等级(详见代码)
自动计算体感温度,进行评价,体感温度过高或过低时会自动报警,即板载22号引脚的led闪烁
幸好学过C艹
这我只是做了一个最简单的实例,如果再连接空调或加湿器,就可以组成一个自动温湿度控制系统

使用前需安装相应库文件


9/19 代码更新

#include "SSD1306.h"

SSD1306 display(0x3c, 26, 27);//SDA SCL//13 15

#include 
#include 
#include 
#define DHTPIN 25

#define DHTTYPE           DHT11     
DHT_Unified dht(DHTPIN, DHTTYPE);
uint32_t delayMS;

int Tline[55] = {0};
int Hline[55] = {0};
int led = 22;
bool ledmode = 1, count = 1;

void setup() {
  display.setFont(ArialMT_Plain_10);
  for(int i = 0; i <= 45; ++i){
    display.init();
    display.drawString(i, 25, "BY");
    display.drawString(110 - i, 25, "CY");//开场动画可以换名字
    display.display();
    delay(10);
  }
  Serial.begin(115200);
  dht.begin();
  pinMode(led, OUTPUT);
  Serial.println("Modified Temperature, Humidity Serial Monitor Example");
  sensor_t sensor;
  dht.temperature().getSensor(&sensor);
  dht.humidity().getSensor(&sensor);
  delayMS = 1000;
}

void loop() {
  // put your main code here, to run repeatedly:
  delay(delayMS);
  sensors_event_t event;  
  dht.temperature().getEvent(&event);

  int warn = 0;
  char T[10];
  float Te;
  dtostrf(event.temperature,3,1,T); 
  
  if (isnan(event.temperature)) {
    Serial.println("Error reading temperature!");
  }
  else {
    Te = event.temperature;
  }
  dht.humidity().getEvent(&event);

  char H[10];
  dtostrf(event.relative_humidity,3,1,H); 
  
  if (isnan(event.relative_humidity)) {
    Serial.println("Error reading humidity!");
  }
  else {
    float Hu = event.relative_humidity;
    //float Fa = 1.8 * Te + 32;
    //float comfort = Fa - (0.55 - 0.55 * Hu) * (Fa - 58);
    float comfort = (1.1818 * Te + 18.18) * (0.88 + 0.002 * Hu) + (Te - 32) / (45 - Te) + 17.4;
    char COMFORT[10];
    Serial.println(comfort);
    dtostrf(comfort,3,1,COMFORT); 
    int showx = 50;
    display.init();
    
    if(comfort < 0){  //舒适度评价
      display.drawString(showx, 10, "ice");
      warn = 2;
    }
    else if(comfort < 25){
      display.drawString(showx, 10, "very cold");
      warn = 2;
    }
    else if(comfort < 38){
      display.drawString(showx, 10, "cold");
      warn = 1;
    }
    else if(comfort < 50){
      display.drawString(showx, 10, "a little cold");
      warn = 1;
    }
    else if(comfort < 58){
      display.drawString(showx, 10, "comfortable");
      warn = 0;
    }
    else if(comfort < 70){
      display.drawString(showx, 10, "best");
      warn = 0;
    }
    else if(comfort < 75){
      display.drawString(showx, 10, "comfortable");
      warn = 0;
    }
    else if(comfort < 79){
      display.drawString(showx, 10, "a little hot");
      warn = 1;
    }
    else if(comfort < 84){
      display.drawString(showx, 10, "hot");
      warn = 1;
    }
    else if(comfort < 88){
      display.drawString(showx, 10, "very hot");
      warn = 2;
    }
    else{
      display.drawString(showx, 10, "torridity");
      warn = 2;
    }
    
    //Very uncomfortable 18
    //uncomfortable 13
    display.drawString(0, 0, "T:         C  comfort:");
    display.drawString(0, 10, "H:         %");     //x,y
    display.drawString(12, 0, T);
    display.drawString(12, 10, H);
    display.drawString(90, 0, COMFORT);
    
    //开始绘制折线
    
    display.drawLine(5, 23, 5, 63);//T坐标轴
    display.drawString(3, 20, "^");
    display.drawLine(5, 63, 55, 63);
    display.drawString(56, 55, "T");

    display.drawLine(68, 23, 68, 63);//H坐标轴
    display.drawString(66, 20, "^");
    display.drawLine(68, 63, 118, 63);
    display.drawString(119, 55, "H");

    Te = (int)(Te);
    Hu = (int)(Hu);
    Serial.println(Te);
    Serial.println(Hu);
    for(int i = 1; i <= 50; ++i){//T折线(笨方法)
      Tline[i - 1] = Tline[i];
    }
    Tline[50] = Te;
    for(int i = 1; i < 50; ++i){
      display.drawLine(i + 4, 103 - Tline[i] * 2, i + 5, 103 - Tline[i + 1] * 2);
    }

    for(int i = 1; i <= 50; ++i){//H折线
      Hline[i - 1] = Hline[i];
    }
    Hline[50] = Hu;
    for(int i = 1; i < 50; ++i){
      display.drawLine(i + 67, 63 - (Hline[i] / 2.5), i + 68, 63 - (Hline[i + 1] / 2.5));
    }

    if(warn == 1){  //舒适度报警
      display.drawString(120, 10, "!");
      if(count){
        ledmode = !ledmode;
        digitalWrite(led, ledmode);
        count = 0;
      }
      else{
        count = 1;
      }
    }
    else if(warn == 2){
      display.drawString(120, 10, "!!");
      ledmode = !ledmode;
      digitalWrite(led, ledmode);
    }
    else{
      ledmode = 1;
      digitalWrite(led, ledmode);
    }
    
    display.display();
  }
}

初代代码(仅有显示温湿度功能)

#include "SSD1306.h"

SSD1306 display(0x3c, 26, 27);//SDA SCL//13 15

//

#include 
#include 
#include 
#define DHTPIN            25         // Pin which is connected to the DHT sensor.

#define DHTTYPE           DHT11     
DHT_Unified dht(DHTPIN, DHTTYPE);
uint32_t delayMS;

void setup() {
  display.setFont(ArialMT_Plain_24);
  for(int i = 0; i <= 30; ++i){
    display.init();//清屏
    //display.setFont(ArialMT_Plain_24);
    display.drawString(i, 18, "BY");
    display.drawString(100 - i, 18, "CY");
    display.display();//刷新
    delay(10);
  }
  // put your setup code here, to run once:
  Serial.begin(115200);
  dht.begin();
  Serial.println("Modified Temperature, Humidity Serial Monitor Example");
  sensor_t sensor;
  dht.temperature().getSensor(&sensor);
  dht.humidity().getSensor(&sensor);
  //delayMS = sensor.min_delay / 1000;
  delayMS = 1000;
}

void loop() {
  // put your main code here, to run repeatedly:
  delay(delayMS);
  sensors_event_t event;  
  dht.temperature().getEvent(&event);

  char T[10];
  dtostrf(event.temperature,3,1,T); 
  
  if (isnan(event.temperature)) {
    Serial.println("Error reading temperature!");
  }
  else {
    
  }
  dht.humidity().getEvent(&event);

  char H[10];
  dtostrf(event.relative_humidity,3,1,H); 
  
  if (isnan(event.relative_humidity)) {
    Serial.println("Error reading humidity!");
  }
  else {
    display.init();//清屏
    //display.setFont(ArialMT_Plain_24);
    display.drawString(0, 30, "H:");
    display.drawString(35, 30, H);
    display.drawString(95, 30, "%");
    display.drawString(0, 0, "T:");
    display.drawString(35, 0, T);
    display.drawString(95, 0, "C");
    display.display();//刷新
    display.display();//刷新
  }
}

设计图

原理图
PCB

BOM

IDNameDesignatorFootprintQuantity
1100nFC5C06031
20.96OLED_4P_MODULE_JXOLED10.96OLED_4P1
35.1kΩR7R08051
4KH-2.54FH-1X13P-H8.5U1,U2HDR-TH_13P-P2.54-V-F2
5DHT11U4SENSOR-TH_DHT111

附件

序号文件名称下载次数
1
vid1-output.mp4
16
克隆工程
添加到专辑
0
0
分享
侵权投诉

工程成员

评论

全部评论(1)
按时间排序|按热度排序
粉丝0|获赞0
相关工程
暂无相关工程

底部导航