Bluetooth-Display - Teil 4 - AZ-Delivery

Willkommen zu dem vierten Teil der Bluetooth Display Reihe.

 

In dem heutigen Teil bekommt unser Display neben einem obligatorischen weiteren Bedienermenüpunkt eine weitere kleine Erweiterung der Hardware spendiert. Über diese neue Hardwareerweiterung kann auch ohne das Bedienermenü per Taster die im internen Speicher gespeicherten Nachrichten abgerufen werden!

Dazu verwenden wir einen weiteren freien Port unseres Mikrocontrollers (kompatibel mit Uno R3) als Eingang. Genauer: wir verwenden Port 2 als Eingang. An diesem Eingang ist ein Taster an Masse angeschlossen, dessen Tastendruck von unserem Arduino ausgewertet wird.

Doch nun zum eigentlichen Aufbau und zur Implementation der Erweiterung. Im ersten Schritt erweitern wir unsere Hardware wie in folgendem Schaltplan gezeigt, um das KY-004 Button Modul. Insgesamt hat das Bluetooth Display bei Verwendung eines Standard Arduinos 12 Textspeicher mit 4x20 Zeichen.

Diese werden aufsteigend von 0 bis 11 beim Drücken des Tasters anzeigt. Wird die Nachricht 11 im Display angezeigt und der Taster gedrückt, springt der Zähler zurück auf die Nachricht 0.

Bluetooth Display - Teil 4 - Schaltplan

 

Als nächstes laden wir für diese Erweiterung auf unseren Mikrocontroller folgenden angepassten Code hoch:

 

 

#include <SPI.h>
#include <Wire.h>
#include <SoftwareSerial.h>
#include <EEPROM.h>
#include <LiquidCrystal.h>
#include <avr/sleep.h>

#define MaxInputBufferSize 20 // maximal 255 Zeichen anpassen an vlcdr
#define EEpromSize 990
#define rLcdChr 20
#define LcdRows 4
#define interval 1000
#define BackgroundLight 5 // Port 5 Hintergrundbeleuchtung LED
#define SwitchPin 2 // Port 12 Taster Nachrichtsauswahl
#define DelayTOPWROFF 500

// EEprom SpeicherzellenAdressen für Konfiguration
#define EEFadeSeconds  993
#define EEPINA 996
#define EEPINC 997
#define EEPINDD 998


SoftwareSerial mySerial(7, 6); // RX, TX
LiquidCrystal lcd(8, 13, 12, 11, 10, 9);

//variables
byte DisplayBankContent = 0;

//Serial Input Handling
char TBuffer;
char Cbuffer[MaxInputBufferSize + 1];     //USB Code Input Buffer
String Sbuffer = "";                      //USB String Input Buffer
int value;                                //USB Nummeric Input Buffer
byte Ccount = 0;                          //Number received Chars
byte Inptype = 0;
boolean StrInput = false;
boolean NumberInput = false;
boolean DataInput = false;
boolean EnterInput = false;
byte MenueSelection = 0;

//Druckknopfsteuerung
boolean Switchstate = true;
boolean SwitchstateBuffer = true;
byte SelectedMsg = 0;

//Give Debug Informations over serial Interface
boolean EchoMode = true;

//EEPROM
int eeaddress;                 //EEPROM Adress Pointer
byte EEPromBanks = 0;          //Used for Calculating the EEPROM Banks
//SerMnueControl
byte MnuState = 0;            // Maximale Menuetiefe 255 icl Sub
byte Selectedbank = 0;

//Real Time Clock
long previousMillis = 0;       // will store last time was measured
long previousMillisB = 0;       // will store last time was measured

//Display Management
boolean DisplayLock = false;
boolean Directprint = false;
byte DirectprintROW = 0;
byte DirectprintLine = 0;

boolean RefreshDisplay = false;
byte FRMCheck = 0; // Used fpr Writing Operations to eeprom so save Wirte cycles
// BatterieMonitoring
float Voltage;
boolean PowersaveMode = false;

// PWM Lichtsteuerung

byte Currentbrightness = 0;
byte Targetbrightness = 0;
byte FadeSeconds = 0; // Standard = 3


void setup()
{
  EEPromBanks = EEpromSize / ((rLcdChr) * LcdRows);
  lcd.begin(rLcdChr, LcdRows);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("    Bluetooth");
  lcd.setCursor(0, 1);
  lcd.print("     Display");
  mySerial.begin(9600);
  pinMode(SwitchPin, INPUT_PULLUP); // Taster Auswahl Text aus EEprom
  pinMode(BackgroundLight, OUTPUT); // Displaybeleuchtung / Display AN /AUS
  digitalWrite(BackgroundLight, LOW);
  // read Config
  FadeSeconds = EEPROM.read(EEFadeSeconds);
  Currentbrightness = 0;
  Targetbrightness = 0;
  lcd.setCursor(0, 4);
  if (DisplayLock) {
    lcd.print("  System gesperrt");
  }
  // Further Setup Routines / initalizing
  lcd.setCursor(0, 0);
  Targetbrightness = 255;
  mySerial.flush();
}

// ###################################################################################################### //
void loop()
{
  SerialcommandProcessor();
  runrealTimeClock();
  Displayprocessor();
  SwitchProcessor();
  //End Main loop
}
// ###################################################################################################### //

