Dynamisches Arduino LCD-Menü

Das folgende Dynamic Arduino LCD-Menü ist einfach zu bedienen, leicht zu bearbeiten und zu erweitern. Sie können beliebig viele Menüpunkte hinzufügen. Geben Sie einfach die Menüpunkte ein, schreiben Sie die entsprechende Funktion und fertig. All dies zu Beginn der Arduino-Skizze, müssen Sie nicht im Code suchen, wo die Code-Schnipsel eingefügt werden sollen. Dies kann sowohl für Anfänger als auch für Fortgeschrittene eine gute Lösung sein, wenn Sie schnell ein LCD-Menü erstellen müssen.

Eine ordnungsgemäße externe Stromversorgung wird dringend empfohlen. Die Stromversorgung des USB-Anschlusses ist gering, um das LCD-Display und das Arduino UNO mit Strom zu versorgen. Sie können auch andere Boards verwenden, z. B. Arduino Nano, Mini, Leonardo, Mega oder ESP 8266, ESP32, je nachdem, was für Sie geeignet ist.

Es ist sehr einfach zu bedienen. Geben Sie im Array MenuItems [] String die Namen der Menüelemente ein und geben Sie die Funktion für das Menüelement in eine if () -Statement in der Funktion menuFunctions () ein. Die Bedingung für if () muss die Seriennummer des Menüelements sein. Das war’s, Sie können das dynamische Arduino-Menü verwenden.

Ich habe einige Beispiele in die Arduino-Skizze geschrieben. Sie können sie löschen oder umschreiben. Ich habe sie nur als Richtlinien zum leichteren Verständnis gedacht.

Aus irgendeinem Grund funktionierte die Funktion lcd.clear () auf einer meiner 4 x 20-Zeichen-LCDs nicht. Die Verwendung der Funktion lcd.noBacklight () löste das Problem. Dieses LCD-Modul verfügt über den PCF8574A-Expander-IC mit der I2C-Adresse „0x3F“. Das andere 4 x 20-stellige LCD-Display ist über den PCF8574-IC mit der Adresse „0x27“ mit dem I2C-Bus verbunden. Dies ist die zweite perfekt funktioniert.

Das erste Beispiel war ein 4 x 20-Zeichen-LCD-Display.

/**************************************/
/*      https://myhomethings.eu       */
/*                                    */
/**************************************/

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x3F, 20, 4);   // I2C Adresse: "0x3F" oder "0x27"

const byte upButtonPin = 4;
const byte downButtonPin = 5;
const byte rightButtonPin = 6;
const byte leftButtonPin = 7;
const byte tweeterPin = 9;
const byte ledPin = 13;
const byte ledPin_fade = 10; 
int fade = 0;


String MenuItems[] = {  // Ihre Menüpunkte
  "LED Switch",
  "LED Brightness",
  "menuitem 3",
  "menuitem 4",
  "menuitem 5",
  "menuitem 6" 
  // und so weiter…
};

void menuFunctions(int menu, byte right, byte left)  // Ihre Menüfunktionen
{
  if(menu == 1) // Beispielfunktion für 1. Menüpunkt
  {
    if(right == 1)
    {
      lcd.setCursor(0, 3);
      lcd.print("Off   ");
      lcd.setCursor(10, 3);
      lcd.print("On  <<");
      digitalWrite(ledPin, HIGH);
    }
    if(left == 1)
    {
      lcd.setCursor(0, 3);
      lcd.print("Off <<");
      lcd.setCursor(10, 3);
      lcd.print("On    ");
      digitalWrite(ledPin, LOW);
    }
  }
  if(menu == 2) // Beispielfunktion für 2. Menüpunkt  
  {
    if(right == 1)
    {
      fade += 20;
      if(fade >= 255)
      {
        fade = 255;
      }
    }
    if(left == 1)
    {
      fade -= 20;
      if(fade <= 0)
      {
        fade = 0;
      }
    }
    lcd.setCursor(0, 3);
    lcd.print("Brightness:     ");
    lcd.setCursor(12, 3);
    lcd.print(fade);
    analogWrite(ledPin_fade, fade);
  }
  if(menu == 3)
  {
    lcd.setCursor(0,2);
    lcd.print("Hello Menu Item 3");
  }
  // und so weiter…
}


