Hi Leute
Ich versuche gerade mithilfe dieses Videos ein Menü zu bauen.
Eigentlich funktioniert auch alles ganz gut. Nur habe ich Probleme eine zurück Taste mit einzubinden.
Hier der Code
/* Sketch for Tutorial 14
Author: Maximilian Hentsch
Sketch zu Arduino Tutorial 14 - Displaymenü
https://www.youtube.com/watch?v=DuAG98P9Seo
*/
#include <Wire.h>
#include <Adafruit_INA219.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(16,17,5,18,23,19);
Adafruit_INA219 ina219;
int upButton = 4;
int downButton = 2;
int selectButton = 15;
int exitButton = 0;
int menu = 1;
int menuA = 1;
void setup() {
Serial.begin(115200);
while (!Serial) {
// will pause Zero, Leonardo, etc until serial console opens
delay(1);
}
uint32_t currentFrequency;
// Initialize the INA219.
if (! ina219.begin()) {
Serial.println("Failed to find INA219 chip");
while (1) { delay(10); }
}
// To use a slightly lower 32V, 1A range (higher precision on amps):
ina219.setCalibration_32V_1A();
// Or to use a lower 16V, 400mA range (higher precision on volts and amps):
//ina219.setCalibration_16V_400mA();
Serial.println("Measuring voltage and current with INA219 ...");
lcd.begin(16, 2);
pinMode(upButton, INPUT_PULLUP);
pinMode(downButton, INPUT_PULLUP);
pinMode(selectButton, INPUT_PULLUP);
pinMode(exitButton, INPUT_PULLUP);
updateMenu();
}
void loop() {
delay(500);
if (!digitalRead(downButton)){
menu++;
updateMenu();
delay(100);
while (!digitalRead(downButton));
}
if (!digitalRead(upButton)){
menu--;
updateMenu();
delay(100);
while(!digitalRead(upButton));
}
if (!digitalRead(selectButton)){
executeAction();
updateMenu();
delay(100);
while (!digitalRead(selectButton));
}
}
void updateMenu() {
switch (menu) {
case 0:
menu = 1;
break;
case 1:
lcd.clear();
lcd.print(">Aktuell");
lcd.setCursor(0, 1);
lcd.print(" Vorauswahl");
break;
case 2:
lcd.clear();
lcd.print(" Aktuell");
lcd.setCursor(0, 1);
lcd.print(">Vorauswahl");
break;
case 3:
lcd.clear();
lcd.print(">MenuItem3");
lcd.setCursor(0, 1);
lcd.print(" MenuItem4");
break;
case 4:
lcd.clear();
lcd.print(" MenuItem3");
lcd.setCursor(0, 1);
lcd.print(">MenuItem4");
break;
case 5:
menu = 4;
break;
}
}
void executeAction() {
switch (menu) {
case 1:
Aktuell();
break;
case 2:
Vorauswahl();
break;
case 3:
action3();
break;
case 4:
action4();
break;
}
}
void Aktuell() {
//lcd.clear();
float shuntvoltage = 0;
float busvoltage = 0;
float current_mA = 0;
float loadvoltage = 0;
float power_mW = 0;
shuntvoltage = ina219.getShuntVoltage_mV();
busvoltage = ina219.getBusVoltage_V();
current_mA = ina219.getCurrent_mA();
power_mW = ina219.getPower_mW();
loadvoltage = busvoltage + (shuntvoltage / 1000);
//Serial ausgabe
Serial.print("Bus Voltage: "); Serial.print(busvoltage); Serial.println(" V");
Serial.print("Shunt Voltage: "); Serial.print(shuntvoltage); Serial.println(" mV");
Serial.print("Load Voltage: "); Serial.print(loadvoltage); Serial.println(" V");
Serial.print("Current: "); Serial.print(current_mA); Serial.println(" mA");
Serial.print("Power: "); Serial.print(power_mW); Serial.println(" mW");
Serial.println("");
// LCD ausgabe
lcd.begin(16, 2);
//lcd.clear();
lcd.print("Aktuell:");
lcd.print(current_mA);
lcd.print("mA");
lcd.setCursor(0,1);
lcd.print(busvoltage);
lcd.print("V");
lcd.print(" ");
lcd.print(power_mW);
lcd.print("mW");
delay(2000);
if (!digitalRead(exitButton)){
updateMenu();
delay(100);
while (!digitalRead(exitButton));
}
else{
Aktuell();
}
}
void Vorauswahl() {
delay(500);
if (!digitalRead(downButton)){
menuA++;
auswahlMenu();
delay(100);
while (!digitalRead(downButton));
}
if (!digitalRead(upButton)){
menuA--;
auswahlMenu();
delay(100);
while(!digitalRead(upButton));
}
if (!digitalRead(selectButton)){
executeActionA();
auswahlMenu();
delay(100);
while (!digitalRead(selectButton));
}
else{
auswahlMenu();
delay(100);
}
}
void auswahlMenu() {
switch (menuA) {
case 0:
menuA = 1;
auswahlMenu();
case 1:
lcd.clear();
lcd.print(">12V 5W");
lcd.setCursor(0, 1);
lcd.print(" 12V 10W");
Vorauswahl();
case 2:
lcd.clear();
lcd.print(" 12V 5W");
lcd.setCursor(0, 1);
lcd.print(">12V 10W");
Vorauswahl();
case 3:
lcd.clear();
lcd.print(">MenuItem3");
lcd.setCursor(0, 1);
lcd.print(" MenuItem4");
Vorauswahl();
case 4:
lcd.clear();
lcd.print(" MenuItem3");
lcd.setCursor(0, 1);
lcd.print(">MenuItem4");
Vorauswahl();
case 5:
menuA = 4;
auswahlMenu();
}
}
void executeActionA() {
switch (menuA) {
case 1:
Aktuell();
break;
case 2:
Vorauswahl();
break;
case 3:
action3();
break;
case 4:
action4();
break;
}
}
}
Das soll die zurück Funktion sein.
if (!digitalRead(exitButton)){
updateMenu();
delay(100);
while (!digitalRead(exitButton));
}
Immer wen ich den Knopf drücke, um zurück ins Hauptmenü zu kommen ist das Hauptmenü nur so lange da wie ich den Knopf gedrückt halte. Sobald ich ihn loslasse, springt das Programm zurück an die stelle, wo die if Funktion ist und macht dann mit void Vorauswahl() weiter.
Kann mir bitte jemand sagen wie ich das verhindern kann?