Table des matières:

Station météo : ESP8266 avec sommeil profond, SQL, représentation graphique par Flask&Plotly : 3 étapes
Station météo : ESP8266 avec sommeil profond, SQL, représentation graphique par Flask&Plotly : 3 étapes

Vidéo: Station météo : ESP8266 avec sommeil profond, SQL, représentation graphique par Flask&Plotly : 3 étapes

Vidéo: Station météo : ESP8266 avec sommeil profond, SQL, représentation graphique par Flask&Plotly : 3 étapes
Vidéo: Création d'une station météo - Microcontrôleur ESP8266 et serveur Web 2024, Juillet
Anonim
Station météo: ESP8266 avec sommeil profond, SQL, représentation graphique par Flask&Plotly
Station météo: ESP8266 avec sommeil profond, SQL, représentation graphique par Flask&Plotly

Serait-ce amusant de connaître la température, l'humidité ou l'intensité lumineuse sur votre balcon ? Je sais que je le ferais. J'ai donc fait une simple station météo pour collecter de telles données. Les sections suivantes sont les étapes que j'ai suivies pour en créer un.

Commençons!

Étape 1: Station météo avec capteurs de lumière, de température et d'humidité

Station météo avec capteurs de lumière, de température et d'humidité
Station météo avec capteurs de lumière, de température et d'humidité
Station météo avec capteurs de lumière, de température et d'humidité
Station météo avec capteurs de lumière, de température et d'humidité
Station météo avec capteurs de lumière, de température et d'humidité
Station météo avec capteurs de lumière, de température et d'humidité
Station météo avec capteurs de lumière, de température et d'humidité
Station météo avec capteurs de lumière, de température et d'humidité

Quand j'ai prévu de construire une station météo, je rêvais d'avoir une station météo à part entière avec la vitesse du vent, la mesure de la pluie, un capteur solaire à spectre complet, mais il s'est avéré que ce ne serait pas bon marché et que le coût d'achat pourrait finir jusqu'à au moins 100 $. J'ai abandonné toutes les options et j'ai commencé à en construire une avec 10 $, plus ou moins. 10 $ est le coût des composants de base de la station météo comme les pièces ci-dessous.

Voici les pièces:

1. ESP8266 La marque Wemos coûte 2,39 $ sur Aliexpress. Je recommanderais la marque Wemos car son EPS8266 est plus facile à programmer, à mettre à jour et à avoir 4 Mo de flash ou plus.

2. Wemos Charger-Boost Shield coûte 1,39 $ pièces. C'est un autre avantage d'utiliser cette marque. Il dispose d'une carte de suralimentation pour batterie Lithium (tension nominale = 3,7V) à un 5V pour ESP8266. La carte est également livrée avec une option de charge avec un courant de charge max = 1M.

*Remarque: Il existe une option moins chère pour la charge/l'amplification de la batterie au lithium. Celui-ci coûte 1,77 $ pour 5 pièces. Cependant, lorsque j'ai utilisé cette carte pour ESP8266 (soit Wemos, soit un ESP8266 nu), le mode veille prolongée de l'ESP8266 a déclenché une réinitialisation juste après avoir fait de l'ESP8266 une boucle de veille-réinitialisation-sommeil, ce qui est très ennuyeux. Si vous savez ce qui se passait, veuillez m'envoyer une boîte de réception.

3. Wemos a également plusieurs protections contre la température et l'humidité, mais je vais construire à partir de composants individuels. Photorésistance (ou résistance dépendante de la lumière -- ldr, pas cher), un capteur de luminosité tel que BH1780 ou TSL2561 (environ 0,87-0,89c pcs), un capteur de température tel que DS18B20 (75c chacun), et un combo humidité et température tel que DHT22 (2,35 $ ici) ou SHT21 (2,20 $ ici). Un coût total pour le capteur ~ 4 $.

4. Batterie au lithium. J'en ai récupéré un d'une batterie Canon 7.4V qui est deux batteries 3.7V en série ou une batterie au lithium 18650. Chaque 18650 coûte environ 5 $ pièce. J'ai une photo qui montre le démontage de la batterie de l'appareil photo. Attention cependant, un court-circuit lors de la découpe du couvercle en plastique peut générer une chaleur extrême et des brûlures.

