Hallo Arduino-Gemeinde, hab ein Problem im Prog. und bräuchte bitte Hilfe zur Lösung.
Ich möchte mit Hilfe eines Menüs ein UnterProgramm mit dem Mittel Button des Poti`s in eine Schleife Starten und wieder Stopen um wieder ins Menü zurück zukommen, leider hänge ich in der Schleife fest oder ich Rufe nur auf ohne Funktion komme aber ins Menü zurück.
Ich möchte aber das Unterprog. zum auslesen in Loop haben.
Schlage mich schon eine ganze Weile damit rum ohne auf die Lösung zukommen.
Den Sketch habe ich aus verschiedenen Teilen zusammen gebaut und läuft bis auf die Schleifen sache
mit den Stop und zurück.
Ich bin für jeden Tipp dankbar. Meine Programmierkenntnisse sind nur Amateurhaft also keine super komplizierten Fragen stellen bitte.
// - MP---encoder----
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
#include <ClickEncoder.h>
#include <TimerOne.h>
const int fontSize = 18;
int ledPin = 12;
int menuitem = 1;
int frame = 1;
int page = 1;
int lastMenuItem = 1;
String menuItem1 = " Akku ";
String menuItem2 = " Spannung ";
String menuItem3 = " LED: An";
boolean Led1 = true;
int selectedDifficulty = 0;
boolean up = false;
boolean down = false;
boolean middle = false;
//int middle = false;
ClickEncoder *encoder;
int16_t last, value;
int analogInput1 = A1;
int analogInput2 = A2;
void setup() {
pinMode(analogInput1, INPUT);
pinMode(analogInput2, INPUT);
pinMode(12,OUTPUT);
Led1An();
encoder = new ClickEncoder(2,3,4); //--- Anschüsse Encoder---
encoder->setAccelerationEnabled(false);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.begin();
Timer1.initialize(1000);
Timer1.attachInterrupt(timerIsr);
last = encoder->getValue();
}
void loop() {
drawMenu();
readRotaryEncoder();
ClickEncoder::Button b = encoder->getButton(); // Drehregler Anfang
if (b != ClickEncoder::Open) {
switch (b) {
case ClickEncoder::Clicked: // Mitte auf an
middle=true;
break;
}
}
if (up && page == 1 ) { // zum hoch scroll
up = false; //--Hoch---
if(menuitem==2 && frame ==2)
{
frame--;
}
if(menuitem==3 && frame ==3)
{
frame--;
}
lastMenuItem = menuitem;
menuitem--;
if (menuitem==0)
{
menuitem=1;
}
}
if (down && page == 1) { // zum runter scroll
down = false; //---Runter---
if(menuitem==2 && lastMenuItem == 1)
{
frame ++;
}
else if(menuitem==4 && lastMenuItem == 3 && frame!=2)
{
frame ++;
}
lastMenuItem = menuitem;
menuitem++;
if (menuitem==4) // ---abschluß immer einen mehr
{
menuitem--;
}
}
//------------------------------Mittel Knopf drücken---------------------------------
if (middle)
{
middle = false;
if(page == 1 && menuitem ==1) // ----Aufruf Prog. 1
{
while(middle = true) // --- Unter Prog. Start-----
{
spannung1();
// if(!digitalRead(middle)) break;
// delay(100);
// return;
}
}
else if(page == 1 && menuitem ==2) // ---- Aufruf Prog. 2
{
spannung2();
}
if (page == 1 && menuitem==3) //---- Auruf Led An/AUS (LED)
{
if (Led1)
{
Led1 = false;
menuItem3 = "Led: Aus";
Led1Aus();
}
else
{
Led1 = true;
menuItem3 = "Led: An";
Led1An();
}
}
else if (page == 1 && menuitem<=3) {
page=2;
}
else if (page == 2)
{
page=1;
}
}
}
void drawMenu()
{
if (page ==1)
{
display.setTextSize(1); // ----- Haupt Menü -----
display.clearDisplay();
display.setTextColor(WHITE);
display.setCursor(25,5);
display.print("Haupt - Menu");
display.drawFastHLine(0,15,120,WHITE);
if(menuitem == 1 && frame == 1)
{
displayMenuItem(menuItem1, 20,true);
displayMenuItem(menuItem2, 35,false);
displayMenuItem(menuItem3, 50,false);
}
else if(menuitem == 2 && frame == 1)
{
displayMenuItem(menuItem1, 20,false);
displayMenuItem(menuItem2, 35,true);
displayMenuItem(menuItem3, 50,false);
}
else if(menuitem == 3 && frame == 1)
{
displayMenuItem(menuItem1, 20,false);
displayMenuItem(menuItem2, 35,false);
displayMenuItem(menuItem3, 50,true); //--letzte Unten
}
else if(menuitem == 3 && frame == 2)
{
displayMenuItem(menuItem1, 20,false);
displayMenuItem(menuItem2, 35,false);
displayMenuItem(menuItem3, 50,true);
}
else if(menuitem == 2 && frame == 2)
{
displayMenuItem(menuItem1, 20,false);
displayMenuItem(menuItem2, 35,true);
displayMenuItem(menuItem3, 50,false);
}
else if(menuitem == 1 && frame == 2)
{
displayMenuItem(menuItem1, 20,true);
displayMenuItem(menuItem2, 35,false);
displayMenuItem(menuItem3, 50,false); //---letzte Oben
}
display.display();
}
}
void spannung1(){
display.clearDisplay();
display.setTextSize(2);
display.setCursor(4,0);
display.setTextColor(WHITE);
display.println("AKKU-Check"); // A1 Eingang
display.setTextSize(1);
display.setCursor(4,30);
display.setTextColor(WHITE);
display.setTextSize(3);
display.setTextSize(3);
int sensorValue = analogRead(analogInput1);
// Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):
float voltage = sensorValue * (5.0 / 1023.0);
// print out the value you read:
display.print(voltage); display.println("V");
display.display();
display.clearDisplay();
}
void spannung2()
{
display.clearDisplay();
display.setTextSize(2);
display.setCursor(4,0);
display.setTextColor(WHITE);
display.println("Span-Check"); // A2 Eingang
display.setTextSize(1);
display.setCursor(4,30);
display.setTextColor(WHITE);
display.setTextSize(3);
display.setTextSize(3);
int sensorValue = analogRead(analogInput2);
float voltage = sensorValue * (5.0 / 1023.0);
display.print(voltage); display.println("V");
display.display();
display.clearDisplay();
}
void Led1An() //------------------ Anschluß 12 An/AUS
{
digitalWrite(12,LOW);
}
void Led1Aus()
{
digitalWrite(12,HIGH);
}
void timerIsr() {
encoder->service();
}
void displayStringMenuPage(String menuItem, String value)
{
display.setTextSize(1);
display.clearDisplay();
display.setTextColor(WHITE);
display.setCursor(15, 0);
display.print(menuItem);
display.drawFastHLine(0,10,83,WHITE);
display.setCursor(5, 18);
display.print("Wert");
display.setTextSize(3);
display.setCursor(10, 40);
display.print(value);
display.setTextSize(3);
display.display();
}
void displayMenuItem(String item, int position, boolean selected)
{
if(selected)
{
display.setTextColor(BLACK,WHITE); //-------- Menue Pfeil Strich !!!
}else
{
display.setTextColor(WHITE,BLACK);
}
display.setCursor(0, position);
display.print("->"+item);
}
void readRotaryEncoder() // -- entprell---
{
value += encoder->getValue();
if (value/2 > last) {
last = value/2;
down = true;
delay(150);
}else if (value/2 < last) {
last = value/2;
up = true;
delay(150);
}
}