Erweiterung für elektronisches Namensschild - AZ-Delivery

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»..

Boîte aux lettres de dessin avec commutateur

Cette icône de lettre est ensuite affichée sur l’écran pendant 12 heures :

Symbole pour la lettre

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 :

Schéma é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.

DisplaysFür arduinoProjekte für fortgeschrittene

3 commentaires

KoPP

KoPP

Nette Menschen könnten auch noch ein “Danke lieber Briefträger” ausgeben.

Flo

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

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”.

Laisser un commentaire

Tous les commentaires sont modérés avant d'être publiés

Articles de blog recommandés

  1. ESP32 jetzt über den Boardverwalter installieren - AZ-Delivery
  2. Internet-Radio mit dem ESP32 - UPDATE - AZ-Delivery
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1 - AZ-Delivery
  4. ESP32 - das Multitalent - AZ-Delivery