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:
DHT-22 pinout
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
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.
Comments