#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#include <DHT.h>
#define TFT_CS 5
#define TFT_RST 4
#define TFT_DC 15
#define DHTPIN 2 // Pin al que está conectado el sensor DHT22
#define DHTTYPE DHT22 // Tipo de sensor DHT (DHT11 o DHT22)
#define RELAY1_PIN 12 // Pin al que está conectado el primer relé
#define RELAY2_PIN 13 // Pin al que está conectado el segundo relé
#define TFT_WIDTH 320
#define TFT_HEIGHT 240
#define Y_OFFSET 10
#define X_OFFSET 5
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(9600);
// Inicialización del sensor DHT
dht.begin();
// Inicialización del display ILI9341
tft.begin();
tft.setRotation(3); // Rotar la pantalla si es necesario
// Limpiar la pantalla
tft.fillScreen(ILI9341_BLACK);
//pantallaPresentacion(5000);
//showSplashScreen();
}
void loop() {
// Lectura de la temperatura y humedad desde el sensor DHT22
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
// Verificar si la lectura del sensor fue exitosa
if (isnan(humidity) || isnan(temperature)) {
Serial.println(F("Error al leer el sensor DHT22"));
return;
}
// Mostrar la temperatura y humedad en el monitor serie
Serial.print(F("Humedad: "));
Serial.print(humidity);
Serial.print(F("%\t"));
Serial.print(F("Temperatura: "));
Serial.print(temperature);
Serial.println(F("°C"));
// Mostrar la temperatura y humedad en el display ILI9341
tft.fillScreen(ILI9341_BLACK); // Limpiar la pantalla
tft.setCursor(X_OFFSET, Y_OFFSET);
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(1); // Tamaño de la fuente
tft.print(F("Humedad: "));
tft.print(humidity);
tft.print(F("%"));
tft.setCursor(X_OFFSET, Y_OFFSET + 30);
tft.print(F("Temperatura: "));
tft.print(temperature);
tft.print(F(" C"));
// Control de los relés en base a la temperatura
if (temperature >= 25) {
digitalWrite(RELAY1_PIN, HIGH); // Encender el primer relé
} else {
digitalWrite(RELAY1_PIN, LOW); // Apagar el primer relé
}
if (temperature >= 30) {
digitalWrite(RELAY2_PIN, HIGH); // Encender el segundo relé
} else {
digitalWrite(RELAY2_PIN, LOW); // Apagar el segundo relé
}
delay(2000); // Esperar 2 segundos antes de la siguiente lectura
//drawHumidityGraph(X_OFFSET, Y_OFFSET, TFT_WIDTH - 2 * X_OFFSET, TFT_HEIGHT - 2 * Y_OFFSET);
drawHumidityGraph(X_OFFSET, Y_OFFSET, TFT_WIDTH , TFT_HEIGHT);
}
void drawHumidityGraph(int x, int y, int width, int height) {
float humidity;
unsigned long startTime = millis();
int prevX = -1;
int prevY = -1;
tft.fillRect(x, y, width, height, ILI9341_BLACK); // Limpiar la zona del gráfico
// Dibujar líneas horizontales para el eje Y (cada 20%)
for (int i = 1; i < 5; i++) {
int yPos = map(i * 20, 0, 100, height, 0);
tft.drawFastHLine(x, y + yPos, width, ILI9341_GREEN);
}
while (millis() - startTime <= 60000) { // Graficar durante 1 minuto
humidity = dht.readHumidity();
if (!isnan(humidity)) {
int graphHeight = map(humidity, 0, 100, 0, height);
int xPos = map(millis() - startTime, 0, 60000, 0, width);
int yPos = y + height - graphHeight;
if (prevX != -1 && prevY != -1) {
tft.drawLine(prevX, prevY, xPos, yPos, ILI9341_WHITE);
}
prevX = xPos;
prevY = yPos;
}
delay(1000); // Actualizar cada segundo
}
}
void showSplashScreen() {
tft.fillScreen(ILI9341_BLACK); // Limpiar la pantalla
// Definir el texto de presentación
String text = "Inicializando";
int textWidth = text.length() * 6; // Anchura estimada del texto
int textX = (TFT_WIDTH - textWidth) / 2; // Centrar el texto horizontalmente
int textY = TFT_HEIGHT / 2 - 10; // Centrar el texto verticalmente
// Mostrar el texto de presentación
tft.setCursor(textX, textY);
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(2);
tft.println(text);
// Animación de espera (puntos circulares)
int dotCount = 8; // Número de puntos
unsigned long startTime = millis();
while (millis() - startTime <= 3000) { // Esperar durante 3 segundos
// Borrar la pantalla debajo de los puntos
tft.fillRect(0, textY + 20, TFT_WIDTH, 10, ILI9341_BLACK);
// Dibujar los puntos en un círculo
int circleX = textX + textWidth + 30; // Posición X del centro del círculo
int circleY = textY + 25; // Posición Y del centro del círculo
int circleRadius = 20; // Radio del círculo
for (int i = 0; i < dotCount; i++) {
float angle = (float)i / dotCount * 2 * PI; // Ángulo para distribuir los puntos uniformemente en el círculo
int dotX = circleX + cos(angle) * circleRadius;
int dotY = circleY + sin(angle) * circleRadius;
// Borrar el punto anterior
tft.fillCircle(dotX, dotY, 3, ILI9341_BLACK);
// Cambiar de color del punto
uint16_t dotColor = (i == (millis() / 300) % dotCount) ? ILI9341_WHITE : ILI9341_GREEN;
// Dibujar el punto actual
tft.fillCircle(dotX, dotY, 3, dotColor);
}
// Esperar un breve tiempo antes de actualizar la animación
delay(300);
}
}