Code zoeken

Meet temperatuur en vochtigheid met M5Stack Core 2 met DHT11 en DHT22 - Robojax

Meet temperatuur en vochtigheid met M5Stack Core 2 met DHT11 en DHT22 - Robojax

Deze handleiding laat zien hoe je een DHT11- of DHT22-temperatuur- en luchtvochtigheidssensor aansluit op de M5Stack Core2 en de metingen weergeeft op het ingebouwde touchscreen. De M5Stack Core2 is een krachtig ESP32-gebaseerd ontwikkelbord met een 2-inch LCD, waardoor het een ideaal platform is voor het creëren van een zelfstandig milieu-monitoringsstation. Dit project is perfect voor diverse toepassingen, zoals:

  • Het bouwen van een desktop-weerstation om uw thuis- of kantooromgeving te monitoren.
  • Het creëren van een temperatuur- en luchtvochtigheidslogger voor een kas, terrarium of reptielenverblijf.
  • Het ontwikkelen van een eenvoudige milieu-monitoringsnode voor een groter IoT-project.
  • Leren hoe u interfacet met de populaire DHT-serie sensoren met behulp van een moderne displaymodule.

Hardwarecomponenten

  • M5Stack Core2 (ESP32-ontwikkelbord met display)
  • DHT11-sensor (ofwel de kale sensor met een 10kΩ-weerstand of een PCB-module)
  • DHT22 (AM2302)-sensor (ofwel de witte module of de rood/zwarte module)
  • Breadboard en jumperdraden

Bekabelingshandleiding

De bekabeling is eenvoudig, omdat de M5Stack Core2 een handige Grove-compatibele poort biedt. De video demonstreert de aansluiting op de expansiepoort van de M5Stack Core2. (in video op 03:52)

Hier is de aansluitsamenvatting voor alle sensortypen:

  • Datapin: Verbind de data/out-pin van de sensor met GPIO 27 op de M5Stack Core2. (in video op 03:58)
  • Voedingspin (VCC/+): Verbind de voedingspin van de sensor met de 3.3V-pin op de M5Stack Core2. (in video op 04:11)
  • Aardingspin (GND/-): Verbind de aardingspin van de sensor met een GND-pin op de M5Stack Core2. (in video op 04:17)

Als u een kale DHT11- of DHT22-sensor gebruikt, moet u een pull-upweerstand (doorgaans 5.6kΩ tot 10kΩ) toevoegen tussen de datapin en de 3.3V-pin. (in video op 04:50)

Code-uitleg

De code is ontworpen om zeer configureerbaar te zijn, zodat u eenvoudig het sensortype, de displaymodus, kleuren en verversingssnelheid kunt wijzigen. Hier is een uitsplitsing van de belangrijkste door de gebruiker configureerbare secties:

Sensor- en displayinstellingen

Bovenaan de code kunt u het sensortype en de displaymodus definiëren. Om uw sensor te selecteren, moet u de juiste #define-regel uit- of aanzetten door deze te becommentariëren of niet. (in video op 13:43)

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

Om bijvoorbeeld een DHT11 te gebruiken, zou u #define DHTTYPE DHT22 uitcommentariëren en #define DHTTYPE DHT11 aanzetten.

De variabele unit bepaalt welke gegevens op het scherm worden weergegeven. (in video op 09:33)

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

U kunt dit instellen op elke waarde van 0 tot 5 om Celsius, Fahrenheit, luchtvochtigheid of een combinatie daarvan weer te geven.

De variabele refresh stelt in hoe vaak de sensor wordt uitgelezen en het scherm wordt bijgewerkt, in milliseconden. (in video op 09:15)

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

Aanpassingsopties

De code stelt u ook in staat om de tekst en kleuren op het scherm aan te passen. De arrays title en unitText slaan de labels en eenheden op die op het scherm worden weergegeven. (in video op 10:01)

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

U kunt deze strings wijzigen om tekst in uw eigen taal weer te geven. De kleurvariabelen zoals backgroundColor, temperatureTitleColor en humidityValueColor kunnen worden ingesteld op elk van de vooraf gedefinieerde TFT-kleurwaarden of uw eigen aangepaste hex-waarden. (in video op 10:21)

Live projectdemonstratie

De video biedt een uitgebreide demonstratie van het project. Het toont het display dat werkt met een DHT22-sensor in verschillende modi, waaronder Fahrenheit, alleen luchtvochtigheid, Celsius met luchtvochtigheid, en ten slotte Celsius en Fahrenheit. (in video op 21:03) De demonstratie omvat ook een test met een DHT11-sensor, zowel met een PCB-module als als kale sensor met een pull-upweerstand. (in video op 22:22) Ten slotte toont de video wat er gebeurt wanneer een draad wordt losgekoppeld, wat resulteert in een "None"-meting op het scherm. (in video op 22:38)

Video-hoofdstukken

  • [00:00] Introductie en projectoverzicht
  • [00:55] M5Stack Core2-functies
  • [02:22] DHT11 vs DHT22-sensorspecificaties
  • [03:52] Bekabelingshandleiding
  • [07:40] Installeren van borddrivers en bibliotheken
  • [09:01] Code-uitleg
  • [21:03] Live demonstratie
  • [22:53] Conclusie en afronding

Afbeeldingen

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

Hulpmiddelen en referenties

Bestanden📁

Geen bestanden beschikbaar.