Пребарување код

Мерење на температура и влажност со M5Stack Core 2 со DHT11 и DHT22 - Robojax

Мерење на температура и влажност со M5Stack Core 2 со DHT11 и DHT22 - Robojax

Овој водич покажува како да поврзете DHT11 или DHT22 сензор за температура и влажност со M5Stack Core2 и да ги прикажете отчитувањата на неговиот вграден екран на допир. M5Stack Core2 е моќна развојна плоча базирана на ESP32 со 2-инчен LCD екран, што ја прави идеална платформа за создавање самостојна станица за следење на околината. Овој проект е совршен за различни апликации, како што се:

  • Изградба на десктоп временска станица за следење на вашата домашна или канцелариска околина.
  • Креирање на логер за температура и влажност за стаклена градина, терариум или живеалиште за влекачи.
  • Развивање на едноставен јазол за следење на околината за поголем IoT проект.
  • Учење како да се поврзете со популарната серија на сензори DHT користејќи модерен модул за приказ.

Хардверски компоненти

  • M5Stack Core2 (ESP32 развојна плоча со екран)
  • DHT11 сензор (или гол сензор со отпорник од 10kΩ или PCB модул)
  • DHT22 (AM2302) сензор (или бел модул или црвен/црн модул)
  • Прототипна плоча и поврзувачки жици

Водич за поврзување

Поврзувањето е едноставно, бидејќи M5Stack Core2 обезбедува удобен Grove-компатибилен порт. Видеото ја демонстрира врската на експанзиониот порт на M5Stack Core2. (во видео на 03:52)

Еве го резимето на поврзувањето за сите типови сензори:

  • Пин за податоци: Поврзете го пинот за податоци/излез на сензорот со GPIO 27 на M5Stack Core2. (во видео на 03:58)
  • Пин за напојување (VCC/+): Поврзете го пинот за напојување на сензорот со пинот 3.3V на M5Stack Core2. (во видео на 04:11)
  • Пин за заземјување (GND/-): Поврзете го пинот за заземјување на сензорот со GND пин на M5Stack Core2. (во видео на 04:17)

Ако користите гол DHT11 или DHT22 сензор, мора да додадете pull-up отпорник (обично 5.6kΩ до 10kΩ) помеѓу пинот за податоци и пинот 3.3V. (во видео на 04:50)

Објаснување на кодот

Кодот е дизајниран да биде високо конфигурабилен, овозможувајќи ви лесно да го промените типот на сензорот, режимот на приказ, боите и стапката на освежување. Еве преглед на главните делови што може да ги конфигурира корисникот:

Поставки за сензор и приказ

На врвот на кодот, можете да го дефинирате типот на сензорот и режимот на приказ. За да го изберете вашиот сензор, мора да го коментирате или декоментирате точниот ред #define. (во видео на 13:43)

#define DHTPIN 27 
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT11   // DHT 11
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

На пример, за да користите DHT11, би го коментирале #define DHTTYPE DHT22 и би го декоментирале #define DHTTYPE DHT11.

Променливата unit контролира кои податоци се прикажуваат на екранот. (во видео на 09:33)

unsigned int unit=3;//
//              0=C целзиус
//              1=F фаренхајт
//              2=Влажност
//              3=C и влажност
//              4=F и влажност
//              5=C и F

Можете да ја поставите оваа вредност на било која вредност од 0 до 5 за да прикажете Целзиус, Фаренхајт, Влажност или комбинација од нив.

Променливата refresh поставува колку често се чита сензорот и се ажурира екранот, во милисекунди. (во видео на 09:15)

const int refresh=3000;//читај на секои 3 секунди

Опции за прилагодување

Кодот исто така ви овозможува да го прилагодите текстот и боите на екранот. Низите title и unitText ги чуваат етикетите и единиците прикажани на екранот. (во видео на 10:01)

char *title[]={"Температура","Температура","Влажност"};
char *unitText[]={"C","F","%"};

Можете да ги промените овие низи за да прикажете текст на ваш јазик. Променливите за боја како што се backgroundColor, temperatureTitleColor и humidityValueColor може да се постават на било која од претходно дефинираните TFT вредности за боја или ваши сопствени hex вредности. (во видео на 10:21)

Демонстрација на проектот во живо

