Nella prima parte del blog multiparte di oggi, costruiamo un display LCD Bluetooth liberamente configurabile. Tramite un profilo Bluetooth seriale, forniamo al client Bluetooth un menu ASCII, attraverso il quale il display LCD è completamente controllabile. Inoltre, espanderemo il menu tra le parti del blog e installeremo nuove funzioni (comfort). Nella prima parte della serie, costruiamo il menu di selezione e implementiamo un numero di serie diretto per visualizzare l'input che restituisce le lettere digitate carattere per carattere direttamente visibili al nostro display. Usiamo il carattere di controllo "Enter" per cambiare le righe di visualizzazione (1-4) e per completare la sequenza di input, così come il carattere di controllo "Backspace" per eliminare le voci non corrette precedenti. Chiameremo la funzione "Direct Print" nel menu. Per stabilire la connessione Bluetooth, un adattatore Bluetooth sul PC può essere utilizzato in combinazione con un programma terminale come "Putty", così come un telefono cellulare compatibile APP che supporta un profilo Bluetooth seriale. Per trasferire l'interfaccia seriale allo standard Bluetooth, utilizziamo il noto modulo Bluetooth HC 05.
Diamo un'occhiata alla lista delle parti del nostro progetto:
1x (in modo non il Modulo Bluetooth HC-05
1x (in modo non il HD44780 Display LCD 4x20
1x Trimmer Potentiometer Massima Resistenza 10k.1
Tolleranza di resistenza 1x 130" -5%
1x (in modo non il Scheda Uno R3 Tipo UNO R3 ATmega328P
Non sono necessarie molte parti per questo progetto, e anche la connessione dei singoli componenti è limitata.
Carichiamo il seguente codice sul nostro Arduino UNO:
#include <SoftwareSerialseriale.H> #include <LiquidoCristallo.H> # define MaxInputBufferSize 20 massimo 255 caratteri per adattarsi a vlcdr # define rLcdChr 20 # define LcdRows (informazioni in base ai colori in 4 # define Intervallo 1000 SoftwareSerialseriale mySerial(7, 6); RX, TX LiquidoCristallo Lcd(8, 13, 12, 11, 10, 9); Variabili Gestione dell'input seriale Char TBuffer (TBuffer); Char Cbuffer (Cbuffer)[MaxInputBufferSize+1]; Buffer di input codice USB Stringa Buffer = ""; Buffer di input stringa USB Int Valore; USB Nummeric Input Buffer Int MnuState = 0; Byte Conteggio cconteggio = 0; Numero ricevuto Chars Byte Inptype (Inptype) = 0; Boolean StrInput = False; Boolean NumeroIngresso = False; Boolean DataInput (Input dati) = False; Boolean Input enter = False; Byte MenueSelezione = 0; Fornire informazioni di debug tramite l'interfaccia seriale Boolean DebugMode (Modalità Debug) = False; Boolean Modalità Echo = Vero; Gestione del display Boolean Impronta diretta = False; Byte Stampa direttaROW = 0; Byte Stampa direttaLinea = 0; Boolean AggiornaVisualizzazione = False; Vuoto Installazione() { Lcd.Iniziare(rLcdChr, LcdRows (informazioni in base ai colori in); Lcd.Chiaro(); Lcd.Setcursor(0, 0); Lcd.Stampare(Bluetooth "); Lcd.Setcursor(0, 1); Lcd.Stampare(" Visualizza "); mySerial.Iniziare(9600); Lcd.Setcursor(0, 0); mySerial.sciacquone(); } Vuoto SerialcommandProcessore() { Int Un; Inptype (Inptype) = 0; Inptype (Inptype) = SerInputHandler(); 0 nessun ritorno 1 numero 2 Stringa 3 Dati Se ((Inptype (Inptype) > 0) & (!Impronta diretta)) { MenueSelezione = 0; Se ((MnuState < 2) && (Inptype (Inptype) == 2)) {Buffer.Caso toupper(); } Per facilitare l'immissione dei comandi Se ((Buffer == "D" (D)) && (MnuState == 0) && (Inptype (Inptype) == 2)) { MenueSelezione = 15;} Interruttore (MenueSelezione) { Caso 15: { PPrint diretto da visualizzare Impronta diretta = Vero; mySerial.println ("Directprint ON."); Se (Impronta diretta) { Stampa direttaROW = 0; Stampa direttaLinea = 0; Lcd.Chiaro(); Lcd.Cursore(); Lcd.Lampeggiare(); } Valore = 0; Buffer = ""; MnuState = 0; Pausa; } Predefinito: { mySerial.println("-------Smart Bluetooth Display 1.0------"); mySerial.println("D - Stampa diretta"); mySerial.println("----------------------------------------"); mySerial.println("Digitare Cmd e premere Invio"); mySerial.sciacquone(); MnuState = 0; Valore = 0; Buffer = ""; } } } Ingresso rilevato Buffer di input } Boolean VerificaforserialE() { Mentre (mySerial.Disponibile()) { Ottenere il nuovo byte: TBuffer (TBuffer) = mySerial.Leggere(); Se (TBuffer (TBuffer) > 9 && TBuffer (TBuffer) < 14) { Cbuffer (Cbuffer)[Conteggio cconteggio] = 0; TBuffer (TBuffer) =0; Se (Modalità Echo) { mySerial.Stampare(Char(13)); mySerial.sciacquone(); } Se (Impronta diretta) { mySerial.println(""); Stampa direttaLinea = 0; Stampa direttaROW = Stampa direttaROW + 1; Se ( Stampa direttaROW > 3) { Impronta diretta = False; Lcd.noCursor (Cursore)(); Lcd.noBlink(); Buffer = ""; Valore = 0; } Altro { Lcd.Cursore(); Lcd.Lampeggiare(); Lcd.Setcursor(0,Stampa direttaROW); } } Input enter = Vero; Ritorno Vero; } Altro Se (TBuffer (TBuffer) > 47 && TBuffer (TBuffer) <58 ) { Se ( Conteggio cconteggio < MaxInputBufferSize) { Cbuffer (Cbuffer)[Conteggio cconteggio] = TBuffer (TBuffer); Conteggio cconteggio++; Se ((Impronta diretta)) { Lcd.Stampare(Char(TBuffer (TBuffer))); Stampa direttaLinea = Stampa direttaLinea + 1; Se ( Conteggio cconteggio > MaxInputBufferSize -1) { Lcd.noCursor (Cursore)(); Lcd.noBlink(); } Altro { Lcd.Cursore(); Lcd.Lampeggiare(); } } Se (Modalità Echo) { mySerial.Stampare(Char(TBuffer (TBuffer))); mySerial.sciacquone(); } } Altro {mySerial.Stampare("#"); } Numero Ingresso rilevato NumeroIngresso = Vero; } Altro Se (TBuffer (TBuffer) > 64 && TBuffer (TBuffer) < 123 ) { Se ( Conteggio cconteggio < MaxInputBufferSize) { Cbuffer (Cbuffer)[Conteggio cconteggio] = TBuffer (TBuffer); Conteggio cconteggio++; Se ((Impronta diretta)) { Lcd.Stampare(Char(TBuffer (TBuffer))); Stampa direttaLinea = Stampa direttaLinea + 1; Se ( Conteggio cconteggio > MaxInputBufferSize -1) { Lcd.noCursor (Cursore)(); Lcd.noBlink(); } Altro { Lcd.Cursore(); Lcd.Lampeggiare(); } } Se (Modalità Echo) { mySerial.Stampare(Char(TBuffer (TBuffer))); mySerial.sciacquone(); } } Altro {mySerial.Stampare("#"); } Rilevato input carattere carattere StrInput = Vero; } Altro Se ( (TBuffer (TBuffer) == 127 ) | (TBuffer (TBuffer) == 8 ) ) { Se ( Stampa direttaLinea > 0 ) { Stampa direttaLinea = Stampa direttaLinea - 1; Lcd.Setcursor(Stampa direttaLinea, Stampa direttaROW); Lcd.Stampare(" "); Lcd.Setcursor(Stampa direttaLinea, Stampa direttaROW); } Se (( Stampa direttaLinea == 0 ) & ( Stampa direttaROW > 0 )) { Stampa direttaROW = Stampa direttaROW - 1; Stampa direttaLinea = rLcdChr -1; Lcd.Setcursor(Stampa direttaLinea, Stampa direttaROW); } Se ( Conteggio cconteggio > 0) { Conteggio cconteggio--; Cbuffer (Cbuffer)[Conteggio cconteggio] = 0; Se ((Impronta diretta)) { Se ( Conteggio cconteggio > MaxInputBufferSize -1) { Lcd.noCursor (Cursore)(); Lcd.noBlink(); } Altro { Lcd.Cursore(); Lcd.Lampeggiare(); } } Se (Modalità Echo) { mySerial.Stampare("-"); mySerial.sciacquone(); } } } Altro { Se ( Conteggio cconteggio < MaxInputBufferSize) { Cbuffer (Cbuffer)[Conteggio cconteggio] = TBuffer (TBuffer); Conteggio cconteggio++; Se ((Impronta diretta)) { Stampa direttaLinea = Stampa direttaLinea + 1; Se (TBuffer (TBuffer) < 128) {Lcd.Stampare(Char(TBuffer (TBuffer))); } Altro {Lcd.Stampare(Stringa(TBuffer (TBuffer))); } Se ( Conteggio cconteggio > MaxInputBufferSize -1) { Lcd.noCursor (Cursore)(); Lcd.noBlink(); } Altro { Lcd.Cursore(); Lcd.Lampeggiare(); } } Se (Modalità Echo) { mySerial.Stampare(Char(TBuffer (TBuffer))); mySerial.sciacquone(); } } Altro {mySerial.Stampare("#"); } Immissione dati rilevata DataInput (Input dati) = Vero; } Ritorno False; } Ritorno False; } Vuoto ClearCBuffer (Buffer Di ClearC) () { Per (byte Un= 0; MaxInputBufferSize -1;Un++) Cbuffer (Cbuffer)[Un] = 0; } byte SerInputHandler() { byte Risultato = 0; Int C; Int D; Int Un; Int B; Risultato = 0; Se (VerificaforserialE()) { Se ((NumeroIngresso) E Non (DataInput (Input dati))E Non (StrInput)) Solo numeri { Buffer = ""; Valore = 0; StrInput = False; NumeroIngresso = False; DataInput (Input dati) = False; Input enter = False; Un = 0; B = 0; C = 0; D = 0; Buffer = Cbuffer (Cbuffer); AUCH wird ! in SBUFFER bernommen, cade ben tigt. Se (Conteggio cconteggio == 1) { Valore = Cbuffer (Cbuffer)[0]- 48 ; } Se (Conteggio cconteggio == 2) { Un = Cbuffer (Cbuffer)[0] - 48 ; Un = Un * 10; B = Cbuffer (Cbuffer)[1] - 48 ; Valore = Un + B; } Se (Conteggio cconteggio == 3) { Un = Cbuffer (Cbuffer)[0] - 48 ; Un = Un * 100; B = Cbuffer (Cbuffer)[1] - 48 ; B = B * 10; C = Cbuffer (Cbuffer)[2] - 48 ; Valore = Un + B + C; } Se (Conteggio cconteggio == 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 ; Valore = Un + B + C + D; } Se (Conteggio cconteggio >= 5) { Buffer = ""; Valore = 0; Buffer = Cbuffer (Cbuffer); ClearCBuffer (Buffer Di ClearC); Risultato = 2; } Altro { ClearCBuffer (Buffer Di ClearC); Conteggio cconteggio = 0; Risultato = 1; Numero Codice restituito NumeroIngresso = False; StrInput = False; DataInput (Input dati) = False; Input enter = False; Conteggio cconteggio = 0; Ritorno Risultato; } } Se ((StrInput) E Non (DataInput (Input dati))) Solo input stringa { Buffer = ""; Buffer = Cbuffer (Cbuffer); Valore = 0; StrInput = False; NumeroIngresso = False; DataInput (Input dati) = False; Input enter = False; Conteggio cconteggio = 0; ClearCBuffer (Buffer Di ClearC); Risultato = 2; Numero Codice restituito } Se (DataInput (Input dati)) { Buffer = ""; Buffer = Cbuffer (Cbuffer); Valore = 0; StrInput = False; NumeroIngresso = False; DataInput (Input dati) = False; Input enter = False; Conteggio cconteggio = 0; ClearCBuffer (Buffer Di ClearC); Risultato = 3; Numero Codice restituito } Se ((Input enter) E Non (StrInput) E Non (NumeroIngresso) E Non (DataInput (Input dati))) { Buffer = ""; Valore = 0; Conteggio cconteggio = 0; ClearCBuffer (Buffer Di ClearC); Risultato = 4; Numero Codice restituito } NumeroIngresso = False; StrInput = False; DataInput (Input dati) = False; Input enter = False; Conteggio cconteggio = 0; Ritorno Risultato; } Ritorno Risultato; Fine controlloforSerialEvent } // ###################################################################################################### // Vuoto Ciclo() { SerialcommandProcessore(); } // ###################################################################################################### //
Dopo aver caricato il codice, ora ci colleghiamo tramite il modulo Bluetooth e con un profilo Bluetooth seriale sul nostro Arduino. Otteniamo il seguente menu dopo aver premuto il pulsante "Invio":
Ora digitiamo la lettera "D" e premiamo "Invio":
Di seguito è riportata una conferma che "Directprint" è stato attivato. Tutto ciò che digitiamo ora viene visualizzato direttamente e senza indugio sia nel display LCD che nell'interfaccia seriale. Quindi "vediamo" nel terminale ciò che scriviamo e possiamo anche correggere gli battidi dei cerbioni con "backspace".
Una nota importante: Per questa funzione del display descritto in questa parte, il codice può sembrare abbastanza complesso. La funzione pure potrebbe anche essere realizzata con codice più semplice. Inoltre, alcune parti del codice sono già state ottimizzate o preparate per le seguenti parti della serie.
Le singole sezioni del codice possono essere spiegate solo nelle seguenti parti:
Ora vi auguro un sacco di divertimento ricreando e fino alla prossima volta.