/* CODIGO FUENTE DEFINITIVO - LUZ (0-200) Y GAS EXACTO */
#include <WiFi.h>
#include <HTTPClient.h>
#include "DHT.h"
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH110X.h>
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const String TOKEN = "BBUS-FayGIsI84hjwgfoSQ7f25QvOtQTuYf";
const String DEVICE_LABEL = "secadero";
#define DHTPIN 4
#define DHTTYPE DHT22
#define LDRPIN 34
#define GASPIN 35
const int pinLedAlarma = 5;
DHT dht(DHTPIN, DHTTYPE);
Adafruit_SH1107 display = Adafruit_SH1107(64, 128, &Wire, -1);
void setup() {
Serial.begin(115200);
dht.begin();
pinMode(pinLedAlarma, OUTPUT);
Serial.println("\n[SISTEMA] Inicializando hardware de telemetria...");
display.begin(0x3c, true);
display.setRotation(1);
display.setTextColor(SH110X_WHITE);
display.setTextSize(1);
display.clearDisplay();
display.setCursor(0, 20);
display.println(" TELEMETRIA UNAD");
display.println(" Conectando red...");
display.display();
Serial.print("[WIFI] Conectando a la red local...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\n[WIFI] Conexion establecida con exito.");
}
void loop() {
// 1. Lectura de variables de clima
float temp = dht.readTemperature();
float hum = dht.readHumidity();
// 2. Cálculo Controlado de Luz (Escala directa 0 a 200)
// Ignoramos la fórmula compleja y hacemos un mapeo lineal suave
int luzCrudo = analogRead(LDRPIN);
int luz = map(luzCrudo, 0, 4095, 200, 0);
// 3. Cálculo EXACTO de Gas en PPM (0.1 a 100,000.0)
int gasCrudo = analogRead(GASPIN);
float gas = 0.1 + ((gasCrudo / 4095.0) * 99999.9);
// Alarma física
digitalWrite(pinLedAlarma, (hum > 70.0) ? HIGH : LOW);
// 4. Interfaz en Pantalla OLED
display.clearDisplay();
display.setCursor(0, 0);
display.println("== TELEMETRIA UNAD ==");
display.print("Temp: "); display.print(temp, 1); display.println(" C");
display.print("Hum : "); display.print(hum, 1); display.println(" %");
display.print("Luz : "); display.print(luz); display.println(" Lux");
display.print("Gas : "); display.print(gas, 1); display.println(" ppm");
display.println("=====================");
display.println("Estado: TX ACTIVA");
display.display();
// 5. Interfaz en Consola Serial
Serial.println("\n================ REPORTE DE TELEMETRIA ================");
Serial.printf(" -> Temperatura : %.1f C\n", temp);
Serial.printf(" -> Humedad : %.1f %%\n", hum);
Serial.printf(" -> Nivel Solar : %d Lux\n", luz);
Serial.printf(" -> Nivel Gases : %.1f ppm\n", gas);
Serial.println("-------------------------------------------------------");
Serial.print("[NUBE] Transmitiendo paquete a Ubidots... ");
// 6. Envío de datos a Ubidots
if(WiFi.status() == WL_CONNECTED){
HTTPClient http;
http.begin("http://things.ubidots.com/api/v1.6/devices/" + DEVICE_LABEL);
http.addHeader("Content-Type", "application/json");
http.addHeader("X-Auth-Token", TOKEN);
String payload = "{\"temperatura\":"+String(temp)+",\"humedad\":"+String(hum)+",\"luz\":"+String(luz)+",\"gas\":"+String(gas, 1)+"}";
int httpResponseCode = http.POST(payload);
if(httpResponseCode > 0) {
Serial.printf("OK (HTTP %d)\n", httpResponseCode);
} else {
Serial.printf("FALLO (Codigo: %d)\n", httpResponseCode);
}
http.end();
} else {
Serial.println("ERROR (WiFi desconectado)");
}
Serial.println("=======================================================\n");
delay(2000);
}Loading
grove-oled-sh1107
grove-oled-sh1107