Arduino Mega + WiFi = Automatización: 5 pasos

Arduino Mega + WiFi = Automatización: 5 pasos

Tabla de contenido:

Anonim

Hoy hablaré sobre un ensamblaje que fue sugerido por muchos seguidores: Arduino Mega + ESP. Esto incluirá un proyecto de automatización con 16 relés, tres sensores y un teléfono inteligente. Haremos un servidor web para Arduino Mega utilizando la comunicación en serie con el ESP8266, en la versión ESP-01. También mostraré una página con los valores de los sensores y botones para modificar el estado de los relés.

Suministros:

Paso 1: Asamblea

Coloqué aquí el esquema, que muestra el DHT22, el Ds18b20 y un tercer sensor (la luz), todos conectados a los relés por los pines 36 a 51.

Paso 2: Demostración

Vea el video de demostración del proyecto en operación. En el ensamblaje, se le entrega una placa de 16 hilos, que se conecta directamente a los puertos de un Arduino Uno. Este Uno que utilicé fue solo para alimentar el 3v3 del ESP-01. Todavía tengo un LDR (que es mi sensor de luz), un termómetro Ds18b20 y el DHT22, que recopila datos de humedad y temperatura. Tenemos una aplicación en el teléfono inteligente que mostrará los datos recopilados por estos sensores y los enviará al teléfono celular desde el Arduino Mega, a través del ESP, que sería el puente en serie (es decir, el WiFi).

En el conjunto, tenemos LED que, cuando están encendidos, indican que los relés respectivos están apagados. Este proceso también es controlado por el teléfono inteligente.

Paso 3: Bibliotecas

Para nuestro proyecto de hoy, necesitaremos ciertas libretas:

Biblioteca de WiFiEsp

En el IDE de Arduino, vaya a Sketch-> Include Library-> Manage Libraries …

Instala WiFiEsp

Biblioteca de temperatura de Dallas

En el IDE de Arduino, vaya a Sketch-> Include Library-> Manage Libraries …

Instalar la temperatura de Dallas

Biblioteca OneWire

En el IDE de Arduino, vaya a Sketch-> Include Library-> Manage Libraries …

Instalar OneWire

Biblioteca de sensores DHT de Adafruit

En el IDE de Arduino, vaya a Sketch-> Include Library-> Manage Libraries …

Instalar la biblioteca de sensores DHT por Adafruit

Paso 4: Código fuente

MEGAESP_01.ino

Comenzamos por incluir las bibliotecas y definir los pines conectados a los sensores. También señalamos el pin donde estará el primer relé y cuántos pines (a partir de este primero) se usarán.

#incluir

#incluir #incluir #incluir // Pinos onde estão os sensores #define PIN_DS18B20 7 #define PIN_DHT22 8 #define PIN_LUMINOSITY A0 #define FIRST_PIN 36 // Pino onde está o primeiro relê #define PINS_COUNT 16 // Quantos pinos a partir do primeiro serão jame

Continuamos con el sensor de temperatura DS18B20 y el sensor de temperatura y humedad DHT22. Luego, nos propusimos definiciones para la red WiFi, como el SSID y la contraseña para que el ESP se conecte. Apuntamos al servidor que recibirá las solicitudes en el puerto 80 (puerto estándar http), así como las variables para almacenar los valores de los sensores.

// Sensor de Temperatura DS18B20

OneWire oneWire (PIN_DS18B20); Sensores de temperatura Dallas (y oneWire); Sensor DeviceAddress; // Sensor de temperatura y temperatura DHT22 DHT dht (PIN_DHT22, DHT22); // SSID y redirecciona wifi para o ESP se conecta char ssid = "SSID"; pase de char = "12345678"; char ip = "192.168.0.109"; // Servidor que se recuerde según lo establecido en la carpeta 80 (porta padrão http) Servidor WiFiEspServer (80); // Variáveis ​​para armazenar os valores dos sensores float temperatureDS18B20 = 0; temperatura del flotador DHT22 = 0; humedad del flotadorDHT22 = 0; Int luminosidad = 0; // Mantener el estado actual de los pines (HIGH ou LOW) int pinsStatus PINS_COUNT;

