Tabla de contenido:
- Suministros:
- Paso 1: Asamblea
- Paso 2: Demostración
- Paso 3: Bibliotecas
- Paso 4: Código fuente
- Paso 5: Archivos
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
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 (" { 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 "