Bienvenue dans la quatrième partie de la série Bluetooth Display.
Dans la partie d’aujourd’hui, notre écran reçoit une autre petite extension du matériel en plus d’un élément de menu d’opérateur supplémentaire obligatoire. Avec cette nouvelle extension matérielle, les messages stockés dans la mémoire interne peuvent être récupérés via un bouton sans le menu de l’opérateur !
À cette fin, nous utilisons un autre port libre de notre microcontrôleur (compatible avec Uno R3) comme entrée. Plus précisément : nous utilisons le port 2 comme entrée. À cet apport, un bouton est relié au sol, dont la presse clé est évaluée par notre Arduino.
Mais maintenant, à la construction et la mise en œuvre réelles de l’élargissement. Dans la première étape, nous élargissons notre matériel comme indiqué dans le schéma suivant au module bouton KY-004. Au total, l’écran Bluetooth a 12 4x20 caractères mémoire texte lors de l’utilisation d’un Arduino standard.
Ceux-ci sont affichés ascendant de 0 à 11 en appuyant sur le bouton. Si le message 11 s’affiche sur l’écran et que le bouton est appuyé, le compteur renvoie au message 0.
Ensuite, pour cette extension, nous téléchargeons le code personnalisé suivant sur notre microcontrôleur :
#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 SwitchPin (SwitchPin) 2 Boutons de sélection de messages Port 12 #define DelayTOPWROFF (en) 500 EEprom Memory CellAddresses pour Configuration #define EEFadeSeconds 993 #define EEPINA (EEPINA) 996 #define EEPINC (EEPINC) 997 #define EEPINDD 998 LogicielsSerial mySerial (en)(7, 6); RX, TX 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 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; Contrôle de la lumière PWM Octet La droiteur actuelle = 0; Octet Cédanteur = 0; Octet FadeSeconds (FadeSeconds) = 0; Norme 3 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); Texte de sélection de boutons de EEprom pinMode(BackgroundLight, Sortie); Affichage Éclairage / Affichage ON /OFF digitalWrite (en)(BackgroundLight, Faible); lire Config FadeSeconds (FadeSeconds) = Eeprom.Lire(EEFadeSeconds); 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)) { MenueSelection = 0; Si ((MnuState (en) < 2) && (Inptype (Inptype) == 2)) { Sbuffer (Sbuffer).àUpperCase(); Pour faciliter les commandes } 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 (MnuState (en) == 12) { MenueSelection = 25; } Interrupteur (MenueSelection) { Cas 2: { mySerial (en).Imprimer("Echo"); EchoMode = !EchoMode; Si (EchoMode) { mySerial (en).println("SUR."); } Autre { mySerial (en).println("OFF"); } mySerial (en).println(""); mySerial (en).Rincer(); Valeur = 0; MnuState (en) = 0; Sbuffer (Sbuffer) = ""; Pause; } Cas 3: { mySerial (en).println("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(" "); mySerial (en).Rincer(); } } Sbuffer (Sbuffer) = ""; mySerial (en).println("Plus de banques EEPROM disponibles."); mySerial (en).Rincer(); Pause; } Cas 4: { Valeur = 0; mySerial (en).Imprimer("Effacement EEPROM "); mySerial (en).println("OUI/NON:"); mySerial (en).Rincer(); MnuState (en) = 1; Sbuffer (Sbuffer) = ""; Pause; } Cas 5: { Valeur = 0; mySerial (en).Imprimer("Effacement EEPROM "); mySerial (en).println("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("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("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("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("Valeur hors de portée."); } MnuState (en) = 0; Valeur = 0; Sbuffer (Sbuffer) = ""; Pause; } Cas 19: { mySerial (en).println("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 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("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("-------Smart Bluetooth Display 1.1------"); mySerial (en).println("S - Lire TOUTES les banques EEPROM"); mySerial (en).println("E - Effacer TOUTES les banques EEPROM"); mySerial (en).println("W - Eil. EEPROM Bank"); mySerial (en).println("R - Lire sel. EEPROM Bank"); mySerial (en).println("P - Imprimer EEPROM Bank sur l’affichage"); mySerial (en).println("----------------------------------------"); mySerial (en).println("D - Impression directe"); mySerial (en).println("B - Afficher Brighness Valeur actuelle: " + String (La droiteur actuelle)); mySerial (en).println("Autre: ECHO"); mySerial (en).println("----------------------------------------"); mySerial (en).println("Type Cmd et appuyez sur Entrez"); 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); 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); 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; 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; 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); } } 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("#"); } 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) - mySerial.println ("Debug : Char sur Serial reçu «); mySerial.flush(); } 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 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 Char(TBuffer (TBuffer))); mySerial (en).Rincer(); } } Autre { mySerial (en).Imprimer("#"); } Entrée de données détectée DataInput (en) = Vrai; } Retour Faux; } Retour Faux; } Vide Processeur d’affichage() Avec l’affichage bleu, l’ingestion de défilement est omise, car ceci ne « lubrifie » { Si (RefreshDisplay (en)) { Lcd.Clair(); RefreshDisplay (en) = Faux; Pour (Int B = 1; B <= LcdRows (LcdRows); B++) { Lcd.setCursor(0, B - 1); 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) Ne montrez pas de personnages spéciaux { mySerial (en).Imprimer(Char Char(Valeur)); Lcd.Imprimer(Char Char(Valeur)); } Autre { Lcd.Imprimer(Char Char(32)); } } 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; Contrôle d’affichage PWM 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) { secondes-course précédenteMillisB = currentMillis; } } 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("Banque non disponible."); Valeur = 0; MnuState (en) = 0; Sbuffer (Sbuffer) = ""; mySerial (en).Rincer(); } } Vide CommutateurProcesseur() { Switchstate (Switchstate) = digitalRead (en)(SwitchPin (SwitchPin)); Si ((!Switchstate (Switchstate)) && (SwitchstateBuffer) && (Pas DisplayLock (DisplayLock)))Commutateur de requête { SwitchstateBuffer = Faux; Empreinte directe = Faux; Lcd.noCursor (en)(); Lcd.noBlink (noBlink)(); 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); Retard(10); Valeur = DelayTOPWROFF (en); Tandis que (digitalRead (en)(SwitchPin (SwitchPin)) == 0) { Retard(1); Si (Valeur > 0) { Valeur = Valeur - 1; }; Lcd.setCursor(0, 3); } DisplayBank (en)(SelectedMsg); } Si (Switchstate (Switchstate)) { SwitchstateBuffer = Vrai; retard(10); } }
En plus de l’extension matérielle, nous avons maintenant une petite fonction d’aide dans le menu plus: La commande est "écho". Avec cela, nous commutons les caractères Echo fonction de l’interface série sur et en dehors. Pour illustrer l’impact de cela, la capture d’écran suivante éteint d’abord la fonction Echo avec la commande Echo. Cela est reconnu avec "Echo OFF". La même commande réactive la fonction Echo. (Fonction de bascule). Cela est confirmé de manière analogue avec "Echo ON". À partir de ce moment, chaque personnage d’entrée est reconnu.
Je vous souhaite beaucoup de plaisir à reconstruire et, comme toujours, jusqu’à la prochaine fois.