ESP32 Tem­pe­ra­tur, Luft­feuch­tig­keit und Luft­druck TFT anzeigen

letz­te Aktua­li­sie­rung: Okt 14, 2024 @ 20:45

TFT gro­ße Schrift

#include "WiFi.h"
#include "time.h"
#include "Adafruit_GFX.h"
#include "Adafruit_ST7735.h"
#include "Adafruit_BMP280.h"

// Schrftart einbinden
#include "Fonts/FreeSans9pt7b.h"

#include "DHT.h"

int SENSOR_DHT = 15;

// Sensortyp festlegen
// DHT11
// #define SensorTyp DHT11

// DHT22
#define SensorTyp DHT22 

// Sensor einen Namen zuweisen
DHT dht(SENSOR_DHT, SensorTyp); 

// Adafruit TFT, WaveShare TFT 1,8 Zoll
#define TFT_CS        5
#define TFT_RST       4
#define TFT_DC        2

Adafruit_BMP280 bmp;
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);

char Router[] = "Router_SSID";
char Passwort[] = "xxxxxxxx";

// statischeIP = false -> IP-Adresse über DHCP vergeben
// statischeIP = true -> statische IP festlegen
// ip und gateway müssen an das lokale Netz angepasst werden
bool statischeIP = false;
IPAddress ip(192, 168, 1, 200);
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);

/*
  öffentliche DNS-Server
  -----------------------------------------------
  OpenDNS 208, 67, 222, 222 (USA)
  Google 8, 8, 8, 8 (USA)
  Cloudfare 1, 1, 1, 1 (USA)
  DNSWWatch 84.200.69.80 (Deutschland)
  Quad9 9, 9, 9, 9 (Schweiz)
  Neustar UltraDNS 56, 154, 70, 3 (USA, gefiltert)
  Deutsche Telekom 217, 5,100,185
  ------------------------------------------------
  oder die im Router eingetragene IP
  im Beispiel: 192, 168, 1, 20
*/
IPAddress primaryDNS(192, 168, 1, 20);
IPAddress secondaryDNS(9, 9, 9, 9);

// NTP-Server aus dem Pool
#define Zeitserver "de.pool.ntp.org"

/*
  Liste der Zeitzonen
  https://github.com/nayarsystems/posix_tz_db/blob/master/zones.csv
  Zeitzone CET = Central European Time -1 -> 1 Stunde zurück
  CEST = Central European Summer Time von
  M3 = März, 5.0 = Sonntag 5. Woche, 02 = 2 Uhr
  bis M10 = Oktober, 5.0 = Sonntag 5. Woche 03 = 3 Uhr
*/
#define Zeitzone "CET-1CEST,M3.5.0/02,M10.5.0/03"

// time_t enthält die Anzahl der Sekunden seit dem 1.1.1970 0 Uhr
time_t aktuelleZeit;

/* 
  Struktur tm
  tm_hour -> Stunde: 0 bis 23
  tm_min -> Minuten: 0 bis 59
  tm_sec -> Sekunden 0 bis 59
  tm_mday -> Tag 1 bis 31
  tm_wday -> Wochentag (0 = Sonntag, 6 = Samstag)
  tm_mon -> Monat: 0 (Januar) bis 11 (Dezember)
  tm_year -> Jahre seit 1900
  tm_yday -> vergangene Tage seit 1. Januar des Jahres
  tm_isdst -> Wert > 0 = Sommerzeit (dst = daylight saving time)
*/
tm Zeit;
WiFiServer Server(80);
WiFiClient Client;

