#include <Arduino.h>
#include <ArduinoJson.h>
#include <HTTPClient.h>
#include <WiFi.h>
#include "DHTesp.h"
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define LED_PIN 0 // Pin de salida para el LED (cámbialo al pin que estés usando)
#define SCREEN_WIDTH 128 // Ancho de la pantalla OLED, en píxeles
#define SCREEN_HEIGHT 64 // Alto de la pantalla OLED, en píxeles
// Crea un objeto de pantalla OLED conectado a I2C
Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const int DHT_PIN = 15;
DHTesp dhtSensor;
// Función para enviar una pregunta a OpenAI y mostrarla en la pantalla OLED
void sendQuestionToOpenAI() {
float temperature = dhtSensor.getTemperature();
float humidity = dhtSensor.getHumidity();
String question = "¿Cuál es el riesgo de incendio en Monterrey basado en la temperatura actual (" + String(temperature, 2) + "°C) y humedad (" + String(humidity, 1) + "%)?";
HTTPClient http;
http.begin("https://api.openai.com/v1/chat/completions");
http.addHeader("Authorization", "Bearer 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"); // Reemplaza con tu clave de API de OpenAI
http.addHeader("Content-Type", "application/json");
String body = "{\"model\": \"gpt-3.5-turbo\",\"messages\":[{\"role\":\"user\", \"content\":\"" + question + "\"}],\"temperature\": 0}";
int httpCode = http.POST(body);
if (httpCode > 0) {
String payload = http.getString();
DynamicJsonDocument doc(512);
deserializeJson(doc, payload);
String answer = doc["choices"][0]["message"]["content"].as<String>();
// Muestra la pregunta y respuesta en la pantalla OLED
oled.clearDisplay();
oled.setTextSize(1);
oled.setTextColor(SSD1306_WHITE);
oled.setCursor(0, 2);
oled.println("P: " + question);
oled.setCursor(0, 20);
oled.println("R: " + answer);
oled.display();
} else {
Serial.println("Error en la solicitud HTTP");
}
http.end();
}
void setup() {
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT); // Configura el pin del LED como salida
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println("Conectando a WiFi...");
}
Serial.println("Conectado a la red WiFi");
if (!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("Error al iniciar la pantalla OLED SSD1306"));
while (1);
}
// Ciclo inicial: enviar la primera pregunta a OpenAI y mostrarla en la pantalla
sendQuestionToOpenAI();
}
void loop() {
// Leer datos de temperatura y humedad
TempAndHumidity data = dhtSensor.getTempAndHumidity();
// Comprobar si los datos son válidos (no son NaN)
if (!isnan(data.temperature) && !isnan(data.humidity)) {
// Enviar la pregunta a OpenAI y mostrarla en la pantalla OLED
sendQuestionToOpenAI();
}
Serial.println("Temp: " + String(data.temperature, 2) + "°C");
Serial.println("Humidity: " + String(data.humidity, 1) + "%");
Serial.println("---");
if (data.temperature > 38) {
digitalWrite(LED_PIN, HIGH); // turn on the LED
} else {
digitalWrite(LED_PIN, LOW); // turn off the LED
}
// Esperar un tiempo antes de la próxima iteración del bucle
delay(5000); // Espera 5 segundos antes de enviar la siguiente pregunta
}