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