Видеото обезбедува сеопфатна демонстрација на проектот. Покажува како екранот работи со DHT22 сензор во различни режими, вклучувајќи Фаренхајт, само влажност, Целзиус со влажност и конечно Целзиус и Фаренхајт. (во видео на 21:03) Демонстрацијата исто така вклучува тест со DHT11 сензор, и со PCB модул и како гол сензор со pull-up отпорник. (во видео на 22:22) Конечно, видеото покажува што се случува кога жица е исклучена, што резултира со отчитување „None" на екранот. (во видео на 22:38)

Видео поглавја

  • [00:00] Вовед и преглед на проектот
  • [00:55] Карактеристики на M5Stack Core2
  • [02:22] Спецификации на сензорите DHT11 наспроти DHT22
  • [03:52] Водич за поврзување
  • [07:40] Инсталирање на драјвери и библиотеки за плочата
  • [09:01] Објаснување на кодот
  • [21:03] Демонстрација во живо
  • [22:53] Заклучок и завршни зборови

Слики

M5Stack Core2: Main
M5Stack Core2: Main
M5Stack Core2: Included
M5Stack Core2: Included
M5Stack Core2: side-right
M5Stack Core2: side-right
M5Stack Core2: DHT11, DHT22
M5Stack Core2: DHT11 DHT22
366-M5Stack Core 2 ESP32 with DHT11 and DHT22
Јазик: C++
/*
 * file: M5Stack_DHT11_DHT22 
  Measure Temperature and Humidity using DHT11, DHT22, DHT21 Sensor and display on M5Stack Core 2 ESP32 IoT board
 * Written by Ahmad Shamshiri on April 22, 2021 in Ontario, Canada
 * Watch video instruction https://youtu.be/ZDZm_QOlCJo
 www.Robojax.com YouTube http://www.youtube.com/robojaxTV
 
 * 
  * 
 * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact. * 
 * This code has been downloaded from Robojax.com
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.

  
*/
#include <M5Core2.h>


const int refresh=3000;//read every 3 seconds

unsigned int unit=3;//
//              0=C celsius
//              1=F fahrenheit
//              2=Humidity
//              3=C and Humidity
//              4=F and Humidity
//              5=C and F

char *title[]={"Temperature","Temperature","Humidity"};
char *unitText[]={"C","F","%"};

//set more color. see https://docs.m5stack.com/#/en/api/lcd

unsigned int backgroundColor= YELLOW;
unsigned int temperatureTitleColor= BLACK;
unsigned int temperatureValueColor= RED;

unsigned int humidityTitleColor= BLACK;
unsigned int humidityValueColor= RED;

unsigned int background2Color= TFT_CYAN;

uint8_t titleV,unitV,degree;

uint8_t line1TitleY=3;
uint8_t line1ValueY=40;

uint8_t line2TitleY=110;
uint8_t line2ValueY=150;

#include "DHT.h"
#define DHTPIN 27 
//#define DHTTYPE DHT11   // DHT 11
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)
DHT dht(DHTPIN, DHTTYPE);
float temperatureCValue,temperatureFValue, humidityValue,myValue1,myValue2;// 
// ****** DHT settings end (Robojax.com )

void readTemperature();
void displayTemperature(uint8_t line );
void setup() {

  M5.begin();
  M5.Lcd.setTextSize(4); 

  Serial.begin(9600);//default is 115200
  Serial.println("M5Stack DHT Test ");

 // Robojax.com code for ESP32 DHT11 DHT22
   dht.begin();  
delay(1000);
}

void loop() {
  readTemperature();//reads the temperature and humidity
  displayMyValue();//displays temperature or humidity

  //printOnSerial();
   delay(refresh);
}


/*
 * www.robojax.com
 * see video https://youtu.be/ZDZm_QOlCJo 
 * for details
 */
void readTemperature()
{
  temperatureCValue = dht.readTemperature();// Read temperature as Celsius (the default)
  humidityValue = dht.readHumidity();// Reading humidity 
  temperatureFValue = dht.readTemperature(true);// Read temperature as Fahrenheit (isFahrenheit = true)

}//readTemperature() end

