Table des matières:

Boîte aux lettres connectée à énergie solaire : 12 étapes (avec photos)
Boîte aux lettres connectée à énergie solaire : 12 étapes (avec photos)

Vidéo: Boîte aux lettres connectée à énergie solaire : 12 étapes (avec photos)

Vidéo: Boîte aux lettres connectée à énergie solaire : 12 étapes (avec photos)
Vidéo: Vidéo N 297 COMMENT BRANCHER LES PANNEAUX ET BATTERIES SOLAIRES SERIE ET PARALLELE 2024, Juillet
Anonim
Boîte aux lettres connectée à énergie solaire
Boîte aux lettres connectée à énergie solaire
Boîte aux lettres connectée à énergie solaire
Boîte aux lettres connectée à énergie solaire

Pour mon deuxième Ible, je vais vous décrire mes travaux sur ma boîte aux lettres connectée.

Après avoir lu cet Instructable (+ beaucoup d'autres), et comme ma boîte aux lettres n'est pas près de chez moi, j'ai voulu m'inspirer des travaux d'Open Green Energy pour connecter ma boîte aux lettres à mon serveur Domoticz.

Buts

  • Soyez avisé par Telegram lorsque des lettres arrivent;
  • Soyez averti par Telegram lorsqu'un colis arrive;
  • Vérifiez si les lettres/colis ont été ramassés.

Ma principale contrainte

La boîte aux lettres est relativement éloignée de la maison et il était impossible d'y tirer un câble électrique pour alimenter quoi que ce soit.

Il fallait que je trouve une autre solution: le solaire était une bonne solution !

La nomenclature

  • Raspberry Pi (pour héberger les pièces MQTT et Domoticz - non décrites ici)
  • Un compte Telegram Bot
  • Lolin D1 mini (ou Wemos…)
  • Connecteur de bornier à vis enfichable
  • Carte de charge de batterie au lithium TP4056
  • Panneau solaire photovoltaïque 6V 2W
  • Batterie Li-Ion 18650
  • Support de batterie Li-Ion
  • Carte de circuit imprimé de prototype de cuivre de soudure de carte PCB DIY
  • Servo analogique SG90
  • 3 commutateurs à lames (un pour les lettres, un pour le colis et un pour la caisse)
  • Aimants
  • Quelques fils
  • Caisse en bois: N'ayant pas d'imprimante 3D, j'ai réalisé ma propre petite maison en bois pour recevoir des pièces électroniques…
  • Câble Ethernet de rechange
  • Carte de dérivation de connecteur Ethernet RJ45

  • Soudure J-B
  • Quelques roulements à billes
  • Vis, écrous, rondelles

Étape 1: Schéma global

Schéma mondial
Schéma mondial
Schéma mondial
Schéma mondial

De beaux dessins valent toujours mieux que de longs discours;-)

Mais quelques explications sur MQTT, Domoticz et Telegram sont toujours les bienvenues !

MQTT (Message Queuing Telemetry Transport), est un protocole de messagerie, utilisé pour envoyer des données entre des appareils et d'autres systèmes dans le monde de l'IoT (Internet des objets).

Sans entrer dans trop de détails, son fonctionnement est basé sur le principe des clients se connectant à un serveur. Dans MQTT, les clients sont appelés Abonné ou Éditeur et le serveur est appelé Broker.

Dans ce Instructable, j'utilise un seul éditeur, le Lolin câblé à ma boîte aux lettres: lorsque des lettres ou des colis sont détectés via les contacts Reed installés dans la boîte aux lettres (étape 1 dans le schéma), son envoi de message MQTT via WIFI au courtier (étape 2).

La partie Broker est effectuée par Mosquitto, qui est installé sur le Raspberry Pi (étape 3).

A propos de Domoticz:

Comme décrit sur la page source, Domoticz est un "système domotique", vous permettant de contrôler divers appareils et de recevoir des entrées de divers protocoles: MQTT est l'un des protocoles pris en charge…

Dès qu'une information lui parvient (Etape 4), vous pouvez définir des événements: Dans le cas de la boîte aux lettres, j'ai choisi d'envoyer une notification Telegram (Etape 5).

