INHALT
Schauen wir uns an, wie man ein Menü auf einem LCD 1602 I2C Display erstellt. Wir werden zwei Beispiele vorstellen: ein Menü zur Aktivierung der LEDs und ein Menü zur Steuerung der Helligkeit der LEDs. Wir empfehlen Ihnen, sich über den Anschluss des LCD 1602 Arduino-Displays und des Encoder-Moduls an den Arduino zu informieren. Wenn Sie diese Module bereits angeschlossen haben, können Sie dieses Miniprojekt starten.
Bestandteile:
- Arduino Uno / Arduino Nano / Arduino Mega
- 1602 LCD-Display mit I2C
- Rotary Encoder Modul KY-040
- LEDs und Widerstände
- Breadboard
- Dupont-Kabel
- Bibliothek LiquidCrystal_I2C.h und RotaryEncoder.h
Die Menübeispiele mit Encoder-Modul und LCD-Display 1602 mit i2c auf dieser Seite können an Ihre Bedürfnisse angepasst werden. Viele Arduino-Projekte erfordern, dass der Benutzer in der Lage ist, ein Gerät auf dem Mikrocontroller zu konfigurieren oder zu steuern. Der Encoder ermöglicht es Ihnen, ein einfaches und natives Menü auf dem LCD-Display zu machen, um LEDs, Mikro-Servo Arduino oder für andere Aufgaben zu steuern.
Erstellen von Menüs auf dem LCD-Display Arduino
LCD 1602 i2c | Arduino Uno | Arduino Nano | Arduino Mega |
GND | GND | GND | GND |
VCC | 5V | 5V | 5V |
SDA | A4 | A4 | 20 |
SCL | A5 | A5 | 21 |
Im ersten einfachen Beispiel hat das Display-Menü drei Punkte, die durch Drehen des Encoder-Knopfes geändert werden können. Wenn der Drehknopf gedrückt wird, wird die ausgewählte RGB-LED-Farbe aktiviert. Abhängig von der Position des Cursors auf dem Display wird die gewünschte Farbe mit Hilfe der bedingten if-Anweisung eingeschaltet. Bauen Sie die Schaltung wie im Bild gezeigt auf und laden Sie das Programm.
Programm für Menü auf LCD-Display 1602 mit Encoder
#include "Wire.h" #include "LiquidCrystal_I2C.h" LiquidCrystal_I2C LCD(0x27, 16, 2); #include "RotaryEncoder.h" RotaryEncoder encoder(4, 5); // DT, CLK #define STEPS 6 #define POSMIN 0 #define POSMAX 12 int lastPos, newPos; boolean buttonWasUp = true; void setup() { LCD.init(); LCD.backlight(); pinMode(9, OUTPUT); // LED blue pinMode(10, OUTPUT); // LED green pinMode(11, OUTPUT); // LED red pinMode(2, INPUT_PULLUP); // SW Serial.begin(9600); encoder.setPosition(10 / STEPS); } void loop() { LCD.setCursor(0, 0); LCD.print("LED1 LED2 LED3"); encoder.tick(); newPos = encoder.getPosition() * STEPS; if (newPos < POSMIN) { encoder.setPosition(POSMIN / STEPS); newPos = POSMIN; } else if (newPos > POSMAX) { encoder.setPosition(POSMAX / STEPS); newPos = POSMAX; } if (lastPos != newPos) { Serial.println(newPos); LCD.setCursor(lastPos, 1); LCD.print(" "); LCD.setCursor(newPos, 1); LCD.print("===="); lastPos = newPos; } boolean buttonIsUp = digitalRead(2); if (buttonWasUp && !buttonIsUp) { delay(10); buttonIsUp = digitalRead(2); if (!buttonIsUp && newPos == 0) { digitalWrite(9,HIGH); digitalWrite(10,LOW); digitalWrite(11,LOW); } if (!buttonIsUp && newPos == 6) { digitalWrite(9,LOW); digitalWrite(10,HIGH); digitalWrite(11,LOW); } if (!buttonIsUp && newPos == 12) { digitalWrite(9,LOW); digitalWrite(10,LOW); digitalWrite(11,HIGH); } } }
- Die Cursorposition auf dem LCD kann drei Werte annehmen – 0, 6 oder 12;
- Die Encodertaste ist über eine Pin-Konfiguration mit dem Parameter INPUT_PULLUP an den digitalen Port angeschlossen, so dass der Druck der Taste gelesen werden kann.
Im folgenden Beispiel hat das Menü eine zweite Ebene, in der die Helligkeit jeder LED separat eingestellt werden kann. Das Umschalten von einem Menü zum anderen erfolgt durch Drücken der Encodertaste, wodurch sich der Wert der globalen Variable w im Skript ändert. Der Anschluss der LEDs und Module an den Mikrocontroller bleibt gleich wie im Bild oben, es muss nur der folgende Programmcode in die Platine geladen werden.
Programm für Zweistufiges Menü auf LCD-Display 1602
#include "Wire.h" #include "LiquidCrystal_I2C.h" LiquidCrystal_I2C LCD(0x27, 16, 2); #include "RotaryEncoder.h" RotaryEncoder encoder(4, 5); // DT, CLK #define STEPS 6 #define POSMIN 0 #define POSMAX 12 #define STEPS_2 10 #define POSMIN_2 0 #define POSMAX_2 250 int lastPos, newPos; boolean buttonWasUp = true; byte w = 2; void setup() { LCD.init(); LCD.backlight(); pinMode(9, OUTPUT); // LED blue pinMode(10, OUTPUT); // LED green pinMode(11, OUTPUT); // LED red pinMode(2, INPUT_PULLUP); // SW Serial.begin(9600); encoder.setPosition(10 / STEPS); } void loop() { while (w == 0) { LCD.setCursor(0, 0); LCD.print("LED1 LED2 LED3"); encoder.tick(); newPos = encoder.getPosition() * STEPS; if (newPos < POSMIN) { encoder.setPosition(POSMIN / STEPS); newPos = POSMIN; } else if (newPos > POSMAX) { encoder.setPosition(POSMAX / STEPS); newPos = POSMAX; } if (lastPos != newPos) { Serial.println(newPos); LCD.setCursor(lastPos, 1); LCD.print(" "); LCD.setCursor(newPos, 1); LCD.print("===="); lastPos = newPos; } boolean buttonIsUp = digitalRead(2); if (buttonWasUp && !buttonIsUp) { delay(10); buttonIsUp = digitalRead(2); if (!buttonIsUp && newPos == 0) { LCD.clear(); delay(500); w = 1; } if (!buttonIsUp && newPos == 6) { LCD.clear(); delay(500); w = 2; } if (!buttonIsUp && newPos == 12) { LCD.clear(); delay(500); w = 3; } } } // VERSCHACHTELTES MENÜ MIT EINEM ERSTEN LED while (w == 1) { LCD.setCursor(0, 0); LCD.print("LED1 - "); encoder.tick(); newPos = encoder.getPosition() * STEPS_2; if (newPos < POSMIN_2) { encoder.setPosition(POSMIN_2 / STEPS_2); newPos = POSMIN_2; } else if (newPos > POSMAX_2) { encoder.setPosition(POSMAX_2 / STEPS_2); newPos = POSMAX_2; } if (lastPos != newPos) { LCD.setCursor(7, 0); LCD.print(newPos); analogWrite(9, newPos); } boolean buttonIsUp = digitalRead(2); if (buttonWasUp && !buttonIsUp) { delay(10); buttonIsUp = digitalRead(2); if (!buttonIsUp) { LCD.clear();digitalWrite(9,LOW);delay(500);w=0; } } } // VERSCHACHTELTES MENÜ MIT EINER ZWEITEN LED while (w == 2) { LCD.setCursor(0, 0); LCD.print("LED2 - "); encoder.tick(); newPos = encoder.getPosition() * STEPS_2; if (newPos < POSMIN_2) { encoder.setPosition(POSMIN_2 / STEPS_2); newPos = POSMIN_2; } else if (newPos > POSMAX_2) { encoder.setPosition(POSMAX_2 / STEPS_2); newPos = POSMAX_2; } if (lastPos != newPos) { LCD.setCursor(7, 0); LCD.print(newPos); analogWrite(10, newPos); } boolean buttonIsUp = digitalRead(2); if (buttonWasUp && !buttonIsUp) { delay(10); buttonIsUp = digitalRead(2); if (!buttonIsUp) { LCD.clear();digitalWrite(10,LOW);delay(500);w=0; } } } // VERSCHACHTELTES MENÜ MIT EINER DRITTEN LED while (w == 3) { LCD.setCursor(0, 0); LCD.print("LED3 - "); encoder.tick(); newPos = encoder.getPosition() * STEPS_2; if (newPos < POSMIN_2) { encoder.setPosition(POSMIN_2 / STEPS_2); newPos = POSMIN_2; } else if (newPos > POSMAX_2) { encoder.setPosition(POSMAX_2 / STEPS_2); newPos = POSMAX_2; } if (lastPos != newPos) { LCD.setCursor(7, 0); LCD.print(newPos); analogWrite(11, newPos); } boolean buttonIsUp = digitalRead(2); if (buttonWasUp && !buttonIsUp) { delay(10); buttonIsUp = digitalRead(2); if (!buttonIsUp) { LCD.clear();digitalWrite(11,LOW);delay(500);w=0; } } } }
- Für jeden Menüabschnitt wird eine while-Schleife verwendet, da zu Beginn die globale Variable w=0; ist, wird eine while-Schleife (w == 0) ausgeführt;
- Wenn Sie nicht wollen, dass die LEDs beim Verlassen des Hauptmenüs ausgeschaltet werden, löschen Sie den Befehl digitalWrite() in allen Untermenü-Schleifen.
Schlussfolgerung. Wir haben uns zwei Beispiele für die Erstellung eines Menüs mit einem Drehgeber auf dem Display 1602 angesehen. Wenn Sie das Wesen der Menüsteuerung mit einem Encoder begriffen haben, können Sie die vorgestellten Beispiele leicht in Ihren eigenen Projekten mit dem Arduino-Display verwenden. Wenn Sie noch Fragen zu diesem Thema haben, können Sie diese in den Kommentaren zu diesem Beitrag stellen.
Schreibe einen Kommentar