Erweiterung für elektronisches Namensschild

Nel mio ultimo Blog (in lingua) in cui ho presentato una targhetta con il proprio testo di scorrimento, una possibile applicazione è un segno di cassetta delle lettere. Tuttavia, trovo che il nostro display con una visualizzazione del nome e il testo di scorrimento da solo come un segno di cassetta delle lettere è un po 'deluso dalle possibilità.  Quindi, che ne dici del nostro display anche mostrando se la cassetta delle lettere è stata aperta dal messaggero in anticipo? Così possiamo vedere direttamente "a colpo d'occhio" se vale la pena aprire la cassetta delle lettere o no.

Per fare questo, abbiamo solo bisogno di espandere il nostro codice un po 'e fare una piccola modifica o estensione nel circuito. Inoltre, abbiamo bisogno di un microinterruttore come contatto.

Principio:

Aggiungiamo un microtaster, che viene spinto verso il basso dal lembo letterbox nello stato normale e quindi chiude il contatto. Se il lembo della cassetta delle lettere viene aperto, il pulsante si apre anche brevemente e dà un impulso al nostro microcontrollore, che interpreta questo segnale come "Una lettera è stata lanciata in".

Scatola di disegno con interruttore

Questa icona della lettera viene quindi visualizzata sul display per 12 ore:

Simbolo per lettera

Questo simbolo può essere utilizzato per identificare immediatamente quando una lettera è stata lanciata.

Il circuito deve essere esteso con un pulsante (più vicino).


Ecco lo schema richiesto o esteso:

Schema esteso

Carichiamo il seguente codice sul nostro Arduino:

 

#include <LiquidoCristallo.H>
#include <Avr/Dormire.H>

porta 10 Contatto normalmente aperto

Costanti e definizioni
Const Galleggiante Tensione di avviso = 4.0;
Const Galleggiante Tensione del sonno = 3.2;
Const Int Velocità di scorrimento = 700;
Const Lungo Intervallo = 1000;    Definizione di un secondo in millisecondi

byte const VoltTestPin : 0;  Test ingresso analogico 0
Const Byte VoltTestPin = 2; Input Alalog produttivo 2

Orologio in tempo reale
Lungo previousMillis = 0;       memorizzerà l'ultima volta è stato misurato
Byte Secondi = 0;
Byte minuto = 0;
Byte Ora = 0;

Defizioni di stringhe
Stringa LetterBoxProprietario = " Tobias Kuch ";  Si prega di cambiare a tuo nome !
Stringa TestoStandard = "Si prega di non gettare in eventuali annunci o giornali gratuiti. Grazie! -   ";
Stringa LetteraArrivedscolltext = "Grazie per aver consegnato la posta. Il destinatario riceve una notifica.   ";
Stringa BattInfo;

Logica del programma
Byte CharPointers[200];
Galleggiante Valore;
Int Tensione;
Boolean BatteriaVuota = False;
Boolean IsSensorActive (attiva le proprietà) = False; In un ripristino, viene visualizzato un segnale alto rilevato (interruttore di apertura ignorato) se non viene visualizzato alcun interruttore dall'inizio ! exized (livello di alto livello permanente)
Byte Displaymode = 0;
Byte oldDisplaymode (modalità visualizzato) = 0;
Boolean MailAlreadyDelivered = False;
Int Stato di commutazione = 1;
Byte DispLATextOneTime = 0;
Byte DispLATextOneTimeTIMEWASDisp = 0;
Int cmpMsgWith = 0;
Int MAMsgDC (MAMsgDC) = 0;
Byte MatC = 0;     Visualizzazione di 12 ore dell'icona "Nuovo messaggio"

Byte newChar[8] = {   0b11111,   0b10011,   0b10101,   0b11001,   0b11001,   0b10101,   0b10011,   0b11111
};

LiquidCrystal(rs, enable, d4, d5, d6, d7);
LiquidoCristallo Lcd(8, 9, 4, 5, 6, 7);

