// Librerías
#include "DHTesp.h" //Biblioteca que se usa para manejar el sensor
#include <WiFi.h> //Biblioteca que se usa para manejar la conexion de wifi
#include <Wire.h> //Biblioteca para I2C
#include <Adafruit_GFX.h> //Biblioteca para gráficos en la pantalla OLED
#include <Adafruit_SSD1306.h> //Biblioteca para manejar la pantalla OLED
// Configuración del sensor DHT
#define DHTPIN 15 //Define pin del DHT11
#define DHTTYPE DHTesp::DHT11 //Define tipo de sensor
DHTesp dht; // Crea una instancia del objeto DHTesp
// Configuración de la pantalla OLED
#define SCREEN_WIDTH 128 // Ancho de la pantalla OLED, en píxeles
#define SCREEN_HEIGHT 64 // Alto de la pantalla OLED, en píxeles
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1); // Crea la instancia de la pantalla OLED
// Configuración de red
const char* ssid = "ssid_name"; //Nombre de la red
const char* password = "*******"; //Contraseña
const char* host = "xxx.xxx.xxx.xxx"; // Dirección IP del servidor
WiFiClient client;
const int httpPort = 80; // El navegador usa el puerto 80 por defecto
// Configuración Inicial
void setup() {
// Configuración del monitor serial
Serial.begin(115200);
// Configuración del sensor DHT
dht.setup(DHTPIN, DHTTYPE);
// Configuración de la pantalla OLED
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Inicializa la pantalla en la dirección I2C 0x3C
Serial.println(F("Error al iniciar la pantalla OLED"));
for(;;); // Si falla la inicialización, queda en un bucle infinito
}
display.clearDisplay(); // Limpia la pantalla
display.setTextColor(WHITE); // Establece el color del texto en blanco
// Conexión a Wi-Fi
Serial.println("Conectando al WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print("."); // Imprime puntos mientras espera la conexión
}
Serial.println("\nWiFi conectado");
Serial.print("Dirección IP: ");
Serial.println(WiFi.localIP());
}
// Función para enviar datos al servidor
void sendDataToServer(float temperature, float humidity) {
if (!client.connect(host, httpPort)) {
Serial.println("Error en la conexión");
return;
}
String url = "/dht11.php?pass=ce_acatl"; // URL con la que se envían los datos al servidor
url += "&Temperatura=" + String(temperature, 2);
url += "&Humedad=" + String(humidity, 1);
Serial.print("Solicitando URL: ");
Serial.println(url);
client.print(String("GET ") + url + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");
unsigned long timeout = millis();
while (client.available() == 0) {
if (millis() - timeout > 5000) {
Serial.println(">>> Tiempo de espera agotado del cliente");
client.stop();
return;
}
}
while (client.available()) {
String line = client.readStringUntil('\r');
Serial.print(line);
}
Serial.println("\nCerrando conexión");
client.stop();
}
// Bucle principal
void loop() {
// Obtiene los datos del sensor DHT
TempAndHumidity data = dht.getTempAndHumidity();
if (isnan(data.temperature) || isnan(data.humidity)) {
Serial.println("Error al leer los datos del sensor DHT");
return;
}
// Imprime los valores en el monitor serial
Serial.print("Temperatura: ");
Serial.print(data.temperature);
Serial.print(" Humedad: ");
Serial.println(data.humidity);
// Muestra los datos en la pantalla OLED
display.clearDisplay();
// Muestra la temperatura
display.setTextSize(1);
display.setCursor(0, 0);
display.print("Temperatura: ");
display.setTextSize(2);
display.setCursor(0, 10);
display.print(data.temperature);
display.print(" ");
display.setTextSize(1);
display.cp437(true);
display.write(167); // Símbolo de grado (°)
display.setTextSize(2);
display.print("C");
// Muestra la humedad
display.setTextSize(1);
display.setCursor(0, 35);
display.print("Humedad: ");
display.setTextSize(2);
display.setCursor(0, 45);
display.print(data.humidity);
display.print(" %");
display.display(); // Actualiza la pantalla con los datos
// Envía los datos al servidor
sendDataToServer(data.temperature, data.humidity);
delay(60000); // Espera 60 segundos antes de la próxima lectura
}