Bienvenue dans la troisième partie de la série Bluetooth Display. Aujourd’hui, en plus d’un élément de menu d’opérateur supplémentaire obligatoire, notre écran reçoit une petite extension du matériel! Avec cette nouvelle extension matérielle, la luminosité de fond de notre écran peut être contrôlée et configurée par un logiciel !
À cette fin, nous utilisons le port 5 de notre Uno comme puissance de modulation de largeur de pouls. Cette sortie contrôle ensuite un module pilote IRF520. Ce module, qui est également utilisé par exemple pour contrôler les moteurs, nous utilisons pour contrôler la connexion au sol des led intégrées de l’écran. (L’IRF520 passe au sol)
De cette façon, vous pouvez contrôler la luminosité de notre écran en 255 niveaux. En outre, il est également pratique à partir de notre terminal Bluetooth.
Mais maintenant, à la construction et la mise en œuvre réelles de l’élargissement. Dans un premier temps, nous étendons notre matériel comme le montre le schéma suivant à Module pilote IRF520 MOS.
Dans le circuit, la première chose qui ressort, c’est que les terminaux d’entrée et de sortie positifs de la Module pilote IRF520 MOSne sont pas occupés. Ce n’est pas une erreur de circuit, car ces terminaux / connexions du module ne sont pas nécessaires pour le fonctionnement de notre circuit, car nous obtenons la tension de fonctionnement positive pour le rétro-éclairage de l’écran via le pré-stand directement via le rail de 5 volts.
(Même dans le module lui-même, les terminaux Vin et VMD ne sont pontés et n’ont pas de composants actifs ou passifs entre les deux terminaux!)
Par conséquent, ne soyez pas irrité par le mode de commutation du module, qui diffère quelque peu de la norme.
Ensuite, pour cette extension, nous téléchargeons le code personnalisé suivant sur notre ARduino UNO :
#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 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; Octet SelectedMsg = 0; 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; Boolean EchoMode = Vrai; 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 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(BackgroundLight, Sortie); Displaybeleuchtung / Affichage AN /AUS digitalWrite (en)(BackgroundLight, Faible); lire Config FadeSeconds (FadeSeconds) = 0; 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(); 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) == "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; } Si (MnuState (en) == 13) { MenueSelection = 27; } Si (MnuState (en) == 14) { MenueSelection = 29; } Interrupteur (MenueSelection) { 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: { 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 la valeur actuelle de luminosité: " + String (La droiteur actuelle)); 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("#"); } 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); 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(); } }
Fini! Plus n’est plus nécessaire.
Après cette petite extension ou ajustement du matériel, la commande supplémentaire "B" pour brightness est maintenant disponible pour nous dans le menu Bluetooth.
-
B - Afficher la valeur actuelle de luminosité : 255
Le nombre donné derrière lui décrit la luminosité d’affichage actuellement définie dans une gamme de valeur de 0 (backlight off) à un maximum de 255 (luminosité maximale)
Nous voyons donc toujours d’un coup d’œil ce que la luminosité est actuellement fixé sur notre écran.
Si nous voulons maintenant changer la luminosité du rétroéclairage, nous sélectionnons le point "B" (Brightness) et appuyez sur Enter. On nous demande ensuite brièvement : Afficher la luminosité : (max 255) et entrez notre valeur désirée derrière elle.
Dans cet exemple, nous entrons 20 comme valeur de luminosité souhaitée)
Ceci est reconnu avec la sortie: Brightness: 20 Set. Nous voyons maintenant comment l’affichage s’assombrit à la valeur désirée.
Pour tous ceux qui sont intéressés qui veulent voir le signal PWM que notre code génère pour contrôler la luminosité, j’ai pris des captures d’écran de mon oscilloscope une fois à la valeur 20 et à la valeur 200:
Valeur: 20
Valeur:200
Comme on peut le voir, le rapport impulsion-pause du signal diffère, tandis que la fréquence reste la même. Notre œil fait la moyenne de ce ratio à une luminosité égale.
Je vous souhaite beaucoup de plaisir à reconstruire et, comme toujours, jusqu’à la prochaine fois.