Vuoto InitLcdSchermo ()
{   Lcd.Chiaro();   Lcd.Setcursor(0, 0);   Lcd.Stampare(Cassetta delle lettere di tipo "");   Lcd.Setcursor(0, 1);   Lcd.Stampare(" tobias.kuch at ");   Ritardo(2000);   Lcd.Setcursor(0, 0);   Lcd.Stampare(LetterBoxProprietario);   Lcd.Setcursor(0, 1);   Lcd.Stampare(" googlemail.com ");   Ritardo(3000);
}

Vuoto Installazione()
{   Per (Int Un = 0; Un < 200; Un++)   {     CharPointers[Un] = Un;   }   Lcd.createChar (in nome)(0, newChar);   Lcd.Iniziare(16, 2);              avviare la libreria   PinMode (Modalità pin)(10, INPUT_PULLUP);             per il nuovo Mail arrival Detection LOW: Flap to HIGH: flap open   Stato di commutazione = digitalRead (Lettura digitale)(10);   InitLcdSchermo();   analogicoReference(Predefinito);   Se (!Stato di commutazione) {     IsSensorActive (attiva le proprietà) = Vero;   }
}



Vuoto Testo a scorrimento normale ()
{   Int cmpMsgWith = TestoStandard.Lunghezza() - 2;   Displaymode = 0;   Ritardo (Velocità di scorrimento);   Lcd.Setcursor(0, 1);   Per (Int Un = 0; Un < 17; Un++)   {     Lcd.Stampare(TestoStandard[CharPointers[Un]]);   }   Per (Int Un = 0; Un < cmpMsgWith; Un++)   {     CharPointers[Un] = CharPointers[Un] + 1;     Se (CharPointers[Un] > cmpMsgWith) {       CharPointers[Un] = 0;     }   }
}

Vuoto Testo BatteriaAvvisoScroll ()
{   BattInfo = "- Achtung! Batteriespannung: " + Stringa(Tensione * 3) + " Volt. Bitte Akku aufladen. - " + TestoStandard + "  ";   Int cmpMsgWith = BattInfo.Lunghezza() - 2;   Displaymode = 2;   Ritardo (Velocità di scorrimento / 2 );   Lcd.Setcursor(0, 1);   Per (Int Un = 0; Un < 17; Un++)   {     Lcd.Stampare(BattInfo[CharPointers[Un]]);   }   Per (Int Un = 0; Un < cmpMsgWith; Un++)   {     CharPointers[Un] = CharPointers[Un] + 1;     Se (CharPointers[Un] > cmpMsgWith) {       CharPointers[Un] = 0;     }   }
}


Vuoto TestoLetteraArrScroll ()
{   Int cmpMsgWith = LetteraArrivedscolltext.Lunghezza() - 2;   Displaymode = 3;   Ritardo (Velocità di scorrimento - 50 );   Lcd.Setcursor(0, 1);   Per (Int Un = 0; Un < 17; Un++)   {     Lcd.Stampare(LetteraArrivedscolltext[CharPointers[Un]]);   }   Per (Int Un = 0; Un < cmpMsgWith; Un++)   {     CharPointers[Un] = CharPointers[Un] + 1;     Se (CharPointers[Un] > cmpMsgWith)     {       CharPointers[Un] = 0;       DispLATextOneTimeTIMEWASDisp = 1;     }   }
}

Vuoto Powerdown ()  Attiva/disattiva accensioni, se viene raggiunta la tensione critica.
{   Lcd.Setcursor(0, 1);   Lcd.Stampare("                  ");   Lcd.Setcursor(0, 1);   Lcd.Stampare("Sys in SleepMode");   set_sleep_mode(SLEEP_MODE_PWR_DOWN);   Cli();   sleep_enable();   sei();   sleep_cpu();   Riavviare
}

