Table des matières:
2025 Auteur: John Day | [email protected]. Dernière modifié: 2025-01-23 14:45
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é
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
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
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é:
Station météo NaTaLia : Station météo à énergie solaire Arduino bien faite : 8 étapes (avec photos)
Station météo NaTaLia : Station météo à énergie solaire Arduino faite de la bonne manière : après 1 an de fonctionnement réussi sur 2 emplacements différents, je partage mes plans de projet de station météo à énergie solaire et j'explique comment elle a évolué en un système qui peut vraiment survivre sur une longue période périodes de l'énergie solaire. Si vous suivez
Capteur de mouvement ESP-01 avec sommeil profond : 5 étapes
Capteur de mouvement ESP-01 avec sommeil profond : j'ai travaillé sur la fabrication de capteurs de mouvement maison qui envoient un message électronique lorsqu'ils sont déclenchés. Il existe de nombreux exemples d'instructables et d'autres exemples de le faire. J'ai récemment eu besoin de le faire avec un capteur de mouvement PIR à piles et un ESP
Représentation graphique du changement de température du changement climatique en Python : 6 étapes
Représentation graphique du changement de température à partir du changement climatique en Python : le changement climatique est un gros problème. Et beaucoup de gens ne savent pas à quel point il a augmenté. Dans ce instructable, nous allons représenter graphiquement le changement de température dans le climat en raison du changement climatique. Pour une aide-mémoire, vous pouvez consulter le fichier python ci-dessous
Station météo graphique : 7 étapes (avec photos)
Station météo graphique : Vous avez toujours voulu avoir une station météo graphique ? Et avec des capteurs précis ? Peut-être que ce projet est quelque chose pour vous. Avec cette station météo, vous pouvez voir ce que le temps "fait". Les températures, par exemple, peuvent augmenter ou diminuer. D'un n
Économiser la vie de la batterie avec le sommeil profond : 20 étapes
Économiser la durée de vie de la batterie avec le sommeil profond : Êtes-vous intéressé par l'utilisation d'une batterie avec votre ESP32 ? Si c'est le cas, je discuterai aujourd'hui de quelques informations techniques importantes concernant ce sujet. On sait que ce microcontrôleur dépense beaucoup d'énergie lorsqu'il transmet des informations. Ça consomme