Welkom bij de zesde en laatste deel van onze Bluetooth Display-serie.
In dit deel heb ik gedacht iets leuks als een aanvulling op de vorige functies. In deze paragraaf zullen we ons wijden aan de energie en batterij Management van de unit. Dit als Aanvulling op het laatste deel, hebben we, om ons te laten zien als een Billboard op de rommelmarkt. Op de rommelmarkt, er zijn zelden plug-in, dus moeten we onze Display met een Powerbank. Maar wat als we opraken van energie, of we willen weten of de voedingsspanning 5 volt? Dit kan het beste gebeuren met behulp van één van de analoge ingangen voor het meten van de spanning van de accu direct in volt, de voedingsspanning op het Display.
Daarnaast is een energiebesparende functie zou handig zijn die we kunnen gebruiken met de ingebouwde controles (push-knop). Bovendien, onze Display wordt nu, eindelijk, is er een Debug-functie is uitgerust, die ons helpt om fouten te vinden op een technisch niveau, en een opluchting voor de uitbreidingen van de code met zich meebrengt.
Maar kan onze Vertoning alleen vast te leggen wanneer de spanning van de voeding, is het noodzakelijk om een kleine hardware-extensie. Deze uitbreiding bestaat uit de verbinding van de Analoge Poort 5 op de voedingsspanning VDD. Hierna de draad brug verbinding in de schakeling is te zien van de afbeelding met een rode pijl.
In dit deel nemen we een uitbreiding of aanpassing van de firmware bron-code in en upload de volgende Code op de Arduino:
#include <SPI.h> #include <Draad.h> #include <SoftwareSerial.h> #include <EEPROM.h> #include <LiquidCrystal.h> #include <avr/slaap.h> #define MaxInputBufferSize 20 // een maximum van 255 tekens aan te passen aan vlcdr #define EEPROM 990 #define rLcdChr 20 #define LcdRows 4 #define interval 1000 #define achtergrond licht 5 // de Haven 5 achtergrondverlichting LED - #definiëren VoltageSensingPin 5 // #define SwitchPin 2 // de Haven een 12-knop bericht selectie #define DelayTOPWROFF 500 #define MinOPVoltage 3.4 // EEprom-geheugen van de cel adressen voor configuratie #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(rs, inschakelen, d4, d5, d6, d7) Liquid crystal lcd(8, 13, 12, 11, 10, 9); //variabelen byte display Bank inhoud = 0; //Seriële Invoer-Behandeling char TBuffer; char Cbuffer[MaxInputBufferSize+1]; //USB-Code Input Buffer String Sbuffer = ""; //USB-String Input Buffer, int waarde; /- /USB-Nummeric Input Buffer byte Ccount = 0; //Aantal ontvangen Tekens byte Inptype = 0; boolean StrInput = valse; boolean aantal input = is vals; boolean data-invoer, = false,; boolean enter input = valse; byte menu-keuze = 0; //push-button control is een boolean - schakelaar staat = op true; boolean - schakelaar staat buffer = ware; byte SelectedMsg = 0; //Geven Debug informatie over seriële Interface boolean debug mode = aan valse; boolean - echo modus = waar,; //EEPROM int eeaddress; //EEPROM adres Aanwijzer byte EEPROM banken = 0; //Gebruikt voor de Berekening van de EEPROM Banken //SerMnueControl byte MnuState = 0; // Maximum menu diepte 255 icl Sub - byte van de geselecteerde Bank =0; //Real-Time Klok lang vorige Millis = 0; // slaan de laatste tijd werd gemeten met de lange previousMillisB = 0; // slaan de laatste tijd wat wordt gemeten: //Display Management boolean display lock = valse; boolean direct print = valse; byte directe printrow = 0; byte direct-print = 0; boolean vernieuwen display = valse; byte FRMCheck = 0; // Gebruikt voor het Schrijven van de werking naar de eeprom, dus sla hosts cycli // battery monitoring float Spanning; boolean power save mode = false,; // PWM light control byte huidige helderheid = 0; byte doel helderheid = 0; byte FadeSeconds = 0; // standaard = 3 // auto-Scherm voor reclame doeleinden boolean Reclame = valse; byte AdvertMsg = 1; // Minimum is 1 byte Advertsecdelay = 0; // standaard = 6 byte advertentie secco onder = 0; void setup() { EEPROM banken = EEPROM / ((rLcdChr) * LcdRows); lcd.beginnen(rLcdChr, LcdRows); lcd.duidelijk(); lcd -.setCursor(0, 0); lcd -.print(" Bluetooth"); lcd -.setCursor(0, 1); lcd -.print(" Display"); mySerial.beginnen(9600); pinMode(SwitchPin,INPUT_PULLUP); // Voorproefje Auswahl Tekst aus EEprom pinMode(BackgroundLight,OUTPUT); // Displaybeleuchtung / Display AN /AUS digitalWrite(BackgroundLight,LAGE); // lees Config FadeSeconds = EEPROM.lezen(EEFadeSeconds); Advertsecdelay =EEPROM.lezen(EEAdvertsecdelay); AdvertMsg =EEPROM.lezen(EEAdvertMsg); Currentbrightness = 0; Targetbrightness = 0; lcd.setCursor(0, 4); als (DisplayLock) { lcd -.print(Systeem" gesperrt"); } // Verdere Installatie 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("Tekst voor de Bank " + String( Selectedbank) + " RIJ " + String (rowm) + ":"); } void SerialcommandProcessor() { int een; Inptype = 0; Inptype = SerInputHandler(); // 0 keine Rückgabe // Nummer 1 // 2 String // 3 Gegevens als ((Inptype > 0) & (!Directprint)) { als (PowersaveMode) { TogglePowerSave(valse); } MenueSelection = 0; als (Reclame) { lcd.duidelijke(); Reclame = valse; mySerial.print(F("Reclame ")); mySerial.println(F(" UIT.")); } als ((MnuState < 2) && (Inptype == 2)) {Sbuffer.toUpperCase(); } // Voor het Eenvoudig Invoeren van Commando ' s als ((Sbuffer == "DEBUG") && (MnuState == 0) && (Inptype == 2)) { MenueSelection = 1;} als ((Sbuffer == "ECHO")&& (MnuState == 0) && (Inptype == 2)) { MenueSelection = 2;} als ((Sbuffer == "S") && (MnuState == 0) && (Inptype == 2)) { MenueSelection = 3;} / Wissen/ ALLE EEprom-Inhoud als ((Sbuffer == "E") && (MnuState == 0) && (Inptype == 2)) { MenueSelection = 4;} als ((Sbuffer == "JA") && (MnuState == 1)&& (Inptype == 2)) { MenueSelection = 5;} als ((Sbuffer != "JA") && (MnuState == 1) && (Inptype == 2)) { MenueSelection = 6;} //Bewerk Geselecteerde Inhoud als ((Sbuffer == "W") && (MnuState == 0) && (Inptype == 2)) { MenueSelection = 7;} als ((MnuState == 2) && (waarde < EEPromBanks) && (Inptype == 1)) { MenueSelection = 8;} als (MnuState == 3) { MenueSelection = 9;} als (MnuState == 4) { MenueSelection = 10;} //Weergave van de Geselecteerde Inhoud als ((Sbuffer == "P") && (MnuState == 0) && (Inptype == 2)) { MenueSelection = 11;} als ((MnuState == 5) && (Inptype == 1)) { MenueSelection = 12;} als ((Sbuffer == "R") && (MnuState == 0) && (Inptype == 2)) { MenueSelection = 13;} als ((MnuState == 6) && (Inptype == 1)) { MenueSelection = 14;} als ((Sbuffer == "D") && (MnuState == 0) && (Inptype == 2)) { MenueSelection = 15;} als ((Sbuffer == "Z") && (MnuState == 0) && (Inptype == 2)) { MenueSelection = 16;} als ((Sbuffer == "B") && (MnuState == 0) && (Inptype == 2)) { MenueSelection = 17;} als ((MnuState == 7) && (Inptype == 1)) { MenueSelection = 18;} als ((Sbuffer == "FADE") && (MnuState == 0) && (Inptype == 2)) { MenueSelection = 19;} als (MnuState == 9) { MenueSelection = 20;} als (MnuState == 10) { MenueSelection = 21;} als ((Sbuffer == "Een") && (MnuState == 0) && (Inptype == 2)) { MenueSelection = 22;} als ((Sbuffer == "ADVERTENTIE") && (MnuState == 0) && (Inptype == 2)) { MenueSelection = 23;} als (MnuState == 11) { MenueSelection = 24;} als (MnuState == 12) { MenueSelection = 25;} als ((Sbuffer == "ADSEC") && (MnuState == 0) && (Inptype == 2)) { MenueSelection = 26;} als (MnuState == 13) { MenueSelection = 27;} als ((Sbuffer == "ADMSG") && (MnuState == 0) && (Inptype == 2)) { MenueSelection = 28;} als (MnuState == 14) { MenueSelection = 29;} schakelaar (MenueSelection) { geval 1: { mySerial.print("Debug "); DebugMode = !DebugMode; als (DebugMode) { mySerial.println(F(" OP.")); EchoMode = valse; } anders { mySerial.println(F(" UIT.")); EchoMode = ware; } mySerial.println(""); mySerial.flush(); waarde = 0; MnuState = 0; Sbuffer = ""; breken; } geval 2: { mySerial.print(F("Echo ")); EchoMode = !EchoMode; als (EchoMode) { mySerial.println(F(" OP.")); DebugMode = valse; } anders { mySerial.println(F(" UIT.")); } mySerial.println(F("")); mySerial.flush(); waarde = 0; MnuState = 0; Sbuffer = ""; breken; } geval 3: { mySerial.println(F("Lees EEEPROM Inhoud:" )); mySerial.flush(); voor (int een = 0; een < EEPromBanks; een++) { mySerial.println("EEPROM-Geheugen van de Bank: " + String(een) ); mySerial.flush(); voor (int b = 1; b <= LcdRows;b++) { mySerial.print("Rij " + String(b) +": "); mySerial.flush(); voor (int c = 0; c <rLcdChr; c++) { eeaddress = 0; eeaddress = (een * (rLcdChr)* LcdRows) + ((rLcdChr) * b) + c; waarde = in het EEPROM.lezen(eeaddress); mySerial.print(char(waarde)); mySerial.flush(); } mySerial.println(F(" ")); mySerial.flush(); } } Sbuffer = ""; mySerial.println(F("Niet meer EEPROM Banken.")); mySerial.flush(); breken; } geval 4: { waarde = 0; mySerial.print("Wissen EEPROM "); mySerial.println(F("JA/NEE:")); mySerial.flush(); MnuState = 1; Sbuffer = ""; breken; } geval 5: { waarde = 0; mySerial.print(F("uit te Wissen EEPROM ")); mySerial.println(F("Stand-by.")); mySerial.flush(); voor (int een = 0; een < EEPromBanks; een++) { //Memory-Bank een mySerial.println("Clear Bank: " + String(een)); voor (int b = 1; b <= LcdRows;b++) { voor (int c = 0; c <rLcdChr; c++) { eeaddress = 0; eeaddress = (een * (rLcdChr)* LcdRows) + ((rLcdChr ) * b) + c; FRMCheck = EEPROM.lezen(eeaddress); als (FRMCheck > 0) { EEPROM.schrijven(eeaddress,00); // Formatierung mySerial.afdrukken("."); waarde++; vertraging(30); mySerial.flush(); } } } mySerial.println(""); mySerial.flush(); } mySerial.println(""); mySerial.println("Klaar. "+ String(waarde) + " Bytes gewist"); mySerial.println(""); mySerial.flush(); Sbuffer = ""; MnuState = 0; breken; } geval 6: { waarde = 0; Sbuffer = ""; MnuState = 0; mySerial.println(F("OP afbreken.")); mySerial.flush(); breken; } geval 7: { mySerial.println("EEPPROM Bank Nummer (0-" + String(EEPromBanks-1) + "):"); mySerial.flush(); MnuState = 2; waarde = 0; Sbuffer = ""; breken; } geval 8: { Selectedbank = waarde; TextHeader(1); MnuState = 3; Sbuffer = ""; waarde = 0; breken; } geval 9: { WriteEEPROM(Selectedbank,1); TextHeader(2); waarde = 0; MnuState = 4; Sbuffer = ""; breken; } geval 10: { WriteEEPROM(Selectedbank,2); waarde = 0; MnuState = 0; Sbuffer = ""; TextHeader(3); mySerial.flush(); waarde = 0; MnuState = 9; Sbuffer = ""; breken; } geval 11: { waarde = 0; mySerial.println("EEPPROM Bank Nummer (0-" + String(EEPromBanks-1) + "):"); MnuState = 5; Sbuffer = ""; mySerial.flush(); breken; } geval 12: { SelectedMsg = waarde; DisplayBank(waarde); breken; } geval 13: { waarde = 0; mySerial.println("EEPPROM Bank Nummer (0-" + String(EEPromBanks-1) + "):"); MnuState = 6; Sbuffer = ""; mySerial.flush(); breken; } geval 14: { een = waarde; als ( een < EEPromBanks) { mySerial.println("Memory Bank: " + String(een) ); mySerial.flush(); voor (int b = 1; b <= LcdRows;b++) { mySerial.print("Rij " + String(b) +": "); mySerial.flush(); voor (int c = 0; c <rLcdChr; c++) { eeaddress = 0; eeaddress = (een * (rLcdChr)* LcdRows) + ((rLcdChr) * b) + c; waarde = in het EEPROM.lezen(eeaddress); mySerial.print(char(waarde)); mySerial.flush(); } mySerial.println(" "); mySerial.flush(); } } anders { mySerial.println(F("Waarde buiten het Bereik.")); } waarde = 0; Sbuffer = ""; MnuState = 0; breken; } geval 15: { // Direct pPrint weer te geven Directprint = ware; mySerial.println ("Directprint OP."); als (Directprint) { DirectprintROW = 0; DirectprintLine = 0; lcd -.duidelijk(); lcd -.cursor(); lcd.knipperen(); } waarde = 0; Sbuffer = ""; MnuState = 0; breken; } geval 16: { waarde = 0; Sbuffer = ""; MnuState = 0; breken; } geval 17: { mySerial.println(F("de Helderheid van het Display: (max 255)")); MnuState = 7; waarde = 0; Sbuffer = ""; breken; } geval 18: { als ((waarde < 256)) { Targetbrightness = waarde; mySerial.println("Helderheid: " + String (Targetbrightness) + " Set"); } anders { mySerial.println(F("Waarde buiten het Bereik.")); } MnuState = 0; waarde = 0; Sbuffer = ""; breken; } geval 19: { mySerial.println(F("Fade Vertraging: (max 255 Sec)")); MnuState = 12; waarde = 0; Sbuffer = ""; breken; } geval 20: { WriteEEPROM(Selectedbank,3); waarde = 0; MnuState = 0; Sbuffer = ""; TextHeader(4); mySerial.flush(); waarde = 0; MnuState = 10; Sbuffer = ""; breken; } geval 21: { WriteEEPROM(Selectedbank,4); waarde = 0; MnuState = 0; Sbuffer = ""; breken; } geval 22: { MnuState = 0; Sbuffer = ""; mySerial.println(F("Voer een NIEUWE BT Pin")); mySerial.flush(); MnuState = 11; breken; } geval 23: { Reclame = !Reclame; mySerial.print(F("Reclame ")); als (Reclame) { mySerial.println(F(" OP.")); } anders { mySerial.println(F(" UIT.")); } mySerial.flush(); waarde = 0; MnuState = 0; Sbuffer = ""; breken; } geval 24: { als ((waarde > 1000) & (waarde < 10000)) { mySerial.print("NEW PIN "+ Sbuffer); vertraging(1000); mySerial.flush(); vertraging(1000); mySerial.println("OP+PIN"+ Sbuffer); vertraging(3000); mySerial.flush(); } anders { waarde = 0; Sbuffer = ""; mySerial.println(F("Waarde buiten het Bereik.")); } waarde = 0; MnuState = 0; Sbuffer = ""; breken; } geval 25: { als ((waarde > 0) & (waarde < 251)) { FadeSeconds = waarde; EEPROM.schrijven(EEFadeSeconds, FadeSeconds); mySerial.println("Waarde " + String (waarde) + " ingesteld."); } anders { waarde = 0; Sbuffer = ""; mySerial.println(F("Waarde buiten het Bereik.")); } waarde = 0; MnuState = 0; Sbuffer = ""; breken; } geval 26: { mySerial.println(F("ADverDelay: (max 255 Sec)")); MnuState = 13; waarde = 0; Sbuffer = ""; breken; } geval 27: { als ((waarde > 0) & (waarde < 256)) { Advertsecdelay = waarde; EEPROM.schrijven(EEAdvertsecdelay,Advertsecdelay); mySerial.println("Waarde " + String (waarde) + " ingesteld."); } anders { waarde = 0; Sbuffer = ""; mySerial.println(F("Waarde buiten het Bereik.")); } waarde = 0; MnuState = 0; Sbuffer = ""; breken; } geval 28: { mySerial.println("ADMsgs: (max " + String (EEPromBanks) + ")"); MnuState = 14; waarde = 0; Sbuffer = ""; breken; } geval 29: { als ((waarde > 0) & (waarde < EEPromBanks +1)) { AdvertMsg = waarde; EEPROM.schrijven(EEAdvertMsg,AdvertMsg); mySerial.println("Waarde " + String (waarde) + " ingesteld."); } anders { waarde = 0; Sbuffer = ""; mySerial.println(F("Waarde buiten het Bereik.")); } waarde = 0; MnuState = 0; Sbuffer = ""; breken; } standaard: { als (DisplayLock) { lcd.helder(); DisplayLock = valse; } mySerial.println(F("-------Slim Bluetooth Display 1.1------")); mySerial.println(F("S - Lees ALLE EEPROM Banken")); mySerial.println(F("E - Wis ALLE EEPROM Banken")); mySerial.println(F("W - Schrijven sel. EEPROM Bank")); mySerial.println(F("R - Lees sel. EEPROM Bank")); mySerial.println(F("P - Print EEPROM Bank op het Display")); mySerial.println(F("----------------------------------------")); mySerial.println(F("D - Direct Print")); mySerial.println("B - Display Helderheid Huidige Waarde: " + String (Currentbrightness)); mySerial.println(F("----------------------------------------")); mySerial.println(F("A - Bluetooth-PIN")); mySerial.println(F("Andere: RECLAME,ADSEC,ADMSG,VERVAGEN,ECHO")); mySerial.println(F("----------------------------------------")); mySerial.println(F("Typ Cmd en druk op Enter.")); mySerial.flush(); als (DebugMode) { mySerial.println("Debug: CmdProc Einde Typ: " + String(Inptype) + " Inhoud: " +Sbuffer); mySerial.flush(); } MnuState = 0; waarde = 0; Sbuffer = ""; } } } // Eingabe erkannt } void WriteEEPROM(byte FBank,byte FRow) { byte Writecounter; Writecounter = 0; mySerial.print("Opslaan "); voor (int c = 0; c <rLcdChr; c++) { eeaddress = 0; eeaddress = (FBank * (rLcdChr)* LcdRows) + ((rLcdChr) * FRow) + c; waarde = in het EEPROM.lezen(eeaddress); als (Sbuffer[c] != waarde) { in het EEPROM.schrijven(eeaddress,Sbuffer[c]); mySerial.print("."); Writecounter++; } } mySerial.println(" " + String (Writecounter) + " geschreven Bytes."); } void ClearCBuffer () { voor (byte een= 0; MaxInputBufferSize -1;een++) Cbuffer[een] = 0; } byte SerInputHandler() { byte resultaat = 0; int c; int d; int een; int b; resultaat = 0; als (CheckforserialEvent()) { als ((NumberInput) en niet (DataInput)en niet (StrInput)) //Getallen alleen { Sbuffer = ""; waarde = 0; StrInput = valse; NumberInput = valse; DataInput = valse; EnterInput = valse; a = 0; b = 0; c = 0; d = 0; Sbuffer = Cbuffer; // Zahl wird AUCH ! in SBUFFER übernommen, valt benötigt. als (Ccount == 1) { waarde = Cbuffer[0]- 48 ; } als (Ccount == 2) { een = Cbuffer[0] - 48 ; een = een * 10; b = Cbuffer[1] - 48 ; waarde = van een + b; } als (Ccount == 3) { een = Cbuffer[0] - 48 ; een = een * 100; b = Cbuffer[1] - 48 ; b = b * 10; c = Cbuffer[2] - 48 ; waarde = a + b + c; } als (Ccount == 4) { een = Cbuffer[0] - 48 ; een = een * 1000; b = Cbuffer[1] - 48 ; b = b * 100; c = Cbuffer[2] - 48 ; c = c * 10; d = Cbuffer[3] - 48 ; waarde = van een + b + c + d; } als (Ccount >= 5) { Sbuffer = ""; waarde = 0; Sbuffer = Cbuffer; ClearCBuffer; resultaat = 2; } anders { ClearCBuffer; als (DebugMode) { mySerial.println("Debug: Aantal: "+String(waarde)); mySerial.flush(); } Ccount = 0; resultaat = 1; //Aantal Retournummer NumberInput = valse; StrInput = valse; DataInput = valse; EnterInput = valse; Ccount = 0; return resultaat; } } als ((StrInput) en niet (DataInput)) //String Ingang { Sbuffer = ""; Sbuffer = Cbuffer; als (DebugMode) { mySerial.println("Debug: String: "+Sbuffer); mySerial.flush(); } waarde = 0; StrInput = valse; NumberInput = valse; DataInput = valse; EnterInput = valse; Ccount = 0; ClearCBuffer; resultaat = 2; //Aantal Retournummer } als (DataInput) { Sbuffer = ""; Sbuffer = Cbuffer; waarde = 0; StrInput = valse; NumberInput = valse; DataInput = valse; EnterInput = false; als (DebugMode) { mySerial.println("Debug: Gegevens: "+Sbuffer); mySerial.flush(); } Ccount = 0; ClearCBuffer; resultaat = 3; //Aantal Retournummer } als ((EnterInput) en niet (StrInput) en niet (NumberInput) en niet (DataInput)) { Sbuffer = ""; waarde = 0; als (DebugMode) { mySerial.println(F("Debug: Alleen Enter gedrukt")); mySerial.flush(); } Ccount = 0; ClearCBuffer; resultaat = 4; //Aantal Retournummer } NumberInput = valse; StrInput = valse; DataInput = valse; EnterInput = valse; Ccount = 0; return resultaat; } return resultaat; //Einde CheckforSerialEvent } // Eingabebuffer boolean CheckforserialEvent() { terwijl (mySerial.beschikbaar()) { // voor de nieuwe byte: TBuffer = mySerial.lezen(); als (TBuffer > 9 && TBuffer < 14) { Cbuffer[Ccount] = 0; TBuffer =0; als (EchoMode) { mySerial.print(char(13)); mySerial.flush(); } als (Directprint) { mySerial.println(""); DirectprintLine = 0; DirectprintROW = DirectprintROW + 1; als ( DirectprintROW > 3) { Directprint = valse; lcd.noCursor(); lcd.noBlink(); Sbuffer = ""; waarde = 0; } anders { lcd -.cursor(); lcd.knipperen(); lcd.setCursor(0,DirectprintROW); } } als (DebugMode) { mySerial.println("Debug: Invoeren ontvangen. Lengte: " + String(Ccount)); mySerial.flush(); } EnterInput = true; return true; } else als (TBuffer > 47 && TBuffer <58 ) { als ( Ccount < MaxInputBufferSize) { Cbuffer[Ccount] = TBuffer; Ccount++; als ((Directprint)) { lcd -.print(char(TBuffer)); DirectprintLine = DirectprintLine + 1; als ( Ccount > MaxInputBufferSize -1) { lcd.noCursor(); lcd.noBlink(); } anders { lcd -.cursor(); lcd-scherm.knipperen(); } } als (EchoMode) { mySerial.print(char(TBuffer)); mySerial.flush(); } } anders {mySerial.afdrukken("#"); } als (DebugMode) { mySerial.println(F("Debug: Aantal Seriële ontvangen ")); mySerial.flush(); } //Nummer Invoer gedetecteerd NumberInput = waar; } anders als (TBuffer > 64 && TBuffer < 123 ) { als ( Ccount < MaxInputBufferSize) { Cbuffer[Ccount] = TBuffer; Ccount++; als ((Directprint)) { lcd -.print(char(TBuffer)); DirectprintLine = DirectprintLine + 1; als ( Ccount > MaxInputBufferSize -1) { lcd.noCursor(); lcd.noBlink(); } anders { lcd -.cursor(); lcd-scherm.knipperen(); } } als (EchoMode) { mySerial.print(char(TBuffer)); mySerial.flush(); } } anders {mySerial.afdrukken("#"); } als (DebugMode) { mySerial.println(F("Debug: Char via een Seriële ontvangen ")); mySerial.flush(); } //Karakter Char Invoer gedetecteerd StrInput = waar; } anders als ( (TBuffer == 127 ) | (TBuffer == 8 ) ) { als ( DirectprintLine > 0 ) { DirectprintLine = DirectprintLine - 1; lcd.setCursor(DirectprintLine, DirectprintROW); lcd -.print(" "); lcd.setCursor(DirectprintLine, DirectprintROW); } als (( DirectprintLine == 0 ) & ( DirectprintROW > 0 )) { DirectprintROW = DirectprintROW - 1; DirectprintLine = rLcdChr -1; lcd.setCursor(DirectprintLine, DirectprintROW); } als ( Ccount > 0) { Ccount--; Cbuffer[Ccount] = 0; als ((Directprint)) { als ( Ccount > MaxInputBufferSize -1) { lcd.noCursor(); lcd.noBlink(); } anders { lcd -.cursor(); lcd-scherm.knipperen(); } } als (EchoMode) { mySerial.print("-"); mySerial.flush(); } } } anders { als ( Ccount < MaxInputBufferSize) { Cbuffer[Ccount] = TBuffer; Ccount++; als ((Directprint)) { DirectprintLine = DirectprintLine + 1; als (TBuffer < 128) {lcd -.print(char(TBuffer)); } anders {lcd -.print(String(TBuffer)); } als ( Ccount > MaxInputBufferSize -1) { lcd.noCursor(); lcd.noBlink(); } anders { lcd -.cursor(); lcd-scherm.knipperen(); } } als (EchoMode) { mySerial.print(char(TBuffer)); mySerial.flush(); } } anders {mySerial.afdrukken("#"); } als (DebugMode) { mySerial.println(F("Debug: Gegevens over een Seriële ontvangen ")); mySerial.flush(); } //Data-Invoer gedetecteerd DataInput = true; } return false; } return false; } void Displayprocessor() // Bei Blauem Display wird auf Scrollfunktion verzichtet, da das nur "schmiert" { als (RefreshDisplay) { lcd.helder(); RefreshDisplay = false; voor (int b = 1; b <= LcdRows;b++) { lcd -.setCursor(0, b -1); als (!Reclame) {mySerial.print("Rij " + String(b) +": "); } voor (int c = 0; c <rLcdChr; c++) { eeaddress = 0; eeaddress = (DisplayBankContent * (rLcdChr)* LcdRows) + ((rLcdChr) * b) + c; waarde = 0; waarde = EEPROM.lezen(eeaddress); als (waarde > 31) // Sonderzeichen nicht anzeigen { als (!Reclame) { mySerial.print(char(waarde)); } anders { vertraging(100);} lcd -.print(char(waarde)); } anders { lcd -.print(char(32)); } } als (!Reclame) { mySerial.println(); } } } } void runrealTimeClock() //TIJDBASIS { // Real-Time Klok en Timerfunctie // lange previousMillis = 0; // slaat de laatste tijd werd gemeten // byte SecDivider = 0; unsigned long currentMillis = millis(); int StepValue = 0; // PWM-Display Steuerung StepValue = 4 * FadeSeconds; als(currentMillis - previousMillis > StepValue) { previousMillis = currentMillis; als (Currentbrightness < Targetbrightness ) { Currentbrightness = Currentbrightness + 1; analogWrite (BackgroundLight,Currentbrightness); } anders als (Currentbrightness > Targetbrightness) { Currentbrightness = Currentbrightness - 1; analogWrite (BackgroundLight,Currentbrightness); } } als(currentMillis - previousMillisB > 1000) { // sekundentakt previousMillisB = currentMillis; BattMonitoring(); // Reclame als (Reclame) { als (Advertseccounter > Advertsecdelay) { Advertseccounter = 0; DisplayBankContent = DisplayBankContent + 1; als (DisplayBankContent > AdvertMsg - 1) { DisplayBankContent = 0; } RefreshDisplay = waar; } anders { Advertseccounter = Advertseccounter +1; } } } } void DisplayBank ( byte cobank) { als (cobank < EEPromBanks ) { RefreshDisplay = true; // Initalize Display Output DisplayBankContent = cobank; mySerial.println("Bank " + String(cobank) + " wordt weergegeven op het LCD-scherm"); MnuState = 0; Sbuffer = ""; waarde =0; mySerial.flush(); } anders { mySerial.println(F("Bank niet beschikbaar is.")); waarde = 0; MnuState = 0; Sbuffer = ""; mySerial.flush(); } } void TogglePowerSave(boolean staat) { mySerial.print("Powersave-Modus "); als (!staat) { PowersaveMode = valse; Targetbrightness = 255; mySerial.println(F("UIT")); } anders { PowersaveMode = ware; Targetbrightness = 0; mySerial.println(F("OP")); } } void SwitchProcessor() { Switchstate = digitalRead(SwitchPin); als ((!Switchstate) && (SwitchstateBuffer) && (niet DisplayLock))// Abfrage Schalter { SwitchstateBuffer = valse; Reclame = valse; Directprint = valse; lcd.noCursor(); lcd.noBlink(); als (PowersaveMode) { TogglePowerSave(valse); } anders { SelectedMsg = SelectedMsg + 1; als (SelectedMsg > EEPromBanks - 1 ) { SelectedMsg = 0; } lcd -.duidelijk(); lcd -.setCursor(0,0); lcd -.print("Bank: " + String(SelectedMsg) + " geselecteerd"); lcd -.setCursor(0,2); lcd -.print("Systeem VDD: " + String(Spanning) + " V"); delay(10); waarde = DelayTOPWROFF; terwijl (digitalRead(SwitchPin) == 0) { vertraging(1); als (waarde > 0) {waarde = waarde - 1;}; als (de waarde == 0 && niet PowersaveMode) { TogglePowerSave(true); // als (SelectedMsg = 0 ) { SelectedMsg = EEPromBanks;} else { SelectedMsg = SelectedMsg - 1;}; lcd.setCursor(0,3); lcd -.print("Power off OK "); } lcd -.setCursor(0,3); als (waarde > 0) {lcd -.print("Power off: " + String(waarde /100)+ " sec ");}; } DisplayBank(SelectedMsg); } } als (Switchstate) { SwitchstateBuffer = true; // delay(10); } } void Powerdown () // Toggle Ingreep, als kritische Spanning is bereikt. { lcd.helder(); lcd -.setCursor(0,0); lcd -.print("Waarschuwing Batterij bijna leeg"); lcd -.setCursor(0,2); lcd -.print("Opladen van de Batterij."); Directprint = valse; Reclame = valse; vertraging(5000); TogglePowerSave(ware); } leegte BattMonitoring() { int BatteryState; BatteryState = analogRead(VoltageSensingPin); // lees de input pin // Mittelung der Messwerte noch hinzufügen Spanning = BatteryState * (0.00489); als (Spanning <= MinOPVoltage) { Powerdown(); } }
Es jetzt wird nicht nur, wie vorher, sterven aktuell ausgewählte Tekst Bank angezeigt, sondern darüber hinaus jetzt sterven aktuelle Betriebsspannung. (im Bild untern 4,97 Volt) sowie ein Teller, der beginnend mit 5 herunterzählt und bei bereiken van von 0 das Systeem herunterfährt. Ebenso wird das Systeem bei unterschreiben der im Quelltext angegeben Minimalbetriebsspannung heruntergefahren. Aktuell wird das Display zwar geleert, und die Hintergrundbeleuchtung abgeschaltet, es bleibt aber noch grundsätzlich mit Spannung versorgt. Wer möchte kann das Display per Feldeffekt Transistor auch noch spannungsfrei schalten. Ich habe aus Gründen der Einfachheit jedoch hierauf verzichtet.
Im Menu selbst ginbt es jetzt den "versteckten" Befehl "debug" der den Debug Modus durch einfache Eingabe des Befehls ein - und ausschaltet. Der nachfolgende Screenshot aus der Handige APP "BlueTerm" die ich für dieses Projekt sehr empfehlen kann, sieht man die Zusatzausgaben (Markiert mit dem Voorvoegsel "Debug:" ) matrijs ausgegeben werden, wenn der Modus eingeschaltet ist. Im Screenshot sieht man die Debugausgabe aller über Serielle Schnittstelle empfangenen Zeichen. (Hier debug)
Nach Empfang des Befehls debug wird der Debug Modus ausgeschaltet und mit "Debug OFF" quittiert.
Ich wünsche viel Spaß beim Nachbauen. Bis bald beim nächsten Blog und beim nächsten Projekt. Ich hoffe Ihr hattet dus viel Spaß beim Nachbauen wie ich beim entwickeln.