Boolean BattWarning ()
{   Valore = analogicOLettura(VoltTestPin);    leggere il pin di input   Valore = Valore  * 0.00488;   Se (Valore <= Tensione del sonno) {     Tensione = Valore;     Powerdown();   }   Se (Valore <= Warnvoltage) {     Tensione = Valore;     Ritorno Vero;   }   {     Ritorno False;   }
}

Vuoto runrealTimeClock()
{   Orologio in tempo reale & Conto alla rovescia   Unsigned Lungo currentMillis = millis();   Se (currentMillis - previousMillis > Intervallo)   {     previousMillis = currentMillis;     Conto alla rovescia     Conto alla rovescia 24 St Hr.     Secondi = Secondi + 1;     Se (Secondi > 59)     {       Secondi = 0;       minuto = minuto + 1;       BatteriaVuota = BattWarning ();       Se (minuto > 59)       {         minuto = 0;         Se (MatC > 1) {           MatC --; Simboli di Anzeige der des Nachricht         }         Ora = Ora + 1;       }       Se (Ora > 23)       {         Ora = 0;       }     }   }
}

Vuoto ChangeDisplayMode (Modalità di visualizzazione)()
{   Se ( Displaymode > oldDisplaymode (modalità visualizzato) )   {     oldDisplaymode (modalità visualizzato) = Displaymode;     Per (Int Un = 0; Un < 200; Un++)     {       CharPointers[Un] = Un;     }   }   Se ( Displaymode < oldDisplaymode (modalità visualizzato) )   {     oldDisplaymode (modalità visualizzato) = Displaymode;     Per (Int Un = 0; Un < 200; Un++)     {       CharPointers[Un] = Un;     }   }
}

Vuoto DisplayMailArrivedSig(Boolean tzstat)
{   byte custHeartChar = 0;   Se (tzstat)   {     Lcd.Setcursor(15, 0);     Lcd.Scrivere(custHeartChar);   } Altro   {     Lcd.Setcursor(15, 0);     Lcd.Scrivere(" ");   }
}

Vuoto NewLetterArrivedCheck (NuovoLetteraArrivedCheck)()
{   Int inPin = 10;   Stato di commutazione = digitalRead (Lettura digitale)(inPin);   if (Switchstate && ! MailAlreadyDelivered)   Se (Stato di commutazione == Vero )   {     MailAlreadyDelivered = Vero;     DisplayMailArrivedSig(Vero);     MatC = 11;  Posta Arrivati zeitanzeiger (Vorladung)     MAMsgDC - LetterArrivedScolltext.length();     DispLATextOneTime = 1;   }   Se (MatC == 1)   {     DisplayMailArrivedSig(False);     MailAlreadyDelivered = False;     MatC = 0;     DispLATextOneTime = 0;     DispLATextOneTimeTIMEWASDisp = 0;   }
}

Vuoto Ciclo()
{   runrealTimeClock();   Se (!BatteriaVuota)   {     Se ( DispLATextOneTime == 1 && DispLATextOneTimeTIMEWASDisp == 0)     {       TestoLetteraArrScroll ();     }     Altro     {       Testo a scorrimento normale ();     }   }   Se (BatteriaVuota)   {     Testo BatteriaAvvisoScroll ();   }   ChangeDisplayMode (Modalità di visualizzazione)();   Se  (IsSensorActive (attiva le proprietà)) {     NewLetterArrivedCheck (NuovoLetteraArrivedCheck)();  verificare se è stata arrivata una nuova lettera, in tal caso, contrassegnarla in Display per le successive 12 Ore   }
}


 

Dieses und andere Projekte von mir trova il più economico du auch auf meiner neuen Github Seite.

Viel Spaim beim Nachbauen und bis zum n'chsten Mal.

DisplaysFür arduinoProjekte für fortgeschrittene

3 Kommentare

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

Einen Kommentar hinterlassen

Alle Kommentare werden vor der Veröffentlichung moderiert