Erweiterung für elektronisches Namensschild - AZ-Delivery

In meinem letzten Blog in dem ich ein Namensschild mit eigenem Scroll Text vorgestellt habe, ist eine mögliche Anwendung ein Briefkastenschild. Ich finde jedoch, dass unser Display mit einer Anzeige des Namens und des Scroll Textes alleine als Briefkastenschild etwas unterfordert in den Möglichkeiten ist.  Wie wäre es daher, wenn unser Display auch anzeigen würde, wenn der Briefkasten durch den Briefboten vorher geöffnet wurde? So können wir sozusagen direkt „auf einen Blick“ sehen, ob es sich lohnt, den Briefkasten aufzumachen oder nicht.

Dazu müssen wir unseren Code nur etwas erweitern und eine kleine Veränderung bzw. eine Erweiterung in der Schaltung vornehmen. Zusätzlich benötigen wir einen Mikroschalter als Schließer.

Funktionsprinzip:

Wir fügen einen Microtaster hinzu, der durch die Briefkastenklappe im Normalzustand „zu“ heruntergedrückt wird und somit den Kontakt schließt. Wird nun die Briefkastenklappe geöffnet, öffnet sich auch der Drucktaster kurz und gib so einen Impuls an unseren Mikrocontroller, der dieses Signal als „Es wurde ein Brief eingeworfen“ interpretiert.

Zeichnung Briefkasten mit Schalter

Im Display wird daraufhin für 12 Stunden dieses Briefsymbol angezeigt:

Symbol für Brief

Anhand dieses Symbols kann man sofort erkennen, wenn ein Brief eingeworfen wurde.

Die Schaltung ist dazu um einen Taster (Schließer) zu erweitern.


Hier der benötigte bzw. erweiterte Schaltplan:

Erweiterter Schaltplan

Wir laden folgendne Code auf unseren Arduino hoch:

 

#include <LiquidCrystal.h>
#include <avr/sleep.h>

// port 10 Schließer

//Constants & Definitions
const float Warnvoltage = 4.0;
const float Sleepvoltage = 3.2;
const int Scrollspeed = 700;
const long interval = 1000;    // Definition of a Second in Milliseconds

//const byte VoltTestPin = 0;  // Test Analogeingang 0
const byte VoltTestPin = 2; // Produktiv Alalogeingang 2

//Real Time Clock
long previousMillis = 0;       // will store last time was measured
byte seconds = 0;
byte minute = 0;
byte hour = 0;

// String Defitions
String LetterBoxOwner = "  Tobias Kuch    ";  // Bitte in eigenen Namen ändern !
String StandardScolltext = "Bitte keine Werbung und keine kostenlosen Zeitungen einwerfen. Danke ! -   ";
String LetterArrivedScolltext = "Vielen Dank für die Zustellung der Postsendung. Der Empfänger wird benachrichtigt.   ";
String BattInfo;

//Program logic
byte CharPointers[200];
float value;
int Voltage;
boolean BatteryEmpty = false;
boolean IsSensorActive = false; // Bei einem Reset wird ein erkanntes High Signal (Geöffnneter Schalter Ignoriert), wenn kein Schalter von Anfang an ! exisiert (Dauerhaft HighPegel)
byte Displaymode = 0;
byte oldDisplaymode = 0;
boolean MailAlreadyDelivered = false;
int Switchstate = 1;
byte DispLATextOneTime = 0;
byte DispLATextOneTimeWASDisp = 0;
int cmpMsgWith = 0;
int MAMsgDC = 0;
byte MatC = 0;     // 12 Stunden Anzeige des Symbole "Neue Nachricht"

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

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

void InitLcdScreen ()
{
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("++ Letterbox ++ ");
  lcd.setCursor(0, 1);
  lcd.print("  tobias.kuch at");
  delay(2000);
  lcd.setCursor(0, 0);
  lcd.print(LetterBoxOwner);
  lcd.setCursor(0, 1);
  lcd.print(" googlemail.com ");
  delay(3000);
}

void setup()
{
  for (int a = 0; a < 200; a++)
  {
    CharPointers[a] = a;
  }
  lcd.createChar(0, newChar);
  lcd.begin(16, 2);              // start the library
  pinMode(10, INPUT_PULLUP);             // for new Mail arrival Detection LOW: Klappe zu HIGH: klappe offen
  Switchstate = digitalRead(10);
  InitLcdScreen();
  analogReference(DEFAULT);
  if (!Switchstate) {
    IsSensorActive = true;
  }
}



void NormalScrolltext ()
{
  int cmpMsgWith = StandardScolltext.length() - 2;
  Displaymode = 0;
  delay (Scrollspeed);
  lcd.setCursor(0, 1);
  for (int a = 0; a < 17; a++)
  {
    lcd.print(StandardScolltext[CharPointers[a]]);
  }
  for (int a = 0; a < cmpMsgWith; a++)
  {
    CharPointers[a] = CharPointers[a] + 1;
    if (CharPointers[a] > cmpMsgWith) {
      CharPointers[a] = 0;
    }
  }
}

void BatteryWarningScrolltext ()
{
  BattInfo = "- Achtung! Batteriespannung: " + String(Voltage * 3) + " Volt. Bitte Akku aufladen. - " + StandardScolltext + "  ";
  int cmpMsgWith = BattInfo.length() - 2;
  Displaymode = 2;
  delay (Scrollspeed / 2 );
  lcd.setCursor(0, 1);
  for (int a = 0; a < 17; a++)
  {
    lcd.print(BattInfo[CharPointers[a]]);
  }

  for (int a = 0; a < cmpMsgWith; a++)
  {
    CharPointers[a] = CharPointers[a] + 1;
    if (CharPointers[a] > cmpMsgWith) {
      CharPointers[a] = 0;
    }
  }
}


void LetterArrScrolltext ()
{
  int cmpMsgWith = LetterArrivedScolltext.length() - 2;
  Displaymode = 3;
  delay (Scrollspeed - 50 );
  lcd.setCursor(0, 1);
  for (int a = 0; a < 17; a++)
  {
    lcd.print(LetterArrivedScolltext[CharPointers[a]]);
  }

  for (int a = 0; a < cmpMsgWith; a++)
  {
    CharPointers[a] = CharPointers[a] + 1;
    if (CharPointers[a] > cmpMsgWith)
    {
      CharPointers[a] = 0;
      DispLATextOneTimeWASDisp = 1;
    }
  }
}

void Powerdown ()  // Toggle Powerdown, if critical Voltage is reached.
{
  lcd.setCursor(0, 1);
  lcd.print("                  ");
  lcd.setCursor(0, 1);
  lcd.print("Sys in SleepMode ");
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  cli();
  sleep_enable();
  sei();
  sleep_cpu();
  //restart
}

boolean BattWarning ()
{
  value = analogRead(VoltTestPin);    // read the input pin
  value = value  * 0.00488;
  if (value <= Sleepvoltage) {
    Voltage = value;
    Powerdown();
  }
  if (value <= Warnvoltage) {
    Voltage = value;
    return true;
  }
  {
    return false;
  }
}

void runrealTimeClock()
{
  // Real Time Clock & Countdown
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis > interval)
  {
    previousMillis = currentMillis;
    // Countdown
    // Countup 24 St Hr.
    seconds = seconds + 1;
    if (seconds > 59)
    {
      seconds = 0;
      minute = minute + 1;
      BatteryEmpty = BattWarning ();
      if (minute > 59)
      {
        minute = 0;
        if (MatC > 1) {
          MatC --; //Anzeige der des Nachricht Symbols
        }
        hour = hour + 1;
      }
      if (hour > 23)
      {
        hour = 0;
      }
    }
  }
}

void ChangeDisplayMode()
{
  if ( Displaymode > oldDisplaymode )
  {
    oldDisplaymode = Displaymode;
    for (int a = 0; a < 200; a++)
    {
      CharPointers[a] = a;
    }
  }
  if ( Displaymode < oldDisplaymode )
  {
    oldDisplaymode = Displaymode;
    for (int a = 0; a < 200; a++)
    {
      CharPointers[a] = a;
    }
  }
}

void DisplayMailArrivedSig(boolean trzstat)
{
  byte custHeartChar = 0;
  if (trzstat)
  {
    lcd.setCursor(15, 0);
    lcd.write(custHeartChar);
  } else
  {
    lcd.setCursor(15, 0);
    lcd.write(" ");
  }
}

void NewLetterArrivedCheck()
{
  int inPin = 10;
  Switchstate = digitalRead(inPin);
  // if (Switchstate && !MailAlreadyDelivered)
  if (Switchstate == true )
  {
    MailAlreadyDelivered = true;
    DisplayMailArrivedSig(true);
    MatC = 11;  // Mail Arrived Zeitanzeiger (Vorladung)
    // MAMsgDC = LetterArrivedScolltext.length();
    DispLATextOneTime = 1;
  }
  if (MatC == 1)
  {
    DisplayMailArrivedSig(false);
    MailAlreadyDelivered = false;
    MatC = 0;
    DispLATextOneTime = 0;
    DispLATextOneTimeWASDisp = 0;
  }
}

void loop()
{
  runrealTimeClock();
  if (!BatteryEmpty)
  {
    if ( DispLATextOneTime == 1 && DispLATextOneTimeWASDisp == 0)
    {
      LetterArrScrolltext ();
    }
    else
    {
      NormalScrolltext ();
    }
  }
  if (BatteryEmpty)
  {
    BatteryWarningScrolltext ();
  }
  ChangeDisplayMode();
  if  (IsSensorActive) {
    NewLetterArrivedCheck();  // test if a new letter was arrived if so, mark //it in Display for next 12 Hours
  }
}


 

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 comments

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

Leave a comment

All comments are moderated before being published

Recommended blog posts

  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