Bluetooth-Display - AZ-Delivery

In het eerste deel van het blog van vandaag, bouwen we een vrij configureerbaar Bluetooth LCD-scherm. Via een serieel Bluetooth-profiel bieden we de Bluetooth-client een ASCII-menu dat kan worden gebruikt om het LCD-scherm volledig te bedienen. Verder zullen we het menu uitbreiden over de blogonderdelen en nieuwe (comfort) functies installeren. In het eerste deel van de serie bouwen we het selectiemenu en implementeren we een directe serie om invoer weer te geven die de getypte letters karakter voor karakter rechtstreeks naar onze display uitvoert. We gebruiken het controleteken "Enter" om de weergaveregels (1-4) te wijzigen en de invoerreeks te beëindigen, evenals het controleteken "Backspace" om eerdere onjuiste vermeldingen te verwijderen. We zullen de functie een naam geven in het menu "Direct Print". Om de Bluetooth-verbinding tot stand te brengen, kan een Bluetooth-adapter op de pc in combinatie met een terminalprogramma zoals "Putty" worden gebruikt, evenals een compatibele mobiele telefoon-APP die een serieel Bluetooth-profiel ondersteunt. We gebruiken de bekende Bluetooth-module HC 05 om de seriële interface over te dragen naar de Bluetooth-standaard.

We kijken naar de onderdelenlijst van ons project:

1x Bluetooth HC-05 module

1x HD44780 LCD-scherm 4x20

1x trimmer potentiometer max. Weerstand 10kΩ1

1x 130Ω weerstandstolerantie ± 5%

1x Uno R3-kaarttype UNO R3 ATmega328P

Voor dit project zijn niet veel onderdelen vereist en de bedrading van de afzonderlijke componenten is beperkt.

We uploaden de volgende code naar onze Arduino UNO:

 

# opnemen <SoftwareSerieel.h>
# opnemen <Vloeibaar Kristal.h>

#define MaxInputBufferSize 20 // maximaal 255 tekens aanpassen aan vlcdr
#define rLcdChr 20
#define LcdRijen 4
#define interval 1000

SoftwareSerieel mySerial(7, 6); // RX, TX
Vloeibaar Kristal lcd(8, 13, 12, 11, 10, 9);

// variabelen

// Seriële invoerafhandeling
char TBuffer;
char Cbuffer[MaxInputBufferSize+1];       // USB-code invoerbuffer
String Sbuffer = "";                      // USB string invoerbuffer
int waarde;                                // USB numerieke invoerbuffer
int  MnuState = 0;
byte Ccount = 0;                          // Aantal ontvangen tekens
byte Inptype = 0;
Boolean StrInput = fout;
Boolean Nummer Input = fout;
Boolean Data-invoer = fout;
Boolean Enter-invoer = fout;
byte Menu selectie = 0;
// Geef foutopsporingsinformatie via de seriële interface
Boolean DebugMode = fout;
Boolean EchoMode = waar;
// Displaybeheer
Boolean Directprint = fout;
byte DirectprintROW = 0;
byte DirectprintLine = 0;

Boolean Vernieuwen Display = fout;

nietig instellen()    {    lcd.beginnen(rLcdChr, LcdRijen);   lcd.duidelijk();   lcd.setCursor(0, 0);   lcd.afdrukken("Bluetooth");   lcd.setCursor(0, 1);   lcd.afdrukken("Display");   mySerial.beginnen(9600);   lcd.setCursor(0, 0);   mySerial.blozen();
}

