Bluetooth Display - Teil 6 - AZ-Delivery

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.

DisplaysFür arduinoProjekte für fortgeschrittene

Laisser un commentaire

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

Articles de blog recommandés

  1. ESP32 jetzt über den Boardverwalter installieren - AZ-Delivery
  2. Internet-Radio mit dem ESP32 - UPDATE - AZ-Delivery
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1 - AZ-Delivery
  4. ESP32 - das Multitalent - AZ-Delivery