Bluetooth-Display

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.

DisplaysFür arduinoProjekte für anfänger

Einen Kommentar hinterlassen

Alle Kommentare werden vor der Veröffentlichung moderiert

Post di blog consigliati

  1. Installa ESP32 ora dal gestore del consiglio di amministrazione
  2. Lüftersteuerung Raspberry Pi
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1
  4. ESP32 - das Multitalent
  5. OTA - Over the Air - Programmazione ESP tramite WLAN