Caută cod

Măsurați temperatura și umiditatea folosind M5Stack Core 2 cu DHT11 și DHT22 - Robojax

Măsurați temperatura și umiditatea folosind M5Stack Core 2 cu DHT11 și DHT22 - Robojax

Acest ghid demonstrează cum să conectați un senzor de temperatură și umiditate DHT11 sau DHT22 la M5Stack Core2 și să afișați citirile pe ecranul tactil integrat. M5Stack Core2 este o placă de dezvoltare puternică bazată pe ESP32, cu un ecran LCD de 2 inch, fiind o platformă ideală pentru crearea unei stații independente de monitorizare a mediului. Acest proiect este perfect pentru o varietate de aplicații, cum ar fi:

  • Construirea unei stații meteorologice de birou pentru a monitoriza mediul din casa sau biroul dumneavoastră.
  • Crearea unui dispozitiv de înregistrare a temperaturii și umidității pentru o seră, terariu sau incintă pentru reptile.
  • Dezvoltarea unui nod simplu de monitorizare a mediului pentru un proiect IoT mai mare.
  • Învățarea modului de interfațare cu populara serie de senzori DHT folosind un modul de afișare modern.

Componente Hardware

  • M5Stack Core2 (placă de dezvoltare ESP32 cu afișaj)
  • Senzor DHT11 (fie senzorul gol cu un rezistor de 10kΩ, fie un modul PCB)
  • Senzor DHT22 (AM2302) (fie modulul alb, fie modulul roșu/negru)
  • Breadboard și fire de legătură

Ghid de Cablare

Cablarea este simplă, deoarece M5Stack Core2 oferă un port convenabil compatibil Grove. Videoclipul demonstrează conexiunea pe portul de expansiune al M5Stack Core2. (în videoclip la 03:52)

Iată rezumatul conexiunilor pentru toate tipurile de senzori:

  • Pin de Date: Conectați pinul de date/ieșire al senzorului la GPIO 27 pe M5Stack Core2. (în videoclip la 03:58)
  • Pin de Alimentare (VCC/+): Conectați pinul de alimentare al senzorului la pinul de 3.3V pe M5Stack Core2. (în videoclip la 04:11)
  • Pin de Masă (GND/-): Conectați pinul de masă al senzorului la un pin GND pe M5Stack Core2. (în videoclip la 04:17)

Dacă utilizați un senzor DHT11 sau DHT22 gol, trebuie să adăugați un rezistor de pull-up (de obicei 5.6kΩ până la 10kΩ) între pinul de date și pinul de 3.3V. (în videoclip la 04:50)

Explicația Codului

Codul este conceput pentru a fi foarte configurabil, permițându-vă să schimbați ușor tipul de senzor, modul de afișare, culorile și rata de reîmprospătare. Iată o defalcare a principalelor secțiuni configurabile de utilizator:

Setări Senzor și Afișaj

În partea de sus a codului, puteți defini tipul de senzor și modul de afișare. Pentru a selecta senzorul, trebuie să comentați sau să decomentați linia corectă #define. (în videoclip la 13:43)

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

De exemplu, pentru a utiliza un DHT11, ar trebui să comentați #define DHTTYPE DHT22 și să decomentați #define DHTTYPE DHT11.

Variabila unit controlează ce date sunt afișate pe ecran. (în videoclip la 09:33)

unsigned int unit=3;//
//              0=C grade Celsius
//              1=F grade Fahrenheit
//              2=Umiditate
//              3=C și Umiditate
//              4=F și Umiditate
//              5=C și F

Puteți seta aceasta la orice valoare de la 0 la 5 pentru a afișa Celsius, Fahrenheit, Umiditate sau o combinație a acestora.

Variabila refresh setează cât de des este citit senzorul și actualizat ecranul, în milisecunde. (în videoclip la 09:15)

const int refresh=3000;//citește la fiecare 3 secunde

Opțiuni de Personalizare

Codul vă permite, de asemenea, să personalizați textul și culorile de pe ecran. Tablourile title și unitText stochează etichetele și unitățile afișate pe ecran. (în videoclip la 10:01)

char *title[]={"Temperatură","Temperatură","Umiditate"};
char *unitText[]={"C","F","%"};

Puteți schimba aceste șiruri pentru a afișa text în propria limbă. Variabilele de culoare, cum ar fi backgroundColor, temperatureTitleColor și humidityValueColor, pot fi setate la oricare dintre valorile de culoare TFT predefinite sau la propriile valori hexazecimale personalizate. (în videoclip la 10:21)

Demonstrație Live a Proiectului

Videoclipul oferă o demonstrație cuprinzătoare a proiectului. Acesta arată afișajul funcționând cu un senzor DHT22 în diverse moduri, inclusiv Fahrenheit, doar umiditate, Celsius cu umiditate și, în final, Celsius și Fahrenheit. (în videoclip la 21:03) Demonstrația include, de asemenea, un test cu un senzor DHT11, atât cu un modul PCB, cât și ca senzor gol cu un rezistor de pull-up. (în videoclip la 22:22) În final, videoclipul arată ce se întâmplă când un fir este deconectat, ceea ce duce la o citire "Niciuna" pe ecran. (în videoclip la 22:38)

Capitolele Videoclipului

  • [00:00] Introducere și Prezentare Generală a Proiectului
  • [00:55] Caracteristicile M5Stack Core2
  • [02:22] Specificațiile Senzorilor DHT11 vs DHT22
  • [03:52] Ghid de Cablare
  • [07:40] Instalarea Driverelor și Bibliotecilor pentru Placă
  • [09:01] Explicația Codului
  • [21:03] Demonstrație Live
  • [22:53] Concluzie și Încheiere

Imagini

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
Limba: 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

Resurse și referințe

Fișiere📁

Nu sunt disponibile fișiere.