Bluetooth Display - Part 5

Welcome to the fifth and penultimate part of the Bluetooth display series.

In today's part I came up with something special. The idea came to me at a flea market where I wanted to sell some old things. I thought that it would be a good idea not to be able to use the display at home, but to use the display as an "eye catcher" at a flea market. After all, not everyone has such a thing, and I haven't found a similar display in regular trade either. But what should I show on the display at a flea market?

The best thing is a sales sticker! How about messages like: Every CD only xx euros, followed by another message like: Every DVD xx euros. The whole thing looks best as ticker ticker, so the individual letters slowly build up from left to right until the whole message is readable. A real eye-catcher for every flea market! To implement this function, we are now expanding our code to include the "Advertising" function.


We therefore first upload the code extended by the "Advertising" function to our hardware platform:

 

 

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


#define MaxInputBufferSize 20 // adapt a maximum of 255 characters to vlcdr
#define EEpromSize 990

#define rLcdChr 20
#define LcdRows 4
#define interval 1000
#define BackgroundLight 5 // Port 5 backlight LED
#define SwitchPin 2 // Port 12 button message selection

// EEprom memory cell addresses for configuration
#define EEFadeSeconds  993
#define EEAdvertsecdelay 994
#define EEAdvertMsg 995
#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 numeric 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;

// push button control
boolean Switchstate = true;
boolean SwitchstateBuffer = true;
byte SelectedMsg = 0;

// Give debug information over serial interface
boolean DebugMode = false;
boolean EchoMode = true;

// EEPROM
int eeaddress;                 // EEPROM address pointer
byte EEPromBanks = 0;          // Used for Calculating the EEPROM Banks
// SerMnueControl
byte MnuState = 0;            // Maximum menu depth 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 for writing operations to eeprom so save host cycles
// Battery monitoring
float Voltage;
boolean PowersaveMode = false;

// PWM light control

byte Currentbrightness = 0;
byte Target brightness = 0;
byte FadeSeconds = 0; // standard = 3

// Auto display e.g. for advertising purposes

boolean Advertising = false;
byte AdvertMsg = 1; // minimum 1
byte Advertsecdelay = 0; // standard = 6
byte Advertseccounter = 0;


