Bienvenue dans la sixième et dernière partie de notre série Bluetooth Display.
Aussi dans cette partie, je suis venu avec quelque chose de gentil comme un supplément aux fonctions précédentes. Dans la partie d’aujourd’hui, nous nous concentrerons sur la gestion de l’énergie et de la batterie de l’unité. Il s’agit d’un supplément à la dernière partie, où nous avons utilisé notre affichage comme un panneau d’affichage au marché aux puces. Il ya rarement des bouchons au marché aux puces, donc nous devons exploiter notre écran avec une banque d’électricité. Mais que faire si nous sommes à court d’énergie, ou voulons-nous savoir si la tension d’approvisionnement est encore 5 volts? Il est préférable d’utiliser l’une des entrées analogiques pour mesurer la tension de la batterie et d’afficher la tension de fonctionnement directement en volts sur notre écran.
En outre, une fonction d’économie d’énergie serait utile, que nous pouvons utiliser avec les commandes précédemment construites (boutons). En outre, notre écran reçoit enfin une fonction de débaillement, ce qui nous aide à trouver des erreurs sur le plan technique et apporte un soulagement avec des extensions du code.
Mais pour que notre écran puisse détecter la tension de la surcapaise d’alimentation, il est nécessaire de faire une autre petite expansion matérielle. Cette extension consiste en la connexion du port analogique 5 avec la tension d’exploitation VDD. En dessous de la connexion composée d’un pont métallique est indiqué dans le schéma et marqué par une flèche rouge.
Aussi dans cette partie, nous faisons une extension ou un ajustement du code source du firmware et donc télécharger le code suivant à l’Arduino:
#include <Spi.H (en)> #include <Fil.H (en)> #include <LogicielsSerial.H (en)> #include <Eeprom.H (en)> #include <LiquidCrystal (en).H (en)> #include <Avr (Avr)/Dormir.H (en)> #define MaxInputBufferSize 20 maximum 255 caractères pour s’adapter à vlcdr #define EEpromSize (EEpromSize) 990 #define rLcdChr 20 #define LcdRows (LcdRows) 4 #define Intervalle 1000 #define BackgroundLight 5 Port 5 LED rétroéclairée #define VoltageSensingPin (en) 5 // #define SwitchPin (SwitchPin) 2 Boutons de sélection de messages Port 12 #define DelayTOPWROFF (en) 500 #define MinOPVoltage 3.4 EEprom Memory CellAddresses pour Configuration #define EEFadeSeconds 993 #define EEAdvertsecdelay (EEAdvertsecdelay) 994 #define EEAdvertMsg 995 #define EEPINA (EEPINA) 996 #define EEPINC (EEPINC) 997 #define EEPINDD 998 LogicielsSerial mySerial (en)(7, 6); RX, TX LiquidCrystal (rs, enable, d4, d5, d6, d7) LiquidCrystal (en) Lcd(8, 13, 12, 11, 10, 9); Variables Octet DisplayBankContent = 0; Manipulation d’intrants en série Char Char TBuffer (TBuffer); Char Char Cbuffer (Cbuffer)[MaxInputBufferSize+1]; Tampon d’entrée de code USB String Sbuffer (Sbuffer) = ""; Tampon d’entrée de chaîne USB Int Valeur; Tampon d’entrée NUmmeric USB Octet Ccount (Ccount) = 0; Nombre reçu Chars Octet Inptype (Inptype) = 0; Boolean StrInput (En) = Faux; Boolean Nombre d’autres = Faux; Boolean DataInput (en) = Faux; Boolean EntrezInput = Faux; Octet MenueSelection = 0; Contrôle du bouton d’appuyez Boolean Switchstate (Switchstate) = Vrai; Boolean SwitchstateBuffer = Vrai; Octet SelectedMsg = 0; Donner des informations Debug sur l’interface série Boolean DebugMode DebugMode = Faux; Boolean EchoMode = Vrai; Eeprom Int eeaddress; Pointeur d’adresse EEPROM Octet EEPromBanks (en) = 0; Utilisé pour calculer les banques EEPROM SerMnueControl Octet MnuState (en) = 0; Profondeur maximale du menu 255 icl Sub Octet Banque sélectionnée =0; Horloge en temps réel Long précédentMillis = 0; stockera la dernière fois a été mesurée Long précédenteMillisB = 0; stockera la dernière fois a été mesurée Gestion de l’affichage Boolean DisplayLock (DisplayLock) = Faux; Boolean Empreinte directe = Faux; Octet DirectprintROW = 0; Octet Ligne d’impression directe = 0; Boolean RefreshDisplay (en) = Faux; Octet FRMCheck (FRMCheck) = 0; Utilisé fpr Opérations d’écriture à eeprom afin d’enregistrer les cycles hôtes Surveillance des batteries Flotteur Tension; Boolean PowersaveMode PowersaveMode PowersaveMode Powersave = Faux; PWM Lichtsteuerung Octet La droiteur actuelle = 0; Octet Cédanteur = 0; Octet FadeSeconds (FadeSeconds) = 0; Norme 3 Auto Display Z.B f’r Werbungszwecke Boolean publicités = Faux; Octet AdvertMsg = 1; Minimum 1 Octet Advertsecdelay Annonces = 0; Norme 6 Octet Advertseccounter (en anglais) = 0; Vide Configuration() { EEPromBanks (en) = EEpromSize (EEpromSize) / ((rLcdChr) * LcdRows (LcdRows)); Lcd.Commencer(rLcdChr, LcdRows (LcdRows)); Lcd.Clair(); Lcd.setCursor(0, 0); Lcd.Imprimer("Bluetooth"); Lcd.setCursor(0, 1); Lcd.Imprimer("Affichage"); mySerial (en).Commencer(9600); pinMode(SwitchPin (SwitchPin),INPUT_PULLUP); Taster Auswahl Texte aus EEprom pinMode(BackgroundLight,Sortie); Displaybeleuchtung / Affichage AN /AUS digitalWrite (en)(BackgroundLight,Faible); lire Config FadeSeconds (FadeSeconds) = Eeprom.Lire(EEFadeSeconds); Advertsecdelay Annonces =Eeprom.Lire(EEAdvertsecdelay (EEAdvertsecdelay)); AdvertMsg =Eeprom.Lire(EEAdvertMsg); La droiteur actuelle = 0; Cédanteur = 0; Lcd.setCursor(0, 4); Si (DisplayLock (DisplayLock)) { Lcd.Imprimer(" Gesperrt système "); } D’autres routines d’installation / initalisant Lcd.setCursor(0, 0); Cédanteur = 255; mySerial (en).Rincer(); } // ###################################################################################################### // Vide Boucle() { SerialcommandProcesseur(); runrealTimeClock (en)(); Processeur d’affichage(); CommutateurProcesseur(); Boucle principale de fin } // ###################################################################################################### // Vide TextHeader (en)(Octet rowm) { mySerial (en).println("Texte pour la Banque" + String( Banque sélectionnée) + " ROW " + String (rowm) + ":"); } Vide SerialcommandProcesseur() { Int Un; Inptype (Inptype) = 0; Inptype (Inptype) = SerInputHandler(); 0 keine R’ckgabe 1 Nummer 2 Chaîne 3 Données Si ((Inptype (Inptype) > 0) & (!Empreinte directe)) { Si (PowersaveMode PowersaveMode PowersaveMode Powersave) { TogglePowerSave(Faux); } MenueSelection = 0; Si (publicités) { Lcd.Clair(); publicités = Faux; mySerial (en).Imprimer(F("Publicité")); mySerial (en).println(F("OFF")); } Si ((MnuState (en) < 2) && (Inptype (Inptype) == 2)) {Sbuffer (Sbuffer).àUpperCase(); } Pour faciliter les commandes Si ((Sbuffer (Sbuffer) == "DEBUG") && (MnuState (en) == 0) && (Inptype (Inptype) == 2)) { MenueSelection = 1;} Si ((Sbuffer (Sbuffer) == "ECHO")&& (MnuState (en) == 0) && (Inptype (Inptype) == 2)) { MenueSelection = 2;} Si ((Sbuffer (Sbuffer) == "S") && (MnuState (en) == 0) && (Inptype (Inptype) == 2)) { MenueSelection = 3;} Effacer TOUS les contenus EEprom Si ((Sbuffer (Sbuffer) == "E") && (MnuState (en) == 0) && (Inptype (Inptype) == 2)) { MenueSelection = 4;} Si ((Sbuffer (Sbuffer) == "OUI") && (MnuState (en) == 1)&& (Inptype (Inptype) == 2)) { MenueSelection = 5;} Si ((Sbuffer (Sbuffer) != "OUI") && (MnuState (en) == 1) && (Inptype (Inptype) == 2)) { MenueSelection = 6;} Modifier le contenu sélectionné Si ((Sbuffer (Sbuffer) == "W") && (MnuState (en) == 0) && (Inptype (Inptype) == 2)) { MenueSelection = 7;} Si ((MnuState (en) == 2) && (Valeur < EEPromBanks (en)) && (Inptype (Inptype) == 1)) { MenueSelection = 8;} Si (MnuState (en) == 3) { MenueSelection = 9;} Si (MnuState (en) == 4) { MenueSelection = 10;} Afficher le contenu sélectionné Si ((Sbuffer (Sbuffer) == "P") && (MnuState (en) == 0) && (Inptype (Inptype) == 2)) { MenueSelection = 11;} Si ((MnuState (en) == 5) && (Inptype (Inptype) == 1)) { MenueSelection = 12;} Si ((Sbuffer (Sbuffer) == "R") && (MnuState (en) == 0) && (Inptype (Inptype) == 2)) { MenueSelection = 13;} Si ((MnuState (en) == 6) && (Inptype (Inptype) == 1)) { MenueSelection = 14;} Si ((Sbuffer (Sbuffer) == "D") && (MnuState (en) == 0) && (Inptype (Inptype) == 2)) { MenueSelection = 15;} Si ((Sbuffer (Sbuffer) == "Z") && (MnuState (en) == 0) && (Inptype (Inptype) == 2)) { MenueSelection = 16;} Si ((Sbuffer (Sbuffer) == "B") && (MnuState (en) == 0) && (Inptype (Inptype) == 2)) { MenueSelection = 17;} Si ((MnuState (en) == 7) && (Inptype (Inptype) == 1)) { MenueSelection = 18;} Si ((Sbuffer (Sbuffer) == "FADE") && (MnuState (en) == 0) && (Inptype (Inptype) == 2)) { MenueSelection = 19;} Si (MnuState (en) == 9) { MenueSelection = 20;} Si (MnuState (en) == 10) { MenueSelection = 21;} Si ((Sbuffer (Sbuffer) == "A") && (MnuState (en) == 0) && (Inptype (Inptype) == 2)) { MenueSelection = 22;} Si ((Sbuffer (Sbuffer) == "PUBLICITÉ") && (MnuState (en) == 0) && (Inptype (Inptype) == 2)) { MenueSelection = 23;} Si (MnuState (en) == 11) { MenueSelection = 24;} Si (MnuState (en) == 12) { MenueSelection = 25;} Si ((Sbuffer (Sbuffer) == "ADSEC") && (MnuState (en) == 0) && (Inptype (Inptype) == 2)) { MenueSelection = 26;} Si (MnuState (en) == 13) { MenueSelection = 27;} Si ((Sbuffer (Sbuffer) == "ADMSG") && (MnuState (en) == 0) && (Inptype (Inptype) == 2)) { MenueSelection = 28;} Si (MnuState (en) == 14) { MenueSelection = 29;} Interrupteur (MenueSelection) { Cas 1: { mySerial (en).Imprimer("Debug"); DebugMode DebugMode = !DebugMode DebugMode; Si (DebugMode DebugMode) { mySerial (en).println(F("SUR.")); EchoMode = Faux; } Autre { mySerial (en).println(F("OFF")); EchoMode = Vrai; } mySerial (en).println(""); mySerial (en).Rincer(); Valeur = 0; MnuState (en) = 0; Sbuffer (Sbuffer) = ""; Pause; } Cas 2: { mySerial (en).Imprimer(F("Echo")); EchoMode = !EchoMode; Si (EchoMode) { mySerial (en).println(F("SUR.")); DebugMode DebugMode = Faux; } Autre { mySerial (en).println(F("OFF")); } mySerial (en).println(F("")); mySerial (en).Rincer(); Valeur = 0; MnuState (en) = 0; Sbuffer (Sbuffer) = ""; Pause; } Cas 3: { mySerial (en).println(F("Lire le contenu EEEPROM:" )); mySerial (en).Rincer(); Pour (Int Un = 0; Un < EEPromBanks (en); Un++) { mySerial (en).println("EEPROM Memory Bank: " + String(Un) ); mySerial (en).Rincer(); Pour (Int B = 1; B <= LcdRows (LcdRows);B++) { mySerial (en).Imprimer("Row " + String(B) +": "); mySerial (en).Rincer(); Pour (Int C = 0; C <rLcdChr; C++) { eeaddress = 0; eeaddress = (Un * (rLcdChr)* LcdRows (LcdRows)) + ((rLcdChr) * B) + C; Valeur = Eeprom.Lire(eeaddress); mySerial (en).Imprimer(char(Valeur)); mySerial (en).Rincer(); } mySerial (en).println(F(" ")); mySerial (en).Rincer(); } } Sbuffer (Sbuffer) = ""; mySerial (en).println(F("Plus de banques EEPROM disponibles.")); mySerial (en).Rincer(); Pause; } Cas 4: { Valeur = 0; mySerial (en).Imprimer("Effacement EEPROM "); mySerial (en).println(F("OUI/NON:")); mySerial (en).Rincer(); MnuState (en) = 1; Sbuffer (Sbuffer) = ""; Pause; } Cas 5: { Valeur = 0; mySerial (en).Imprimer(F("Effacement EEPROM ")); mySerial (en).println(F("Restez là.")); mySerial (en).Rincer(); Pour (Int Un = 0; Un < EEPromBanks (en); Un++) { Banque de mémoire a mySerial (en).println("Clear Bank: " + String(Un)); Pour (Int B = 1; B <= LcdRows (LcdRows);B++) { Pour (Int C = 0; C <rLcdChr; C++) { eeaddress = 0; eeaddress = (Un * (rLcdChr)* LcdRows (LcdRows)) + ((rLcdChr ) * B) + C; FRMCheck (FRMCheck) = Eeprom.Lire(eeaddress); Si (FRMCheck (FRMCheck) > 0) { Eeprom.Écrire(eeaddress,00); Formatierung Formatierung mySerial (en).Imprimer("."); Valeur++; Retard(30); mySerial (en).Rincer(); } } } mySerial (en).println(""); mySerial (en).Rincer(); } mySerial (en).println(""); mySerial (en).println("Fini."+ String(Valeur) + "Octes effacé"); mySerial (en).println(""); mySerial (en).Rincer(); Sbuffer (Sbuffer) = ""; MnuState (en) = 0; Pause; } Cas 6: { Valeur = 0; Sbuffer (Sbuffer) = ""; MnuState (en) = 0; mySerial (en).println(F("OP avorter.")); mySerial (en).Rincer(); Pause; } Cas 7: { mySerial (en).println(Numéro de banque EEPPROM (0-" + String(EEPromBanks (en)-1) + "):"); mySerial (en).Rincer(); MnuState (en) = 2; Valeur = 0; Sbuffer (Sbuffer) = ""; Pause; } Cas 8: { Banque sélectionnée = Valeur; TextHeader (en)(1); MnuState (en) = 3; Sbuffer (Sbuffer) = ""; Valeur = 0; Pause; } Cas 9: { ÉcrireEEPROM(Banque sélectionnée,1); TextHeader (en)(2); Valeur = 0; MnuState (en) = 4; Sbuffer (Sbuffer) = ""; Pause; } Cas 10: { ÉcrireEEPROM(Banque sélectionnée,2); Valeur = 0; MnuState (en) = 0; Sbuffer (Sbuffer) = ""; TextHeader (en)(3); mySerial (en).Rincer(); Valeur = 0; MnuState (en) = 9; Sbuffer (Sbuffer) = ""; Pause; } Cas 11: { Valeur = 0; mySerial (en).println(Numéro de banque EEPPROM (0-" + String(EEPromBanks (en)-1) + "):"); MnuState (en) = 5; Sbuffer (Sbuffer) = ""; mySerial (en).Rincer(); Pause; } Cas 12: { SelectedMsg = Valeur; DisplayBank (en)(Valeur); Pause; } Cas 13: { Valeur = 0; mySerial (en).println(Numéro de banque EEPPROM (0-" + String(EEPromBanks (en)-1) + "):"); MnuState (en) = 6; Sbuffer (Sbuffer) = ""; mySerial (en).Rincer(); Pause; } Cas 14: { Un = Valeur; Si ( Un < EEPromBanks (en)) { mySerial (en).println("Banque de mémoire: " + String(Un) ); mySerial (en).Rincer(); Pour (Int B = 1; B <= LcdRows (LcdRows);B++) { mySerial (en).Imprimer("Row " + String(B) +": "); mySerial (en).Rincer(); Pour (Int C = 0; C <rLcdChr; C++) { eeaddress = 0; eeaddress = (Un * (rLcdChr)* LcdRows (LcdRows)) + ((rLcdChr) * B) + C; Valeur = Eeprom.Lire(eeaddress); mySerial (en).Imprimer(char(Valeur)); mySerial (en).Rincer(); } mySerial (en).println(" "); mySerial (en).Rincer(); } } Autre { mySerial (en).println(F("Valeur hors de portée.")); } Valeur = 0; Sbuffer (Sbuffer) = ""; MnuState (en) = 0; Pause; } Cas 15: { PPrint direct à afficher Empreinte directe = Vrai; mySerial (en).println ("Directprint ON."); Si (Empreinte directe) { DirectprintROW = 0; Ligne d’impression directe = 0; Lcd.Clair(); Lcd.Curseur(); Lcd.Clignoter(); } Valeur = 0; Sbuffer (Sbuffer) = ""; MnuState (en) = 0; Pause; } Cas 16: { Valeur = 0; Sbuffer (Sbuffer) = ""; MnuState (en) = 0; Pause; } Cas 17: { mySerial (en).println(F("Afficher la luminosité: (max 255)")); MnuState (en) = 7; Valeur = 0; Sbuffer (Sbuffer) = ""; Pause; } Cas 18: { Si ((Valeur < 256)) { Cédanteur = Valeur; mySerial (en).println("Brightness: " + String (Cédanteur) + "Set"); } Autre { mySerial (en).println(F("Valeur hors de portée.")); } MnuState (en) = 0; Valeur = 0; Sbuffer (Sbuffer) = ""; Pause; } Cas 19: { mySerial (en).println(F("Fade Delay: (max 255 Sec)")); MnuState (en) = 12; Valeur = 0; Sbuffer (Sbuffer) = ""; Pause; } Cas 20: { ÉcrireEEPROM(Banque sélectionnée,3); Valeur = 0; MnuState (en) = 0; Sbuffer (Sbuffer) = ""; TextHeader (en)(4); mySerial (en).Rincer(); Valeur = 0; MnuState (en) = 10; Sbuffer (Sbuffer) = ""; Pause; } Cas 21: { ÉcrireEEPROM(Banque sélectionnée,4); Valeur = 0; MnuState (en) = 0; Sbuffer (Sbuffer) = ""; Pause; } Cas 22: { MnuState (en) = 0; Sbuffer (Sbuffer) = ""; mySerial (en).println(F("Entrez NOUVEAU BT Pin")); mySerial (en).Rincer(); MnuState (en) = 11; Pause; } Cas 23: { publicités = !publicités; mySerial (en).Imprimer(F("Publicité")); Si (publicités) { mySerial (en).println(F("SUR.")); } Autre { mySerial (en).println(F("OFF")); } mySerial (en).Rincer(); Valeur = 0; MnuState (en) = 0; Sbuffer (Sbuffer) = ""; Pause; } Cas 24: { Si ((Valeur > 1000) & (Valeur < 10000)) { mySerial (en).Imprimer("NOUVELLE ÉPINGLE"+ Sbuffer (Sbuffer)); Retard(1000); mySerial (en).Rincer(); Retard(1000); mySerial (en).println("AT-PIN"+ Sbuffer (Sbuffer)); Retard(3000); mySerial (en).Rincer(); } Autre { Valeur = 0; Sbuffer (Sbuffer) = ""; mySerial (en).println(F("Valeur hors de portée.")); } Valeur = 0; MnuState (en) = 0; Sbuffer (Sbuffer) = ""; Pause; } Cas 25: { Si ((Valeur > 0) & (Valeur < 251)) { FadeSeconds (FadeSeconds) = Valeur; Eeprom.Écrire(EEFadeSeconds, FadeSeconds (FadeSeconds)); mySerial (en).println("Valeur" + String (Valeur) + "ensemble."); } Autre { Valeur = 0; Sbuffer (Sbuffer) = ""; mySerial (en).println(F("Valeur hors de portée.")); } Valeur = 0; MnuState (en) = 0; Sbuffer (Sbuffer) = ""; Pause; } Cas 26: { mySerial (en).println(F("ADverDelay: (max 255 Sec)")); MnuState (en) = 13; Valeur = 0; Sbuffer (Sbuffer) = ""; Pause; } Cas 27: { Si ((Valeur > 0) & (Valeur < 256)) { Advertsecdelay Annonces = Valeur; Eeprom.Écrire(EEAdvertsecdelay (EEAdvertsecdelay),Advertsecdelay Annonces); mySerial (en).println("Valeur" + String (Valeur) + "ensemble."); } Autre { Valeur = 0; Sbuffer (Sbuffer) = ""; mySerial (en).println(F("Valeur hors de portée.")); } Valeur = 0; MnuState (en) = 0; Sbuffer (Sbuffer) = ""; Pause; } Cas 28: { mySerial (en).println("ADMsgs: (max" + String (EEPromBanks (en)) + ")"); MnuState (en) = 14; Valeur = 0; Sbuffer (Sbuffer) = ""; Pause; } Cas 29: { Si ((Valeur > 0) & (Valeur < EEPromBanks (en) +1)) { AdvertMsg = Valeur; Eeprom.Écrire(EEAdvertMsg,AdvertMsg); mySerial (en).println("Valeur" + String (Valeur) + "ensemble."); } Autre { Valeur = 0; Sbuffer (Sbuffer) = ""; mySerial (en).println(F("Valeur hors de portée.")); } Valeur = 0; MnuState (en) = 0; Sbuffer (Sbuffer) = ""; Pause; } Par défaut: { Si (DisplayLock (DisplayLock)) { Lcd.Clair(); DisplayLock (DisplayLock) = Faux; } mySerial (en).println(F("-------Smart Bluetooth Display 1.1------")); mySerial (en).println(F("S - Lire TOUTES les banques EEPROM")); mySerial (en).println(F("E - Effacer TOUTES les banques EEPROM")); mySerial (en).println(F("W - Eil. EEPROM Bank")); mySerial (en).println(F("R - Lire sel. EEPROM Bank")); mySerial (en).println(F("P - Imprimer EEPROM Bank sur l’affichage")); mySerial (en).println(F("----------------------------------------")); mySerial (en).println(F("D - Impression directe")); mySerial (en).println("B - Afficher Brighness Valeur actuelle: " + String (La droiteur actuelle)); mySerial (en).println(F("----------------------------------------")); mySerial (en).println(F("A - Bluetooth Access PIN")); mySerial (en).println(F("Autre: ADVERT,ADSEC,ADMSG,FADE,ECHO")); mySerial (en).println(F("----------------------------------------")); mySerial (en).println(F("Type Cmd et appuyez sur Entrez")); mySerial (en).Rincer(); Si (DebugMode DebugMode) { mySerial (en).println("Debug: CmdProc End Typ: " + String(Inptype (Inptype)) + " Inhaler: " +Sbuffer (Sbuffer)); mySerial (en).Rincer(); } MnuState (en) = 0; Valeur = 0; Sbuffer (Sbuffer) = ""; } } } Eingabe erkannt } Vide ÉcrireEEPROM(Octet FBank (FBank),Octet FRow (FRow)) { Octet Ecrire le compte; Ecrire le compte = 0; mySerial (en).Imprimer("Sauver"); Pour (Int C = 0; C <rLcdChr; C++) { eeaddress = 0; eeaddress = (FBank (FBank) * (rLcdChr)* LcdRows (LcdRows)) + ((rLcdChr) * FRow (FRow)) + C; Valeur = Eeprom.Lire(eeaddress); Si (Sbuffer (Sbuffer)[C] != Valeur) { Eeprom.Écrire(eeaddress,Sbuffer (Sbuffer)[C]); mySerial (en).Imprimer("."); Ecrire le compte++; } } mySerial (en).println(" " + String (Ecrire le compte) + "Bytes écrit."); } Vide ClearCBuffer (en) () { Pour (Octet Un= 0; MaxInputBufferSize -1;Un++) Cbuffer (Cbuffer)[Un] = 0; } Octet SerInputHandler() { Octet Résultat = 0; Int C; Int D; Int Un; Int B; Résultat = 0; Si (CheckforserialEvent()) { Si ((Nombre d’autres) Et Pas (DataInput (en))Et Pas (StrInput (En))) Nombres seulement { Sbuffer (Sbuffer) = ""; Valeur = 0; StrInput (En) = Faux; Nombre d’autres = Faux; DataInput (en) = Faux; EntrezInput = Faux; Un = 0; B = 0; C = 0; D = 0; Sbuffer (Sbuffer) = Cbuffer (Cbuffer); Zahl wird AUCH ! sBUFFER 'bernommen, falls ben’tigt. Si (Ccount (Ccount) == 1) { Valeur = Cbuffer (Cbuffer)[0]- 48 ; } Si (Ccount (Ccount) == 2) { Un = Cbuffer (Cbuffer)[0] - 48 ; Un = Un * 10; B = Cbuffer (Cbuffer)[1] - 48 ; Valeur = Un + B; } Si (Ccount (Ccount) == 3) { Un = Cbuffer (Cbuffer)[0] - 48 ; Un = Un * 100; B = Cbuffer (Cbuffer)[1] - 48 ; B = B * 10; C = Cbuffer (Cbuffer)[2] - 48 ; Valeur = Un + B + C; } Si (Ccount (Ccount) == 4) { Un = Cbuffer (Cbuffer)[0] - 48 ; Un = Un * 1000; B = Cbuffer (Cbuffer)[1] - 48 ; B = B * 100; C = Cbuffer (Cbuffer)[2] - 48 ; C = C * 10; D = Cbuffer (Cbuffer)[3] - 48 ; Valeur = Un + B + C + D; } Si (Ccount (Ccount) >= 5) { Sbuffer (Sbuffer) = ""; Valeur = 0; Sbuffer (Sbuffer) = Cbuffer (Cbuffer); ClearCBuffer (en); Résultat = 2; } Autre { ClearCBuffer (en); Si (DebugMode DebugMode) { mySerial (en).println("Debug: Nombre: "+String(Valeur)); mySerial (en).Rincer(); } Ccount (Ccount) = 0; Résultat = 1; Code de retour de numéro Nombre d’autres = Faux; StrInput (En) = Faux; DataInput (en) = Faux; EntrezInput = Faux; Ccount (Ccount) = 0; Retour Résultat; } } Si ((StrInput (En)) Et Pas (DataInput (en))) Entrée de chaîne seulement { Sbuffer (Sbuffer) = ""; Sbuffer (Sbuffer) = Cbuffer (Cbuffer); Si (DebugMode DebugMode) { mySerial (en).println("Debug: String: "+Sbuffer (Sbuffer)); mySerial (en).Rincer(); } Valeur = 0; StrInput (En) = Faux; Nombre d’autres = Faux; DataInput (en) = Faux; EntrezInput = Faux; Ccount (Ccount) = 0; ClearCBuffer (en); Résultat = 2; Code de retour de numéro } Si (DataInput (en)) { Sbuffer (Sbuffer) = ""; Sbuffer (Sbuffer) = Cbuffer (Cbuffer); Valeur = 0; StrInput (En) = Faux; Nombre d’autres = Faux; DataInput (en) = Faux; EntrezInput = Faux; Si (DebugMode DebugMode) { mySerial (en).println("Debug: Données: "+Sbuffer (Sbuffer)); mySerial (en).Rincer(); } Ccount (Ccount) = 0; ClearCBuffer (en); Résultat = 3; Code de retour de numéro } Si ((EntrezInput) Et Pas (StrInput (En)) Et Pas (Nombre d’autres) Et Pas (DataInput (en))) { Sbuffer (Sbuffer) = ""; Valeur = 0; Si (DebugMode DebugMode) { mySerial (en).println(F("Debug: Seulement Entrer pressé")); mySerial (en).Rincer(); } Ccount (Ccount) = 0; ClearCBuffer (en); Résultat = 4; Code de retour de numéro } Nombre d’autres = Faux; StrInput (En) = Faux; DataInput (en) = Faux; EntrezInput = Faux; Ccount (Ccount) = 0; Retour Résultat; } Retour Résultat; Fin CheckforSerialEvent } Eingabebuffer Boolean CheckforserialEvent() { Tandis que (mySerial (en).Disponible()) { obtenir le nouveau byte: TBuffer (TBuffer) = mySerial (en).Lire(); Si (TBuffer (TBuffer) > 9 && TBuffer (TBuffer) < 14) { Cbuffer (Cbuffer)[Ccount (Ccount)] = 0; TBuffer (TBuffer) =0; Si (EchoMode) { mySerial (en).Imprimer(char(13)); mySerial (en).Rincer(); } Si (Empreinte directe) { mySerial (en).println(""); Ligne d’impression directe = 0; DirectprintROW = DirectprintROW + 1; Si ( DirectprintROW > 3) { Empreinte directe = Faux; Lcd.noCursor (en)(); Lcd.noBlink (noBlink)(); Sbuffer (Sbuffer) = ""; Valeur = 0; } Autre { Lcd.Curseur(); Lcd.Clignoter(); Lcd.setCursor(0,DirectprintROW); } } Si (DebugMode DebugMode) { mySerial (en).println("Debug: Entrez reçu. Longueur: " + String(Ccount (Ccount))); mySerial (en).Rincer(); } EntrezInput = Vrai; Retour Vrai; } Autre Si (TBuffer (TBuffer) > 47 && TBuffer (TBuffer) <58 ) { Si ( Ccount (Ccount) < MaxInputBufferSize) { Cbuffer (Cbuffer)[Ccount (Ccount)] = TBuffer (TBuffer); Ccount (Ccount)++; Si ((Empreinte directe)) { Lcd.Imprimer(char(TBuffer (TBuffer))); Ligne d’impression directe = Ligne d’impression directe + 1; Si ( Ccount (Ccount) > MaxInputBufferSize -1) { Lcd.noCursor (en)(); Lcd.noBlink (noBlink)(); } Autre { Lcd.Curseur(); Lcd.Clignoter(); } } Si (EchoMode) { mySerial (en).Imprimer(char(TBuffer (TBuffer))); mySerial (en).Rincer(); } } Autre {mySerial (en).Imprimer("#"); } Si (DebugMode DebugMode) { mySerial (en).println(F("Debug: Nombre sur Serial reçu ")); mySerial (en).Rincer(); } Entrée de nombre détectée Nombre d’autres = Vrai; } Autre Si (TBuffer (TBuffer) > 64 && TBuffer (TBuffer) < 123 ) { Si ( Ccount (Ccount) < MaxInputBufferSize) { Cbuffer (Cbuffer)[Ccount (Ccount)] = TBuffer (TBuffer); Ccount (Ccount)++; Si ((Empreinte directe)) { Lcd.Imprimer(char(TBuffer (TBuffer))); Ligne d’impression directe = Ligne d’impression directe + 1; Si ( Ccount (Ccount) > MaxInputBufferSize -1) { Lcd.noCursor (en)(); Lcd.noBlink (noBlink)(); } Autre { Lcd.Curseur(); Lcd.Clignoter(); } } Si (EchoMode) { mySerial (en).Imprimer(char(TBuffer (TBuffer))); mySerial (en).Rincer(); } } Autre {mySerial (en).Imprimer("#"); } Si (DebugMode DebugMode) { mySerial (en).println(F("Debug: Char sur Serial reçu ")); mySerial (en).Rincer(); } Entrée de char de caractère détectée StrInput (En) = Vrai; } Autre Si ( (TBuffer (TBuffer) == 127 ) | (TBuffer (TBuffer) == 8 ) ) { Si ( Ligne d’impression directe > 0 ) { Ligne d’impression directe = Ligne d’impression directe - 1; Lcd.setCursor(Ligne d’impression directe, DirectprintROW); Lcd.Imprimer(" "); Lcd.setCursor(Ligne d’impression directe, DirectprintROW); } Si (( Ligne d’impression directe == 0 ) & ( DirectprintROW > 0 )) { DirectprintROW = DirectprintROW - 1; Ligne d’impression directe = rLcdChr -1; Lcd.setCursor(Ligne d’impression directe, DirectprintROW); } Si ( Ccount (Ccount) > 0) { Ccount (Ccount)--; Cbuffer (Cbuffer)[Ccount (Ccount)] = 0; Si ((Empreinte directe)) { Si ( Ccount (Ccount) > MaxInputBufferSize -1) { Lcd.noCursor (en)(); Lcd.noBlink (noBlink)(); } Autre { Lcd.Curseur(); Lcd.Clignoter(); } } Si (EchoMode) { mySerial (en).Imprimer("-"); mySerial (en).Rincer(); } } } Autre { Si ( Ccount (Ccount) < MaxInputBufferSize) { Cbuffer (Cbuffer)[Ccount (Ccount)] = TBuffer (TBuffer); Ccount (Ccount)++; Si ((Empreinte directe)) { Ligne d’impression directe = Ligne d’impression directe + 1; Si (TBuffer (TBuffer) < 128) {Lcd.Imprimer(char(TBuffer (TBuffer))); } Autre {Lcd.Imprimer(String(TBuffer (TBuffer))); } Si ( Ccount (Ccount) > MaxInputBufferSize -1) { Lcd.noCursor (en)(); Lcd.noBlink (noBlink)(); } Autre { Lcd.Curseur(); Lcd.Clignoter(); } } Si (EchoMode) { mySerial (en).Imprimer(char(TBuffer (TBuffer))); mySerial (en).Rincer(); } } Autre {mySerial (en).Imprimer("#"); } Si (DebugMode DebugMode) { mySerial (en).println(F("Debug: Données sur Serial reçu ")); mySerial (en).Rincer(); } Entrée de données détectée DataInput (en) = Vrai; } Retour Faux; } Retour Faux; } Vide Processeur d’affichage() Bei Blauem Display wird auf Scrollfunktion verzichtet, da das nur "schmiert" { Si (RefreshDisplay (en)) { Lcd.Clair(); RefreshDisplay (en) = Faux; Pour (Int B = 1; B <= LcdRows (LcdRows);B++) { Lcd.setCursor(0, B -1); Si (!publicités) {mySerial (en).Imprimer("Row " + String(B) +": "); } Pour (Int C = 0; C <rLcdChr; C++) { eeaddress = 0; eeaddress = (DisplayBankContent * (rLcdChr)* LcdRows (LcdRows)) + ((rLcdChr) * B) + C; Valeur = 0; Valeur = Eeprom.Lire(eeaddress); Si (Valeur > 31) Sonderzeichen nicht anzeigen { Si (!publicités) { mySerial (en).Imprimer(char(Valeur)); } Autre { Retard(100);} Lcd.Imprimer(char(Valeur)); } Autre { Lcd.Imprimer(char(32)); } } Si (!publicités) { mySerial (en).println(); } } } } Vide runrealTimeClock (en)() BASE DE TEMPS { Horloge en temps réel et compte à rebours longs précédentsMillis 0; stockera la dernière fois a été mesurée byte SecDivider 0; Unsigned Long currentMillis = Millis(); Int StepValue (StepValue) = 0; PwM Affichage Steuerung StepValue (StepValue) = 4 * FadeSeconds (FadeSeconds); Si(currentMillis - précédentMillis > StepValue (StepValue)) { précédentMillis = currentMillis; Si (La droiteur actuelle < Cédanteur ) { La droiteur actuelle = La droiteur actuelle + 1; analogWrite (en) (BackgroundLight,La droiteur actuelle); } Autre Si (La droiteur actuelle > Cédanteur) { La droiteur actuelle = La droiteur actuelle - 1; analogWrite (en) (BackgroundLight,La droiteur actuelle); } } Si(currentMillis - précédenteMillisB > 1000) { sekundentakt précédenteMillisB = currentMillis; BattMonitoring (battMonitoring)(); publicités Si (publicités) { Si (Advertseccounter (en anglais) > Advertsecdelay Annonces) { Advertseccounter (en anglais) = 0; DisplayBankContent = DisplayBankContent + 1; Si (DisplayBankContent > AdvertMsg - 1) { DisplayBankContent = 0; } RefreshDisplay (en) = Vrai; } Autre { Advertseccounter (en anglais) = Advertseccounter (en anglais) +1; } } } } Vide DisplayBank (en) ( Octet cobancaire) { Si (cobancaire < EEPromBanks (en) ) { RefreshDisplay (en) = Vrai; Initaliser la sortie d’affichage DisplayBankContent = cobancaire; mySerial (en).println("Banque" + String(cobancaire) + " est affiché sur LCD "); MnuState (en) = 0; Sbuffer (Sbuffer) = ""; Valeur =0; mySerial (en).Rincer(); } Autre { mySerial (en).println(F("Banque non disponible.")); Valeur = 0; MnuState (en) = 0; Sbuffer (Sbuffer) = ""; mySerial (en).Rincer(); } } Vide TogglePowerSave(Boolean État) { mySerial (en).Imprimer("Powersave Mode "); Si (!État) { PowersaveMode PowersaveMode PowersaveMode Powersave = Faux; Cédanteur = 255; mySerial (en).println(F("OFF")); } Autre { PowersaveMode PowersaveMode PowersaveMode Powersave = Vrai; Cédanteur = 0; mySerial (en).println(F("SUR")); } } Vide CommutateurProcesseur() { Switchstate (Switchstate) = digitalRead (en)(SwitchPin (SwitchPin)); Si ((!Switchstate (Switchstate)) && (SwitchstateBuffer) && (Pas DisplayLock (DisplayLock)))Abfrage Schalter { SwitchstateBuffer = Faux; publicités = Faux; Empreinte directe = Faux; Lcd.noCursor (en)(); Lcd.noBlink (noBlink)(); Si (PowersaveMode PowersaveMode PowersaveMode Powersave) { TogglePowerSave(Faux); } Autre { SelectedMsg = SelectedMsg + 1; Si (SelectedMsg > EEPromBanks (en) - 1 ) { SelectedMsg = 0; } Lcd.Clair(); Lcd.setCursor(0,0); Lcd.Imprimer("Banque: " + String(SelectedMsg) + "Sélectionné"); Lcd.setCursor(0,2); Lcd.Imprimer("Système VDD: " + String(Tension) + "V"); Retard(10); Valeur = DelayTOPWROFF (en); Tandis que (digitalRead (en)(SwitchPin (SwitchPin)) == 0) { Retard(1); Si (Valeur > 0) {Valeur = Valeur - 1;}; Si (Valeur == 0 && Pas PowersaveMode PowersaveMode PowersaveMode Powersave) { TogglePowerSave(Vrai); si (SelectedMsg '0 ) - SelectedMsg ' EEPromBanks; Lcd.setCursor(0,3); Lcd.Imprimer("Power off OK"); } Lcd.setCursor(0,3); Si (Valeur > 0) {Lcd.Imprimer("Power off: " + String(Valeur /100)+ " sec ");}; } DisplayBank (en)(SelectedMsg); } } Si (Switchstate (Switchstate)) { SwitchstateBuffer = Vrai; retard(10); } } Vide Powerdown (Powerdown) () Toggle Powerdown, si voltage est critique est atteint. { Lcd.Clair(); Lcd.setCursor(0,0); Lcd.Imprimer("Battery LOW Warning"); Lcd.setCursor(0,2); Lcd.Imprimer("Chargez la batterie."); Empreinte directe = Faux; publicités = Faux; Retard(5000); TogglePowerSave(Vrai); } Vide BattMonitoring (battMonitoring)() { Int BatteryState (en); BatteryState (en) = analogRead (en)(VoltageSensingPin (en)); lire la goupille d’entrée Ajouter une moyenne des valeurs mesurées Tension = BatteryState (en) * (0.00489); Si (Tension <= MinOPVoltage) { Powerdown (Powerdown)(); } }
La Text Bank actuellement sélectionnée est maintenant affichée non seulement comme avant, mais aussi la tension d’exploitation actuelle. (dans l’image ci-dessous 4,97 volts) et un compteur qui compte à partir de 5 et arrête le système lorsque 0 est atteint. Le système est également arrêté lorsque la tension d’exploitation minimale spécifiée dans le code source est signée. Actuellement, l’écran est vidé et le rétro-éclairage éteint, mais il reste essentiellement fourni avec tension. Si vous le souhaitez, vous pouvez passer l’écran via l’effet de champ transistor également sans tension. Cependant, par souci de simplicité, je me suis abstenu de le faire.
Dans le menu lui-même, il gins la commande "cachée" "debug" qui tourne le mode débaillement sur et hors en tapant simplement la commande. La capture d’écran suivante de l’APP téléphone mobile APP "BlueTerm" que je recommande fortement pour ce projet, vous pouvez voir les sorties supplémentaires (marquée avec le préfixe "Debug:" ) qui sont la sortie lorsque le mode est allumé. Dans la capture d’écran, vous pouvez voir la sortie de débog de tous les personnages reçus via l’interface sérielle. (Ici débogé)
Après avoir reçu la commande de débog, le mode débogé est éteint et reconnu avec "Debug OFF".
Je vous souhaite beaucoup de plaisir à reconstruire. Rendez-vous bientôt pour votre prochain blog et projet. J’espère que vous avez eu autant de plaisir à reconstruire que je l’ai fait lors du développement.