/***  nicht ändern  ***********************************************/
template< typename T, size_t NumberOfSize > 
size_t MenuItemsSize(T (&) [NumberOfSize]){ return NumberOfSize; }
int numberOfMenuItems = MenuItemsSize(MenuItems) - 1;
int currentMenuItem = 0;
int previousMenuItem = 1;
byte button_flag = 0;
unsigned long previousMillis = millis();
const int note = 4699;
void beepsOnce()
{
  tone(tweeterPin, note, 125);
  delay(60);
  noTone(tweeterPin);
}
/*******************************************************************/

void setup()
{
  pinMode(ledPin, OUTPUT);
  pinMode(ledPin_fade, OUTPUT);

  /************************************/
  pinMode(upButtonPin, INPUT_PULLUP);
  pinMode(downButtonPin, INPUT_PULLUP);
  pinMode(rightButtonPin, INPUT_PULLUP);
  pinMode(leftButtonPin, INPUT_PULLUP);
  
  lcd.begin();
  //lcd.noBacklight();
  lcd.clear();
  lcd.setCursor(2, 1);
  lcd.print("myhomethings.eu");
  lcd.setCursor(0, 3);
  lcd.print("Simple Dynamic Menu");
  delay(5000);
  lcd.clear();
}

void loop() 
{
  if(digitalRead(rightButtonPin) == LOW && button_flag == 0)
  {
    menuFunctions(currentMenuItem + 1, 1, 0);
    button_flag = 1;
    previousMillis = millis();
    beepsOnce();
  }
  if(digitalRead(leftButtonPin) == LOW && button_flag == 0)
  {
    menuFunctions(currentMenuItem + 1, 0, 1);
    button_flag = 1;
    previousMillis = millis();
    beepsOnce();
  }
  if(digitalRead(upButtonPin) == LOW && button_flag == 0)
  {
    ++currentMenuItem;
    if(currentMenuItem > numberOfMenuItems )
    {
      currentMenuItem = numberOfMenuItems ;
    }
    button_flag = 1;
    previousMillis = millis();
    beepsOnce();
  }
  else if(digitalRead(downButtonPin) == LOW && button_flag == 0)
  {
    currentMenuItem--;
    if(currentMenuItem < 0)
    {
      currentMenuItem = 0;
    }
    button_flag = 1;
    previousMillis = millis();
    beepsOnce();
  }
  if(currentMenuItem != previousMenuItem)
  {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Menu Item:");
    lcd.setCursor(0, 1);
    lcd.print(MenuItems [currentMenuItem]);
    menuFunctions(currentMenuItem + 1, 0, 0);
    previousMenuItem = currentMenuItem;
  }
  if(millis() - previousMillis >= 400) 
  {
    previousMillis = millis();
    button_flag = 0;
  }
}

werbung – amazon.de

Das folgende Beispiel zeigt ein Arduino-Menü für ein 2 x 16-stelliges LCD-Display:

/**************************************/
/*      https://myhomethings.eu       */
/*                                    */
/**************************************/

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);   // I2C Adresse: "0x3F" oder "0x27"

const byte upButtonPin = 4;
const byte downButtonPin = 5;
const byte rightButtonPin = 6;
const byte leftButtonPin = 7;
const byte tweeterPin = 9;
const byte ledPin = 13;
const byte ledPin_fade = 10; 
int fade = 0;


String MenuItems[] = {  // Ihre Menüpunkte
  "LED Switch",
  "LED Brightness",
  "menuitem 3",
  "menuitem 4",
  "menuitem 5",
  "menuitem 6" 
  // und so weiter…
};