void TextHeader(byte rowm)
{
  mySerial.println("Text for Bank " + String( Selectedbank) + " ROW " + String (rowm) + ":");
}

void SerialcommandProcessor()
{
  int a;
  Inptype = 0;
  Inptype = SerInputHandler();
  // 0 keine Rückgabe
  // 1 Nummer
  // 2 String
  // 3 Data

  if ((Inptype > 0) & (!Directprint))
  {
    MenueSelection = 0;
    if ((MnuState < 2) && (Inptype == 2)) {
      Sbuffer.toUpperCase();  // For Easy Entering Commands
    }
    if ((Sbuffer == "ECHO") && (MnuState == 0) && (Inptype == 2))     {
      MenueSelection = 2;
    }
    if ((Sbuffer == "S") && (MnuState == 0) && (Inptype == 2))       {
      MenueSelection = 3;
    }
    // Erasing ALL EEprom Content
    if ((Sbuffer == "E") && (MnuState == 0) && (Inptype == 2))       {
      MenueSelection = 4;
    }
    if ((Sbuffer == "YES") && (MnuState == 1) && (Inptype == 2))      {
      MenueSelection = 5;
    }
    if ((Sbuffer != "YES") && (MnuState == 1) && (Inptype == 2))     {
      MenueSelection = 6;
    }
    //Edit  Selected Content
    if ((Sbuffer == "W") && (MnuState == 0) && (Inptype == 2))       {
      MenueSelection = 7;
    }
    if ((MnuState == 2) && (value  < EEPromBanks) && (Inptype == 1)) {
      MenueSelection = 8;
    }
    if (MnuState == 3)                                               {
      MenueSelection = 9;
    }
    if (MnuState == 4)                                               {
      MenueSelection = 10;
    }
    //Display  Selected Content
    if ((Sbuffer == "P") && (MnuState == 0) && (Inptype == 2))       {
      MenueSelection = 11;
    }
    if ((MnuState == 5) && (Inptype == 1))                           {
      MenueSelection = 12;
    }
    if ((Sbuffer == "R") && (MnuState == 0) && (Inptype == 2))       {
      MenueSelection = 13;
    }
    if ((MnuState == 6) && (Inptype == 1))                           {
      MenueSelection = 14;
    }
    if ((Sbuffer == "D") && (MnuState == 0) && (Inptype == 2))       {
      MenueSelection = 15;
    }
    if ((Sbuffer == "Z") && (MnuState == 0) && (Inptype == 2))       {
      MenueSelection = 16;
    }
    if ((Sbuffer == "B") && (MnuState == 0) && (Inptype == 2))       {
      MenueSelection = 17;
    }
    if ((MnuState == 7) && (Inptype == 1))                           {
      MenueSelection = 18;
    }
    if ((Sbuffer == "FADE") && (MnuState == 0) && (Inptype == 2))     {
      MenueSelection = 19;
    }
    if (MnuState == 9)                                               {
      MenueSelection = 20;
    }
    if (MnuState == 10)                                              {
      MenueSelection = 21;
    }
    if (MnuState == 12)                                              {
      MenueSelection = 25;
    }
    switch (MenueSelection)
    {
      case 2:
        {
          mySerial.print("Echo ");
          EchoMode = !EchoMode;
          if (EchoMode) {
            mySerial.println(" ON.");

          } else
          {
            mySerial.println(" OFF.");
          }
          mySerial.println("");
          mySerial.flush();
          value = 0;
          MnuState = 0;
          Sbuffer = "";
          break;
        }
      case 3:
        {
          mySerial.println("Read EEEPROM Content:" );
          mySerial.flush();
          for (int a = 0; a < EEPromBanks; a++)
          {
            mySerial.println("EEPROM Memory Bank: " + String(a) );
            mySerial.flush();
            for (int b = 1; b <= LcdRows; b++)
            {
              mySerial.print("Row " + String(b) + ": ");
              mySerial.flush();
              for (int c = 0; c < rLcdChr; c++)
              {
                eeaddress = 0;
                eeaddress = (a * (rLcdChr) * LcdRows) + ((rLcdChr) * b) + c;
                value = EEPROM.read(eeaddress);
                mySerial.print(char(value));
                mySerial.flush();
              }
              mySerial.println(" ");
              mySerial.flush();
            }

          }
          Sbuffer = "";
          mySerial.println("No more EEPROM Banks available.");
          mySerial.flush();
          break;
        }
      case 4:
        {
          value = 0;
          mySerial.print("Erasing EEPROM ");
          mySerial.println("YES/NO:");
          mySerial.flush();
          MnuState = 1;
          Sbuffer = "";
          break;
        }
      case 5:
        {
          value = 0;
          mySerial.print("Erasing EEPROM ");
          mySerial.println("Stand by.");
          mySerial.flush();
          for (int a = 0; a < EEPromBanks; a++)
          {
            //Memory Bank a
            mySerial.println("Clear Bank: " + String(a));
            for (int b = 1; b <= LcdRows; b++)
            {
              for (int c = 0; c < rLcdChr; c++)
              {
                eeaddress = 0;
                eeaddress = (a * (rLcdChr) * LcdRows) + ((rLcdChr ) * b) + c;
                FRMCheck = EEPROM.read(eeaddress);
                if (FRMCheck >