#include <Adafruit_SH110X.h>
#include <Adafruit_GFX.h>
#include <Wire.h>
#include <DHT.h>
// ---- Pines / Config ----
const short DHT22_PIN = 33; // sensor temperatura y humedad
const int pot = 32; // potenciometro
const int led = 2; // led interno es el azul de la placa
const int touchmas = 13; // touch +
const int touchmenos = 4; // touch -
const int led_externo = 23; // led verde
const int relay = 14; // alarma
// Encoder KY040
const int ENCODER_SW = 19; // pulsador del encoder (reemplaza el boton de antes)
// Estado
int modo = 1; // 1..4
int humedadMinima = 40;
float temperaturaMaxima = 30.0;
// Display y DHT
Adafruit_SH1106G display = Adafruit_SH1106G(128, 64, &Wire, -1);
DHT dht(DHT22_PIN, DHT22);
// Debounce para SW
unsigned long lastPressMs = 0;
const unsigned long debounceMs = 120;
int lastBtn = HIGH; // con INPUT_PULLUP suelto es un HIGH
void setup() {
Serial.begin(9600);
pinMode(led, OUTPUT);
pinMode(pot, INPUT);
pinMode(touchmas, INPUT); // si son botones fisicos, pasar estoa INPUT_PULLUP
pinMode(touchmenos, INPUT);
pinMode(relay, OUTPUT);
pinMode(led_externo, OUTPUT);
// Encoder
pinMode(ENCODER_SW, INPUT_PULLUP); // importante!!!!!!!
if (!display.begin(0x3C, true)) {
Serial.println("OLED inicio fallido!");
while (1);
}
display.setTextSize(1);
display.setTextColor(SH110X_WHITE);
display.clearDisplay();
dht.begin();
Serial.println("Inicio");
}
void loop() {
// --- LED PWM desde potenciometro ---
int lectura = analogRead(pot); // 0- 4095
int salida = map(lectura, 0, 4095, 0, 255); // 0--255
analogWrite(led, salida);
// --- DHT22 ---
float temp = dht.readTemperature();
float hum = dht.readHumidity();
// --- Alarma ---
if (temp > temperaturaMaxima || hum < humedadMinima) {
digitalWrite(relay, HIGH);
digitalWrite(led_externo, HIGH);
} else {
digitalWrite(relay, LOW);
digitalWrite(led_externo, LOW);
}
// --- Cambio de modo con SW del encoder (FLANCO DESCENDENTE) ---
int btn = digitalRead(ENCODER_SW);
if (btn != lastBtn) {
if (btn == LOW && (millis() - lastPressMs) > debounceMs) {
modo = (modo % 4) + 1; // 1-2-3-4
lastPressMs = millis();
}
lastBtn = btn;
}
// --- Ajustes CON BOTONEs TOUCH ---
if (modo == 3) {
int lecturaTmas = digitalRead(touchmas);
int lecturaTmenos = digitalRead(touchmenos);
if (lecturaTmas == 1 && humedadMinima < 100) humedadMinima++;
else if (lecturaTmenos == 1 && humedadMinima > 0) humedadMinima--;
}
else if (modo == 4) {
int lecturaTmas = digitalRead(touchmas);
int lecturaTmenos = digitalRead(touchmenos);
if (lecturaTmas == 1 && temperaturaMaxima < 100) temperaturaMaxima += 1.0;
else if (lecturaTmenos == 1 && temperaturaMaxima > -20) temperaturaMaxima -= 1.0;
}
// --- Pantallas ---
if (modo == 1) {
display.clearDisplay();
display.setCursor(0, 0);
display.println("---------------------");
display.println("Modo 1");
display.println("---------------------");
display.print("Temperatura: ");
display.print(temp);
display.println(" oC");
display.print("Humedad: ");
display.print(hum);
display.println("%");
display.display();
} else if (modo == 2) {
display.clearDisplay();
display.setCursor(0, 0);
display.println("---------------------");
display.println("Modo 2");
display.println("---------------------");
display.print("Potencia del led: ");
display.println(salida);
display.println("---------------------");
display.print("Lectura pot: ");
display.println(lectura);
display.display();
} else if (modo == 3) {
display.clearDisplay();
display.setCursor(0, 0);
display.println("---------------------");
display.println("Modo 3");
display.println("---------------------");
display.print("Humedad minima: ");
display.print(humedadMinima);
display.println("%");
display.display();
} else if (modo == 4) {
display.clearDisplay();
display.setCursor(0, 0);
display.println("---------------------");
display.println("Modo 4");
display.println("---------------------");
display.println("Temperatura maxima: ");
display.print(temperaturaMaxima);
display.println(" oC");
display.display();
}
delay(10);
}