5. Carte PCB, cavalier, fil, soudure, votre temps, peut-être quelques compétences de débogage.

Laissez les composants de fil ensemble suivre le schéma ci-dessus.

Ensuite, recherchez la tâche dans la boucle de configuration. Il s'agit simplement d'une série de tâches et se termine par une commande de veille.

void setup() { Serial.begin(115200); Serial.println("Node de départ nommé " + String(SENSORNAME)); setup_wifi(); retard (100); Fil.begin(); pinMode(ldrPin, INPUT); SHT21.begin(); if(!tsl.begin()) { Serial.print("TSL2561 non trouvé"); tandis que(1); } retard (100); ldr = analogRead(ldrPin); tsl.enableAutoRange(true); tsl.setIntegrationTime(TSL2561_INTEGRATIONTIME_13MS); retard (100); sensor_event_t événement; tsl.getEvent(&event); if (événement.lumière) lux = événement.lumière; else Serial.println("Surcharge du capteur");

h = SHT21.getHumidity();

t = SHT21.getTemperature(); tempSensor.setWaitForConversion(false); tempSensor.begin(); retard (100); if (tempSensor.getDeviceCount() == 0) { Serial.printf("DS18x20 introuvable sur la broche %d\n", ds18b20); Serial.flush(); retard(1000); } retard (100); tempSensor.requestTemperatures(); t18 = tempSensor.getTempCByIndex(0); Serial.printf("\nLight: %d lux\t", lux); Serial.printf("LDR: %d /1024\t", ldr); Serial.printf("T: %0.2f *C\t", t); Serial.printf("H:%0.2f \t", h); Serial.printf("HIC: %0.2f \t", hic); retard (100); client.setServer(mqtt_server, mqtt_port); client.setCallback(rappel); reconnecter(); retard (100); ESP.deepSleep(3e8); // 300 millions de microsecondes, 300 secondes, 5 minutes; }

Pendant le débogage ou la configuration, commandez à ESP.deepsleep() pour avoir une lecture série en continu. Comme toujours, le code complet à télécharger sur ESP8266 est hébergé ici (GitHub).

Pensez à mettre le cavalier entre RST et D0/GPIO16 pour déclencher un réveil après une période de sommeil profond.

Maintenant, il est temps de télécharger le code à l'aide de l'IDE Arduino sur l'ESP8266.

Étape 2: MQTT: un support flexible pour publier et abonner des données

MQTT: un support flexible pour publier et souscrire des données
MQTT: un support flexible pour publier et souscrire des données
MQTT: un support flexible pour publier et souscrire des données
MQTT: un support flexible pour publier et souscrire des données

Tout d'abord, j'aime utiliser MQTT pour envoyer et recevoir des données via différents capteurs et clients de ma maison. En effet, la flexibilité d'envoyer un nombre illimité de données classées par sujet et un nombre illimité de clients pour s'abonner à un sujet à partir d'un courtier MQTT. Deuxièmement, je ne suis pas qualifié pour discuter de MQTT en profondeur. J'ai parfois rencontré MQTT l'année dernière (2017) en suivant des tutoriels pour configurer une station météo et des capteurs à l'aide de Node-RED. Quoi qu'il en soit, je ferai de mon mieux pour vous présenter quelques informations. Wikipédia est un autre bon point de départ.

Si vous n'avez pas le temps de lire la théorie et que vous souhaitez mettre en place un courtier MQTT, j'ai publié un autre tutoriel juste pour le faire. Recherchez ce message et faites défiler jusqu'à l'étape 4.

Pour expliquer ce qu'est le transport de télémétrie Message Queuing (MQTT) à ma connaissance, j'ai préparé un diagramme comme ci-dessus. En résumé, MQTT est une norme ISO, et un produit tel que mosquitto et mosquitto-client, deux packages que j'ai utilisés pour construire le courtier MQTT sur un Raspberry Pi, doivent être conformes à cette norme. Le courtier MQTT devient alors un moyen pour les éditeurs de diffuser un message et les abonnés d'écouter un sujet cible.

La combinaison de la bibliothèque Arduino PubSubclient avec ArduinoJson, grâce à son créateur knolleary et bblanchon, facilite pour les bricoleurs et les développeurs un ensemble d'outils allant des capteurs à un équipement cible ou un client final.

Continuez avec créer une base de données et affichez des données.

Étape 3: Enregistrer les données dans SQL et les afficher sur un serveur Web

Enregistrer les données dans SQL et les afficher sur un serveur Web
Enregistrer les données dans SQL et les afficher sur un serveur Web
Enregistrer les données dans SQL et les afficher sur un serveur Web
Enregistrer les données dans SQL et les afficher sur un serveur Web

J'ai utilisé sqlite3 pour créer une base de données pour le serveur Web. Installez le sqlite3 dans Rapberry Pi en:

sudo apt-get install sqlite3

créé une base de données et une table en tapant dans le terminal:

station météo sqlite3.db

CREATE TABLE weatherdata (id INT PRIMARY KEY, thetime DATETIME, ldr INT, tls2561 INT, ds18b20 REAL, tsht21 REAL, hsht21 REAL);

.exit //pour quitter la ligne de commande sqlite et revenir au terminal Linux

Pour écouter un sujet publié par la station météo, j'ai utilisé une librairie Paho avec Python:

# ! /usr/bin/python3# adopté de: > # binh nguyen, august 04, 2018, from time import localtime, strftime, sleep import paho.mqtt.client as mqtt import sqlite3, json

mqtt_topic = 'balcony/weatherstation'

mqtt_username = "johndoe" mqtt_password = "password" dbfile = "/path/to/databse/weatherstation.db" mqtt_broker_ip = '192.168.1.50'

# the callback for when the client receives a connack response from the server.

def on_connect(client, userdata, flags, rc): print("connected with result code "+str(rc)) client.subscribe(mqtt_topic) # the callback for when a publish message is received from the server. def on_message(client, userdata, msg): thetime = strftime("%y-%m-%d %h:%m:%s", localtime())

topic = msg.topic

payload = json.dumps(msg.payload.decode('utf-8')) sql_cmd = sql_cmd = """insert into weatherdata values ({0}, '{1}', {2[ldr]}, {2[tsl2561]}, {2[ds18b20]}, {2[tsht21]}, {2[hsht21]})""".format(none, time_, payload) writetodb(sql_cmd) print(sql_cmd) return none

def writetodb(sql_cmd):

conn = sqlite3.connect(dbfile) cur = conn.cursor() cur.execute(sql_command) conn.commit()

client = mqtt.client()

client.on_connect = on_connect client.on_message = on_message client.username_pw_set(username=mqtt_username, password=mqtt_password) client.connect(mqtt_broker_ip, 1883, 60) sleep(1) client.loop_forever()

to display data from use another sql command to query data from the database such as:

sql_command = """ select * from weatherdata order by thetime desc limit 1000;"

this sql command is included in the app.py that uses flask framework and plotty to make a web server and plotting a graph.

the complete code is hosted on the github.

if the esp8266 cannot read the ds18b20, it assigned a value of -127 as the temperature which skews the relative range of other readable temperatures. i cleaned up those values by set a null value to those equals to -127:

sqlite3 weatherstation.db

sqlite3> update weatherdata set ds18b20 = null where ds18b20 = -127;

to set up an environment for this mini web server, i used the shared libraries on raspberry pi. a virtualenv is a better option if the web server is hosted on a powerful computer. start the web server by:

python3 app.py

press control + c to stop the server.

the web server is set to auto-refreshed for every 60 seconds. you can change the interval in index.html file:

battery performance:

i did not measure the current between the normal state or sleep state of esp8266. many others did so. the first google search turned to this page. the normal state of esp8266 consumes about 100ma depends on the rate of transmitting and wifi activity. the deep-sleep state needs in the range of micro a, which a thousand times less.

for 5-minute interval between sleeping and waking up, one single lithium 18650 (2000mah) could fuel my weather station for 12 days. the same battery only enough for esp 8266 ran less than a day with a normal working state. the one i took from the camera battery pack (did not know the capacity) was enough to run the weather station with deep sleep for 5-6 days.

thank you for spending time with me to this end.

Conseillé: