Para mejorar el termostato de mi habitación, sobre el que escribí anteriormente , me propuse complementarlo con un sensor de temperatura inalámbrico para medir la temperatura del aire exterior, armar un termostato alimentado por batería y reemplazar los módulos transmisor-receptor RF 433MHz con otro par de módulos de radio con un rango de comunicación más largo con un voltaje de alimentación no Más de 3V. En el curso de la resolución de estos problemas, surgió una estación meteorológica autónoma, que se discutirá a continuación.
La estación meteorológica consta de dos nodos, llamémosles un analizador y un termómetro por simplicidad. Comunicación entre nodos: inalámbrica, inalámbrica.
El analizador se basa en el controlador ATMEGA328P y mide la temperatura y la humedad en la habitación (sensor de temperatura y humedad DHT22) y el voltaje de suministro del analizador, que es proporcionado por dos baterías AA de 1.5V. El controlador recibe una señal del receptor LoRa, que recibe información del termómetro (sensor remoto) por el aire. La información del controlador se muestra en la pantalla LCD del NOKIA 5110.
El termómetro, también montado en el controlador ATMEGA328P, mide la temperatura del aire exterior (sensor de temperatura DS18B20) y la tensión de alimentación de la unidad remota, organizada en dos baterías AA de 1,5 V. El transmisor LoRa de esta unidad transfiere la temperatura y la tensión de alimentación al analizador.
El controlador ATMEGA328P y el transmisor LoRa del termómetro se ponen en modo de suspensión para ahorrar energía de la batería después de las mediciones y enviar información. El voltaje de la fuente de alimentación al sensor DS18B20 se aplica mediante programación solo durante la medición de temperatura. La medición y el envío de datos desde el termómetro se realiza con un período de aproximadamente un minuto.
En el mismo modo de trabajo y reposo, el analizador también funciona. La duración del analizador controlador y receptor durante varios segundos más de un minuto. Esto se hace para recibir con confianza la señal del termómetro; después de todo, el funcionamiento del termómetro y el analizador no están sincronizados. Luego, el ATMEGA328P y el receptor LoRa se ponen en modo de suspensión durante 14 minutos antes de despertarse y comenzar el siguiente ciclo. DHT22 solo proporciona energía durante la medición.
Para programar el modo de suspensión de los controladores ATMEGA328P, se utiliza la biblioteca LowPower.h.
Con la descarga de las baterías, el valor del voltaje disminuye en ellas.
El límite inferior del voltaje de funcionamiento para el controlador ATMEGA328P es 1.8V. Al mismo tiempo, la configuración de fábrica del fusible ATMEGA328P se realizó para monitorear el umbral del voltaje de suministro de 2.7V, por lo que es necesario cambiar la configuración de fábrica del fusible al umbral de monitoreo de 1.8V, para garantizar el funcionamiento del controlador cuando se alimenta con baterías agotadas.
El generador del controlador interno puede no arrancar a una frecuencia de 16 MHz con un voltaje de suministro de 3 V o ligeramente más bajo. Ambos controladores funcionan con cuarzo de 16 MHz con un voltaje de suministro reducido de 2.7 ... 2.8 V, por lo que no cambié el cuarzo de 16 MHz a 8 MHz.
Para ensamblar el dispositivo, necesitará componentes, una lista de los cuales y su costo estimado en los precios del sitio web de AliExpress se muestran en la tabla.
Componente | Precio, $ |
analizador |
Controlador ATMEGA328P-PU | 1,59 |
Sensor de temperatura y humedad DHT22 | 2,34 |
Transmisor LoRa Ra-01 | 3.95 |
LCD NOKIA 5110 | 1,91 |
Tablero de pruebas (montaje), cables de montaje, baterías AA, resonador de cuarzo de 16 MHz, resistencias, etc. | 4.00 |
termómetro |
Controlador ATMEGA328P-PU | 1,59 |
Sensor de temperatura DS18B20 | 0,63 |
Transmisor LoRa Ra-01 | 3.95 |
Placa de desarrollo (fibra de vidrio), cables de montaje, baterías AA, resonador de cuarzo de 16 MHz, resistencias, etc. | 4.00 |
Total (aproximadamente): | 24 |
Analizador
El cerebro del analizador es un controlador ATMEGA328P. Recibe señales del sensor DHT22 y, a través del protocolo SPI, se comunica con el receptor LoRa y la pantalla NOKIA 5110.
Hay muchas quejas en Internet sobre la baja precisión del DHT22. Hoy existe una alternativa: sensores de temperatura y humedad más modernos HTU21 (GY21) , (Vcc = 3 ... 5 V), Si7021 , (Vcc = 1.9 ... 3.6 V), SHT21 , (Vcc = 2.1 .... 3,6 V).
Uso DHT22, ya que la discrepancia entre las lecturas de humedad de mi muestra de este sensor y el termohigrómetro LaCrosse WS-9024IT disponible comercialmente no es más de 8 unidades, lo cual es bastante aceptable para fines domésticos. La discrepancia entre las lecturas de humedad aumenta enormemente si el voltaje de suministro de DHT22 es inferior a 3V. Esto es comprensible, porque el voltaje de suministro de DHT22 debe estar dentro de 3 ... 5V. En resumen: idealmente en estas condiciones, el sensor Si7021 se adapta al circuito del analizador.
En la imagen a continuación, el pinout de los elementos de la estación meteorológica.
Fusion y mucho más de varios controladores, incluido ATMEGA328P, se pueden leer y editar con la utilidad SinaProg. Si es la primera vez que encuentra este programa, a pesar de la interfaz intuitiva, no intente comenzar a trabajar con él después de instalar la aplicación. Primero lea este artículo en el que HWman proporciona los complementos necesarios de SinaProg cuando utiliza la placa Arduino UNO como gestor de arranque.
Le aconsejo que primero lea la configuración de fábrica del ATMEGA328P de fusión y guarde sus valores para volver a ellos en caso de falla. En mis controladores, los ajustes de fábrica para el bit de fusible son: BAJO: 0xFF, ALTO: 0xDE, EXTENDIDO: 0x05 (Vcc = 2.7V, BODLEVEL = 101). Nuevos fusibles para monitorear el umbral de 1.8V que desea establecer: BAJO: 0xFF, ALTO: 0xDE, EXTENDIDO: 0x06 (Vcc = 1.8V, BODLEVEL = 110).
El boceto del analizador para cargar en el ATMEGA328P está debajo del spoiler.
bosquejo analizador`` `cpp
/ *
Estación meteorológica autónoma en el controlador ATMEGA328P y alimentada por batería con un sensor remoto inalámbrico, analizador
https://habr.com/en/post/470381/
* /
#include <SPI.h>
#include <LoRa.h>
#include <DHT.h>
#define DHTPIN 3 // a qué pin digital estamos conectados
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
DHT dht (DHTPIN, DHTTYPE);
flotador de estaño = 0;
int Hin = 0;
flotador BatteryInLevel; // voltaje de la batería base
String LoRaData, Tout_str, BatteryInLevel_str, BatteryOutLevel_str;
// dormir
#include <LowPower.h>
#define PowerDHT (4) // pin de alimentación DHT22
unsigned int sleepCounter;
// Nokia 5110
#include <SPI.h>
#include <Adafruit_GFX.h> //https://esp8266.ru/forum/threads/esp8266-5110-nokia-lcd.1143/#post-16942
#include <Adafruit_PCD8544.h> //https://esp8266.ru/forum/threads/esp8266-5110-nokia-lcd.1143/#post-16942
// temporizador
#include <SimpleTimer.h>
Temporizador simple;
Adafruit_PCD8544 display = Adafruit_PCD8544 (5, 7, 6);
nulo sendSensor () {
digitalWrite (PowerDHT, 1);
retraso (2000);
Hin = dht.readHumidity ();
Estaño = dht.readTemperature ();
/ * if (isnan (Hin) || isnan (Tin)) {
// Serial.println ("¡Error al leer del sensor DHT!");
volver
} * /
digitalWrite (PowerDHT, 0);
// medición del voltaje de la batería:
referencia analógica (INTERNO);
int sensorValue = analogRead (A4);
BatteryInLevel = (sensorValue * 3.2 / 1024);
}
sorteo vacío () {
display.clearDisplay ();
// estaño
{
display.setTextSize (2);
display.setCursor (8, 0);
display.println (Estaño, 1); // un decimal
display.setCursor (68, 0);
display.println ("C");
}
// hin
{
display.setTextSize (2);
display.setCursor (8, 16);
display.println (Cadena (Hin) + "%");
}
// Tout
{
char chr_Tout [12];
Tout_str.toCharArray (chr_Tout, 5);
display.setTextSize (1);
display.setCursor (50, 16);
display.println (String (chr_Tout) + "C");
}
// Nivel de batería agotada
{
char chr_BatteryOutLevel [12];
BatteryOutLevel_str.toCharArray (chr_BatteryOutLevel, 4);
display.setTextSize (1);
display.setCursor (2, 32);
display.println ("BAT Out:" + String (chr_BatteryOutLevel) + "V");
}
// Nivel de batería en
{
display.setTextSize (1);
display.setCursor (2, 40);
display.println ("BAT In:„);
display.setCursor (56, 40);
display.println (BatteryInLevel, 1); // un decimal
display.setCursor (74, 40);
display.println ("V");
}
display.display ();
/ *
Serial.println ("Tin:" + String (Tin) + "* C");
Serial.println ("Hin:" + Cadena (Hin) + "%");
Serial.println ("Tout:" + Cadena (Tout_str) + "* C");
Serial.println ("BAT_In:" + String (BatteryInLevel) + "V");
Serial.println ("BAT_Out:" + String (BatteryOutLevel_str) + "V");
Serial.println ("......");
* /
}
void sleepDevice () {
// sleepCounter = 65 - 10 min
// sleepCounter = 91 - 14 min
para (sleepCounter = 91; sleepCounter> 0; sleepCounter--) // 91 !!!
{
LoRa.sleep ();
LowPower.powerDown (SLEEP_8S, ADC_OFF, BOD_OFF);
}
LoRa.sleep ();
}
vacío SignalReception () {
// intenta analizar el paquete
int packetSize = LoRa.parsePacket ();
if (packetSize) {
// leer paquete
while (LoRa.available ()) {
LoRaData = LoRa.readString ();
// Serial.println ("Aceptado:" + (LoRaData));
}
int pos1 = LoRaData.indexOf ('#');
Tout_str = LoRaData.substring (0, pos1);
BatteryOutLevel_str = LoRaData.substring (pos1 + 1, LoRaData.length ());
}
}
configuración nula () {
//Serial.begin(9600);
pinMode (PowerDHT, OUTPUT);
// inicializa y borra la pantalla
display.begin ();
display.clearDisplay ();
display.display ();
display.setContrast (60); // establece el contraste
display.clearDisplay ();
display.setTextSize (2);
display.setCursor (12, 16);
display.println (">>>>>"); // indicación del inicio del trabajo cuando se enciende
display.display ();
dht.begin ();
sendSensor ();
dibujar ();
while (! LoRa.begin (433E6)) {
//Serial.println (".");
retraso (500);
}
// El rango para la palabra de sincronización está entre "0 - 0xFF".
LoRa.setSyncWord (0xF3);
//Serial.println (wonLoRa Initializing ");
timer.setInterval (20000, sendSensor);
timer.setInterval (5000, dibujar);
timer.setInterval (65000, sleepDevice);
}
bucle vacío () {
SignalReception ();
timer.run ();
}
`` ``
Para trabajar con los controladores ATMEGA328P, utilizo la placa Arduino UNO como programador. Hay un buen video en Youtube sobre la instalación del gestor de arranque y la descarga de bocetos al controlador ATMEGA328 utilizando la placa Arduino UNO.
El boceto comentaba los comandos para enviar al monitor del puerto serie (Serie). Descomente si es necesario.
El ciclo comienza escuchando la transmisión y recibiendo información por el receptor LoRa. El temporizador establece el tiempo de escucha: 65 segundos. En este momento, con un período de 5 segundos, la información en la pantalla de NOKIA se actualiza y con un período de 20 segundos (3 veces), el sensor DHT22 toma mediciones de temperatura, humedad, así como el nivel de voltaje de las baterías a través de una de las entradas analógicas del controlador. El voltaje de suministro al DHT22 se aplica solo durante las mediciones con un retraso mínimo de 2 segundos, en el que el sensor aún funciona. La salida del ADC en el boceto se ajusta al voltaje de las baterías nuevas, que es 3.2V (1.6V x 2). El tiempo de escucha del aire se eligió un poco más de 1 minuto para recibir con confianza un paquete de un termómetro que funciona en la transmisión con un período de 1 minuto, pero más sobre eso a continuación. Luego, en el segundo 62, el controlador y el receptor se ponen en modo de suspensión, que dura aproximadamente 14 minutos, es decir, El período del ciclo "trabajo / reposo" del analizador es de aproximadamente 15 minutos. Observo que el modo de suspensión en el analizador es una medida forzada diseñada para reducir significativamente el consumo.
A modo de comparación, la siguiente tabla muestra las características del termohigrómetro LaCrosse WS-9024IT y el analizador de este proyecto.
Parámetro | LaCrosse WS-9024IT | SadilTM |
Nutrición | 2xAA, 3B, Durasell | 2xAA, 3V, GP Ultra +, 1800 mAh |
El consumo de sueño | | 350 μA (10 μA) |
Duración del sueño | | 14 min |
Consumo operacional | <200 μA | 12-18 mA |
Duración del trabajo | | aproximadamente 1 minuto |
Período de trabajo / ciclo de sueño | | 15 min |
Tiempo de funcionamiento | unos 2 años | alrededor de 2.5 meses |
El consumo actual de LaCrosse baila mucho. En la tabla di el valor medido máximo para mostrar el orden de consumo: no más de doscientos microamperios.
Quería complementar la tabla con los resultados de desarrollos aficionados similares, pero no encontré nada. Probablemente porque la mayoría de los aficionados envían información desde los sensores a una computadora, tableta, teléfono inteligente o en tránsito a uno de los servicios en la red donde el problema de salvar la vida de la batería simplemente no existe.
El principal contribuyente al analizador de reposo (350 μA) es la pantalla LCD. Si lo apaga, el consumo caerá a 10 μA. El consumo máximo de 18 mA ocurre cuando el receptor LoRa recibe la señal del transmisor, pero la señal tarda unos microsegundos. Este tiempo es muy corto en comparación con el minuto en que el receptor está en modo de audición y el consumo de 10 mA, por lo que no tuve en cuenta este pico a corto plazo al calcular el tiempo de funcionamiento de un conjunto de baterías.
Cálculo de horas de trabajo.
Consumo de corriente promedio: 10 mA / 15 + 0.35 mA = 1.0 mA, donde 15 es el ciclo de trabajo. Tiempo de funcionamiento: 1800 mA * hora / 1.0 mA = 1800 horas (2.5 meses).
Aclararé:
- El cálculo es muy aproximado.
- El horario de atención de LaCrosse se basa en mi propia experiencia. He tenido este dispositivo durante mucho tiempo.
Termómetro
La capacidad y el voltaje de las baterías en climas fríos se reducen considerablemente . Por lo tanto, para no exponer las baterías y el dispositivo en su conjunto a pruebas tan fuertes, saqué solo el sensor de temperatura DS18B20 fuera de la habitación, y la unidad y las baterías están en la habitación. El DS18B20 se conecta a la placa host con un cable delgado de tres hilos. Encontré esta solución en mi estación meteorológica en serie: los desarrolladores están seguros de que siempre habrá un espacio en el apartamento para tender cables con un diámetro de varios milímetros.
Los fusibles para el termómetro ATMEGA328P son los mismos que para el analizador.
El conjunto del termómetro también está integrado en el controlador ATMEGA328P. Recibe la señal del sensor DS18B20, mide el voltaje de alimentación y controla el transmisor LoRa.
El dibujo del termómetro está debajo del spoiler.
dibujo del termómetro #include <OneWire.h> OneWire ds(7); //pin 13, Atmega328P #include <SPI.h> #include <LoRa.h> #include <LowPower.h> #define PowerDS18B20 (6) //pin 12 (Atmega328P), e DS18B20 unsigned int sleepCounter; // , float Tout; // int i; // (20 1 ) String messageTout; // LoRa- float batteryLevel; // const int batteryPin = A0; // pin 23 (Atmega328P), void Measurement () { // byte data[2]; digitalWrite(PowerDS18B20, 1); ds.reset(); ds.write(0xCC); // (1 ) ds.write(0x44); // delay(700); ds.reset(); ds.write(0xCC); ds.write(0xBE); // data[0] = ds.read(); data[1] = ds.read(); Tout = ((data[1] << 8) | data[0]) * 0.0625; // Serial.println("Tout= "+ String(Tout)); digitalWrite(PowerDS18B20, 0); // : analogReference(INTERNAL); int sensorValue = analogRead(A0); batteryLevel = (sensorValue * 3.2 / 1024); // Serial.println("BAT= "+ String(batteryLevel)); } void SetSynchLoRa () { int counter = 0; while (!LoRa.begin(433E6) && counter < 10) { // Serial.print("."); counter++; delay(500); } LoRa.setTxPower(4); // 2-20 /* if (counter == 10) { // Serial.println("Failed to initialize ..."); }*/ LoRa.setSyncWord(0xF3); } void SendMessage () { // (, ) messageTout = String(Tout) + "#" + String(batteryLevel); // Serial.println(messageTout); delay(250); LoRa.beginPacket(); LoRa.print(messageTout); LoRa.endPacket(); } void setup() { //Serial.begin(9600); // Serial.println("Initializing ..."); pinMode(PowerDS18B20, OUTPUT); SetSynchLoRa (); } void loop() { //Serial.println(""); //Serial.println("i = " + String(i)); if (i >= 30) { // i >= 30 (1 ) — (, — 1 /1 ) for (sleepCounter = 5; sleepCounter > 0; sleepCounter--) { LoRa.sleep (); LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); } Measurement (); SendMessage (); LoRa.sleep (); } else { // 1 , — 1 /2 Measurement (); SendMessage (); delay (1000); } i++; if (i >= 30) i = 30; // }
Un par de transmisor-receptor LoRa proporciona una comunicación estable a una distancia de 1,5 km con visibilidad directa y hasta 300 m en áreas urbanas, por supuesto, a una potencia máxima o cercana a la máxima: 17-20 dB. Para una conexión estable dentro del apartamento, 4 dB fueron suficientes.
Al principio, cuando se conecta la alimentación, el termómetro funciona en modo intensivo durante un minuto. Mide la temperatura, el voltaje de las baterías y envía sus valores al aire cada 2 segundos. Esto es por conveniencia. Suponga que no tiene que esperar un minuto para reemplazar las baterías o depurarlas. La información del sensor aparecerá en la pantalla del analizador en los primeros segundos después de conectar las baterías del termómetro y el analizador. Naturalmente, debe darse prisa y no hacer un espacio de tiempo por más de un minuto entre conectar las baterías en ambos nodos.
Entonces el sensor remoto pasa al modo normal. Después de medir y enviar información que dura un poco más que el primer segundo, el controlador y el transmisor se ponen en modo de suspensión de software durante aproximadamente 1 minuto.
Cálculo de horas de trabajo.
Consumo de corriente promedio: 14 mA / 60 + 0.005 mA = 0.24 mA, donde 60 es el ciclo de trabajo. Tiempo de funcionamiento: 1800 mA * hora / 0.24 mA = 7500 horas (10 meses).
Las aclaraciones anteriores sobre la precisión del tiempo de funcionamiento calculado de un solo conjunto de baterías siguen siendo válidas.
Y una tabla de comparación. Contiene los resultados de un par de proyectos similares de Internet.
Parámetro | LaCrosse WS-9024IT | chinche | avs24rus | SadilTM |
Nutrición | 2xAAA, 3B, Durasell | 3V, CR2450 Renata, 540 mAh | 3V, CR2450, 550-610 mAh | 2xAA, 3V, GP Ultra +, 1800 mAh |
El consumo de sueño | | 0,14 mA (?) | 14 μA | 5 μA |
Duración del sueño | | | | 1 min |
Consumo operacional | <700 μA | 13,57 mA | 16-18 mA | 14 mA |
Duración del trabajo | | 0.027 segundos | | 1 seg |
Período de trabajo / ciclo de sueño | | 1 min | 10 min | 1 min |
Tiempo de funcionamiento | unos 2 años | | más de 0.5 años | unos 10 meses |
Si los nodos se ensamblan sin errores, en la pantalla veremos la siguiente imagen:

De las tablas comparativas se puede ver que el consumo máximo de dispositivos aficionados es un orden de magnitud mayor que en las funciones análogas de la LaCrosse industrial. Por ejemplo, 14 mA versus 700 μA para el sensor remoto y 10 ... 18 mA versus 200 μA para el analizador. Tal diferencia notable en el consumo máximo se explica, en mi opinión, por el hecho de que los controladores en los circuitos de aficionados se programan utilizando la plataforma IDE Arduino, funciones pesadas y bibliotecas, y en productos industriales, muy probablemente en uno de los lenguajes de bajo nivel o, por ejemplo, en C ++ (por cierto, el lenguaje base de Arduino) o C (C). Si usa estos idiomas, estoy seguro de que puede alcanzar un consumo comparable a los diseños industriales. Sin embargo, esto fue demostrado de manera muy convincente por HWman en su publicación " Por qué a muchos no les gusta Arduino ". Realizar el boceto más simple de hasta una docena de líneas (Blink), realizado en el IDE de Arduino en un caso y en otro - "simple C", como dice el autor en el video, conduce a una pérdida de rendimiento de 26 veces. En resumen, el aumento del consumo de recursos es una tarifa para la comodidad y un pequeño esfuerzo por parte del programador; el resto lo harán las funciones "glotonas" del entorno de desarrollo para él en Arduino. Anticipo que tendrá que esforzarse y dominar al menos los conceptos básicos de C / C ++, cuyas funciones son compiladas por el IDE de Arduino.
Conclusiones
• El analizador y el termómetro ensamblados tienen demasiado consumo de corriente en comparación con los diseños industriales.
• Un tercero sugiere las dos baterías en los circuitos, luego los siguientes problemas se resuelven automáticamente: no es necesario volver a instalar el fusible, el controlador funciona a una frecuencia de 16 MHz, los sensores DHT22, DS18B20 están lejos del umbral inferior de su voltaje de suministro. Esto último es importante, ya que la tensión de alimentación no se suministra directamente a los sensores, sino programáticamente a través de la llave desde el pin del controlador, en el que cae aproximadamente 1V.
• El uso de módulos de radio LoRa, con una potencia de transmisor programable de 4 dB, permitió establecer una conexión estable dentro del departamento con la fuente de alimentación de los módulos de dos baterías AA.
Enlaces relacionados
Conjunto de sensor inalámbrico de baja energía
Sensor de iluminación inalámbrico CR2450
Sensor inalámbrico de temperatura, humedad y presión atmosférica en nRF52832
Termómetro inalámbrico
Convierta a Arduino en un programador AVRISP completo
Lora y dormir
Aprenda sobre los bits de configuración ATmega328P y cómo usarlos con un cristal de cuarzo externo
AVR Fusion Calculator
¿Por qué a muchas personas no les gusta Arduino?
Gran prueba de batería
Baterias en el frio