Station météo autonome sur le contrôleur ATMEGA328P et alimentée par batterie avec un capteur à distance sans fil

Améliorant mon thermostat d'ambiance, dont j'ai parlé plus tôt , je me suis proposé de le compléter avec un capteur de température sans fil pour mesurer la température de l'air extérieur, d'assembler un thermostat alimenté par batterie et de remplacer les modules émetteur-récepteur RF 433 MHz par une autre paire de modules radio avec une portée de communication plus longue à une tension d'alimentation non plus de 3V. Au cours de la résolution de ces problèmes, une station météorologique autonome a vu le jour, qui sera discutée ci-dessous.



La station météo se compose de deux nœuds, appelons-les un analyseur et un thermomètre pour plus de simplicité. Communication entre les nœuds - sans fil, par voie hertzienne.


L'analyseur est basé sur le contrôleur ATMEGA328P et mesure la température et l'humidité dans la pièce (capteur de température et d'humidité DHT22) et la tension d'alimentation de l'analyseur, fournie par deux piles AA de 1,5 V. Le contrôleur reçoit un signal du récepteur LoRa, qui reçoit des informations du thermomètre (capteur à distance) sur l'air. Les informations du contrôleur s'affichent sur l'écran LCD du NOKIA 5110.


Le thermomètre, également monté sur le contrôleur ATMEGA328P, mesure la température de l'air extérieur (capteur de température DS18B20) et la tension d'alimentation de l'unité distante, organisée sur deux piles AA de 1,5 V. Le transmetteur LoRa de cette unité transfère la température et la tension d'alimentation à l'analyseur.


Le contrôleur ATMEGA328P et l'émetteur LoRa du thermomètre sont mis en mode veille pour économiser la batterie après les mesures et envoyer des informations. La tension d'alimentation du capteur DS18B20 est appliquée par programme uniquement pendant la durée de la mesure de température. La mesure et l'envoi des données du thermomètre s'effectuent sur une période d'environ une minute.


Dans le même mode travail-sommeil, l'analyseur fonctionne également. La durée du contrôleur et de l'analyseur du récepteur pendant plusieurs secondes plus d'une minute. Ceci est fait pour recevoir en toute confiance le signal du thermomètre - après tout, le fonctionnement du thermomètre et de l'analyseur ne sont pas synchronisés. L'ATMEGA328P et le récepteur LoRa sont ensuite mis en mode veille pendant 14 minutes avant de se réveiller et de démarrer le cycle suivant. Le DHT22 fournit uniquement de l'énergie pendant la mesure.


Pour programmer le mode veille des contrôleurs ATMEGA328P, la bibliothèque LowPower.h est utilisée.


Avec la décharge des batteries, la valeur de la tension diminue sur elles.



La limite inférieure de la tension de fonctionnement du contrôleur ATMEGA328P est de 1,8 V. Dans le même temps, l'installation en usine du fusible ATMEGA328P a été effectuée pour surveiller le seuil de la tension d'alimentation de 2,7 V, il est donc nécessaire de changer les paramètres d'usine du fusible au seuil de surveillance de 1,8 V pour garantir le fonctionnement du contrôleur lorsqu'il est alimenté par des piles épuisées.


Le générateur du contrôleur interne peut ne pas démarrer à une fréquence de 16 MHz avec une tension d'alimentation de 3 V ou légèrement inférieure. Les deux contrôleurs fonctionnent avec du quartz 16 MHz à une tension d'alimentation réduite de 2,7 ... 2,8 V, donc je n'ai pas changé le quartz 16 MHz en 8 MHz.



Pour assembler l'appareil, vous aurez besoin de composants, dont la liste et leur coût estimé aux prix du site AliExpress sont indiqués dans le tableau.


ComposantPrix, $
analyseur
Contrôleur ATMEGA328P-PU1,59
Capteur de température et d'humidité DHT222,34
Émetteur LoRa Ra-013,95
LCD NOKIA 51101,91
Carte de montage (montage), fils de montage, piles AA, résonateur à quartz 16 MHz, résistances, etc.4.00
thermomètre
Contrôleur ATMEGA328P-PU1,59
Capteur de température DS18B200,63
Émetteur LoRa Ra-013,95
Carte de développement (fibre de verre), fils de montage, piles AA, résonateur à quartz 16 MHz, résistances, etc.4.00
Total (environ):24

Analyseur




Le cerveau de l'analyseur est un contrôleur ATMEGA328P. Il reçoit les signaux du capteur DHT22 et, via le protocole SPI, communique avec le récepteur LoRa et l'écran NOKIA 5110.



Il existe de nombreuses plaintes sur Internet concernant la faible précision du DHT22. Aujourd'hui, il existe une alternative: des capteurs de température et d'humidité plus modernes HTU21 (GY21) , (Vcc = 3 ... 5 V), Si7021 , (Vcc = 1,9 ... 3,6 V), SHT21 , (Vcc = 2.1 .... 3,6 V).


J'utilise le DHT22, car la différence entre les lectures d'humidité de mon échantillon de ce capteur et du thermo-hygromètre LaCrosse WS-9024IT disponible dans le commerce ne dépasse pas 8 unités, ce qui est tout à fait acceptable à des fins domestiques. L'écart entre les lectures d'humidité augmente considérablement si la tension d'alimentation du DHT22 est inférieure à 3V. Cela est compréhensible, car la tension d'alimentation du DHT22 doit être comprise entre 3 et 5 V. En résumé - idéalement dans ces conditions, le capteur Si7021 s'intègre dans le circuit de l'analyseur.


Dans l'image ci-dessous - le brochage des éléments de la station météo.



Fusion et bien d'autres contrôleurs, y compris ATMEGA328P, peuvent être lus et modifiés avec l'utilitaire SinaProg. Si c'est la première fois que vous rencontrez ce programme, alors malgré l'interface intuitive, n'essayez pas de commencer à travailler avec lui après avoir installé l'application. Lisez d'abord cet article dans lequel HWman fournit les modules complémentaires SinaProg nécessaires lors de l'utilisation de la carte Arduino UNO comme chargeur de démarrage.


Je vous conseille de lire d'abord les réglages d'usine de la fusion ATMEGA328P et de sauvegarder leurs valeurs afin d'y revenir en cas de panne. Dans mes contrôleurs, les paramètres d'usine pour le bit de fusible sont: LOW: 0xFF, HIGH: 0xDE, EXTENDED: 0x05 (Vcc = 2.7V, BODLEVEL = 101). Nouveaux fusibles pour surveiller le seuil de 1,8 V que vous souhaitez définir: LOW: 0xFF, HIGH: 0xDE, EXTENDED: 0x06 (Vcc = 1,8 V, BODLEVEL = 110).


L'esquisse de l'analyseur pour le chargement dans l'ATMEGA328P se trouve sous le becquet.


croquis de l'analyseur
`` `cpp
/ *
Station météo autonome sur le contrôleur ATMEGA328P et alimentée par batterie avec un capteur à distance sans fil, un analyseur
https://habr.com/en/post/470381/
* /

#include <SPI.h>
#include <LoRa.h>

#include <DHT.h>
#define DHTPIN 3 // à quelle broche numérique nous sommes connectés
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
DHT DHT (DHTPIN, DHTTYPE);

étain flottant = 0;
int Hin = 0;
float BatteryInLevel; // tension de base de la batterie
String LoRaData, Tout_str, BatteryInLevel_str, BatteryOutLevel_str;

// dormir
#include <LowPower.h>
#define PowerDHT (4) // Broche d'alimentation 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

// minuterie
#include <SimpleTimer.h>
Minuterie SimpleTimer;

Affichage Adafruit_PCD8544 = Adafruit_PCD8544 (5, 7, 6);

void sendSensor () {
digitalWrite (PowerDHT, 1);
retard (2000);
Hin = dht.readHumidity ();
Tin = dht.readTemperature ();

/ * if (isnan (Hin) || isnan (Tin)) {
// Serial.println ("Impossible de lire à partir du capteur DHT!");
retour
} * /

digitalWrite (PowerDHT, 0);

// mesure de la tension de la batterie:
analogReference (INTERNAL);
int sensorValue = analogRead (A4);
BatteryInLevel = (sensorValue * 3.2 / 1024);
}

void draw () {
display.clearDisplay ();
// Étain
{
display.setTextSize (2);
display.setCursor (8, 0);
display.println (Étain, 1); // une décimale
display.setCursor (68, 0);
display.println ("C");
}
// hin
{
display.setTextSize (2);
display.setCursor (8, 16);
display.println (String (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");
}
// Niveau de sortie de la batterie
{
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");
}
// Niveau de batterie
{
display.setTextSize (1);
display.setCursor (2, 40);
display.println ("BAT In:„);
display.setCursor (56, 40);
display.println (BatteryInLevel, 1); // une décimale
display.setCursor (74, 40);
display.println ("V");
}

display.display ();
/ *
Serial.println ("Tin:" + String (Tin) + "* C");
Serial.println ("Hin:" + String (Hin) + "%");
Serial.println ("Tout:" + String (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
pour (sleepCounter = 91; sleepCounter> 0; sleepCounter--) // 91 !!!
{
LoRa.sleep ();
LowPower.powerDown (SLEEP_8S, ADC_OFF, BOD_OFF);
}
LoRa.sleep ();
}

void SignalReception () {
// essaie d'analyser le paquet
int packetSize = LoRa.parsePacket ();
if (packetSize) {
// lire le paquet
while (LoRa.available ()) {
LoRaData = LoRa.readString ();
// Serial.println ("Accepted:" + (LoRaData));
}
int pos1 = LoRaData.indexOf ('#');
Tout_str = LoRaData.substring (0, pos1);
BatteryOutLevel_str = LoRaData.substring (pos1 + 1, LoRaData.length ());
}
}

void setup () {
//Serial.begin(9600);
pinMode (PowerDHT, OUTPUT);

// initialise et efface l'affichage
display.begin ();
display.clearDisplay ();
display.display ();
display.setContrast (60); // régler le contraste

display.clearDisplay ();
display.setTextSize (2);
display.setCursor (12, 16);
display.println (">>>>>"); // indication du début du travail lorsqu'il est allumé
display.display ();

dht.begin ();
sendSensor ();
draw ();

while (! LoRa.begin (433E6)) {
//Serial.println (".");
retard (500);
}
// La plage du mot de synchronisation est comprise entre "0 - 0xFF".
LoRa.setSyncWord (0xF3);
//Serial.println (initialisation wonLoRa ");
timer.setInterval (20000, sendSensor);
timer.setInterval (5000, tirage);
timer.setInterval (65000, sleepDevice);
}

boucle vide () {
Réception du signal ();
timer.run ();
}
`` ``


Pour travailler avec les contrôleurs ATMEGA328P, j'utilise la carte Arduino UNO comme programmeur. Il y a une bonne vidéo sur Youtube sur l'installation du chargeur de démarrage et le téléchargement de croquis sur le contrôleur ATMEGA328 en utilisant la carte Arduino UNO.


L'esquisse commentait les commandes de sortie vers le moniteur de port série (série). Décommentez si nécessaire.


Le cycle commence par l'écoute de la diffusion et la réception d'informations par le récepteur LoRa. La minuterie règle la durée d'écoute - 65 secondes. À ce moment, avec une période de 5 secondes, les informations sur l'écran NOKIA sont mises à jour et avec une période de 20 secondes (3 fois), le capteur DHT22 prend des mesures de température, d'humidité, ainsi que le niveau de tension des batteries via l'une des entrées analogiques du contrôleur. La tension d'alimentation du DHT22 n'est appliquée que pendant les mesures avec un retard minimum de 2 secondes, pendant lesquelles le capteur fonctionne toujours. La sortie de l'ADC dans l'esquisse est mise à l'échelle de la tension des nouvelles batteries, qui est de 3,2 V (1,6 V x 2). Le temps d'écoute de l'air a été choisi un peu plus de 1 min pour recevoir en toute confiance un paquet d'un thermomètre qui fonctionne sur la transmission avec une période de 1 min, mais plus sur celui ci-dessous. Ensuite, à la 62e seconde, le contrôleur et le récepteur sont mis en mode veille, ce qui dure environ 14 minutes, c'est-à-dire la durée du cycle «travail / sommeil» de l'analyseur est d'environ 15 minutes. Je note que le mode veille de l'analyseur est une mesure forcée conçue pour réduire considérablement la consommation.


A titre de comparaison, le tableau ci-dessous présente les caractéristiques du thermohygromètre LaCrosse WS-9024IT et de l'analyseur de ce projet.


ParamètreLaCrosse WS-9024ITSadilTM
La nutrition2xAA, 3B, Durasell2xAA, 3V, GP Ultra +, 1800 mAh
Consommation de sommeil350 μA (10 μA)
Durée du sommeil14 min
Consommation opérationnelle<200 μA12-18 mA
Durée du travailenviron 1 min
Période de travail / cycle de sommeil15 min
Durée de fonctionnementenviron 2 ansenviron 2,5 mois

La consommation actuelle de LaCrosse danse beaucoup. Dans le tableau, j'ai donné la valeur mesurée maximale pour montrer l'ordre de consommation: pas plus de deux cents microampères.



Je voulais compléter le tableau avec les résultats de développements amateurs similaires, mais je n'ai rien trouvé. Probablement parce que la plupart des amateurs transmettent des informations des capteurs à un ordinateur, une tablette, un smartphone ou en transit vers l'un des services du réseau où le problème de la durée de vie de la batterie n'existe tout simplement pas.


Le principal contributeur au sommeil de l'analyseur (350 μA) est l'écran LCD. Si vous l'éteignez, la consommation chutera à 10 μA. La consommation de pointe de 18 mA se produit lorsque le récepteur LoRa reçoit le signal de l'émetteur, mais le signal prend quelques microsecondes. Ce temps est très court par rapport à la minute où le récepteur est en mode écoute et la consommation de 10 mA, donc je n'ai pas pris en compte ce pic à court terme lors du calcul du temps de fonctionnement sur un jeu de piles.


Calcul des heures de travail.
Consommation de courant moyenne: 10 mA / 15 + 0,35 mA = 1,0 mA, où 15 est le rapport cyclique. Durée de fonctionnement: 1800 mA * heure / 1,0 mA = 1800 heures (2,5 mois).
Je vais clarifier:
- Le calcul est très approximatif.
- Les heures de fonctionnement de LaCrosse sont basées sur ma propre expérience. J'ai cet appareil depuis longtemps.


Thermomètre



La capacité et la tension des batteries par temps froid sont considérablement réduites . Par conséquent, afin de ne pas exposer les batteries et l'appareil dans son ensemble à de tels tests, je n'ai sorti que le capteur de température DS18B20 à l'extérieur de la pièce, et l'unité et les piles sont dans la pièce. Le DS18B20 se connecte à la carte hôte avec un mince câble à trois fils. J'ai repéré cette solution dans ma station météo en série - les développeurs sont sûrs qu'il y aura toujours un espace dans l'appartement pour la pose de fils d'un diamètre de plusieurs millimètres.



Les fusibles du thermomètre ATMEGA328P sont les mêmes que pour l'analyseur.


L'ensemble thermomètre est également construit sur le contrôleur ATMEGA328P. Il reçoit le signal du capteur DS18B20, mesure la tension d'alimentation et contrôle l'émetteur LoRa.



Le croquis du thermomètre est sous le spoiler.


croquis de thermomètre
/*     ATMEGA328P        ,  https://habr.com/ru/post/470381/ */ #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; //    } 

Une paire d'émetteurs-récepteurs LoRa offre une communication stable à une distance de 1,5 km avec une visibilité directe et jusqu'à 300 m dans les zones urbaines, bien sûr, à la puissance maximale ou proche de la puissance maximale de l'émetteur: 17-20 dB. Pour une connexion stable dans l'appartement, 4 dB suffisaient.


Au début, lorsque l'alimentation est connectée, le thermomètre fonctionne en mode intensif pendant une minute. Il mesure la température, la tension des batteries et envoie leurs valeurs dans l'air toutes les 2 secondes. C'est pour plus de commodité. Supposons que vous n'ayez pas à attendre une minute lors du remplacement des piles ou du débogage. Les informations du capteur apparaîtront sur l'écran de l'analyseur dans les premières secondes après avoir connecté les piles du thermomètre et de l'analyseur. Naturellement, vous devez vous dépêcher et ne pas faire de différence de temps pendant plus d'une minute entre la connexion des batteries sur les deux nœuds.


Ensuite, le capteur à distance passe en mode normal. Après avoir mesuré et envoyé des informations qui durent un peu plus que la première seconde, le contrôleur et l'émetteur sont mis en mode veille logiciel pendant environ 1 minute.


Calcul des heures de travail.
Consommation de courant moyenne: 14 mA / 60 + 0,005 mA = 0,24 mA, où 60 est le rapport cyclique. Durée de fonctionnement: 1800 mA * heure / 0,24 mA = 7500 heures (10 mois).
Les précisions précédentes concernant la précision du temps de fonctionnement calculé à partir d'un seul jeu de batteries restent valables.


Et un tableau de comparaison. Il contient les résultats de quelques projets similaires sur Internet.


ParamètreLaCrosse WS-9024ITmaniacbugavs24rusSadilTM
La nutrition2xAAA, 3B, Durasell3V, CR2450 Renata, 540 mAh3V, CR2450, 550-610 mAh2xAA, 3V, GP Ultra +, 1800 mAh
Consommation de sommeil0,14 mA (?)14 μA5 μA
Durée du sommeil1 min
Consommation opérationnelle<700 μA13,57 mA16 - 18 mA14 mA
Durée du travail0,027 s1 sec
Période de travail / cycle de sommeil1 min10 min1 min
Durée de fonctionnementenviron 2 ansplus de 0,5 anenviron 10 mois

Si les nœuds sont assemblés sans erreur, sur l'écran, nous verrons l'image suivante:



Les tableaux comparatifs montrent que la consommation de pointe des appareils amateurs est d'un ordre de grandeur supérieur à celle des fonctions analogues de la LaCrosse industrielle. Par exemple, 14 mA contre 700 μA pour le capteur à distance et 10 ... 18 mA contre 200 μA pour l'analyseur. Une telle différence frappante dans la consommation maximale s'explique, à mon avis, par le fait que les contrôleurs des circuits amateurs sont programmés à l'aide de la plate-forme Arduino IDE, des fonctions lourdes et des bibliothèques et des produits industriels - très probablement dans l'un des langages de bas niveau ou, par exemple, en C ++ (soit dit en passant, le langage de base d'Arduino) ou C (C). Si vous utilisez ces langues, je suis sûr que vous pouvez atteindre une consommation comparable aux dessins et modèles industriels. Cependant, cela a été démontré de manière très convaincante par HWman dans sa publication « Why Many Don't Like Arduino ». L'exécution de l'esquisse la plus simple d'une douzaine de lignes (Blink), réalisée dans l'IDE Arduino dans un cas et dans un autre - «C simple», comme le dit l'auteur dans la vidéo, entraîne une perte de performances de 26 fois. En bref, l'augmentation de la consommation de ressources est un prix pour le confort et un petit effort de la part du programmeur - le reste sera fait par les fonctions «gourmandes» de l'environnement de développement pour lui en Arduino. Je prévois que vous devrez forcer et maîtriser au moins les bases du C / C ++, dont les fonctions sont compilées par l'IDE Arduino.


Conclusions


• L'analyseur et le thermomètre assemblés consomment trop de courant par rapport aux modèles industriels.


• Un troisième se propose pour les deux batteries dans les circuits, puis les problèmes suivants sont automatiquement résolus: il n'est pas nécessaire de réinstaller le fusible, le contrôleur fonctionne à une fréquence de 16 MHz, les capteurs DHT22, DS18B20 sont loin du seuil inférieur de leur tension d'alimentation. Ce dernier est important, car la tension d'alimentation n'est pas directement fournie aux capteurs, mais par programmation via la clé de la broche du contrôleur, sur laquelle elle chute d'environ 1V.


• L'utilisation de modules radio LoRa, avec une puissance d'émission programmable de 4 dB, a permis d'établir une connexion stable au sein de l'appartement avec l'alimentation des modules à partir de deux piles AA.


Liens connexes


Ensemble capteur sans fil basse consommation
Capteur d'éclairage sans fil CR2450
Capteur de température, d'humidité et de pression atmosphérique sans fil sur nRF52832
Thermomètre sans fil
Transformez Arduino en un programmeur AVRISP à part entière
Lora et le sommeil
En savoir plus sur les bits de configuration ATmega328P et comment les utiliser avec un cristal de quartz externe
AVR Fusion Calculator
Pourquoi beaucoup de gens n'aiment pas Arduino
Grand test de batterie
Batteries dans le froid

Source: https://habr.com/ru/post/fr470381/


All Articles