void set up()
{   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);   Advertsecdelay = EEPROM.read(EEAdvertsecdelay);   AdvertMsg = EEPROM.read(EEAdvertMsg);   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();   //Powermgmt();   //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 (Advertising)     {       lcd.clear();       Advertising = false;       mySerial.print("Advertising ");       mySerial.println(" OFF.");     }     if ((MnuState < 2) && (Inptype == 2)) {       Sbuffer.toUpperCase();  // For Easy Entering Commands     }     if ((Sbuffer == "DEBUG") && (MnuState == 0) && (Inptype == 2))   {       MenueSelection = 1;     }     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 ((Sbuffer == "ADVERT") && (MnuState == 0) && (Inptype == 2))  {       MenueSelection = 23;     }     if (MnuState == 11)                                              {       MenueSelection = 24;     }     if (MnuState == 12)                                              {       MenueSelection = 25;     }     if ((Sbuffer == "ADSEC") && (MnuState == 0) && (Inptype == 2))   {       MenueSelection = 26;     }     if (MnuState == 13)                                              {       MenueSelection = 27;     }     if ((Sbuffer == "ADMSG") && (MnuState == 0) && (Inptype == 2))   {       MenueSelection = 28;     }     if (MnuState == 14)                                              {       MenueSelection = 29;     }     switch (MenueSelection)     {       case 1:         {           mySerial.print("Debug ");           DebugMode = !DebugMode;           if (DebugMode) {             mySerial.println(" ON.");             EchoMode = false;           } else           {             mySerial.println(" OFF.");             EchoMode = true;           }           mySerial.println("");           mySerial.flush();           value = 0;           MnuState = 0;           Sbuffer = "";           break;         }       case 2:         {           mySerial.print("Echo ");           EchoMode = !EchoMode;           if (EchoMode) {             mySerial.println(" ON.");             DebugMode = false;           } 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 > 0)                 {                   EEPROM.write(eeaddress, 00); // Formatierung                   mySerial.print(".");                   value++;                   delay(30);                   mySerial.flush();                 }               }             }             mySerial.println("");             mySerial.flush();           }           mySerial.println("");           mySerial.println("Finished. " + String(value) + " Bytes cleared");           mySerial.println("");           mySerial.flush();           Sbuffer = "";           MnuState = 0;           break;         }       case 6:         {           value = 0;           Sbuffer = "";           MnuState = 0;           mySerial.println("OP abort.");           mySerial.flush();           break;         }       case 7:         {           mySerial.println("EEPPROM Bank Number (0-" + String(EEPromBanks - 1) + "):");           mySerial.flush();           MnuState = 2;           value = 0;           Sbuffer = "";           break;         }       case 8:         {           Selectedbank = value;           TextHeader(1);           MnuState = 3;           Sbuffer = "";           value = 0;           break;         }       case 9:         {           WriteEEPROM(Selectedbank, 1);           TextHeader(2);           value = 0;           MnuState = 4;           Sbuffer = "";           break;         }       case 10:         {           WriteEEPROM(Selectedbank, 2);           value = 0;           MnuState = 0;           Sbuffer = "";           TextHeader(3);           mySerial.flush();           value = 0;           MnuState = 9;           Sbuffer = "";           break;         }       case 11:         {           value = 0;           mySerial.println("EEPPROM Bank Number (0-" + String(EEPromBanks - 1) + "):");           MnuState = 5;           Sbuffer = "";           mySerial.flush();           break;         }       case 12:         {           SelectedMsg = value;           DisplayBank(value);           break;         }       case 13:         {           value = 0;           mySerial.println("EEPPROM Bank Number (0-" + String(EEPromBanks - 1) + "):");           MnuState = 6;           Sbuffer = "";           mySerial.flush();           break;         }       case 14:         {           a = value;           if ( a < EEPromBanks)           {             mySerial.println("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();             }           } else           {             mySerial.println("Value out of Range.");           }           value = 0;           Sbuffer = "";           MnuState = 0;           break;         }       case 15:         {           // Direct pPrint to Display           Directprint = true;           mySerial.println ("Directprint ON.");           if (Directprint)           {             DirectprintROW = 0;             DirectprintLine = 0;             lcd.clear();             lcd.cursor();             lcd.blink();           }           value = 0;           Sbuffer = "";           MnuState = 0;           break;         }       case 16:         {           value = 0;           Sbuffer = "";           MnuState = 0;           break;         }       case 17:         {           mySerial.println("Display Brightness: (max 255)");           MnuState = 7;           value = 0;           Sbuffer = "";           break;         }       case 18:         {           if ((value < 256))           {             Targetbrightness = value;             mySerial.println("Brightness: " + String (Targetbrightness) + " Set");           } else           {             mySerial.println("Value out of Range.");           }           MnuState = 0;           value = 0;           Sbuffer = "";           break;         }       case 19:         {           mySerial.println("Fade Delay: (max 255 Sec)");           MnuState = 12;           value = 0;           Sbuffer = "";           break;         }       case 20:         {           WriteEEPROM(Selectedbank, 3);           value = 0;           MnuState = 0;           Sbuffer = "";           TextHeader(4);           mySerial.flush();           value = 0;           MnuState = 10;           Sbuffer = "";           break;         }       case 21:         {           WriteEEPROM(Selectedbank, 4);           value = 0;           MnuState = 0;           Sbuffer = "";           break;         }       case 23:         {           Advertising  = !Advertising;           mySerial.print("Advertising ");           if (Advertising)           {             mySerial.println(" ON.");           } else  {             mySerial.println(" OFF.");           }           mySerial.flush();           value = 0;           MnuState = 0;           Sbuffer = "";           break;         }       case 25:         {           if ((value > 0) & (value < 251))           {             FadeSeconds = value;             EEPROM.write(EEFadeSeconds, FadeSeconds);             mySerial.println("Value " + String (value) + " set.");           } else           {             value = 0;             Sbuffer = "";             mySerial.println("Value out of Range.");           }           value = 0;           MnuState = 0;           Sbuffer = "";           break;         }       case 26:         {           mySerial.println("ADverDelay: (max 255 Sec)");           MnuState = 13;           value = 0;           Sbuffer = "";           break;         }       case 27:         {           if ((value > 0) & (value < 256))           {             Advertsecdelay = value;             EEPROM.write(EEAdvertsecdelay, Advertsecdelay);             mySerial.println("Value " + String (value) + " set.");           } else           {             value = 0;             Sbuffer = "";             mySerial.println("Value out of Range.");           }           value = 0;           MnuState = 0;           Sbuffer = "";           break;         }       case 28:         {           mySerial.println("ADMsgs: (max " + String (EEPromBanks) + ")");           MnuState = 14;           value = 0;           Sbuffer = "";           break;         }       case 29:         {           if ((value > 0) & (value < EEPromBanks + 1))           {             AdvertMsg = value;             EEPROM.write(EEAdvertMsg, AdvertMsg);             mySerial.println("Value " + String (value) + " set.");           } else           {             value = 0;             Sbuffer = "";             mySerial.println("Value out of Range.");           }           value = 0;           MnuState = 0;           Sbuffer = "";           break;         }       default:         {           if (DisplayLock)           {             lcd.clear();             DisplayLock = false;           }           mySerial.println("-------Smart Bluetooth Display 1.1------");           mySerial.println("S - Read ALL EEPROM Banks");           mySerial.println("E - Erase ALL EEPROM Banks");           mySerial.println("W - Write sel. EEPROM Bank");           mySerial.println("R - Read sel. EEPROM Bank");           mySerial.println("P - Print EEPROM Bank on Display");           mySerial.println("----------------------------------------");           mySerial.println("D - Direct Print");           mySerial.println("B - Display Brighness Current Value: " + String (Currentbrightness));           mySerial.println("----------------------------------------");           mySerial.println("Other: ADVERT,ADSEC,ADMSG,ECHO");           mySerial.println("----------------------------------------");           mySerial.println("Type Cmd and press Enter");           mySerial.flush();           MnuState = 0;           value = 0;           Sbuffer = "";         }     }   } // Eingabe erkannt
}