Enfin, le client Telegram est configuré sur mon téléphone (et celui de ma femme aussi ! - Etape 6): l'objectif final est atteint…

Étape 2: Shematic / Câblage

Shematic / Câblage
Shematic / Câblage
Shematic / Câblage
Shematic / Câblage
Shematic / Câblage
Shematic / Câblage
Shematic / Câblage
Shematic / Câblage

Un mot sur l'analogique à lire:

Tout d'abord, j'ai remarqué après quelques recherches que Lolin mini D1 (comme l'ancien Wemos), a intégré un diviseur de tension pour la broche A0 (en considérant 220KΩ pour R1 et 100KΩ pour R2 - voir à droite de la fiche technique liée), permettant 3,2 Volts comme tension d'entrée analogique maximale.

Considérant que la tension de sortie maximale de la batterie est de 4, 2 V (limitée par la carte de charge), et théoriquement, il vous suffit d'ajouter une résistance externe (en série avec R1) pour augmenter la plage de tension d'entrée maximale. Ensuite, si vous ajoutez 100K en série avec R1, vous aurez ce résultat:

Vin * R1/(R1+R2) = Vout

4, 2 * 320K/(320K+100K) = 3, 2

Dans mon circuit, j'ai choisi de pouvoir régler sa valeur, c'est pourquoi j'ai préféré utiliser une résistance réglable dans mon circuit: peut-être qu'elle vous sera inutile, mais dans ma situation, j'ai mis sa valeur à environ 10KΩ pour avoir une valeur cohérente dans Domoticz…

Notez que la broche A0 a une résolution de 10 bits: cela signifie que dans votre croquis, votre lecture analogique renverra une valeur comprise entre 0 et 1024.

Comme je veux envoyer une valeur en pourcentage à Domoticz, je dois diviser le résultat de la lecture analogique par 10, 24.

Étape 3: Gestion de l'alimentation

Gestion de l'alimentation
Gestion de l'alimentation
Gestion de l'alimentation
Gestion de l'alimentation

Bien sûr, je veux que la boîte aux lettres soit autonome. Pour atteindre mon objectif, j'utilise ces éléments:

  • une batterie Li-Ion 18650 de 4000mAh;
  • un panneau solaire pouvant délivrer 6V/2W;
  • une carte de charge de batterie au lithium TP4056.

Pour choisir le panneau solaire le plus adapté, j'ai jeté un oeil à quelques exemples, dont celui-ci: dans cet exemple, un panneau solaire 5.5V / 0.66W est utilisé, et est probablement suffisant pour l'usage. Dans mon cas, et comme l'ESP8266 doit rester allumé pendant la journée et doit pouvoir faire tourner un servomoteur pour garder la maison face au soleil, j'ai choisi un modèle de panneau solaire plus puissant (6V/2W) - Il me permet aussi pour anticiper les périodes hivernales sombres et les journées nuageuses;-)

Aussi, et afin de réduire au maximum les dépenses énergétiques, j'ai sélectionné les scénarios suivants:

  • sachant que le facteur ne passe qu'entre 7h et 20h, ESP est placé en DeepSleep le reste de la nuit;
  • Le facteur ne passe pas entre le samedi midi et le lundi matin: l'ESP est également placé en mode DeepSleep durant cette période.
  • Pour la période entre 7h et 20h, et afin de réduire la consommation électrique, je désactive simplement l'interface réseau de l'ESP: le réseau n'est redémarré qu'à l'arrivée d'un colis ou d'une lettre, juste le temps d'envoyer l'information à Domoticz. Je n'ai pas besoin d'être prévenu immédiatement et les quelques secondes supplémentaires nécessaires au redémarrage de l'interface réseau ne sont pas nuisibles !

Quelques informations sur la consommation dans les différents modes que j'utilise pour le Lolin - regardez la fiche technique, p18:

  • En mode normal (avec fonctionnement RF), la consommation électrique peut atteindre 170mA ! Comme ma boîte aux lettres est à environ 50 mètres de chez moi (et à la limite du signal WIFI…) je suppose que la puissance utilisée pour maintenir la connexion est à son maximum…
  • En mode veille, la consommation électrique chute à 15 mA. Mais comme vous pouvez le voir dans la fiche technique, cela n'a pas complètement arrêté le modem, car l'ESP "maintient une connexion Wi-Fi sans transmission de données".
  • En sommeil profond, la puissance chute à 20 uA.