void setup() 
{
  // Zeitzone: Parameter für die zu ermittelnde Zeit
  configTzTime(Zeitzone, Zeitserver);

  Serial.begin(9600);

  // auf serielle Verbindung warten
  while (!Serial);
  delay(1000);

  // WiFi starten
  WiFi.begin(Router, Passwort);

  Serial.println("------------------------");

   // statische IP vergeben
  if (statischeIP) 
  {
    WiFi.config(ip, gateway, subnet, primaryDNS, secondaryDNS); 
    Serial.print("Verbunden mit ");
    Serial.println(Router);

    // IP anzeigen
    Serial.print("Statische IP: ");
    Serial.println(ip);
  }

  // IP über DHCP ermitteln
  else
  {
    while (WiFi.status() != WL_CONNECTED) 
    {
      delay(200);
      Serial.print(".");
    }
    Serial.println();
    Serial.print("Verbunden mit ");
    Serial.println(Router);
    Serial.print("IP über DHCP: ");
    Serial.println(WiFi.localIP());
  }

  // BMP280 starten
  bmp.begin();

  // DHT starten
  dht.begin();

  // schwarzer Hintergrund
  tft.initR(INITR_BLACKTAB);

  // Rotation anpassen
  tft.setRotation(1);
}

void loop() 
{
  // aktuelle Zeit holen
  time(&aktuelleZeit);

  // localtime_r -> Zeit in die lokale Zeitzone setzen
  localtime_r(&aktuelleZeit, &Zeit);

  /*
    TFT-Parameter:
    Schriftart (muss im Kopf eingebunden werden)
    Cursor Spalte, Zeile setzen
    Textfarbe
    Bildschirm mit schwarz füllen
  */
  tft.setFont(&FreeSans9pt7b);
  tft.setCursor(1, 13);
  tft.setTextColor(ST7735_GREEN);
  tft.fillScreen(ST7735_BLACK);

  Serial.println("------------------------");

  // es kann bis zu 60 Sekunden dauern
  // bis die Zeit ermittelt wird

  // Name des Wochentages 0-6
  switch (Zeit.tm_wday)
  {
    case 0:
      Serial.print("Sonntag");      
      tft.print("Sonntag"); 
      break;
    case 1:
      Serial.print("Montag");
      tft.print("Montag"); 
      break;   
   case 2:
      Serial.print("Dienstag");
      tft.print("Dienstag"); 
      break;
   case 3:
      Serial.print("Mittwoch");
      break;
      tft.print("Mittwoch");
   case 4:
      Serial.print("Donnerstag");
      tft.print("Donnerstag");
      break;
   case 5:
      Serial.print("Freitag");
      tft.print("Freitag");
      break;
   case 6:
      Serial.print("Samstag");
      tft.print("Samstag");
      break;
  }

  Serial.print(", ");
  tft.setCursor(1, 33);

  // Datum
  if (Zeit.tm_mday < 10)  
  {
    Serial.print("0");
    tft.print("0");
  }
  Serial.print(Zeit.tm_mday);
  tft.print(Zeit.tm_mday);

  Serial.print(".");
  tft.print(".");

  // Monat: führende 0 ergänzen
  if (Zeit.tm_mon < 9) 
  {
    Serial.print("0");
    tft.print("0");
  }

  // Zählung beginnt mit 0 -> +1
  Serial.print(Zeit.tm_mon + 1);
  Serial.print(".");
  tft.print(Zeit.tm_mon + 1);
  tft.print(".");

  // Anzahl Jahre seit 1900
  Serial.print(Zeit.tm_year + 1900);
  Serial.print(" ");
  tft.print(Zeit.tm_year + 1900);
  tft.print(" ");

  tft.setCursor(1, 53);
  // Stunde: wenn Stunde < 10 -> 0 davor setzen
  if (Zeit.tm_hour < 10) 
  {
    Serial.print("0");
    tft.print("0");
  }
  Serial.print(Zeit.tm_hour);
  Serial.print(":");
  tft.print(Zeit.tm_hour);
  tft.print(":");

  // Minuten
  if (Zeit.tm_min < 10)
  {
    Serial.print("0");
    tft.print("0");
  }
  Serial.print(Zeit.tm_min);
  Serial.print(":");
  tft.print(Zeit.tm_min);
  tft.print(" Uhr");

  // Sekunden (nur Serieller Monitor)
  if (Zeit.tm_sec < 10) Serial.print("0");
  Serial.print(Zeit.tm_sec);

  Serial.println();
  Serial.println("Tage seit dem 1.1. " + String(Zeit.tm_yday));

  // Normalzeit/Sommerzeit
  if(Zeit.tm_isdst > 0) Serial.println("MESZ = Mitteleuropäische Sommerzeit");
  else Serial.println("MEZ = Mitteleuropäische Zeit");

  // Temperatur BMP280
  String Temperatur = String(bmp.readTemperature());

  // alternativ: Temperatur DHT
  // String Temperatur = String(dht.readTemperature());

  // . durch , ersetzen
  Temperatur.replace(".", ",");

  /*
    BMP280 Luftdruck messen
    readPressure() liest in Pascal, Ausgabe in hPa (Hekto-Pascal)
    Ergebnis durch 100 teilen
  */
  String Luftdruck = String(bmp.readPressure() / 100);
  Luftdruck.replace(".", ",");

  // Luftfeuchtigkeit DHT lesen 
  String Luftfeuchtigkeit = String(dht.readHumidity());

  // . durch , ersetzen
  Luftfeuchtigkeit.replace(".", ",");

  // Ausgabe Serieller Monitor
  Serial.println("Temperatur: " + Temperatur + "°C");
  Serial.println("Luftfeuchtigkeit: " + Luftfeuchtigkeit + "%");
  Serial.println("Luftdruck: " + Luftdruck + " hPa");

  // Ausgabe TFT
  tft.drawFastHLine(1, 57, tft.width(), ST7735_WHITE);
  tft.setCursor(1, 73);
  tft.print(Temperatur + " Grad C");
  tft.setCursor(1, 93);
  tft.print(Luftfeuchtigkeit + "%");
  tft.setCursor(1, 113);
  tft.print(Luftdruck + " hPa");

  // Wartezeit bis zur nächsten Messung
  delay(5000);
}

TFT klei­ne Schrift

#include "WiFi.h"
#include "time.h"
#include "Adafruit_GFX.h"
#include "Adafruit_ST7735.h"
#include "Adafruit_BMP280.h"

#include "DHT.h"

int SENSOR_DHT = 15;

// Sensortyp festlegen
// DHT22
#define SensorTyp DHT22 

// Sensor einen Namen zuweisen
DHT dht(SENSOR_DHT, SensorTyp); 

// Adafruit TFT, WaveShare TFT 1,8 Zoll
#define TFT_CS        5
#define TFT_RST       4
#define TFT_DC        2

Adafruit_BMP280 bmp;
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);

char Router[] = "Router_SSID";
char Passwort[] = "xxxxxxxx";

// statischeIP = false -> IP-Adresse über DHCP vergeben
// statischeIP = true -> statische IP festlegen
// ip und gateway müssen an das lokale Netz angepasst werden
bool statischeIP = true;
IPAddress ip(192, 168, 1, 200);
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);

/*
  öffentliche DNS-Server
  -----------------------------------------------
  OpenDNS 208, 67, 222, 222 (USA)
  Google 8, 8, 8, 8 (USA)
  Cloudfare 1, 1, 1, 1 (USA)
  DNSWWatch 84.200.69.80 (Deutschland)
  Quad9 9, 9, 9, 9 (Schweiz)
  Neustar UltraDNS 56, 154, 70, 3 (USA, gefiltert)
  Deutsche Telekom 217, 5,100,185
  ------------------------------------------------
  oder die im Router eingetragene IP
  im Beispiel: 192, 168, 1, 20
*/
IPAddress primaryDNS(192, 168, 1, 20);
IPAddress secondaryDNS(9, 9, 9, 9);

