Πίνακας περιεχομένων:

Συνδεδεμένο Letterbox Solar Powered: 12 βήματα (με εικόνες)
Συνδεδεμένο Letterbox Solar Powered: 12 βήματα (με εικόνες)

Βίντεο: Συνδεδεμένο Letterbox Solar Powered: 12 βήματα (με εικόνες)

Βίντεο: Συνδεδεμένο Letterbox Solar Powered: 12 βήματα (με εικόνες)
Βίντεο: BigTreeTech - SKR 3 - TMC2130 with Sensorless Homing 2024, Ιούλιος
Anonim
Συνδεδεμένο Letterbox Solar Powered
Συνδεδεμένο Letterbox Solar Powered
Συνδεδεμένο Letterbox Solar Powered
Συνδεδεμένο Letterbox Solar Powered

Για το δεύτερο Ible μου, θα σας περιγράψω τα έργα μου σχετικά με το συνδεδεμένο γραμματοκιβώτιό μου.

Αφού διάβασα αυτό το Instructable (+ πολλά άλλα), και καθώς το γραμματοκιβώτιό μου δεν είναι κοντά στο σπίτι μου, ήθελα να με εμπνεύσει από τα έργα της Open Green Energy για να συνδέσω το γραμματοκιβώτιό μου με τον διακομιστή Domoticz.

Γκολ

  • Ενημερωθείτε από το Telegram όταν έρχονται γράμματα.
  • Ενημερωθείτε από το Telegram όταν έρχεται ένα δέμα.
  • Ελέγξτε αν τα γράμματα / δέματα έχουν παραληφθεί.

Ο βασικός μου περιορισμός

Το γραμματοκιβώτιο είναι σχετικά μακριά από το σπίτι και ήταν αδύνατο να τραβήξετε ένα ηλεκτρικό καλώδιο μέχρι να τροφοδοτήσει οτιδήποτε.

Έπρεπε να βρω μια άλλη λύση: η ηλιακή ενέργεια ήταν μια καλή λύση!

Το BOM

  • Raspberry Pi (για τη φιλοξενία ανταλλακτικών MQTT και Domoticz - δεν περιγράφεται εδώ)
  • Λογαριασμός Telegram Bot
  • Lolin D1 mini (ή Wemos…)
  • Πρόσθετος συνδετήρας μπλοκ τερματικού βίδας
  • Πίνακας φόρτισης μπαταριών λιθίου TP4056
  • Φωτοβολταϊκό ηλιακό πάνελ 6V 2W
  • Μπαταρία Li-Ion 18650
  • Θήκη μπαταρίας Li-Ion
  • PCB DIY Soldering Copper Prototype Printed Circuit Board
  • Αναλογικό Servo SG90
  • 3 διακόπτες καλαμιών (ένας για γράμματα, ένας για δέμα και ένας για ολοκλήρωση αγοράς)
  • Μαγνήτες
  • Κάποια σύρματα
  • Ξύλινο κιβώτιο: Καθώς δεν πήρα κανέναν τρισδιάστατο εκτυπωτή, συνειδητοποίησα το δικό μου σπιτάκι με ξύλο για λήψη ηλεκτρονικών εξαρτημάτων…
  • Ανταλλακτικό καλώδιο Ethernet
  • RJ45 Ethernet Connector Breakout Board

  • J-B Weld
  • Μερικά ρουλεμάν
  • Βίδες, παξιμάδια, ροδέλες

Βήμα 1: Παγκόσμιο Σχέδιο

Παγκόσμιο Σχέδιο
Παγκόσμιο Σχέδιο
Παγκόσμιο Σχέδιο
Παγκόσμιο Σχέδιο

Τα όμορφα σχέδια είναι πάντα καλύτερα από τις μεγάλες ομιλίες;-)

Αλλά μερικές επεξηγήσεις σχετικά με το MQTT, το Domoticz και το Telegram είναι πάντα ευπρόσδεκτες!

Το MQTT (Message Queuing Telemetry Transport), είναι ένα πρωτόκολλο ανταλλαγής μηνυμάτων, που χρησιμοποιείται για την αποστολή δεδομένων μεταξύ συσκευών και άλλων συστημάτων στον κόσμο του IoT (Internet of things).

Χωρίς να υπεισέλθω σε πολλές λεπτομέρειες, η λειτουργία του βασίζεται στην αρχή της σύνδεσης πελατών σε διακομιστή. Στο MQTT, οι πελάτες ονομάζονται Συνδρομητής ή Εκδότης και ο διακομιστής ονομάζεται Μεσίτης.

Σε αυτό το Instructable, χρησιμοποιώ μόνο έναν εκδότη, το Lolin που συνδέεται με το γραμματοκιβώτιό μου: όταν ανιχνεύονται γράμματα ή δέματα μέσω των επαφών καλαμιών που είναι εγκατεστημένα στο γραμματοκιβώτιο (Βήμα 1 σε θερμικό), στέλνει το μήνυμα MQTT μέσω WIFI στον Μεσίτη (Βήμα 2).

Το τμήμα Broker γίνεται από το Mosquitto, το οποίο είναι εγκατεστημένο στο Raspberry Pi (Βήμα 3).

Σχετικά με τον Domoticz:

Όπως περιγράφεται στην αρχική σελίδα, το Domoticz είναι ένα «σύστημα αυτοματισμού σπιτιού», το οποίο σας επιτρέπει να ελέγχετε διάφορες συσκευές και να λαμβάνετε πληροφορίες από διάφορα πρωτόκολλα: Το MQTT είναι ένα από τα υποστηριζόμενα πρωτόκολλα…

Μόλις φτάσουν οι πληροφορίες (Βήμα 4), μπορείτε να ορίσετε συμβάντα: Στην περίπτωση του γραμματοκιβωτίου, επέλεξα να στείλω μια ειδοποίηση Telegram (Βήμα 5).

Τέλος, ο πελάτης Telegram έχει ρυθμιστεί στο τηλέφωνό μου (και της γυναίκας μου επίσης! - Βήμα 6): ο τελικός στόχος επιτυγχάνεται…

Βήμα 2: Σηματικό / Καλωδίωση

Shematic / Καλωδίωση
Shematic / Καλωδίωση
Shematic / Καλωδίωση
Shematic / Καλωδίωση
Shematic / Καλωδίωση
Shematic / Καλωδίωση
Shematic / Καλωδίωση
Shematic / Καλωδίωση

Μια λέξη για το αναλογικό διαβάζεται:

Πρώτα απ 'όλα, παρατήρησα μετά από μερικές έρευνες ότι το Lolin mini D1 (ως το παλιό Wemos), έχει ενσωματωμένο διαχωριστή τάσης για τον πείρο A0 (λαμβάνοντας υπόψη 220KΩ για R1 και 100KΩ για R2 - δείτε στα δεξιά του δελτίου δεδομένων που συνδέεται), επιτρέποντας 3,2 Volt ως μέγιστη αναλογική τάση εισόδου.

Λαμβάνοντας υπόψη τη μέγιστη τάση εξόδου από την μπαταρία είναι 4, 2v (περιορίζεται από τον πίνακα φόρτισης) και θεωρητικά, χρειάζεται μόνο να προσθέσετε έναν εξωτερικό ρυθμιστή (σε σειρά με R1) για να αυξήσετε το μέγιστο εύρος τάσης εισόδου. Στη συνέχεια, αν προσθέσετε 100K σε σειρά με R1, θα έχετε αυτό το αποτέλεσμα:

Vin * R1/(R1+R2) = Vout

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

Στο κύκλωμά μου, επέλεξα να μπορώ να προσαρμόσω την τιμή του, γι 'αυτό προτίμησα να χρησιμοποιήσω μια ρυθμιζόμενη αντίσταση στο κύκλωμά μου: ίσως να είναι άχρηστο για εσάς, αλλά στην περίπτωσή μου, έθεσα την τιμή του σε περίπου 10KΩ για να έχω μια συνεκτική αξία στο Domoticz…

Σημειώστε ότι ο ακροδέκτης A0 έχει ανάλυση 10 bit: αυτό σημαίνει ότι στο σκίτσο σας, η αναλογική σας ανάγνωση θα επιστρέψει μια τιμή μεταξύ 0 και 1024.

Καθώς θέλω να στείλω μια ποσοστιαία τιμή στον Domoticz, πρέπει να διαιρέσω το αναλογικό αποτέλεσμα ανάγνωσης με 10, 24.

Βήμα 3: Διαχείριση ισχύος

Διαχείριση ισχύος
Διαχείριση ισχύος
Διαχείριση ισχύος
Διαχείριση ισχύος

Φυσικά, θέλω το γραμματοκιβώτιο να είναι αυτόνομο. Για να επιτύχω τον στόχο μου, χρησιμοποιώ αυτά τα στοιχεία:

  • μπαταρία Li-Ion 18650 4000mAh.
  • ένα ηλιακό πάνελ που μπορεί να αποδώσει 6V / 2W.
  • μια πλακέτα φόρτισης μπαταριών λιθίου TP4056.

Για να επιλέξω το καταλληλότερο ηλιακό πάνελ, έριξα μια ματιά σε μερικά παραδείγματα, συμπεριλαμβανομένου αυτού: σε αυτό το παράδειγμα, χρησιμοποιείται ηλιακός πίνακας 5,5V / 0,66W και πιθανώς είναι επαρκής για το σκοπό αυτό. Στην περίπτωσή μου, και καθώς το ESP8266 πρέπει να παραμένει ενεργοποιημένο κατά τη διάρκεια της ημέρας και να μπορεί να λειτουργεί σερβοκινητήρα για να κρατά το σπίτι στραμμένο στον ήλιο, επέλεξα ένα πιο ισχυρό μοντέλο ηλιακού πίνακα (6V / 2W) - Μου επιτρέπει επίσης να προβλέπει σκοτεινές χειμερινές περιόδους και συννεφιασμένες μέρες;-)

Επίσης, και προκειμένου να μειώσω τις ενεργειακές δαπάνες στο μέγιστο, επέλεξα τα ακόλουθα σενάρια:

  • γνωρίζοντας ότι ο ταχυδρόμος πέρασε μόνο μεταξύ 7πμ και 8μμ, το ESP τοποθετείται στο DeepSleep το υπόλοιπο της νύχτας.
  • Ο συντελεστής δεν περνά από το μεσημέρι του Σαββάτου έως το πρωί της Δευτέρας: το ESP τοποθετείται επίσης σε λειτουργία DeepSleep κατά τη διάρκεια αυτής της περιόδου.
  • Για την περίοδο μεταξύ 7 π.μ. και 8 μ.μ., και για να μειώσω την κατανάλωση ενέργειας, απενεργοποιώ απλώς τη διεπαφή δικτύου του ESP: το δίκτυο επανεκκινείται μόνο με την άφιξη ενός δέματος ή μιας επιστολής, αρκετός χρόνος για την αποστολή των πληροφοριών στο Domoticz. Δεν χρειάζεται να ειδοποιηθώ αμέσως και τα λίγα επιπλέον δευτερόλεπτα που είναι απαραίτητα για την επανεκκίνηση της διεπαφής δικτύου δεν είναι επιβλαβή!

Κάποια αξία για την κατανάλωση σε διαφορετικές λειτουργίες που χρησιμοποιώ για το Lolin - δείτε το φύλλο δεδομένων, σελ 18:

  • Σε κανονική λειτουργία (με λειτουργία RF), η κατανάλωση ενέργειας μπορεί να αυξηθεί στα 170mA! Καθώς το γραμματοκιβώτιό μου είναι περίπου 50 μέτρα από το σπίτι μου (και στο όριο του σήματος WIFI …) υποθέτω ότι η ισχύς που χρησιμοποιείται για τη διατήρηση της σύνδεσης είναι στο μέγιστο…
  • Στο Modem-sleep, η κατανάλωση ενέργειας μειώνεται στα 15mA. Αλλά όπως μπορείτε να δείτε στο φύλλο δεδομένων, δεν σταμάτησε εντελώς το μόντεμ, καθώς το ESP "διατηρεί σύνδεση Wi-Fi χωρίς μετάδοση δεδομένων".
  • Στο Deep-sleep, η ισχύς πέφτει στα 20uA.

Για να είμαι σίγουρος ότι το wifi δεν παραμένει ενεργό άσκοπα, προτίμησα να το απενεργοποιήσω με τις ακόλουθες εντολές. Σημειώστε την πολλή καθυστέρηση () κλήσης … Χωρίς αυτά, η συντριβή του ESP:

