Servidor web asíncrono con el módulo ESP8266.

Este ejemplo básico de un servidor web asíncrono para usarlo en el esp8266 cargándolo desde el Sketch de arduino gracias a que con un flasheo del firmware podemos reprogramarlo como si de un atmega328p se tratase, y olvidándonos de los tediosos comandos AT, usaremos el sensor DHT22 que es mucho más preciso que su archienemigo el DHT11.

Usaremos el conversor serial que contiene el arduino, por medio de los pines tx/rx si no tendríamos que comprar un conversor usb-serial ttl muy económicos. fu#k comandos at

Estas son breves característica de ambos sensores:

image

DHT-22 pinout

image

Código del servidor web asíncrono (AsynchronousWebServer)

Usaremos las librerías siguientes:

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESPAsyncTCP.h>
#include <ESPAsyncWebServer.h>
#include <ArduinoJson.h>
#include <DHT.h>

Hay están contenidas para cada caso, para la conexión wifi (WiFiClient,ESP8266WiFi), servidor asíncrono (ESPAsyncTCP, ESPAsyncWebServer) creación del json (ArduinoJson) para la api Rest, y del sensor de humedad y temperatura (DHT)

Definimos las variables para usar el pin del sensor DHT22

#define DHTTYPE DHT22
#define DHTPIN 2
DHT dht(DHTPIN, DHTTYPE,27);

Definimos el puerto del servidor en el 8081, tengo los otros típicos en uso XD

AsyncWebServer server(8081);

Configuración de red wifi, colocamos nombre y password.

const char* ssid = "Tu red";
const char* password = "misuperhax0rpassword";

Se intentara conectar a la red wifi, y notificara por la consola.

  //esperando por conexión
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi..");
  }

la función helloWorld simplemente saluda con un texto al visitar la url principal /

//Hello world!
void initRoute() {
   server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) {
        request -> send(OK_HTTP, TEXT_PLAIN, "Welcome webserver Esp8266");
   });
}

Aquí pasa parte de la magia, en la url /dht22 expondremos nuestra simple api Rest

void dht22() {
//Temperaturaº y Humedad%
server.on("/dht22", HTTP_GET, [](AsyncWebServerRequest *request){
    String json;
    StaticJsonDocument<300> doc;
    doc["sensor"] = "DHT-22";
    doc["temperature"] = t;
    doc["humidity"] = h;
    serializeJson(doc,json);
    request -> send(OK_HTTP, TEXT_JSON, json);
  });
}

la función handeLED la usaremos para prender y apagar un led en el pin GPIO0 = 0 entonces si visitamos la url /on u /off, ocurre nuevamente la magia esperada.

//On/off Led
void handleLED() {
  //Encender led
  server.on("/on", HTTP_GET, [](AsyncWebServerRequest *request){
    digitalWrite(led,HIGH);
    request -> send(OK_HTTP, TEXT_PLAIN, oK);
  });

  //Apagar led
  server.on("/off", HTTP_GET, [](AsyncWebServerRequest *request){
    digitalWrite(led,LOW);
    request -> send(OK_HTTP, TEXT_PLAIN, oK);
  });
}

Aqui la función loop() necesaria para hacer la lectura del sensor, y colocar un delay de 1 segundo

void loop(void){
   t = dht.readTemperature();
   h = dht.readHumidity();
    
   Serial.print("Humidity: ");
   Serial.print(h);
   Serial.println(HUMIDITY);
    
   Serial.print("Temperature: ");
   Serial.print(t);
   Serial.println(TMP);
      
   delay(1000);
}

Código completo.

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESPAsyncTCP.h>
#include <ESPAsyncWebServer.h>
#include <ArduinoJson.h>
#include <DHT.h>

#define DHTTYPE DHT22
#define DHTPIN 2
DHT dht(DHTPIN, DHTTYPE,27);

float t=0;
float h=0;

AsyncWebServer server(8081);// Create a asynchronous webserver object that listens for HTTP request on port 8081

const int led = 0;
const int OK_HTTP = 200;
const char* TMP = "ºC";
const char* HUMIDITY = "%";
const char* TEXT_PLAIN = "text/plain";
const char* TEXT_JSON = "text/json";
const char* oK = "OK";
//Wifi network credentials
const char* ssid = "MOVISTAR_5F52";
const char* password = "62A3F569A1A589497DF7"; //aqui les dejo mi contraseña para que se conecten, wifi free :)

void setup(void){
  Serial.begin(115200);
  delay(10);
  Serial.println('\n');
  WiFi.begin(ssid, password);
  pinMode(led, OUTPUT);

  //esperando por conexión
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi..");
  }

  Serial.println('\n');
  Serial.print("Connected to ");
  Serial.println(WiFi.SSID());             
  Serial.print("IP address:\t");
  Serial.println(WiFi.localIP());          

  initRoute();
  dht22();
  handleLED();
  handleNotFound();
  
  server.begin();// Actually start the server
  Serial.println("HTTP server started");
}

//Hello world!
void initRoute() {
   server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) {
        request -> send(OK_HTTP, TEXT_PLAIN, "Welcome webserver Esp8266");
   });
}

void dht22() {
  //Temperaturaº y Humedad%
  server.on("/dht22", HTTP_GET, [](AsyncWebServerRequest *request){
    String json;
    StaticJsonDocument<300> doc;
    doc["sensor"] = "DHT-22";
    doc["temperature"] = t;
    doc["humidity"] = h;
    serializeJson(doc,json);
    request -> send(OK_HTTP, TEXT_JSON, json);
  });
}

//On/off Led
void handleLED() {
  //Encender led
  server.on("/on", HTTP_GET, [](AsyncWebServerRequest *request){
    digitalWrite(led,HIGH);
    request -> send(OK_HTTP, TEXT_PLAIN, oK);
  });

  //Apagar led
  server.on("/off", HTTP_GET, [](AsyncWebServerRequest *request){
    digitalWrite(led,LOW);
    request -> send(OK_HTTP, TEXT_PLAIN, oK);
  });
}

//404
void handleNotFound() {
  //Error 404 not found
  server.onNotFound([](AsyncWebServerRequest *request){
    request->send(404, TEXT_PLAIN, "Sorry, 404 not found.");
  });
}

void loop(void){
  t = dht.readTemperature();
  h = dht.readHumidity();

  Serial.print("Humidity: ");
  Serial.print(h);
  Serial.println(HUMIDITY);

  Serial.print("Temperature: ");
  Serial.print(t);
  Serial.println(TMP);
  
  delay(1000);
}

Al visitar la URL /dht22

Alt Text

Vista final

Aquí usamos la fuente de 3.3v | 5v con un transformador externo de 2000mAh más salida de 12vc. Se ve en la fuente de poder MB102, el jumper que nos permite obtener 3.3v, se puede comprobar con un multímetro con puntas de caiman, y o agujas.

Un transformador de menos de 6.5vdc no servirá para la MB102

image

image

image

Info

Comments