Continuará La parte anterior .
Tabla de contenido:
Unidad central Software
Finalmente, llegamos a la parte más difícil para cualquier programador: describir en términos humanos lo que había hecho allí.
El código fuente del servidor es de aproximadamente 1300 líneas, incluida la sangría, pero esto no debería asustarlo. El texto fuente se proporciona con comentarios detallados, en este sentido no me equivocaré si digo que mis fuentes se describen mejor que cualquier otra que solo pueda encontrar. En los comentarios directamente en el código fuente, encontrará todos los pinouts para conectar módulos y todos los enlaces necesarios a la documentación externa. El secreto es simple: escribí comentarios para mí constantemente, "en el curso de la obra", por lo que no tuve ninguna dificultad con la documentación.
Como ya escribí, puede comenzar sin tener todos los módulos a mano. Por ejemplo, puede comenzar sin tener un módulo de radio o ESP8266. También puede faltar el sensor de presión barométrica BMP180. Añadir más tarde. Es cierto que, en este caso, es posible que (deba) comentar de forma independiente en el boceto aquellas secciones del código que son responsables de interactuar con los bloques que faltan, pero lo más probable es que esto no sea necesario. Lo principal es que al menos algo se ha reunido y ganado, entonces es más divertido continuar.
Específicamente, ahora, en este punto de la historia, todavía no hemos ensamblado un módulo sin ventana (externo) y no tenemos nuestro propio servidor web con una base de datos, todavía no lo necesitamos (pero si hay uno, conéctelo de inmediato para que no tenga que cavar):
- módulo de radio nRF24L01 +
- Módulo WiFi ESP8266.
Y, sin embargo, probablemente comenzaré con el ESP8266, como el más problemático en la programación y operación del módulo. La razón radica en la diversidad de los módulos mismos y su firmware.
Como escribí el firmware AT estándar para él, hay una serie de desventajas:
- todavía están húmedos (a partir de 2016)
- No pude encontrar una biblioteca normal para que Arduino controlara el módulo ESP8266 usando comandos AT, tuve que "cultivar colectivamente".
No formateé el código para ESP8266 en una biblioteca separada, sino que simplemente escribí las funciones necesarias, por lo que el boceto salió mucho tiempo. Además, implementé solo la funcionalidad que necesito. Toda la programación para ESP utilizando comandos AT se reduce a analizar cadenas y establecer demoras entre comandos.
Puede encontrar y descargar el código fuente del servidor (módulo central) server.ino aquí .
Luego pongo el firmware para el ESP8266 en el archivo firmware/AT23-SDK101-nocloud.bin
y la documentación para los curiosos está en el mismo directorio. Al actualizar el firmware indicado, puede estar seguro de que mi boceto funcionará con WiFi como estaba previsto. No experimenté con otro firmware AT. El hecho es que logré encontrar el firmware "avanzado" que no es AT e incluso participé un poco en su creación, que es perfectamente adecuado para nuestros propósitos ( aquí está esp-link ). Sin embargo, como sucede a menudo, todo sucedió después de que se completó el trabajo en la versión actual de la estación meteorológica, por lo que se decidió dejarlo como está.
Entonces, al principio tienes que actualizar el firmware AT especificado. No hay nada complicado, sino también simple. La forma de hacerlo se describe mucho en la red, ESP8266, conectando y actualizando el firmware .
Como mi convertidor USB-TTL no tenía suficiente corriente y el puerto USB se caía constantemente (¡esto es un turno!), Conecté eléctricamente el módulo para su firmware usando el método "Arduino como un simple convertidor TTL de USB a serie".
Como trabajo en Linux, lo estaba esptool.py
con esptool.py
. Para la comodidad del firmware, yo "nakolhozil" una pequeña placa auxiliar con interruptores (no se describe aquí).
Después de la actualización, debe establecer la velocidad del puerto en 57600 (ya que para SoftSerial, la velocidad del puerto en 115200 es grande y no garantiza una operación estable) con el comando
AT+UART_DEF=57600,8,1,0,0
A continuación, debe modificar ligeramente las bibliotecas Arduino IDE estándar, es decir, en el archivo arduino/hardware/arduino/avr/libraries/SoftwareSerial/SoftwareSerial.h
, cambie la línea correspondiente a
#define _SS_MAX_RX_BUFF 128
en el archivo arduino/hardware/arduino/avr/cores/arduino/HardwareSerial.h
cambie las líneas correspondientes a
#define SERIAL_TX_BUFFER_SIZE 128 #define SERIAL_RX_BUFFER_SIZE 128
y en el archivo arduino/hardware/arduino/avr/cores/arduino/USBAPI.h
cambie la línea correspondiente a
#define SERIAL_BUFFER_SIZE 128
Estrictamente hablando, esto está mal, porque al actualizar el SDK de Arduino, estos archivos probablemente se sobrescribirán y deberá repetir todas las correcciones nuevamente. En ciencia, debemos inventar nuestra propia biblioteca, que manipula los valores especificados (si es posible), pero esto no es para todos.
De una forma u otra, las manipulaciones preliminares han terminado.
Ahora pasamos directamente al código de la unidad central (servidor) server.ino
En las primeras líneas, debe cambiar la configuración de acceso para su punto WiFi
const String SSID = "..."; const String PASSWORD = "...";
El trabajo con el servidor web se analizará en detalle más adelante.
Las siguientes son definiciones de depuración (comentadas):
//#define DEBUG //#define DEBUG_RF //#define DEBUG_ESP //#define DEBUG_LOG_SD
Si algo sale mal, siempre puede descomentarlos, volver a compilar y volver a cargar el boceto y obtener más información de depuración en la consola o escribirlo en un archivo en la tarjeta SD. Y solo puede descomentar lo que necesita. Por ejemplo, el módulo nRF24L01 +? Luego descomente solo DEBUG_RF, etc.
A continuación hay comentarios extensos con pinouts, inicialización y una descripción detallada de toda la periferia.
Aquí puede cambiar el número del canal de radio para nRF24L01 +
#define RF_CHANNEL 73
Luego viene void setup()
, que queda claro a partir de comentarios detallados allí. Bueno, y luego void loop()
, el código para trabajar con el servidor web aún no se considera.
Después de completar el boceto, su unidad central cobrará vida y le mostrará algo, pero no inmediatamente, sino después de 10 minutos: el valor DELAY_LOCAL_SENSOR
. Puedes cambiarlo, por supuesto.
La pantalla debe mostrar: temperatura y humedad ambiente (datos del sensor DHT11) y presión barométrica (de BMP180).
Las siguientes funciones son responsables de la visualización en la pantalla LCD 16 × 4:
void lcdClearRow(int row) // , void lcdPrintOutdoor(int temperature, int humidity, float voltage) // , void lcdPrintHome(int temperature, int humidity, int pressure) void lcdPrintInfo(char info[LCD_MAX_COLS]) void lcdPrintStatus() void lcdPrintLastSensorTime()
El diseño de la pantalla LCD1604 es el siguiente.

La primera línea (superior) imprime un ícono estilizado (hombre caminando) diseñado para indicar el clima en la calle (salió a la calle, baja por la calle). Se me ocurrió el ícono, así que si tienes una mejor idea (que cabe en 5x8 píxeles), puedes especificarla en los comentarios (como una matriz de bytes). Puede practicar pixel art aquí Generador de caracteres personalizados para módulos LCD HD44780 . En la misma línea, se imprime el voltaje del módulo de ventana.
La segunda línea imprime "clima en la casa" y presión atmosférica. El icono de la casa es estándar, comprensible para todos.
En la tercera línea, lcdPrintLastSensorTime()
imprime cuánto tiempo ha pasado (en segundos) desde el momento en que se tomaron las últimas lecturas de los sensores, respectivamente en la calle y, separadas por una coma, en el hogar. Es útil saber con certeza que la estación meteorológica no muestra el clima de ayer. De hecho, esta es información de depuración y se puede eliminar en la versión final.
Y en la última cuarta línea de la pantalla con la función lcdPrintStatus()
, se imprime la información de estado, donde
- s es un sensor de presión local
- e es un módulo ESP8266
- i es una conexión WiFi
- w es la disponibilidad del servidor web
- l - archivo de registro en la tarjeta SD
Después de cada una de estas letras convencionales habrá un signo más o menos, lo que significa que no hay errores, problemas en el funcionamiento de los módulos correspondientes.
Volviendo a la cuestión de elegir el hierro, explicaré las ventajas de elegir una pantalla de texto LCD1604 sobre una gráfica. El hecho es que los módulos LCD1604 comprados a varios vendedores en la mayoría de los casos serán los mismos y predecibles en conexión y fáciles de programar. Lo que no se puede decir sobre las pantallas gráficas, aunque puede dibujar y mostrar en ellas mucho más. La legibilidad de una imagen desde una distancia de varios metros es nuevamente mejor con una pantalla de texto, sí, sí, puede hacer una fuente más grande en una pantalla gráfica, pero ¿cuánto puede caber en ella?
Siguiente Tan pronto como complete el boceto y se asegure de que todo funcione como debería, puede volver a conectar la "placa base" Arduino Mega a una fuente de alimentación externa. O déjelo como está, conectado al USB de la computadora para ver toda esta belleza en la consola de depuración.
Si no tiene todos los bloques ensamblados, puede comentar el código innecesario. Aunque, repito, debería funcionar así, solo recibe mensajes de error en la consola. ¿Cómo evitar esto?
Por ejemplo, no ha comprado un sensor de presión atmosférica BMP180. En el boceto server.ino , buscamos las líneas responsables de conectar las bibliotecas correspondientes, en nuestro caso es
#include <Wire.h> #include <Adafruit_Sensor.h> #include <Adafruit_BMP085_U.h>
Comentando sobre este bloque.
A continuación, en el IDE de Arduino, comenzamos a compilar el código (no el firmware) y miramos qué líneas jura el compilador. Comentamos sobre estas líneas. Repetimos la operación hasta que el código se recopile normalmente, sin errores. Antes de editar, es una buena práctica crear una copia del boceto para que cuando el sensor deseado llegue de la soleada China, no repita todas las operaciones.
Los enlaces a las bibliotecas utilizadas se dan en el código fuente. Si no existe dicho enlace, se utilizó la biblioteca Arduino IDE estándar.
Por si acaso, todas las bibliotecas (excepto las estándar) que utilicé se almacenan en el directorio de bibliotecas . Estrictamente hablando, esto está mal. Debe descargar las últimas versiones de las bibliotecas de sus repositorios oficiales (con errores corregidos, nuevas funciones), pero en caso de que sean difíciles de encontrar, ya están eliminadas o las versiones anteriores no son compatibles, solo para este caso guardé todas las bibliotecas utilizadas.
El siguiente es el ensamblaje del transductor, por lo que esta parte quedó corta para no mezclar.