Pour être certain que le wifi ne reste pas actif inutilement, j'ai préféré le désactiver avec les commandes suivantes. Notez les nombreux appels de delay() … Sans eux, l'ESP plante:

WiFi.disconnect();

retard(1000); WiFi.mode (WIFI_OFF); retard(1000); WiFi.forceSleepBegin(); retard(1);

Globalement, après plusieurs jours de fonctionnement, cela semble fonctionner et surtout se charger correctement:

  • cela me permet de faire tourner le servomoteur toutes les heures pour positionner la maison face au soleil;
  • Je peux aussi me permettre de réactiver l'interface réseau toutes les heures également pour envoyer à Domoticz le niveau de charge de la batterie.

Étape 4: Installation des aimants et des contacts Reeds

Installation des aimants et des contacts Reeds
Installation des aimants et des contacts Reeds
Installation des aimants et des contacts Reeds
Installation des aimants et des contacts Reeds
Installation des aimants et des contacts Reeds
Installation des aimants et des contacts Reeds

Comme d'habitude, j'ai utilisé mon Proxxon pour façonner l'emplacement de l'anche dans un morceau de bois.

Pour fixer le contact reed dans son trou, j'ai utilisé un peu de soudure J-B.

Pour le colis et la sortie, un petit bout de scotch, un peu de scie à métaux, et le but est atteint !

L'avantage de ma boîte aux lettres est qu'elle est en métal, ce qui facilite le positionnement des aimants pour qu'elle interagisse correctement avec les contacts reeds.

Étape 5: Connectez-vous à My Little House

Connectez-vous à Ma Petite Maison
Connectez-vous à Ma Petite Maison
Connectez-vous à Ma Petite Maison
Connectez-vous à Ma Petite Maison

Pour pouvoir connecter et déconnecter facilement le câble qui va aux contacts reed de la boîte aux lettres à la maison, j'ai choisi d'utiliser un connecteur Ethernet.

Vous pouvez utiliser ce modèle ou, comme moi, utiliser un vieux shield Ethernet Arduino qui pend dans mes tiroirs: Il n'a pas souffert, il a été courageux devant la scie, sa mort a été rapide ^^

Juste un mot sur ce shield Ethernet Arduino: ne vous attendez pas à avoir 8 drivers distincts… Les câbles sont appairés par 2 à l'intérieur du shield… Cela m'a rendu fou pendant trop longtemps !!!

Étape 6: Dans la maison…

Dans la maison …
Dans la maison …
Dans la maison …
Dans la maison …

Juste assez de place pour fixer le support de batterie, le réglage du servo, et le connecteur femelle RJ45.

Étape 7: Laissez-le tourner…

Laissez-le tourne-disque…
Laissez-le tourne-disque…
Laissez-le tourne-disque…
Laissez-le tourne-disque…
Laissez-le tourner…
Laissez-le tourner…
Laissez-le tourne-disque…
Laissez-le tourne-disque…

L'objectif est de la garder face au soleil…

Pour laisser la possibilité de tourner, j'ai utilisé une longue vis comme axe, avec quelques écrous et deux roulements à billes…

Jusqu'à présent, j'utilisais le servo SG90 (couple: 1,8kg/cm à 4,8v).

Faire tourner la maison (et ses quelques grammes) suffit. Par contre, je ne suis pas sûr que ses engrenages en plastique résistent longtemps aux fréquentes rafales de vent qu'il y a dans ma région.

J'en ai commandé un autre (couple MG995: 9.4kg/cm à 4.8v), pas très cher non plus, mais avec des engrenages en métal.

Ce sera la prochaine chose à faire quand je l'aurai reçu: je compte sur ma boîte aux lettres connectée pour m'avertir de son arrivée !

Étape 8: quelques tests

Image
Image

Quelques remarques:

Ce croquis est uniquement pour émuler les changements d'heures au cours de la journée pour me permettre de contrôler la position du servo.

  • Avec le SG90: pas de besoins supplémentaires, il peut fonctionner avec la tension OUT provenant du contrôleur de batterie.
  • Mais, avec la MG 995:

    • L'angle de rotation total n'est pas le même (plus large): j'ai dû utiliser une fonction supplémentaire pour le réduire (Servo_Delta()).
    • Besoin d'un élévateur DC/DC pour fournir une tension suffisante au servo … à suivre …

/*

- TEST avec SG90: aucun besoin supplémentaire, il peut fonctionner avec la tension OUT provenant du contrôleur de batterie - POUR MG 995: - utiliser la fonction Servo_Delta() … - Besoin d'un DC/DC Step up pour fournir suffisamment de tension au servo … pour être continué: */ #include bool Logs = true; Servo myservo; #define PIN_SERVO D2 // position servo pour: 7h, 8h, 9h, 10h, 11h, 12h, 13h, 14h, 15h, 16h, 17h, 18h, 19h, 20h, 21h //int Arr_Servo_Pos = {177, 173, 163, 148, 133, 118, 100, 80, 61, 41, 28, 15, 2, 2, 2}; int Arr_Servo_Pos = {180, 175, 165, 150, 135, 120, 102, 82, 63, 43, 30, 15, 0, 0, 0}; int ancien; position int; int je; void setup() { Serial.begin(115200); } boucle vide() { for(i = 7; i <= 22; i++){ old = i; if (i == 7){ if (Logs) Serial.println ("Positionne le servo pour 7 Heure"); monservo.attach(PIN_SERVO); for(int index = Arr_Servo_Pos[(sizeof(Arr_Servo_Pos) / sizeof(Arr_Servo_Pos[0])) -1]; index 7 && i = Arr_Servo_Pos[i-7]; index--){ if (Logs) Serial.println (indice); if (Logs) Serial.print ("Valeur ajustée: "); if (Journaux) Serial.println(Servo_Delta(index)); retard (200); //monservo.write(Servo_Delta(index)); monservo.write(index); } délai(15); monservo.write(Arr_Servo_Pos[i-7]); // réécrit la dernière valeur pour éviter les mouvements saccadés lorsque datach myservo.detach(); } } } délai (2000); } } int Servo_Delta(int value){ int Temp_val; Temp_val = (valeur*0.80)+9; return Temp_val; }

Étape 9: La Petite Maison

La petite maison
La petite maison
La petite maison
La petite maison
La petite maison
La petite maison

Comme je l'ai déjà dit, je n'ai pas eu d'imprimante 3D. Je décide donc d'utiliser une vieille caisse à légumes…

Peut-être qu'il ne durera pas longtemps, mais d'ici là, j'aurais le temps d'envisager une autre solution (ou un ami qui possède une imprimante 3D): pour protéger le bois, j'ai rajouté beaucoup de vernis un peu partout…

On voit bien les « jolis rideaux »… C'est ce qui arrive quand on demande à sa femme de faire le boulot ^^

Étape 10: Le croquis

En cours… Mais semble stable

Je travaille toujours sur le code: comme ce n'est pas une version définitive, vos commentaires/conseils sont les bienvenus;-)

Quelques remarques:

  • Il y a beaucoup de delays() dans le code: c'est pour éviter pas mal de plantage de la Lolin, notamment lors de l'arrêt d'un réseau en démarrage…
  • Je n'ai pas trouvé de moyen simple et fiable pour obtenir l'azimut du soleil: c'est pourquoi j'ai fixé la valeur du servo en fonction de ce que j'ai observé… Si vous avez un bon (et simple) moyen de l'obtenir, ça m'intéresse !Peut-être une piste à étudier ici, même si je préfère une API en ligne me donne l'azimut directement en fonction de la date, de l'heure, et de la position géographique…
  • A propos de la technique du sommeil: comme le Lolin est un processeur Tensilica 32 bits, sa valeur maximale pour un entier 32 bits non signé est de 4294967295 … alors, cela donne environ 71 minutes maximum pour l'intervalle de sommeil profond. C'est pourquoi je fais dormir l'ESP plusieurs fois pendant environ 60 minutes…

EDIT - 2018-10-08:

J'ai découvert que le servo a beaucoup de mouvements saccadés, surtout avant l'attachement (), detach () et à chaque fois que le Lolin se réveille de deepSleep ().

En étudiant un peu plus les fiches techniques, je me suis rendu compte de deux choses:

  • Sur la fiche technique de Lolin, la sortie D4 est déjà connectée avec le BUILTIN_LED…
  • Sur la fiche technique ESP8266ex, nous apprenons que la sortie D4 est utilisée comme UART 1/U 1 TXD (Universal Asynchronous Receiver Transmitter). Il est également précisé que cet UART1 est utilisé pour l'impression du journal.

En lisant ces informations, je me suis rendu compte que la sortie D4 n'était pas une bonne idée, surtout pour gérer un servomoteur !

Donc, maintenant la sortie utilisée pour contrôler le servomoteur est D2, le code ci-dessous a été mis à jour en conséquence.

//****************************************

Date de création: 08/Date de mise en prod: 08/Version: 0.9.4 Version IDE Arduino: 1.8.6 Vitesse de téléchargement: 921600 Type de carte dans l'IDE: "LOLIN(WEMOS) D1 R2 & mini" Carte physique employée: LOLIN(WEMOS) D1 R2 & mini (https://www.amazon.fr/gp/product/B01ELFAF1S/ref=oh_aui_detailpage_o00_s00?ie=UTF8&psc=1) Pin Fonction ESP-8266 Pin Utilisation locale ------- -------------------------------------------------- ------------------------------------ TX TXD TXD RX RXD RXD A0 Entrée analogique, entrée max 3.3V A0 Tension d'alimentation D0 IO GPIO16 Connecté à RST (pour le deep.sleep) D1 IO, SCL GPIO5 D2 IO, SDA GPIO4 Servo moteur D3 IO, 10k Pull-up GPIO0 D4 IO, 10k pull-up, BUILTIN_LED GPIO2 D5 IO, SCK GPIO14 Reed relève D6 IO, MISO GPIO12 Reed lettre D7 IO, MOSI GPIO13 Reed colis D8 IO, 10k pull-down, SS GPIO15 G Ground GND 5V 5V – 3V3 3.3V 3.3V RST Reset RST Connecté à D0 (pour le deep.sleep) ********************************************/ #include bool Logs = true; // wifi const char* ssid = "LOL"; const char* mot de passe = "LOL"; Adresse IP ip (192, 168, 000, 000); Adresse IP DNS (192, 168 000, 000); Passerelle d'adresse IP (192, 168, 000, 000); sous-réseau d'adresse IP (255, 255, 000, 000); Client WiFiClient; // Servo #include #define PIN_SERVO D2 Servo myservo; // position servo pour: 7h, 8h, 9h, 10h, 11h, 12h, 13h, 14h, 15h, 16h, 17h, 18h, 19h, 20h, 21h int Arr_Servo_Pos = {179, 175, 165, 150, 135, 120, 102, 82, 63, 43, 30, 15, 1, 1, 1}; // Reeds #define PIN_SWITCH_OUT D5 octet Old_Switch_State_OUT; octet Switch_State_OUT; #define PIN_SWITCH_IN_PARCEL D6 octet Old_Switch_State_IN_PARCEL; octet Switch_State_IN_PARCEL; #define PIN_SWITCH_IN_LETTER D7 octet Old_Switch_State_IN_LETTER; octet Switch_State_IN_LETTER; commutateur long non signéPressTime; const long non signé DEBOUCE_TIME = 200; // Analogique #define PIN_ANALOG A0 // MQTT #include const char* MQTT_Server_IP = "Votre adresse MQTT"; const int MQTT_Server_Port =; entier IDX_Letter_Box =; entier IDX_Parcel_Box =; int IDX_Letter_Box_Battery =; PubSubClient ClientMQTT(client); char MQTT_Message_Buff[70]; Chaîne MQTT_Pub_String; // Flotteur de tension vcc; // NTP #include time_t tnow; int Old_Time = 0; int Int_Heures = 0; int Int_Minutes = 0; int Int_Sleep_Duration = 63; void setup(){ Serial.begin(115200); réseau (vrai); pinMode(PIN_SWITCH_OUT, INPUT_PULLUP); Old_Switch_State_OUT = digitalRead (PIN_SWITCH_OUT); pinMode(PIN_SWITCH_IN_LETTER, INPUT_PULLUP); Old_Switch_State_IN_LETTER = digitalRead (PIN_SWITCH_IN_LETTER); pinMode(PIN_SWITCH_IN_PARCEL, INPUT_PULLUP); Old_Switch_State_IN_PARCEL = digitalRead (PIN_SWITCH_IN_PARCEL); SendBatteryLevel(); réseau (faux); // NTP défini tnow = time(nullptr); Int_Heures = String(ctime(&tnow)).substring(11, 13).toInt(); Int_Minutes = String(ctime(&tnow)).substring(14, 16).toInt(); // Sommeil profond pour la nuit if(!((Int_Heures >= 7) && (Int_Heures <= 20))){ Serial.print("Sleep pour la nuit ("); Serial.print(Int_Sleep_Duration - Int_Minutes); Serial. println("minutes)"); sommeil(Int_Sleep_Duration - Int_Minutes); } } void loop() { // NTP défini tnow = time(nullptr); Int_Heures = String(ctime(&tnow)).substring(11, 13).toInt(); Int_Minutes = String(ctime(&tnow)).substring(14, 16).toInt(); //Serial.println(String(ctime(&tnow))); //Serial.println ("Heure: " + String(ctime(&tnow)).substring(11, 13)); //Serial.println (String(ctime(&tnow)).substring(11, 13).toInt()); // Gestion des servos if (Old_Time != Int_Heures){ Old_Time = Int_Heures; if (Int_Heures == 7){ if (Logs) Serial.println ("Positionne le servo pour 7 Heure"); monservo.attach(PIN_SERVO); for(int index = Arr_Servo_Pos[(sizeof(Arr_Servo_Pos) / sizeof(Arr_Servo_Pos[0])) -1]; index 7 && Int_Heures = Arr_Servo_Pos[Int_Heures-7]; index--){ if (Logs) Serial.println (indice); retard (200); monservo.write(index); } délai(15); monservo.write(Arr_Servo_Pos[Int_Heures-7]); // réécrit la dernière valeur pour éviter les mouvements saccadés lorsque detach myservo.detach(); } réseau(vrai); SendBatteryLevel(); réseau (faux); } } } // Deepsleep if samedi après 13h if((String(ctime(&tnow)).substring(0, 3) == "Sat") && (Int_Heures >= 13)){ if (Logs) Serial.print("Sleep pour le samedi aprés midi ("); if (Logs) Serial.print(Int_Sleep_Duration - Int_Minutes); if (Logs) Serial.println(" minutes)"); sommeil(Int_Sleep_Duration - Int_Minutes); } // Deepsleep if dimanche if(String(ctime(&tnow)).substring(0, 3) == "Sun"){ if (Logs) Serial.print("Sleep pour le dimanche ("); if (Logs) Serial.print(Int_Sleep_Duration - Int_Minutes); if (Logs) Serial.println ("minutes)"); sommeil(Int_Sleep_Duration - Int_Minutes); } // Gestion des anches Switch_State_OUT = digitalRead (PIN_SWITCH_OUT); if (Switch_State_OUT != Old_Switch_State_OUT){ if (millis () - switchPressTime >= DEBOUCE_TIME){ switchPressTime = millis (); if (Switch_State_OUT == HIGH){ Serial.println ("courrier relevé !"); réseau (vrai); retard (5000); MQTT_Pubilsh(IDX_Letter_Box, 0, "0"); retard (5000); MQTT_Pubilsh(IDX_Parcel_Box, 0, "0"); retard (5000); réseau (faux); } } Old_Switch_State_OUT = Switch_State_OUT; } Switch_State_IN_LETTER = digitalRead (PIN_SWITCH_IN_LETTER); if (Switch_State_IN_LETTER != Old_Switch_State_IN_LETTER){ if (millis () - switchPressTime >= DEBOUCE_TIME){ switchPressTime = millis (); if (Switch_State_IN_LETTER == HIGH){ Serial.println ("courrier arrivé !"); réseau (vrai); retard (5000); MQTT_Pubilsh(IDX_Letter_Box, 1, "Courrier"); retard (5000); réseau (faux); } } Old_Switch_State_IN_LETTER = Switch_State_IN_LETTER; } Switch_State_IN_PARCEL = digitalRead (PIN_SWITCH_IN_PARCEL); if (Switch_State_IN_PARCEL != Old_Switch_State_IN_PARCEL){ if (millis () - switchPressTime >= DEBOUCE_TIME){ switchPressTime = millis (); if (Switch_State_IN_PARCEL == HIGH){ Serial.println ("colis arrivé !"); réseau (vrai); retard (5000); MQTT_Pubilsh(IDX_Parcel_Box, 1, "Colis"); retard (5000); réseau (faux); } } Old_Switch_State_IN_PARCEL = Switch_State_IN_PARCEL; } } void SendBatteryLevel(){ delay(5000); vcc = analogRead(PIN_ANALOG)/10.24; if (Logs) Serial.println ("\tTension relevée: " + String(vcc, 0)); MQTT_Pubilsh(IDX_Letter_Box_Battery, 0, String(vcc, 0)); retard (5000); } void sleep(int Min_Duration){ ESP.deepSleep(Min_Duration * 60e6); } void network(bool UpDown){ if (UpDown){ Serial.print("Network start "); WiFi.forceSleepWake(); retard(1); // init WIFI WiFi.config(ip, dns, gateway, subnet); WiFi.begin(ssid, mot de passe); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } retard (5000); Serial.println("."); Serial.print("\tConnecté - Adresse IP: "); Serial.println(WiFi.localIP()); // init MQTT ClientMQTT.setServer(MQTT_Server_IP, MQTT_Server_Port); // Init NTP Serial.print("\tTime Synch."); configTime(0, 0, "fr.pool.ntp.org"); setenv("TZ", "CET-1CEST, M3.5.0, M10.5.0/3", 0); while(time(nullptr) <= 100000) { Serial.print("."); delay(100); } Serial.println("."); } else{ Serial.println("Network stop."); WiFi.disconnect(); delay(1000); WiFi.mode(WIFI_OFF); delay(1000); WiFi.forceSleepBegin(); delay(1); } } void reconnect() { while (!ClientMQTT.connected()) { Serial.print(" \tTentative de connexion MQTT…"); // Tentative de connexion if (ClientMQTT.connect("ESP8266ClientBAL")) { Serial.println("connected"); } else { Serial.print("failed, rc="); Serial.print(ClientMQTT.state()); Serial.println(" réessayer dans 5 secondes"); // Attendre 5 secondes avant de réessayer delay(5000); } } } void MQTT_Pubilsh(int Int_IDX, int N_Value, String S_Value) { if (!ClientMQTT.connected()) reconnect(); vcc = analogRead(PIN_ANALOG)/10.24; Serial.println("\tSend info to MQTT …"); MQTT_Pub_String = "{ "idx\": " + String (Int_IDX) + ", \"Batterie\": " + String(vcc, 0) + ", \"nvalue\": " + N_Value + ", \"svalue \": \"" + S_Value + "\"}"; MQTT_Pub_String.toCharArray(MQTT_Message_Buff, MQTT_Pub_String.length()+1); ClientMQTT.publish("domoticz/in", MQTT_Message_Buff); ClientMQTT.disconnect(); }

Étape 11: Domotique

Domotique
Domotique
Domotique
Domotique
Domotique
Domotique

Dans Domoticz:

Pour usage général:

  • Créez deux "Dummy (Ne fait rien, utilisez pour les commutateurs virtuels)":

    1. Le premier pour les lettres…
    2. La seconde pour le colis…
  • Pour chacun d'eux, personnalisez les notifications;
  • Bien sûr, vous devez configurer votre jeton Tegegram.

En option:

Vous pouvez ajouter un « capteur utilitaire » pour surveiller le niveau de charge de votre batterie.

Astuces: vous trouverez ici de nombreuses icônes personnalisées gratuites…

Étape 12: Conclusion

Conclusion
Conclusion
Conclusion
Conclusion

J'espère que ce Instructable vous aidera:

  • si vous souhaitez créer votre propre boîte aux lettres connectée;
  • ou juste pour vous donner quelques idées pour vos projets !

Si vous avez des idées d'améliorations, je suis à l'écoute !

PS: désolé pour mon anglais, la traduction Google m'aide beaucoup mais n'est probablement pas parfaite;-)

Conseillé: