Dans mon dernier Blog dans lequel j’ai présenté une plaque de nom avec son propre texte de défilement, une application possible est un signe de boîte aux lettres. Cependant, je trouve que notre affichage avec un affichage du nom et le texte de défilement seul comme un signe de boîte aux lettres est quelque peu déçu dans les possibilités. Alors que diriez-vous de notre affichage aussi afficher si la boîte aux lettres a été ouverte par le messager à l’avance? Ainsi, nous pouvons voir directement "en un coup d’œil" si elle vaut la peine d’ouvrir la boîte aux lettres ou non.
Pour ce faire, nous avons juste besoin d’élargir notre code un peu et faire un petit changement ou une extension dans le circuit. En outre, nous avons besoin d’un microswitch comme un contact.
Principe:
Nous ajoutons un microtrage, qui est poussé vers le bas par le rabat de boîte aux lettres dans l’état normal et ferme ainsi le contact. Si le volet de la boîte aux lettres est ouvert, le bouton poussoir s’ouvre également brièvement et donne une impulsion à notre microcontrôleur, qui interprète ce signal comme «Une lettre a été jetée dans»..
Cette icône de lettre est ensuite affichée sur l’écran pendant 12 heures :
Ce symbole peut être utilisé pour vous identifier immédiatement lorsqu’une lettre a été lancée.
Le circuit doit être prolongé par un bouton (plus proche).
Voici le schéma requis ou étendu :
Nous téléchargeons le code suivant sur notre Arduino :
#include <LiquidCrystal (en).H (en)> #include <Avr (Avr)/Dormir.H (en)> port 10 Contact normalement ouvert Constantes et définitions Const Flotteur Tension d’avertissement = 4.0; Const Flotteur Sleepvoltage = 3.2; Const Int Scrollspeed = 700; Const Long Intervalle = 1000; Définition d’une seconde en millisecondes const byte VoltTestPin 0; Test d’entrée analogique 0 Const Octet VoltTestPin VoltTestPin = 2; Entrée Alalog productive 2 Horloge en temps réel Long précédentMillis = 0; stockera la dernière fois a été mesurée Octet Secondes = 0; Octet Minute = 0; Octet Heure = 0; Défitions de cordes String LetterBoxOwner (en) = " Tobias Kuch "; S’il vous plaît changer dans votre propre nom ! String StandardScolltext = "S’il vous plaît ne pas jeter dans les annonces ou les journaux gratuits. Je vous remercie! - "; String LetterArrivedScolltext = "Merci d’avoir livré le courrier. Le destinataire est avisé. "; String BattInfo (en anglais); Logique du programme Octet CharPointers CharPointers[200]; Flotteur Valeur; Int Tension; Boolean BatteryEmpty (BatteryEmpty) = Faux; Boolean IsSensorActive (en) = Faux; Dans une réinitialisation, un signal élevé détecté (commutateur ouvert ignoré) s’affiche si aucun interrupteur n’est affiché depuis le début ! exized (niveau élevé permanent) Octet Displaymode = 0; Octet vieuxDisplaymode = 0; Boolean MailAlreadyDelivered MailAlreadyDelivered MailAlreadyDelivered MailAl = Faux; Int Switchstate (Switchstate) = 1; Octet DispLATextOneTime = 0; Octet DispLATextOneTimeWASDisp = 0; Int cmpMsgAvec = 0; Int MAMsgDC = 0; Octet MatC MatC = 0; Affichage de 12 heures de l’icône "Nouveau Message" Octet nouveauChar[8] = { 0b11111, 0b10011, 0b10101, 0b11001, 0b11001, 0b10101, 0b10011, 0b11111 }; LiquidCrystal (rs, enable, d4, d5, d6, d7); LiquidCrystal (en) Lcd(8, 9, 4, 5, 6, 7); Vide InitLcdScreen (en) () { Lcd.Clair(); Lcd.setCursor(0, 0); Lcd.Imprimer(Boîte aux lettres "); Lcd.setCursor(0, 1); Lcd.Imprimer(" tobias.kuch at "); Retard(2000); Lcd.setCursor(0, 0); Lcd.Imprimer(LetterBoxOwner (en)); Lcd.setCursor(0, 1); Lcd.Imprimer(" googlemail.com "); Retard(3000); } Vide Configuration() { Pour (Int Un = 0; Un < 200; Un++) { CharPointers CharPointers[Un] = Un; } Lcd.createChar(0, nouveauChar); Lcd.Commencer(16, 2); démarrer la bibliothèque pinMode(10, INPUT_PULLUP); pour la nouvelle arrivée de courrier Détection LOW: Flap à HIGH: volet ouvert Switchstate (Switchstate) = digitalRead (en)(10); InitLcdScreen (en)(); analogReference (en)(Par défaut); Si (!Switchstate (Switchstate)) { IsSensorActive (en) = Vrai; } } Vide NormalScrolltext () { Int cmpMsgAvec = StandardScolltext.Longueur() - 2; Displaymode = 0; Retard (Scrollspeed); Lcd.setCursor(0, 1); Pour (Int Un = 0; Un < 17; Un++) { Lcd.Imprimer(StandardScolltext[CharPointers CharPointers[Un]]); } Pour (Int Un = 0; Un < cmpMsgAvec; Un++) { CharPointers CharPointers[Un] = CharPointers CharPointers[Un] + 1; Si (CharPointers CharPointers[Un] > cmpMsgAvec) { CharPointers CharPointers[Un] = 0; } } } Vide BatteryWarningScrolltext (en) () { BattInfo (en anglais) = "- Achtung! Batteriespannung: " + String(Tension * 3) + "Volt. Akku aufladen. - " + StandardScolltext + " "; Int cmpMsgAvec = BattInfo (en anglais).Longueur() - 2; Displaymode = 2; Retard (Scrollspeed / 2 ); Lcd.setCursor(0, 1); Pour (Int Un = 0; Un < 17; Un++) { Lcd.Imprimer(BattInfo (en anglais)[CharPointers CharPointers[Un]]); } Pour (Int Un = 0; Un < cmpMsgAvec; Un++) { CharPointers CharPointers[Un] = CharPointers CharPointers[Un] + 1; Si (CharPointers CharPointers[Un] > cmpMsgAvec) { CharPointers CharPointers[Un] = 0; } } } Vide LetterArrScrolltext () { Int cmpMsgAvec = LetterArrivedScolltext.Longueur() - 2; Displaymode = 3; Retard (Scrollspeed - 50 ); Lcd.setCursor(0, 1); Pour (Int Un = 0; Un < 17; Un++) { Lcd.Imprimer(LetterArrivedScolltext[CharPointers CharPointers[Un]]); } Pour (Int Un = 0; Un < cmpMsgAvec; Un++) { CharPointers CharPointers[Un] = CharPointers CharPointers[Un] + 1; Si (CharPointers CharPointers[Un] > cmpMsgAvec) { CharPointers CharPointers[Un] = 0; DispLATextOneTimeWASDisp = 1; } } } Vide Powerdown (Powerdown) () Basculez Powerdown, si la tension critique est atteinte. { Lcd.setCursor(0, 1); Lcd.Imprimer(" "); Lcd.setCursor(0, 1); Lcd.Imprimer("Sys dans SleepMode"); set_sleep_mode(SLEEP_MODE_PWR_DOWN); Cli(); sleep_enable(); Sei(); sleep_cpu(); Redémarrer } Boolean BattWarning (BattWarning) () { Valeur = analogRead (en)(VoltTestPin VoltTestPin); lire la goupille d’entrée Valeur = Valeur * 0.00488; Si (Valeur <= Sleepvoltage) { Tension = Valeur; Powerdown (Powerdown)(); } Si (Valeur <= Warnvoltage) { Tension = Valeur; Retour Vrai; } { Retour Faux; } } Vide runrealTimeClock (en)() { Horloge en temps réel et compte à rebours Unsigned Long currentMillis = Millis(); Si (currentMillis - précédentMillis > Intervalle) { précédentMillis = currentMillis; Countdown Comteup 24 St Hr. Secondes = Secondes + 1; Si (Secondes > 59) { Secondes = 0; Minute = Minute + 1; BatteryEmpty (BatteryEmpty) = BattWarning (BattWarning) (); Si (Minute > 59) { Minute = 0; Si (MatC MatC > 1) { MatC MatC --; Anzeige der des Nachricht Symboles } Heure = Heure + 1; } Si (Heure > 23) { Heure = 0; } } } } Vide ChangeDisplayMode() { Si ( Displaymode > vieuxDisplaymode ) { vieuxDisplaymode = Displaymode; Pour (Int Un = 0; Un < 200; Un++) { CharPointers CharPointers[Un] = Un; } } Si ( Displaymode < vieuxDisplaymode ) { vieuxDisplaymode = Displaymode; Pour (Int Un = 0; Un < 200; Un++) { CharPointers CharPointers[Un] = Un; } } } Vide DisplayMailArrivedSig(Boolean trzstat) { Octet custHeartChar = 0; Si (trzstat) { Lcd.setCursor(15, 0); Lcd.Écrire(custHeartChar); } Autre { Lcd.setCursor(15, 0); Lcd.Écrire(" "); } } Vide NewLetterArrivedCheck (en)() { Int inPin = 10; Switchstate (Switchstate) = digitalRead (en)(inPin); si (Switchstate et ! MailAlreadyDelivered) Si (Switchstate (Switchstate) == Vrai ) { MailAlreadyDelivered MailAlreadyDelivered MailAlreadyDelivered MailAl = Vrai; DisplayMailArrivedSig(Vrai); MatC MatC = 11; Mail Arrived Zeitanzeiger (Vorladung) MAMsgDC - LetterArrivedScolltext.length(); DispLATextOneTime = 1; } Si (MatC MatC == 1) { DisplayMailArrivedSig(Faux); MailAlreadyDelivered MailAlreadyDelivered MailAlreadyDelivered MailAl = Faux; MatC MatC = 0; DispLATextOneTime = 0; DispLATextOneTimeWASDisp = 0; } } Vide Boucle() { runrealTimeClock (en)(); Si (!BatteryEmpty (BatteryEmpty)) { Si ( DispLATextOneTime == 1 && DispLATextOneTimeWASDisp == 0) { LetterArrScrolltext (); } Autre { NormalScrolltext (); } } Si (BatteryEmpty (BatteryEmpty)) { BatteryWarningScrolltext (en) (); } ChangeDisplayMode(); Si (IsSensorActive (en)) { NewLetterArrivedCheck (en)(); test si une nouvelle lettre a été arrivée si oui, marque //elle dans Display pour les 12 prochaines heures } }
Dieses und andere Projekte von mir findest du auch auf meiner neuen Github Seite.
Viel Spaà beim Nachbauen und bis zum n’chsten Mal.
3 commentaires
KoPP
Nette Menschen könnten auch noch ein “Danke lieber Briefträger” ausgeben.
Flo
Gute Idee, aber ich werde das noch etwas erweitern:
Wenn wir noch einen zweiten Mikroschalter einsetzen um die “Entnahmeklappe/Briefkastentür” zu überwachen, kann man damit das Briefsymbol wieder löschen und es öffnen nicht alle Bewohner den Kasten, wenn sie nach Hause kommen. Wir vermeiden so die “Enttäuschung” der zweiten und dritten Heimkehrer…
Viele Grüße Flo
Arnold Schommer
Den Brief einfach fix für 12 Stunden anzuzeigen ist eine pragmatische, einfache und damit wenig fehlerträchtige Lösung.
Ich hätte vielleicht einen Taster eingeplant, mit dem die Anzeige dann gelöscht wird. Sei es, dass man den zweiten Taster beim Entnehmen des Briefes drückt oder dass er – wenn das “baulich” geht – das Öffnen des Briefkastens “erkennt”. Aber dabei kann halt einiges “schief gehen”.