// NTP-Server aus dem Pool
#define Zeitserver "de.pool.ntp.org"

/*
  Liste der Zeitzonen
  https://github.com/nayarsystems/posix_tz_db/blob/master/zones.csv
  Zeitzone CET = Central European Time -1 -> 1 Stunde zurück
  CEST = Central European Summer Time von
  M3 = März, 5.0 = Sonntag 5. Woche, 02 = 2 Uhr
  bis M10 = Oktober, 5.0 = Sonntag 5. Woche 03 = 3 Uhr
*/
#define Zeitzone "CET-1CEST,M3.5.0/02,M10.5.0/03"

// time_t enthält die Anzahl der Sekunden seit dem 1.1.1970 0 Uhr
time_t aktuelleZeit;

/* 
  Struktur tm
  tm_hour -> Stunde: 0 bis 23
  tm_min -> Minuten: 0 bis 59
  tm_sec -> Sekunden 0 bis 59
  tm_mday -> Tag 1 bis 31
  tm_wday -> Wochentag (0 = Sonntag, 6 = Samstag)
  tm_mon -> Monat: 0 (Januar) bis 11 (Dezember)
  tm_year -> Jahre seit 1900
  tm_yday -> vergangene Tage seit 1. Januar des Jahres
  tm_isdst -> Wert > 0 = Sommerzeit (dst = daylight saving time)
*/
tm Zeit;
WiFiServer Server(80);
WiFiClient Client;

void setup() 
{
  // Zeitzone: Parameter für die zu ermittelnde Zeit
  configTzTime(Zeitzone, Zeitserver);

  Serial.begin(9600);

  // auf serielle Verbindung warten
  while (!Serial);
  delay(1000);

  // WiFi starten
  WiFi.begin(Router, Passwort);

  Serial.println("------------------------");

   // statische IP vergeben
  if (statischeIP) 
  {
    WiFi.config(ip, gateway, subnet, primaryDNS, secondaryDNS); 
    Serial.print("Verbunden mit ");
    Serial.println(Router);

    // IP anzeigen
    Serial.print("Statische IP: ");
    Serial.println(ip);
  }

  // IP über DHCP ermitteln
  else
  {
    while (WiFi.status() != WL_CONNECTED) 
    {
      delay(200);
      Serial.print(".");
    }
    Serial.println();
    Serial.print("Verbunden mit ");
    Serial.println(Router);
    Serial.print("IP über DHCP: ");
    Serial.println(WiFi.localIP());
  }

  // BMP280 starten
  bmp.begin();

  // DHT starten
  dht.begin();

  // schwarzer Hintergrund
  tft.initR(INITR_BLACKTAB);

  // Rotation anpassen
  tft.setRotation(1);

  // schwarzer Hintergrund
  tft.fillScreen(ST7735_BLACK);
  tft.setTextSize(1);
}

void loop() 
{
  // aktuelle Zeit holen
  time(&aktuelleZeit);

  // localtime_r -> Zeit in die lokale Zeitzone setzen
  localtime_r(&aktuelleZeit, &Zeit);

  /*
    TFT-Parameter:
    Schriftart (muss im Kopf eingebunden werden)
    Cursor Spalte, Zeile setzen
    Textfarbe
    Bildschirm mit schwarz füllen
  */
  tft.setCursor(1, 5);
  tft.setTextColor(ST7735_GREEN);
  tft.fillScreen(ST7735_BLACK);
  tft.setTextSize(1);

  Serial.println("------------------------");

  // es kann bis zu 60 Sekunden dauern
  // bis die Zeit ermittelt wird

  // Name des Wochentages 0-6
  switch (Zeit.tm_wday)
  {
    case 0:
      Serial.print("Sonntag");      
      tft.print("Sonntag"); 
      break;
    case 1:
      Serial.print("Montag");
      tft.print("Montag"); 
      break;   
   case 2:
      Serial.print("Dienstag");
      tft.print("Dienstag"); 
      break;
   case 3:
      Serial.print("Mittwoch");
      break;
      tft.print("Mittwoch");
   case 4:
      Serial.print("Donnerstag");
      tft.print("Donnerstag");
      break;
   case 5:
      Serial.print("Freitag");
      tft.print("Freitag");
      break;
   case 6:
      Serial.print("Samstag");
      tft.print("Samstag");
      break;
  }

  Serial.print(", ");
  tft.setCursor(1, 20);
  if (Zeit.tm_mday < 10)  
  {
    Serial.print("0");
    tft.print("0");
  }
  Serial.print(Zeit.tm_mday);
  tft.print(Zeit.tm_mday);

  Serial.print(".");
  tft.print(".");

  // Monat: führende 0 ergänzen
  if (Zeit.tm_mon < 9) 
  {
    Serial.print("0");
    tft.print("0");
  }

  // Zählung beginnt mit 0 -> +1
  Serial.print(Zeit.tm_mon + 1);
  Serial.print(".");
  tft.print(Zeit.tm_mon + 1);
  tft.print(".");

  // Anzahl Jahre seit 1900
  Serial.print(Zeit.tm_year + 1900);
  Serial.print(" ");
  tft.print(Zeit.tm_year + 1900);
  tft.print(" ");

  // Stunde: wenn Stunde < 10 -> 0 davor setzen
  if (Zeit.tm_hour < 10) 
  {
    Serial.print("0");
    tft.print("0");
  }
  Serial.print(Zeit.tm_hour);
  Serial.print(":");
  tft.print(Zeit.tm_hour);
  tft.print(":");

  // Minuten
  if (Zeit.tm_min < 10)
  {
    Serial.print("0");
    tft.print("0");
  }
  Serial.print(Zeit.tm_min);
  Serial.print(":");
  tft.print(Zeit.tm_min);

  // Sekunden
  if (Zeit.tm_sec < 10) Serial.print("0");
  Serial.print(Zeit.tm_sec);

  Serial.println();
  Serial.println("Tage seit dem 1.1. " + String(Zeit.tm_yday));

  // Normalzeit/Sommerzeit
  if(Zeit.tm_isdst > 0) Serial.println("MESZ = Mitteleuropäische Sommerzeit");
  else Serial.println("MEZ = Mitteleuropäische Zeit");

   // Temperatur BMP280
  String Temperatur = String(bmp.readTemperature());

  // alternativ: Temperatur DHT
  // String Temperatur = String(dht.readTemperature());

  // . durch , ersetzen
  Temperatur.replace(".", ",");

  /*
    BMP280 Luftdruck messen
    readPressure() liest in Pascal, Ausgabe in hPa (Hekto-Pascal)
    Ergebnis durch 100 teilen
  */
  String Luftdruck = String(bmp.readPressure() / 100);
  Luftdruck.replace(".", ",");

  // Luftfeuchtigkeit DHT lesen 
  String Luftfeuchtigkeit = String(dht.readHumidity());

  // . durch , ersetzen
  Luftfeuchtigkeit.replace(".", ",");

  // Ausgabe Serieller Monitor
  Serial.println("Temperatur: " + Temperatur + "°C");
  Serial.println("Luftfeuchtigkeit: " + Luftfeuchtigkeit + "%");
  Serial.println("Luftdruck: " + Luftdruck + " hPa");

  // Ausgabe TFT
  tft.drawFastHLine(1, 35, tft.width(), ST7735_WHITE);
  tft.setCursor(1, 50);
  tft.print("Temperatur: " + Temperatur + char(247) + "C");
  tft.setCursor(1, 65);
  tft.print("Luftfeuchtigkeit: " + Luftfeuchtigkeit + "%");
  tft.setCursor(1, 80);
  tft.print(Luftdruck + " hPa");

  // Wartezeit bis zur nächsten Messung
  delay(5000);
}