Écran Bluetooth - Teil 4

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.

Affichage Bluetooth - Partie 4 - Diagramme câblé

 

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.

Partie 4 - Menu d’affichage

 

Je vous souhaite beaucoup de plaisir à reconstruire et, comme toujours, jusqu’à la prochaine fois.

EtalagesPour arduinoProjets pour avancéCapteurs

Laisser un commentaire

Tous les commentaires sont modérés avant d'être publiés

Messages de blogs recommandés

  1. Installez maintenant ESP32 via l'administrateur de la carte
  2. Lüftersteuerung Raspberry Pi
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1
  4. ESP32 - das Multitalent
  5. OTA-Over the Air-ESP Programmation par WiFi