void menuFunctions(int menu, byte right, byte left)  // Ihre Menüfunktionen
{
  if(menu == 1) // Beispielfunktion für 1. Menüpunkt  
  {
    if(right == 1)
    {
      lcd.setCursor(0, 1);
      lcd.print("Off   ");
      lcd.setCursor(10, 1);
      lcd.print("On  <<");
      digitalWrite(ledPin, HIGH);
    }
    if(left == 1)
    {
      lcd.setCursor(0, 1);
      lcd.print("Off <<");
      lcd.setCursor(10, 1);
      lcd.print("On    ");
      digitalWrite(ledPin, LOW);
    }
  }
  if(menu == 2) // Beispielfunktion für 2. Menüpunkt
  {
    if(right == 1)
    {
      fade += 20;
      if(fade >= 255)
      {
        fade = 255;
      }
    }
    if(left == 1)
    {
      fade -= 20;
      if(fade <= 0)
      {
        fade = 0;
      }
    }
    lcd.setCursor(0, 1);
    lcd.print("Brightness:     ");
    lcd.setCursor(12, 1);
    lcd.print(fade);
    analogWrite(ledPin_fade, fade);
  }
  if(menu == 3)
  {
    lcd.setCursor(0, 1);
    lcd.print("Hello Menu Item 3");
  }
  // und so weiter… 
}


/***  nicht ändern  ***********************************************/
template< typename T, size_t NumberOfSize > 
size_t MenuItemsSize(T (&) [NumberOfSize]){ return NumberOfSize; }
int numberOfMenuItems = MenuItemsSize(MenuItems) - 1;
int currentMenuItem = 0;
int previousMenuItem = 1;
byte button_flag = 0;
unsigned long previousMillis = millis();
const int note = 4699;
void beepsOnce()
{
  tone(tweeterPin, note, 125);
  delay(60);
  noTone(tweeterPin);
}
/*******************************************************************/

void setup()
{
  pinMode(ledPin, OUTPUT);
  pinMode(ledPin_fade, OUTPUT);

  /************************************/
  pinMode(upButtonPin, INPUT_PULLUP);
  pinMode(downButtonPin, INPUT_PULLUP);
  pinMode(rightButtonPin, INPUT_PULLUP);
  pinMode(leftButtonPin, INPUT_PULLUP);
  
  lcd.begin();
  // lcd.noBacklight();
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Simple");
  lcd.setCursor(3, 1);
  lcd.print("Dynamic Menu");
  delay(3000);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("myhomethings.eu");
  delay(5000);
  lcd.clear();
}

void loop() 
{
  if(digitalRead(rightButtonPin) == LOW && button_flag == 0)
  {
    menuFunctions(currentMenuItem + 1, 1, 0);
    button_flag = 1;
    previousMillis = millis();
    beepsOnce();
  }
  if(digitalRead(leftButtonPin) == LOW && button_flag == 0)
  {
    menuFunctions(currentMenuItem + 1, 0, 1);
    button_flag = 1;
    previousMillis = millis();
    beepsOnce();
  }
  if(digitalRead(upButtonPin) == LOW && button_flag == 0)
  {
    ++currentMenuItem;
    if(currentMenuItem > numberOfMenuItems )
    {
      currentMenuItem = numberOfMenuItems ;
    }
    button_flag = 1;
    previousMillis = millis();
    beepsOnce();
  }
  else if(digitalRead(downButtonPin) == LOW && button_flag == 0)
  {
    currentMenuItem--;
    if(currentMenuItem < 0)
    {
      currentMenuItem = 0;
    }
    button_flag = 1;
    previousMillis = millis();
    beepsOnce();
  }
  if(currentMenuItem != previousMenuItem)
  {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print(MenuItems [currentMenuItem]);
    menuFunctions(currentMenuItem + 1, 0, 0);
    previousMenuItem = currentMenuItem;
  }
  if(millis() - previousMillis >= 400) 
  {
    previousMillis = millis();
    button_flag = 0;
  }
}

Ich hoffe, Ihnen hat dieser Artikel gefallen. Ähnliche Arduino-Skizzen finden Sie unter dem folgenden Link. Viele Spaß.

ESP32, ESP8266, Arduino-Skizzen, Beispiele

SP8266 Vierkanal Wifi Relais IOT Smart Home Handy APP Fernbedienung
ESP32-CAM-MB 2640 Kameramodul WiFi Bluetooth-Entwicklungsplatine, USB auf serielle Port

werbung

ESP8266 ESP-01S mit USB-Adapter WLAN WiFi Modul