void WriteEEPROM(byte FBank, byte FRow)
{   byte Writecounter;   Writecounter = 0;   mySerial.print("Saving ");   for (int c = 0; c < rLcdChr; c++)   {     eeaddress = 0;     eeaddress = (FBank * (rLcdChr) * LcdRows) + ((rLcdChr) * FRow) + c;     value = EEPROM.read(eeaddress);     if (Sbuffer[c] != value)     {       EEPROM.write(eeaddress, Sbuffer[c]);       mySerial.print(".");       Writecounter++;     }   }   mySerial.println(" " + String (Writecounter) + " Bytes written.");

}


void ClearCBuffer ()

{   for (byte a = 0; MaxInputBufferSize - 1; a++)     Cbuffer[a] = 0;
}


byte SerInputHandler()

{   byte result = 0;   int c;   int d;   int a;   int b;   result = 0;   if (CheckforserialEvent())   {     if ((NumberInput) and not (DataInput) and not (StrInput))    //Numbers only     {       Sbuffer = "";       value = 0;       StrInput = false;       NumberInput = false;       DataInput = false;       EnterInput = false;       a = 0;       b = 0;       c = 0;       d = 0;       Sbuffer = Cbuffer; // Zahl wird AUCH ! in SBUFFER übernommen, falls benötigt.       if (Ccount == 1) {         value  = Cbuffer[0] - 48 ;       }       if (Ccount == 2) {         a = Cbuffer[0] - 48 ;         a = a * 10;         b = Cbuffer[1] - 48 ;         value = a + b;       }       if (Ccount == 3) {         a = Cbuffer[0] - 48 ;         a = a * 100;         b = Cbuffer[1] - 48 ;         b = b * 10;         c = Cbuffer[2] - 48 ;         value = a + b + c;       }       if (Ccount == 4) {         a = Cbuffer[0] - 48 ;         a = a * 1000;         b = Cbuffer[1] - 48 ;         b = b * 100;         c = Cbuffer[2] - 48 ;         c = c * 10;         d = Cbuffer[3] - 48 ;         value = a + b + c + d;       }       if (Ccount >= 5)       {         Sbuffer = "";         value = 0;         Sbuffer = Cbuffer;         ClearCBuffer;         result = 2;       } else       {         ClearCBuffer;         Ccount = 0;         result = 1;                                                //Number Returncode         NumberInput = false;         StrInput = false;         DataInput = false;         EnterInput = false;         Ccount = 0;         return result;       }     }     if ((StrInput) and not (DataInput))                          //String Input only     {       Sbuffer = "";       Sbuffer = Cbuffer;       value = 0;       StrInput = false;       NumberInput = false;       DataInput = false;       EnterInput = false;       Ccount = 0;       ClearCBuffer;       result = 2;                                                 //Number Returncode     }     if (DataInput) {       Sbuffer = "";       Sbuffer = Cbuffer;       value = 0;       StrInput = false;       NumberInput = false;       DataInput = false;       EnterInput = false;       Ccount = 0;       ClearCBuffer;       result = 3;                                               //Number Returncode     }     if ((EnterInput) and not (StrInput) and not (NumberInput) and not (DataInput))     {       Sbuffer = "";       value = 0;       Ccount = 0;       ClearCBuffer;       result = 4;                                               // Number return code     }     NumberInput = false;     StrInput = false;     DataInput = false;     EnterInput = false;     Ccount = 0;     return result;   }   return result;   // End CheckforSerialEvent
}



// input buffer


boolean CheckforserialEvent()
{   while (mySerial.available()) {     // get the new byte:     TBuffer = mySerial.read();     if (TBuffer > 9 && TBuffer < 14)     {       Cbuffer[Ccount] = 0;       TBuffer = 0;       if (EchoMode)       {         mySerial.print(char(13));         mySerial.flush();       }       if (Directprint)       {         mySerial.println("");         DirectprintLine = 0;         DirectprintROW = DirectprintROW + 1;         if ( DirectprintROW > 3)         {           Directprint = false;           lcd.noCursor();           lcd.noBlink();           Sbuffer = "";           value = 0;         } else         {           lcd.cursor();           lcd.blinking();           lcd.setCursor(0, DirectprintROW);         }       }       EnterInput = true;       return true;     } else if (TBuffer > 47 && TBuffer < 58 )     {       if ( Ccount < MaxInputBufferSize)       {         Cbuffer[Ccount] = TBuffer;         Ccount++;         if ((Directprint))         {           lcd.print(char(TBuffer));           DirectprintLine = DirectprintLine + 1;           if ( Ccount > MaxInputBufferSize - 1)           {             lcd.noCursor();             lcd.noBlink();           } else {             lcd.cursor();             lcd.blinking();           }         }         if (EchoMode) {           mySerial.print(char(TBuffer));           mySerial.flush();         }       } else {         mySerial.print("#");       }       // Number input detected       NumberInput = true;     }     else if (TBuffer > 64 && TBuffer < 123 )     {       if ( Ccount < MaxInputBufferSize)       {         Cbuffer[Ccount] = TBuffer;         Ccount++;         if ((Directprint))         {           lcd.print(char(TBuffer));           DirectprintLine = DirectprintLine + 1;           if ( Ccount > MaxInputBufferSize - 1)           {             lcd.noCursor();             lcd.noBlink();           } else {             lcd.cursor();             lcd.blinking();           }         }         if (EchoMode) {           mySerial.print(char(TBuffer));           mySerial.flush();         }       } else {         mySerial.print("#");       }       // Character Char Input detected       StrInput = true;     }     else if ( (TBuffer == 127 )  |  (TBuffer == 8 ) )     {       if ( DirectprintLine > 0 )       {         DirectprintLine = DirectprintLine - 1;         lcd.setCursor(DirectprintLine, DirectprintROW);         lcd.print(" ");         lcd.setCursor(DirectprintLine, DirectprintROW);       }       if (( DirectprintLine == 0 ) & ( DirectprintROW > 0 ))       {         DirectprintROW = DirectprintROW - 1;         DirectprintLine = rLcdChr - 1;         lcd.setCursor(DirectprintLine, DirectprintROW);       }       if ( Ccount > 0)       {         Ccount--;         Cbuffer[Ccount] = 0;         if ((Directprint))         {           if ( Ccount > MaxInputBufferSize - 1)           {             lcd.noCursor();             lcd.noBlink();           } else {             lcd.cursor();             lcd.blinking();           }         }         if (EchoMode) {           mySerial.print("-");           mySerial.flush();         }       }     }     else     {       if ( Ccount < MaxInputBufferSize)       {         Cbuffer[Ccount] = TBuffer;         Ccount++;         if ((Directprint))         {           DirectprintLine = DirectprintLine + 1;           if (TBuffer < 128) {             lcd.print(char(TBuffer));           } else  {             lcd.print(String(TBuffer));           }           if ( Ccount > MaxInputBufferSize - 1)           {             lcd.noCursor();             lcd.noBlink();           } else {             lcd.cursor();             lcd.blinking();           }         }         if (EchoMode) {           mySerial.print(char(TBuffer));           mySerial.flush();         }       } else {         mySerial.print("#");       }       // Data input detected       DataInput = true;     }     return false;   }   return false;
}

void Display processor()  // With a blue display, the scroll function is not used, since it only "smears"
{   if (RefreshDisplay)   {     lcd.clear();     RefreshDisplay = false;     for (int b = 1; b <= LcdRows; b++)     {       lcd.setCursor(0, b - 1);       if (!Advertising) {         mySerial.print("Row" + String(b) + ": ");       }       for (int c = 0; c < rLcdChr; c++)       {         eeaddress = 0;         eeaddress = (DisplayBankContent * (rLcdChr) * LcdRows) + ((rLcdChr) * b) + c;         value = 0;         value = EEPROM.read(eeaddress);         if (value > 31) // Don't show special characters         {           if (!광고) {             균사체.인쇄하다(차르(가치));           } 기타 {             지연(100);           }           엘시디.인쇄하다(차르(가치));         } 기타         {           엘시디.인쇄하다(차르(32));         }       }       만약 (!광고) {         균사체.인쇄하();       }     }   }
}

공허 런리얼타임클록()    //시간대
{   / / 실시간 시계 & amp; 카운트 다운   // 이전 밀리스 = 0; // 마지막으로 측정한 저장 중   // 바이트 분리기 = 0;   서명되지 않은  커런트 밀리스 = 밀리스();   인트 스텝밸류 = 0;   // PWM 디스플레이 슈테룽   StepValue = 4 * FadeSeconds;   if (currentMillis - previousMillis > StepValue)   {     previousMillis = currentMillis;     if (Currentbrightness < Targetbrightness        )     {       Currentbrightness = Currentbrightness + 1;       analogWrite (BackgroundLight, Currentbrightness);     } else if (Currentbrightness > Targetbrightness)     {       Currentbrightness = Currentbrightness - 1;       analogWrite (BackgroundLight, Currentbrightness);     }   }   if (currentMillis - previousMillisB > 1000)   {     // sekundentakt     previousMillisB = currentMillis;     // Advertising     if (Advertising)     {       if (Advertseccounter >  Advertsecdelay)       {         Advertseccounter = 0;         DisplayBankContent = DisplayBankContent + 1;         if (DisplayBankContent > AdvertMsg - 1) {           DisplayBankContent = 0;         }         RefreshDisplay = true;       } else {         Advertseccounter = Advertseccounter + 1;       }     }   }
}

void DisplayBank ( byte cobank)
{   if (cobank  < EEPromBanks )   {     RefreshDisplay = true;   // Initalize Display Output     DisplayBankContent = cobank;     mySerial.println("Bank " + String(cobank) + " is displayed on LCD");     MnuState = 0;     Sbuffer = "";     value = 0;     mySerial.flush();   } else   {     mySerial.println("Bank not available.");     value = 0;     MnuState = 0;     Sbuffer = "";     mySerial.flush();   }
}

void SwitchProcessor()
{   Switchstate = digitalRead(SwitchPin);   if ((!Switchstate) && (SwitchstateBuffer) && (not DisplayLock))// Abfrage Schalter   {     SwitchstateBuffer = false;     Advertising = false;     Directprint = false;     lcd.noCursor();     lcd.noBlink();     SelectedMsg = SelectedMsg + 1;     if (SelectedMsg >  EEPromBanks - 1 )     {       SelectedMsg = 0;     }     lcd.clear();     lcd.setCursor(0, 0);     lcd.print("Bank: " + String(SelectedMsg) + " selected");     delay(10);     value = 50000;     while (digitalRead(SwitchPin) == 0)     {       delay(1);       if (value > 0) {         value = value - 1;       };       lcd.setCursor(0, 3);       if (value > 0) {         lcd.print("Power off: " + String(value / 100) + " sec ");       };     }     DisplayBank(SelectedMsg);   }   if (Switchstate)   {     SwitchstateBuffer = true;     //  delay(10);   }
}

 

Ab jetzt ist das Menü um 3 weitere Optionen reicher: ADVERT, ADSEC, und ADMSG. Diese zeigt unser Menü unter „Other“ an:

Output menu on the smartphone

 

Als Handyapp empfehle ich zur Bedienung die App „BlueTerm“ die es kostenlos aus dem Google Store zu laden gibt. Um nun die Nachrichten nacheinander automatisch anzeigen zu lassen, ist wie folgt vorzugehen:

Als erstes setzen wir mit dem Befehl ADMSG die Anzahl an Nachrichten von 0 zählend, die nacheinander angezeigt werden sollen. Beispiel: Wir haben in den Bänken 0-2 insges. 3 Nachrichten gespeichert, die angezeigt werden sollen.

Dann geben wir nach dem Befehl ADMSG die Zahl 4 ein. Als Quittierung bekommen wir die Ausgabe: „Value 2 set“.

Danach geben wir den Befehl „ADSEC“ ein gefolgt von einer Zahl zwischen 1 und 255. Dabei steht die eingegebene Zahl für die Anzahl an Sekunden, bis die angezeigte aktuelle Nachricht durch die nächste konfigurierte Nachricht ersetzt wird. Als Beispiel geben wir hier „5“ ein. Als Quittierung bekommen wir auch hier wieder die Ausgabe: „Value 5 set“.

Als letzten Schritt geben wir nun den Befehl „ADVERT“ ein. Nach der Quittierung des Befehls durch „Advertising On“ wird nun immer im Wechsel automatisch die Nachrichten aus den Bänken 0-2 hintereinander anzeigt. Ausschalten lässt sich die Automatik durch erneute Eingabe des Befehls ADVERT oder durch einen druck auf den Nachrichtenwahltaster.



Ich wünsche viel Spaß beim Nachbauen und wie immer bis zum nächsten Mal.

 

DisplaysFür arduinoProjekte für fortgeschrittene

Leave a comment

All comments are moderated before being published