estacion de tiempo — Arduino Uno simulation

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

Components

Sketch code

// Estación Meteorológica
// Sensores: DHT22 (Temperatura + Humedad) y BMP280 (Presión + Temp)
// Pantalla: LCD 1602 (modo 4-bit)
// Conexiones:
//   LCD RS -> pin 12
//   LCD E  -> pin 11
//   LCD D4 -> pin 5
//   LCD D5 -> pin 4
//   LCD D6 -> pin 3
//   LCD D7 -> pin 2
//   LCD V0 -> potenciómetro (contraste)
//   DHT22 DATA -> pin 7
//   BMP280 SDA -> A4 (I2C)
//   BMP280 SCL -> A5 (I2C)

#include <LiquidCrystal.h>
#include <DHT.h>
#include <Wire.h>
#include <Adafruit_BMP280.h>

// Definición de pines
#define DHTPIN 7
#define DHTTYPE DHT22

// Pines LCD
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

// Sensores
DHT dht(DHTPIN, DHTTYPE);
Adafruit_BMP280 bmp;  // I2C (dirección 0x76 o 0x77)

// Variables de tiempo
unsigned long lastSensorRead = 0;
const long sensorInterval = 2000;  // Leer sensores cada 2s

unsigned long lastDisplayUpdate = 0;
const long displayInterval = 3000; // Cambiar pantalla cada 3s

int displayPage = 0;  // 0: Temp+Humi, 1: Presión+Altitud

void setup() {
  Serial.begin(9600);
  Serial.println(F("=== Estación Meteorológica Iniciada ==="));

  lcd.begin(16, 2);
  lcd.clear();
  lcd.print(F("  Estacion    "));
  lcd.setCursor(0, 1);
  lcd.print(F("  Meteorologica"));
  delay(2000);

  dht.begin();

  if (!bmp.begin(0x76)) {
    Serial.println(F("BMP280 no encontrado en 0x76, probando 0x77..."));
    if (!bmp.begin(0x77)) {
      Serial.println(F("ERROR: BMP280 no encontrado!"));
      lcd.clear();
      lcd.print(F("BMP280 ERROR!"));
      while (1);
    }
  }

  // Configuración BMP280
  bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,
                  Adafruit_BMP280::SAMPLING_X2,   // Temperatura
                  Adafruit_BMP280::SAMPLING_X16,  // Presión
                  Adafruit_BMP280::FILTER_X16,
                  Adafruit_BMP280::STANDBY_MS_500);

  Serial.println(F("Sensores listos!"));
  lcd.clear();
}

void loop() {
  unsigned long now = millis();

  // Leer sensores cada 2 segundos
  if (now - lastSensorRead >= sensorInterval) {
    lastSensorRead = now;
    leerSensores();
  }

  // Cambiar página en LCD cada 3 segundos
  if (now - lastDisplayUpdate >= displayInterval) {
    lastDisplayUpdate = now;
    displayPage = (displayPage + 1) % 2;
    actualizarLCD();
  }
}

// Variables globales para almacenar lecturas
float tempDHT = 0.0;
float humedad = 0.0;
float tempBMP = 0.0;
float presion = 0.0;
float altitud = 0.0;
bool lecturaExitosa = false;

void leerSensores() {
  // Leer DHT22
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  // Leer BMP280
  float tb = bmp.readTemperature();
  float p = bmp.readPressure() / 100.0F;       // hPa
  float a = bmp.readAltitude(1013.25);          // Altitud aprox, ref 1013.25 hPa

  // Verificar lecturas
  if (isnan(h) || isnan(t)) {
    Serial.println(F("Error leyendo DHT22"));
    lecturaExitosa = false;
  } else {
    tempDHT = t;
    humedad = h;
    tempBMP = tb;
    presion = p;
    altitud = a

More projects by dave