void displayMyValue()
{
  
  switch (unit) {
    case 1:
      titleV = 1;
      unitV =1; 
      myValue1= temperatureFValue;    
      displayTemperature( 1 , true);    
    break;

    case 2:
      titleV = 2;
      unitV =2;   
      myValue1= humidityValue;  
     displayTemperature( 1, false );    
    break;

    case 3:
      titleV = 0;
      unitV =0;     
      myValue1= temperatureCValue;      
      displayTemperature( 1 , true);
 
      titleV = 2;
      unitV =2;  
      myValue2= humidityValue; 
      displayTemperature( 2, false );               
    break;

    case 4:
      titleV = 1;
      unitV =1;     
      myValue1= temperatureFValue;      
      displayTemperature( 1 , true);
 
      titleV = 2;
      unitV =2;  
      myValue2= humidityValue; 
      displayTemperature( 2 , false);      
    break;

    case 5:
      titleV = 0;
      unitV =0;     
      myValue1= temperatureCValue;      
      displayTemperature( 1, true);
 
      titleV = 1;
      unitV =1;  
      myValue2= temperatureFValue; 
      displayTemperature( 2 , true);         
    break;

    default:
      titleV = 0;
      unitV =0;    
      myValue1= temperatureCValue;
      displayTemperature(1, true);    
    break;
    
  }

 
}//displayMyValue() end

/*
 * displayTemperature(uint8_t line, bool degree)
 * Displays temperature on Core2 screen
 * See video for details
 * https://youtu.be/ZDZm_QOlCJo
 */
void displayTemperature(uint8_t line, bool degree)
{
  uint8_t Y_lineTitle,Y_lineValue;
  float valueToDisplay;
  //M5.Lcd.fillScreen(backgroundColor);
  M5.Lcd.setTextColor(temperatureTitleColor);  
 
  M5.Lcd.setTextSize(4);
  if(line ==1){
    Y_lineTitle =line1TitleY;
    Y_lineValue =line1ValueY;
    valueToDisplay=myValue1;
    //M5.Lcd.fillRect(0, 0, 340, line2TitleY, backgroundColor);            
   M5.Lcd.fillScreen(backgroundColor);     
  }else{
    //M5.Lcd.drawRect(0, line2TitleY, 340, 240-line2TitleY, background2Color);
    M5.Lcd.fillRect(0, line2TitleY, 340, 240-line2TitleY, background2Color);      
    Y_lineTitle =line2TitleY;
    Y_lineValue =line2ValueY; 
    valueToDisplay=myValue2;
  }

  M5.Lcd.setCursor(3,Y_lineTitle); 
 
  M5.Lcd.print(title[titleV]);
  M5.Lcd.setTextColor(temperatureValueColor);    
  M5.Lcd.setTextSize(7);  
  M5.Lcd.setCursor(3,Y_lineValue);  
  M5.Lcd.printf("%.1f", valueToDisplay);  
  if(degree){
   printDegree();//print degree symbol if needed
  }
  M5.Lcd.print(unitText[unitV]);    
}
/*
 * displayHumidity()
 * displays humidity from DHT11 or DHT22 on Core 2
 * written by Ahmad Shamshiri
 * on April 21, 2021 in Ajax, Ontario, Canada
 * www.robojax.com
 */
void displayHumidity()
{

  M5.Lcd.setTextColor(humidityTitleColor);      
  M5.Lcd.setTextSize(4);    
  M5.Lcd.setCursor(3,110); 
  M5.Lcd.print(title[2]); //humidity title   
  M5.Lcd.setTextColor(humidityValueColor);    
  M5.Lcd.setTextSize(7);  
  M5.Lcd.setCursor(3,150);   
  M5.Lcd.printf("%.1f", humidityValue);       
  M5.Lcd.print(unitText[2]);    

}//displayHumidity() end


/*
 * printDegree()
 * prints degree symbol
 * Written by Ahmad Shamshiri 
 * on April 2, 2021 at 23:53
 * www.robojax.com
 */
void printDegree()
{

  M5.Lcd.setTextSize(3);  
  
  M5.Lcd.print("o");  
  M5.Lcd.setTextSize(7);    
  M5.Lcd.setCursor(M5.Lcd.getCursorX()+15,M5.Lcd.getCursorY());   
}//printDegree() end

/*
written by Ahmad Shamshiri for Robojax, Robojax.com
on April 21, 2021 in Ajax, Ontario, Canada
*/
void printOnSerial()
{
      Serial.print(title[unit]); 
      Serial.print(" "); 
      Serial.print(myValue1);  
             
      Serial.print(unitText[unit]);      
      Serial.println();  
}//printOnSerial() end

Ресурси и референци

Датотеки📁

Нема достапни датотеки.