Estación meteorológica ESP32 — ESP32 simulation

Estación meteorológica con ESP32, sensor BMP280 (presión/temp), DHT22 (humedad/temp) y pantalla TFT ILI9341 a color.

An interactive ESP32 circuit simulation you can run free in your browser on Velxio, by dave.

Components

Sketch code

// ESP32 Weather Station
// BMP280 (temp + pressure) + DHT22 (humidity) + ILI9341 TFT
// Wiring:
//   BMP280 - SDA=21, SCL=22, VCC=3V3, GND=GND
//   DHT22  - DATA=15, VCC=3V3, GND=GND
//   TFT    - CS=5, DC=2, RST=4, MOSI=23, SCK=18, MISO=19, LED=3V3, VCC=3V3, GND=GND

#include <Wire.h>
#include <Adafruit_BMP280.h>
#include <DHT.h>
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>

// --- BMP280 ---
Adafruit_BMP280 bmp;

// --- DHT22 ---
#define DHTPIN 15
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

// --- ILI9341 TFT ---
#define TFT_CS  5
#define TFT_DC  2
#define TFT_RST 4
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);

// --- Data cache ---
struct {
  float tempC = 0.0f;
  float pressure_hPa = 0.0f;
  float humidity = 0.0f;
  float bmpTempC = 0.0f;
  bool bmpOk = false;
  bool dhtOk = false;
  unsigned long lastRead = 0;
} data;

void readSensors() {
  // BMP280
  if (data.bmpOk) {
    data.bmpTempC = bmp.readTemperature();
    data.pressure_hPa = bmp.readPressure() / 100.0f;
  }

  // DHT22
  if (data.dhtOk) {
    data.humidity = dht.readHumidity();
    data.tempC = dht.readTemperature();
    if (isnan(data.humidity) || isnan(data.tempC)) {
      data.dhtOk = false;
    }
  }
}

void updateDisplay() {
  tft.fillScreen(ILI9341_BLACK);

  // Title bar
  tft.fillRect(0, 0, 320, 30, ILI9341_DARKCYAN);
  tft.setTextColor(ILI9341_WHITE);
  tft.setTextSize(2);
  tft.setCursor(50, 6);
  tft.print("WEATHER STATION");

  // Temperature (DHT22) - big
  tft.setTextSize(3);
  tft.setCursor(20, 50);
  tft.setTextColor(ILI9341_YELLOW);
  tft.print((int)data.tempC);
  tft.setTextSize(2);
  tft.print(".");
  tft.setTextSize(2);
  tft.print((int)(data.tempC * 10) % 10);
  tft.setTextColor(ILI9341_WHITE);
  tft.setTextSize(1);
  tft.print("o");
  tft.setTextSize(2);
  tft.print("C");

  // Humidity
  tft.setTextSize(2);
  tft.setCursor(20, 90);
  tft.setTextColor(ILI9341_CYAN);
  tft.print("Humidity: ");
  tft.setTextColor(ILI9341_WHITE);
  tft.print((int)data.humidity);
  tft.print("%");

  // Pressure
  tft.setTextSize(2);
  tft.setCursor(20, 120);
  tft.setTextColor(ILI9341_GREEN);
  tft.print("Pressure: ");
  tft.setTextColor(ILI9341_WHITE);
  tft.print(data.pressure_hPa, 1);
  tft.print(" hPa");

  // BMP280 temperature
  tft.setTextSize(1);
  tft.setCursor(20, 160);
  tft.setTextColor(ILI9341_ORANGE);
  tft.print("BMP280 temp: ");
  tft.setTextColor(ILI9341_WHITE);
  tft.print(data.bmpTempC, 1);
  tft.print(" C");

  // Status line
  tft.setCursor(20, 190);
  tft.setTextColor(data.bmpOk ? ILI9341_GREEN : ILI9341_RED);
  tft.print("BMP280: ");
  tft.print(data.bmpOk ? "OK" : "FAIL");
  tft.setCursor(160, 190);
  tft.setTextColor(data.dhtOk ? ILI9341_GREEN : ILI9341_RED);
  tft.print("DHT22: ");
  tft.print(data.dhtOk ? "OK" : "FAIL");

  // Footer
  tft.setTextColor(ILI9341_DARKGREY);
  tft.setTextSize(1);
  tft.setCursor(70, 220);
  tft.print("velx.io weather station");
}

void printSerial() {
  Serial.print("

More projects by dave