WiFi.disconnect ();

καθυστέρηση (1000)? WiFi.mode (WIFI_OFF); καθυστέρηση (1000)? WiFi.forceSleepBegin (); καθυστέρηση (1)?

Συνολικά, μετά από αρκετές ημέρες λειτουργίας, φαίνεται να λειτουργεί και ειδικά να φορτώνεται σωστά:

  • Αυτό μου επιτρέπει να τρέχω τον σερβοκινητήρα κάθε ώρα για να τοποθετήσω το σπίτι προς τον ήλιο.
  • Μπορώ επίσης να επιτρέψω στον εαυτό μου να ενεργοποιήσει εκ νέου τη διεπαφή δικτύου κάθε ώρα επίσης για να στείλει στο Domoticz το επίπεδο φόρτισης της μπαταρίας.

Βήμα 4: Εγκατάσταση επαφών μαγνητών και καλαμιών

Εγκατάσταση επαφών μαγνητών και καλαμιών
Εγκατάσταση επαφών μαγνητών και καλαμιών
Εγκατάσταση επαφών μαγνητών και καλαμιών
Εγκατάσταση επαφών μαγνητών και καλαμιών
Εγκατάσταση επαφών μαγνητών και καλαμιών
Εγκατάσταση επαφών μαγνητών και καλαμιών

Ως συνήθως, χρησιμοποίησα το Proxxon μου για να διαμορφώσω τη θέση του Καλαμιού σε ένα κομμάτι ξύλο.

Για να διορθώσω την επαφή του καλαμιού στην τρύπα του, χρησιμοποίησα λίγη συγκόλληση J-B.

Για το δέμα και την έξοδο, ένα μικρό κομμάτι ταινίας, λίγο πριόνι, και ο στόχος επιτυγχάνεται!

Το πλεονέκτημα του γραμματοκιβωτίου μου είναι ότι είναι μέταλλο, το οποίο διευκολύνει τη θέση των μαγνητών έτσι ώστε να αλληλεπιδρά σωστά με τις επαφές των καλαμιών.

Βήμα 5: Συνδεθείτε στο My Little House

Συνδεθείτε στο My Little House
Συνδεθείτε στο My Little House
Συνδεθείτε στο My Little House
Συνδεθείτε στο My Little House

Για να μπορώ να συνδέω και να αποσυνδέω εύκολα το καλώδιο που πηγαίνει στις επαφές καλαμιών από το γραμματοκιβώτιο στο σπίτι, επέλεξα να χρησιμοποιήσω μια υποδοχή Ethernet.

Μπορείτε να χρησιμοποιήσετε αυτό το μοντέλο ή, όπως εγώ, να χρησιμοποιήσετε μια παλιά ασπίδα Arduino Ethernet που κρέμεται στα συρτάρια μου: Δεν υπέφερε, ήταν γενναίος μπροστά από το πριόνι, ο θάνατός του ήταν γρήγορος ^^

Λίγα λόγια για αυτήν την ασπίδα Arduino Ethernet: μην περιμένετε να έχετε 8 ξεχωριστά προγράμματα οδήγησης… Τα καλώδια συνδυάζονται με 2 μέσα στην ασπίδα… Με τρέλανε για πολύ καιρό !!!

Βήμα 6: Στο σπίτι…

Μέσα στο σπίτι …
Μέσα στο σπίτι …
Μέσα στο σπίτι …
Μέσα στο σπίτι …

Απλά αρκετό μέρος για να στερεώσετε τη θήκη της μπαταρίας, ρυθμίζοντας το σερβο και το θηλυκό βύσμα RJ45.

Βήμα 7: Αφήστε το πικάπ…

Αφήστε το Πικάπ…
Αφήστε το Πικάπ…
Αφήστε το Πικάπ…
Αφήστε το Πικάπ…
Αφήστε το Πικάπ…
Αφήστε το Πικάπ…
Αφήστε το Πικάπ…
Αφήστε το Πικάπ…

Ο στόχος είναι να το κρατήσουμε στραμμένο στον ήλιο…