nietig Seriële opdracht Processor()
{
int een;
Inptype = 0;
Inptype = SerInputHandler();
// 0 geen teruggave 
// 1 nummer 
// 2 string 
// 3 gegevens
als ((Inptype > 0) & (!Directprint))               {    Menu selectie = 0;    als ((MnuState < 2) && (Inptype == 2)) {Sbuffer.toUpperCase(); } // Voor eenvoudig invoeren van opdrachten    als ((Sbuffer == "D") && (MnuState == 0) && (Inptype == 2))       { Menu selectie = 15;}    schakelaar (Menu selectie)      {        geval 15:        {        // Directe afdruk afdrukken        Directprint = waar;        mySerial.println ("Directprint AAN.");        als (Directprint)        {        DirectprintROW = 0;        DirectprintLine = 0;        lcd.duidelijk();        lcd.cursor();        lcd.knipperend();        }        waarde = 0;             Sbuffer = "";        MnuState = 0;        pauze;         }        standaard:        {          mySerial.println("------- Smart Bluetooth Display 1.0 ------");          mySerial.println("D - Direct afdrukken");          mySerial.println("----------------------------------------");          mySerial.println("Typ Cmd en druk op Enter");          mySerial.blozen();          MnuState = 0;          waarde = 0;          Sbuffer = "";        }           }      } // invoer herkend
// invoerbuffer
}

Boolean CheckforserialEvent()
{   terwijl (mySerial.beschikbaar()) {      // haal de nieuwe byte:      TBuffer = mySerial.lezen();       als (TBuffer > 9 && TBuffer < 14)        {         Cbuffer[Ccount] = 0;         TBuffer =0;         als (EchoMode)           {            mySerial.afdrukken(char(13));            mySerial.blozen();          }            als (Directprint)           {           mySerial.println("");           DirectprintLine = 0;           DirectprintROW = DirectprintROW + 1;           als ( DirectprintROW > 3)            {                     Directprint = fout;                    lcd.noCursor();                    lcd.noBlink();                    Sbuffer = "";                    waarde = 0;                                 } anders            {           lcd.cursor();           lcd.knipperen();           lcd.setCursor(0,DirectprintROW);           }           }          Enter-invoer = waar;           terug waar;      } anders als (TBuffer > 47 && TBuffer <58 )       {        als ( Ccount < MaxInputBufferSize)           {             Cbuffer[Ccount] = TBuffer;               Ccount++;             als ((Directprint))               {                  lcd.afdrukken(char(TBuffer));                  DirectprintLine = DirectprintLine + 1;                  als ( Ccount > MaxInputBufferSize -1)                   {                    lcd.noCursor();                    lcd.noBlink();                    } anders {                    lcd.cursor();                    lcd.knipperen();                    }                                 }                      als (EchoMode) {              mySerial.afdrukken(char(TBuffer));              mySerial.blozen();             }            } anders {mySerial.afdrukken("#"); }            // Nummerinvoer gedetecteerd       Nummer Input = waar;       }        anders als (TBuffer > 64 && TBuffer < 123 )       {        als ( Ccount < MaxInputBufferSize)           {             Cbuffer[Ccount] = TBuffer;               Ccount++;             als ((Directprint))               {                  lcd.afdrukken(char(TBuffer));                                 DirectprintLine = DirectprintLine + 1;                  als ( Ccount > MaxInputBufferSize -1)                   {                    lcd.noCursor();                    lcd.noBlink();                    } anders {                    lcd.cursor();                    lcd.knipperen();                    }                       }                als (EchoMode) {              mySerial.afdrukken(char(TBuffer));              mySerial.blozen();             }            } anders {mySerial.afdrukken("#"); }       // Char Char Char Input gedetecteerd       StrInput = waar;      }     anders als ( (TBuffer == 127 )  |  (TBuffer == 8 ) )          {                       als ( DirectprintLine > 0 )                  {                  DirectprintLine = DirectprintLine - 1;                  lcd.setCursor(DirectprintLine, DirectprintROW);                   lcd.afdrukken(" ");                  lcd.setCursor(DirectprintLine, DirectprintROW);                   }                                                       als (( DirectprintLine == 0 ) & ( DirectprintROW > 0 ))                  {                  DirectprintROW = DirectprintROW - 1;                   DirectprintLine = rLcdChr -1;                  lcd.setCursor(DirectprintLine, DirectprintROW);                   }          als ( Ccount > 0)           {             Ccount--;             Cbuffer[Ccount] = 0;             als ((Directprint))               {                  als ( Ccount > MaxInputBufferSize -1)                   {                    lcd.noCursor();                    lcd.noBlink();                    } anders {                    lcd.cursor();                    lcd.knipperen();                    }                       }                      als (EchoMode) {              mySerial.afdrukken("-");              mySerial.blozen();             }            }        }          anders         {                      als ( Ccount < MaxInputBufferSize)           {             Cbuffer[Ccount] = TBuffer;               Ccount++;              als ((Directprint))               {                  DirectprintLine = DirectprintLine + 1;                  als (TBuffer < 128) {lcd.afdrukken(char(TBuffer)); } anders  {lcd.afdrukken(Draad(TBuffer)); }                  als ( Ccount > MaxInputBufferSize -1)                   {                    lcd.noCursor();                    lcd.noBlink();                    } anders {                    lcd.cursor();                    lcd.knipperen();                    }                       }                als (EchoMode) {              mySerial.afdrukken(char(TBuffer));              mySerial.blozen();             }            } anders {mySerial.afdrukken("#"); }       // Gegevensinvoer gedetecteerd       Data-invoer = waar;       }      terug fout;      }     terug fout;   }    nietig ClearCBuffer ()

{
 voor (byte een= 0; MaxInputBufferSize -1;een++)   Cbuffer[een] = 0;
}    byte SerInputHandler()
{
byte resultaat = 0;
int c;
int d;
int een;
int b;
resultaat = 0;
als (CheckforserialEvent())     {       als ((Nummer Input) en niet (Data-invoer)en niet (StrInput))     //Alleen nummers        {        Sbuffer = "";        waarde = 0;        StrInput = fout;        Nummer Input = fout;        Data-invoer = fout;        Enter-invoer = fout;         een = 0;        b = 0;        c = 0;        d = 0;        Sbuffer = Cbuffer; // Zahl wird AUCH! in SBUFFER �bernommen, valt ten goede.        als (Ccount == 1) { waarde  = Cbuffer[0]- 48 ; }        als (Ccount == 2) {           een = Cbuffer[0] - 48 ;           een = een * 10;          b = Cbuffer[1] - 48 ;          waarde = een + b;          }        als (Ccount == 3) {           een = Cbuffer[0] - 48 ;           een = een * 100;          b = Cbuffer[1] - 48 ;          b = b * 10;          c = Cbuffer[2] - 48 ;          waarde = een + b + c;          }        als (Ccount == 4) {           een = Cbuffer[0] - 48 ;           een = een * 1000;          b = Cbuffer[1] - 48 ;          b = b * 100;          c = Cbuffer[2] - 48 ;          c = c * 10;          d = Cbuffer[3] - 48 ;          waarde = een + b + c + d;          }        als (Ccount >= 5)            {            Sbuffer = "";            waarde = 0;            Sbuffer = Cbuffer;            ClearCBuffer;            resultaat = 2;             } anders           {            ClearCBuffer;            Ccount = 0;            resultaat = 1;                                                // Nummer retourcode            Nummer Input = fout;            StrInput = fout;            Data-invoer = fout;            Enter-invoer = fout;             Ccount = 0;            terug resultaat;            }        }      als ((StrInput) en niet (Data-invoer))                          // Alleen stringinvoer        {        Sbuffer = "";        Sbuffer = Cbuffer;        waarde = 0;        StrInput = fout;        Nummer Input = fout;        Data-invoer = fout;        Enter-invoer = fout;         Ccount = 0;        ClearCBuffer;        resultaat = 2;                                                 // Nummer retourcode        }       als (Data-invoer) {        Sbuffer = "";        Sbuffer = Cbuffer;        waarde = 0;        StrInput = fout;        Nummer Input = fout;        Data-invoer = fout;        Enter-invoer = fout;         Ccount = 0;        ClearCBuffer;        resultaat = 3;                                               // Nummer retourcode        }        als ((Enter-invoer) en niet (StrInput) en niet (Nummer Input) en niet (Data-invoer))        {        Sbuffer = "";        waarde = 0;        Ccount = 0;        ClearCBuffer;        resultaat = 4;                                               // Nummer retourcode        }             Nummer Input = fout;    StrInput = fout;    Data-invoer = fout;    Enter-invoer = fout;     Ccount = 0;    terug resultaat;     } 
terug resultaat;          // Einde CheckforSerialEvent
}


// ###################################################################################################### //

nietig lus() 

{
Seriële opdracht Processor();
}

// ###################################################################################################### //

Na het uploaden van de code maken we nu verbinding met onze Arduino via de Bluetooth-module en een serieel Bluetooth-profiel. We krijgen het volgende menu na het indrukken van de "Enter" -toets:

We typen nu de letter "D" en drukken vervolgens op "Enter":

Een bevestiging volgt dat "Directprint" is ingeschakeld. Alles wat we nu typen, wordt direct en zonder vertraging weergegeven op het LCD-scherm en bevestigd op de seriële interface. We 'zien' wat we in de terminal schrijven en kunnen ook typefouten corrigeren met 'Backspace'.

Een belangrijke opmerking: de code voor deze functie van de display die in dit deel wordt beschreven, kan behoorlijk complex lijken. De pure functie zou ook mogelijk zijn met eenvoudige code. Sommige delen van de code zijn al geoptimaliseerd of voorbereid voor de volgende delen van de reeks.

Sommige delen van de code kunnen dit verklaren alleen in de volgende delen

 

Nu wens ik je veel plezier met de replicatie en tot de volgende keer.

DisplaysFür arduinoProjekte für anfänger

Laat een reactie achter

Alle opmerkingen worden voor publicatie gecontroleerd door een moderator

Aanbevolen blogberichten

  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