MEGAESP_01.ino - configuración

Inicializamos el monitor serie y el monitor serie donde el ESP-01 es con firmware AT, además de pines y sensores DS18B20 y DHT22. Para el sensor de brillo, solo necesitamos leer el pin analógico. También inicializamos el WiFi y nos conectamos a la red. Finalmente, inicializamos el servidor.

configuración del vacío ()

{// Serial para o monitor serial Serial.begin (115200); // Serial onde está o ESP-01 com firmware AT Serial1.begin (115200); // Inicializa os pinos setupPins (); // Inicializa o sensor DS18B20 setupDS18B20 (); // Inicializa o sensor DHT22 dht.begin (); // Para o sensor de luminosidad apenas se define el pino analógico pinMode (A0, INPUT); // Inicializa WiFi e conecta à rede setupWiFi (); // Inicializa o server server.begin (); }

MEGAESP_01.ino - setupPins

En este paso, colocamos los pines que están conectados a los relés como salidas.

void setupPins ()

{// Coloca os pinos que están ligados o relegados como saída para (int i = 0; i

MEGAESP_01.ino - setupWiFi

Aquí, realizamos una función que inicializa la serie donde el ESP-01 está con el firmware AT ya instalado. Esperamos para conectarnos a la red WiFi, configurar la IP y verificar la misma IP.

void setupWiFi ()

{// Serial onde está o ESP-01 con firmware AT já instalado WiFi.init (& Serial1); Serial.print ("Conectando a"); Serial.println (ssid); int status = WL_IDLE_STATUS; // Aguarda conectar à rede WiFi while (estado! = WL_CONECTADO) {estado = WiFi.begin (ssid, pass); } Serial.println (); Serial.println ("Conectado"); // Configura o IP IPAddress ipAddress; ipAddress.fromString (ip); WiFi.config (ipAddress); // Veririca o IP IPAddress localIP = WiFi.localIP (); Serial.print ("IP:"); Serial.println (localIP); }

MEGAESP_01.ino - setupDS18B20

Inicialice el sensor DS18B20.

// Inicializa o sensor DS18B20

void setupDS18B20 () {sensores.begin (); if (! sensores.getAddress (sensor, 0)) {Serial.println ("Sensor no encontrado!"); }}

MEGAESP_01.ino - Loop

En el Loop, comprobamos si hay un nuevo cliente. Leemos la solicitud y, si la solicitud no es para el favicon, ejecutamos la acción con el valor pasado en la solicitud. Luego leemos los sensores y enviamos la respuesta al cliente. Determinamos un tiempo para que el navegador reciba los datos y cierre la conexión con el cliente.

bucle de vacío ()

{Cliente WiFiEspClient = server.available (); // Verifica si no es cliente si (cliente) {Serial.println ("Novo cliente conectou"); // Faz a leitura da requisição char * request = readRequest (cliente); // Se requiere un requisito para para o favicon if (strstr (request, "favicon") == NULL) {// Executamos a ação con un valor passado na requisição execute (getAction (request), getValue (request)); // Faz a leitura dos sensores readSensorDS18B20 (); readSensorDHT22 (); readSensorLuminosity (); // Envia a resposta ao cliente sendResponse (cliente); // Tempo para navegador receber os dados delay (100); } // Fecha una conexión con el cliente client.stop (); }}

MEGAESP_01.ino - readRequest

Aquí, tenemos una función muy importante. ¿Qué hace? Cuando presionamos un botón en el teléfono inteligente, la función envía el comando en HTTP a ESP8266, usando solo la primera línea, como puede ver en el siguiente ejemplo. Enfatizo que incluso después de leer la primera línea, es importante leerla hasta el final, de lo contrario, la biblioteca WiFiESP da un tiempo de espera.

GET /? On = 1 HTTP / 1.1 r n

Anfitrión: 192.168.3.154 r n

Conexión: keep-alive r n

Control de caché: max-age = 0 r n

Solicitudes de actualización inseguras: 1 r n

Usuario-Agente: Mozilla / 5.0 (Linux; Android 8.0.0; SM-G955F Build / R16N) AppleWebKit / 537.36 (KHTML, como Gecko) Chrome / 68.0.3440.91 Mobile Safari / 537.36 r n

Acepte: texto / html, aplicación / xhtml + xml, aplicación / xml; q = 0.9, imagen / webp, imagen / apng, * / *; q = 0.8 r n

Referer:

Aceptar la codificación: gzip, deflate r n

Aceptar lenguaje: en-US, en; q = 0.9 r n

r n

Aquí, tenemos la lectura de la primera línea de la solicitud.

// Faz a leitura da primeira linha da requisição

char * readRequest (cliente WiFiEspClient) {bool currentLineIsBlank = true; solicitud de char 50; int i = 0; bool firstLine = true; while (client.connected ()) {if (client.available ()) {char c = client.read (); Serial.write (c); // Apenas a primeira linha da requisição nos interessa if (firstLine) {solicitud i = c; i ++; }

Vemos que la última línea de la solicitud es: r n solo, r n. Y, después de la línea anterior, es: r nso. Si llegamos aquí, es porque la solicitud se ha leído en su totalidad. Además, si lee cualquier carácter que no sea ny r, significa que la línea no está en blanco.

si (c == ' n') {

// La última línea de la solicitud es um r n sozinho, após o r n da linha anterior if (currentLineIsBlank) {// Se chegou aqui it porque a requisição foi lida por completo break; } currentLineIsBlank = true; FirstLine = falso; } else if (c! = ' r') {// Se leu qualquer caracter que não para n e significa que a linha não está em branco currentLineIsBlank = false; } } } solicitud de devolución; }

MEGAESP_01.ino - sendResponse

Esta función envía el HTML al cliente. También envía el encabezado HTTP, así como el encabezado y cuerpo HTML.

// Envia o HTML para o cliente

void sendResponse (cliente WiFiEspClient) {// Envia o cabeçalho HTTP client.print ("HTTP / 1.1 200 OK r n" "Tipo de contenido: texto / html; charset = UTF-8 r n" "Conexión: cerrar r n "" Actualizar: 10; URL = / r n "// Para obtener más información, haga clic en un servidor cada 10 segundos" r n "); client.println (""); client.println (""); head (cliente); // Envia o cabeçalho do HTML body (client); // Envia o corpo do HTML client.println ("');

}

MEGAESP_01.ino - cabeza

Enviamos el CSS para modificar la apariencia de la página.

// Envia o CSS para modificar a aparência da página

cabeza vacía (cliente WiFiEspClient) {client.println (F ("' ''

''));

}

MEGAESP_01.ino - cuerpo

Luego procedemos a mostrar los datos del sensor y creamos los botones para cada pin que tiene un relé.

// Exibe os dados dos sensores y cria os botões

cuerpo vacío (cliente WiFiEspClient) {client.println (""" DS18B20 Temperatura: "+ String (temperatureDS18B20) +" ° C "" "" DHT22 Temperatura: "+ String (temperatureDHT22) +" ° C "" "DHT22 Humedad:" + String (HumedadDHT22) + "%" "); Botones de cadena =" "; // Cria um botão para cada pino que posiblemente se puede relê (int i = 0; i

{

buttons.concat (botón (i));

}

client.println (botones);

client.println ("');

}

MEGAESP_01.ino - botón

Creamos un botón con la apariencia y la acción que corresponde al estado actual del relé.

// Se trata de un artículo con una descripción y una correspondencia en el estado actual de la comunicación.

Botón de cadena (número int.) {Etiqueta de cadena = Cadena (número + 1); String className = "button"; className + = pinsStatus número == ALTO? "button_on": "button_off"; String action = pinsStatus número == ALTO? "apagado en"; regreso "