Για να αφήσω την ικανότητα περιστροφής, χρησιμοποίησα μια μακρά βίδα ως άξονα, με μερικά παξιμάδια και δύο ρουλεμάν …

Μέχρι τώρα χρησιμοποιούσα SG90 servo (ροπή: 1,8kg/cm στα 4,8v).

Για να γυρίσετε το σπίτι (και τα λίγα γραμμάρια του) αρκεί. Από την άλλη πλευρά, δεν είμαι σίγουρος ότι τα πλαστικά γρανάζια του αντιστέκονται για μεγάλο χρονικό διάστημα στις συχνές ριπές ανέμου που υπάρχουν στην περιοχή μου.

Παρήγγειλα ένα άλλο (ροπή MG995: 9,4kg/cm στα 4,8v), ούτε πολύ ακριβό, αλλά με μεταλλικά γρανάζια.

Θα είναι το επόμενο πράγμα που θα κάνω όταν το λάβω: βασίζομαι στο συνδεδεμένο γραμματοκιβώτιό μου για να με ειδοποιήσει για την άφιξή του!

Βήμα 8: Μερικές δοκιμές

Image
Image

Μερικές σημειώσεις:

Αυτό το σκίτσο είναι μόνο για να μιμηθεί τις αλλαγές των ωρών κατά τη διάρκεια της ημέρας για να μου επιτρέψει να ελέγξω τη θέση του σερβο.

  • Με SG90: χωρίς επιπλέον ανάγκες, μπορεί να λειτουργήσει με την τάση OUT που προέρχεται από τον ελεγκτή μπαταρίας.
  • Αλλά, με το MG 995:

    • Η συνολική γωνία περιστροφής δεν είναι η ίδια (ευρύτερη): Έπρεπε να χρησιμοποιήσω μια επιπλέον συνάρτηση για να τη μειώσω (Servo_Delta ()).
    • Χρειάζεστε ένα DC/DC Step up για να παρέχετε αρκετή τάση στο σερβο… για να συνεχίσετε…

/*

- ΔΟΚΙΜΗ με SG90: χωρίς επιπλέον ανάγκες, μπορεί να λειτουργήσει με την τάση OUT που προέρχεται από τον ελεγκτή μπαταρίας - ΓΙΑ MG 995: - Χρησιμοποιήστε τη λειτουργία Servo_Delta ()… να συνεχιστεί: */ #include bool Logs = true; Servo myservo; #define PIN_SERVO D2 // servo position for: 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 παλιά? int pos? int i? void setup () {Serial.begin (115200); } void loop () {for (i = 7; i <= 22; i ++) {old = i; if (i == 7) {if (Logs) Serial.println ("Positionne le servo pour 7 Heure"); myservo.attach (PIN_SERVO); για (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 (δείκτης); if (Logs) Serial.print ("Προσαρμοσμένη τιμή:"); if (Logs) Serial.println (Servo_Delta (ευρετήριο)); καθυστέρηση (200)? //myservo.write(Servo_Delta(index)); myservo.write (ευρετήριο); } καθυστέρηση (15); myservo.write (Arr_Servo_Pos [i-7]); // γράψτε ξανά την τελευταία τιμή για να αποφύγετε τις σπασμωδικές κινήσεις όταν datach myservo.detach (); }}} καθυστέρηση (2000); }} int Servo_Delta (τιμή int) {int Temp_val; Temp_val = (τιμή*0,80) +9; επιστροφή Temp_val? }

Βήμα 9: Το μικρό σπίτι

Το Μικρό Σπίτι
Το Μικρό Σπίτι
Το Μικρό Σπίτι
Το Μικρό Σπίτι
Το Μικρό Σπίτι
Το Μικρό Σπίτι

Όπως είπα και πριν, δεν πήρα κανέναν τρισδιάστατο εκτυπωτή. Αποφασίζω λοιπόν να χρησιμοποιήσω παλιό κλουβί λαχανικών…

Maybeσως δεν θα διαρκέσει πολύ καιρό, αλλά μέχρι τότε, θα είχα χρόνο να σκεφτώ μια άλλη λύση (ή έναν φίλο που έχει 3D εκτυπωτή): για την προστασία του ξύλου, πρόσθεσα πολύ βερνίκι παντού…

Μπορείτε να δείτε τις "όμορφες κουρτίνες" … Αυτό συμβαίνει όταν ζητάτε από τη γυναίκα σας να κάνει τη δουλειά ^^

Βήμα 10: Το σκίτσο

Σε εξέλιξη… Αλλά φαίνεται να είναι σταθερό

Εξακολουθώ να δουλεύω τον κώδικα: καθώς δεν πρόκειται για οριστική έκδοση, τα σχόλια / συμβουλές σας είναι ευπρόσδεκτα;-)

Μερικές παρατηρήσεις:

  • Είναι πολλές οι καθυστερήσεις () στον κώδικα: αυτό είναι για να αποφευχθεί πολύ η συντριβή του Lolin, ειδικά κατά τη διακοπή ενός δικτύου εκκίνησης…
  • Δεν βρήκα έναν εύκολο και αξιόπιστο τρόπο για να πάρω το αζιμούθιο του ήλιου: γι 'αυτό διόρθωσα την τιμή σερβο σε συνάρτηση με αυτό που παρατήρησα … Έχω έναν καλό (και απλό) τρόπο να το αποκτήσω, με ενδιαφέρει! Maybeσως ένα κομμάτι για σπουδές εδώ, ακόμα κι αν προτιμώ ένα διαδικτυακό API μου δίνει το αζιμούθιο απευθείας σύμφωνα με την ημερομηνία, την ώρα και τη γεωγραφική θέση…
  • Σχετικά με την τεχνική ύπνου: καθώς το Lolin είναι ένας επεξεργαστής Tensilica 32-bit, η μέγιστη τιμή του για έναν 32-bit ανυπόγραφο ακέραιο είναι 4294967295 … τότε, δίνει περίπου 71 λεπτά για το βαθύ διάστημα ύπνου. Γι 'αυτό κοιμάμαι πολλές φορές για περίπου 60 λεπτά…

EDIT - 2018-10-08:

Ανακάλυψα ότι το σερβο έχει πολλές σπασμωδικές κινήσεις, ειδικά πριν από την προσάρτηση (), αποσύνδεση () και κάθε φορά που η Λολίν ξυπνάει από βαθύ ύπνο ().

Μελετώντας λίγο περισσότερα φύλλα δεδομένων, συνειδητοποίησα δύο πράγματα:

  • Στο φύλλο δεδομένων Lolin, η έξοδος D4 είναι ήδη συνδεδεμένη με το BUILTIN_LED…
  • Στο φύλλο δεδομένων ESP8266ex, μαθαίνουμε ότι η έξοδος D4 χρησιμοποιείται ως UART 1/U 1 TXD (Universal Asynchronous Receiver Transmitter). Έχει επίσης καθοριστεί ότι αυτό το UART1 χρησιμοποιείται για εκτύπωση ημερολογίου.

Διαβάζοντας αυτές τις πληροφορίες, συνειδητοποίησα ότι η έξοδος D4 δεν ήταν καλή ιδέα, ειδικά για τη διαχείριση ενός σερβοκινητήρα!

Έτσι, τώρα η έξοδος που χρησιμοποιείται για τον έλεγχο του σερβοκινητήρα είναι D2, ο παρακάτω κώδικας έχει ενημερωθεί αναλόγως.

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

Ημερομηνία δημιουργίας: 08/Ημερομηνία mise en prod: 08/Έκδοση: 0.9.4 Έκδοση IDE Arduino: 1.8.6 Ταχύτητα μεταφόρτωσης: 921600 Τύπος 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 Function ESP-8266 Pin Utilization Local ------- ------------------------------------------------------ ------------------------------------- TX TXD TXD RX RXD RXD A0 Αναλογική είσοδος, μέγιστη είσοδος 3,3V A0 Tension d'alimentaion 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, 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 3.3V RST Reset RST Connecté à D0 (pour le deep.sleep) ************************************** ? // wifi const char* ssid = "LOL"; const char* κωδικός πρόσβασης = "LOL"; IPAddress ip (192, 168, 000, 000); IPAddress dns (192, 168, 000, 000); Πύλη IPAddress (192, 168, 000, 000). Υποδίκτυο IPAddress (255, 255, 000, 000). Πελάτης WiFiClient. // Servo #include #define PIN_SERVO D2 Servo myservo; // σερβο θέση για: 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 byte Old_Switch_State_OUT; byte Switch_State_OUT; #define PIN_SWITCH_IN_PARCEL D6 byte Old_Switch_State_IN_PARCEL; byte Switch_State_IN_PARCEL; #define PIN_SWITCH_IN_LETTER D7 byte Old_Switch_State_IN_LETTER; byte Switch_State_IN_LETTER; ανυπόγραφο μακρύ switchPressTime; const ανυπόγραφο μεγάλο DEBOUCE_TIME = 200; // Analog #define PIN_ANALOG A0 // MQTT #include const char* MQTT_Server_IP = "Η διεύθυνση MQTT σας"; const int MQTT_Server_Port =; int IDX_Letter_Box =; int IDX_Parcel_Box =; int IDX_Letter_Box_Battery =; PubSubClient ClientMQTT (πελάτης). char MQTT_Message_Buff [70]; Χορδή MQTT_Pub_String; // Tension float 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); δίκτυο (αληθινό)? 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 (); δίκτυο (ψευδές)? // NTP set tnow = time (nullptr); Int_Heures = String (ctime (& tnow)). Substring (11, 13).toInt (); Int_Minutes = String (ctime (& tnow)). Substring (14, 16).toInt (); // Deepsleep for the night if (! ((Int_Heures> = 7) && (Int_Heures <= 20))) {Serial.print ("Sleep pour la nuit ("); Serial.print (Int_Sleep_Duration - Int_Minutes); Serial println ("λεπτά)"); ύπνος (Int_Sleep_Duration - Int_Minutes); }} void loop () {// NTP set 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 ()); // Servo management if (Old_Time! = Int_Heures) {Old_Time = Int_Heures; if (Int_Heures == 7) {if (Logs) Serial.println ("Positionne le servo pour 7 Heure"); myservo.attach (PIN_SERVO); για (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 (δείκτης); καθυστέρηση (200)? myservo.write (ευρετήριο); } καθυστέρηση (15); myservo.write (Arr_Servo_Pos [Int_Heures-7]); // γράψτε ξανά την τελευταία τιμή για να αποφύγετε τις σπασμωδικές κινήσεις κατά την αποσύνδεση του myservo.detach (); } δίκτυο (αληθινό); SendBatteryLevel (); δίκτυο (ψευδές)? }}} // Deepsleep εάν Σάββατο μετά τις 13h εάν ((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)"); ύπνος (Int_Sleep_Duration - Int_Minutes); } // Deepsleep if Sunday (if) (String (ctime (& tnow)).. Substring (0, 3) == "Sun") {if (Logs) Serial.print ("Sleep pour le dimanche ("); Serial.print (Int_Sleep_Duration - Int_Minutes); if (Logs) Serial.println ("λεπτά" "); ύπνος (Int_Sleep_Duration - Int_Minutes); } // Διαχείριση καλαμιών Switch_State_OUT = digitalRead (PIN_SWITCH_OUT); εάν (Switch_State_OUT! = Old_Switch_State_OUT) {if (millis () - switchPressTime> = DEBOUCE_TIME) {switchPressTime = millis (); if (Switch_State_OUT == HIGH) {Serial.println ("courrier relevé!"); δίκτυο (αληθινό)? καθυστέρηση (5000)? MQTT_Pubilsh (IDX_Letter_Box, 0, "0"); καθυστέρηση (5000)? MQTT_Pubilsh (IDX_Parcel_Box, 0, "0"); καθυστέρηση (5000)? δίκτυο (ψευδές)? }} Old_Switch_State_OUT = Switch_State_OUT; } Switch_State_IN_LETTER = digitalRead (PIN_SWITCH_IN_LETTER); εάν (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é!"); δίκτυο (αληθινό)? καθυστέρηση (5000)? MQTT_Pubilsh (IDX_Letter_Box, 1, "Courrier"); καθυστέρηση (5000)? δίκτυο (ψευδές)? }} Old_Switch_State_IN_LETTER = Switch_State_IN_LETTER; } Switch_State_IN_PARCEL = digitalRead (PIN_SWITCH_IN_PARCEL); εάν (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é!"); δίκτυο (αληθινό)? καθυστέρηση (5000)? MQTT_Pubilsh (IDX_Parcel_Box, 1, "Colis"); καθυστέρηση (5000)? δίκτυο (ψευδές)? }} Old_Switch_State_IN_PARCEL = Switch_State_IN_PARCEL; }} void SendBatteryLevel () {καθυστέρηση (5000); vcc = analogRead (PIN_ANALOG) /10.24; if (Αρχεία καταγραφής) Serial.println ("\ tΕμφάνιση έντασης:" + String (vcc, 0)); MQTT_Pubilsh (IDX_Letter_Box_Battery, 0, String (vcc, 0)); καθυστέρηση (5000)? } void sleep (int Min_Duration) {ESP.deepSleep (Min_Duration * 60e6); } void network (bool UpDown) {if (UpDown) {Serial.print ("Έναρξη δικτύου"); WiFi.forceSleepWake (); καθυστέρηση (1)? // init WIFI WiFi.config (ip, dns, gateway, subnet); WiFi.begin (ssid, κωδικός πρόσβασης); while (WiFi.status ()! = WL_CONNECTED) {καθυστέρηση (500); Serial.print ("."); } καθυστέρηση (5000); Serial.println ("."); Serial.print ("\ tΣυνδεδεμένο - Διεύθυνση IP:"); Serial.println (WiFi.localIP ()); // init MQTT ClientMQTT.setServer (MQTT_Server_IP, MQTT_Server_Port); // Init NTP Serial.print ("\ tΧρονικός συγχρονισμός"); 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 ("."); Καθυστέρηση (100);} Serial.println (".");} Else {Serial.println ("Διακοπή δικτύου."); WiFi.disconnect (); καθυστέρηση (1000); WiFi.mode (WIFI_OFF); καθυστέρηση (1000); WiFi.forceSleepBegin (); καθυστέρηση (1);}} άκυρη επανασύνδεση () {ενώ (! ClientMQTT.connected ()) {Serial.print (" / tΠροσπάθεια σύνδεσης MQTT… "); // Προσπάθεια σύνδεσης εάν (ClientMQTT.connect (" ESP8266ClientBAL ")) {Serial.println (" συνδεδεμένο ");} else {Serial.print (" απέτυχε, rc = "); Serial print {if (! ClientMQTT.connected ()) επανασύνδεση (); vcc = analogRead (PIN_ANALOG) /10.24; Serial.println ("\ tΑποστολή πληροφοριών στο MQTT …"); MQTT_Pub_String = "{" idx / ":" + String (Int_IDX) + ", \" Battery / ":" + 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 (); }

Βήμα 11: Domoticz

Ντόμοτιτς
Ντόμοτιτς
Ντόμοτιτς
Ντόμοτιτς
Ντόμοτιτς
Ντόμοτιτς

Στο Domoticz:

Για γενική χρήση:

  • Δημιουργήστε δύο "Dummy (Δεν κάνει τίποτα, χρησιμοποιήστε για εικονικούς διακόπτες)":

    1. Το πρώτο για γράμματα…
    2. Το δεύτερο για δέμα…
  • Για καθένα από αυτά, εξατομικεύστε τις ειδοποιήσεις.
  • Φυσικά, πρέπει να ρυθμίσετε το διακριτικό Tegegram.

Προαιρετικά:

Μπορείτε να προσθέσετε έναν "αισθητήρα χρησιμότητας" για να επιβλέπετε το επίπεδο φόρτισης της μπαταρίας σας.

Συμβουλές: εδώ μπορείτε να βρείτε πολλά δωρεάν προσαρμοσμένα εικονίδια…

Βήμα 12: Συμπέρασμα

συμπέρασμα
συμπέρασμα
συμπέρασμα
συμπέρασμα

Ελπίζω ότι αυτό το Instructable θα σας βοηθήσει:

  • αν θα φτιάξετε το δικό σας συνδεδεμένο letterlbox?
  • ή απλά για να σας δώσω μερικές ιδέες για τα έργα σας!

Αν έχετε ιδέες για βελτιώσεις, σας ακούω!

ΥΓ: συγνώμη για τα αγγλικά μου, η μετάφραση Google με βοηθάει πολύ αλλά μάλλον δεν είναι τέλεια;-)

Συνιστάται: