Programme per taster wechseln

Hallo leute,

ich habe wenig erfahrung mit Arduino und brauche hilfe.
Ich möchte folgenden sketch so hinbekommen dass ich per tastendruck auf einen anderen loop komme, ich denke man sieht auch worauf ich hinaus will (ja ich weiss es geht auch kleiner). Aktuell funktioniert "AUS" und "AN", "BLINKEN" und "PULSIEREN" funktionieren aber nicht . Das Display Funktioniert überall, es geht nur um die LEDs

const byte AUS = 22;
const byte AN = 23;
const byte BLINKEN = 24;
const byte PULSIEREN = 25;
int x = 1;
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>

#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_WIDTH 128 // OLED display Breite, in pixels
#define SCREEN_HEIGHT 64 // OLED display Höhe, in pixels
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
const byte inputPIN1 = 50;
const byte inputPIN2 = 52;
void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // I2C address = 0x3C
  delay(1000);
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(30, 0);
  display.print("MODUS");
  display.display(); 

pinMode(2, OUTPUT);  //LED
pinMode(3, OUTPUT);  //LED
pinMode(4, OUTPUT);  //LED
pinMode(5, OUTPUT);  //LED
pinMode(6, OUTPUT); //LED
pinMode(7, OUTPUT); //LED
pinMode(8, OUTPUT);//LED
pinMode(9, OUTPUT);//LED
pinMode(10, OUTPUT);//LED
pinMode(11, OUTPUT);//LED
pinMode(12, OUTPUT);//LED
pinMode(13, OUTPUT);//LED
pinMode(AUS, INPUT);
pinMode(AN, INPUT);
pinMode(BLINKEN, INPUT);
pinMode(PULSIEREN, INPUT);
digitalWrite(2,LOW);
digitalWrite(3,LOW);
digitalWrite(4,LOW);
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(7,LOW);
digitalWrite(8,LOW);
digitalWrite(9,LOW);
digitalWrite(10,LOW);
digitalWrite(11,LOW);
digitalWrite(12,LOW);
digitalWrite(13,LOW);

}

void loop() {
  digitalRead(22);
   digitalRead(23);
   digitalRead(24);
   digitalRead(25);
   
  if (digitalRead(22) == HIGH) { digitalWrite(2,LOW); //AUS
digitalWrite(3,LOW);
digitalWrite(4,LOW);
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(7,LOW);
digitalWrite(8,LOW);
digitalWrite(9,LOW);
digitalWrite(10,LOW);
digitalWrite(11,LOW);
digitalWrite(12,LOW);
digitalWrite(13,LOW);
display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(30, 0);
  display.print("MODUS");
  display.setTextSize(2);
  display.setCursor(0, 10);
  display.print("AUS");
  display.display();

}

 if (digitalRead(23) == HIGH) { digitalWrite(2,HIGH); //AN
digitalWrite(3,HIGH);
digitalWrite(4,HIGH);
digitalWrite(5,HIGH);
digitalWrite(6,HIGH);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(11,HIGH);
digitalWrite(12,HIGH);
digitalWrite(13,HIGH);
display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(30, 0);
  display.print("MODUS");
  display.setTextSize(2);
  display.setCursor(0, 10);
  display.print("AN");
  display.display();
}

 if (digitalRead(24) == HIGH) {                        //BLINKEN
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(30, 0);
  display.print("MODUS");
  display.setTextSize(2);
  display.setCursor(0, 10);
  display.print("BLINKEN");
  display.display();
digitalWrite(2,HIGH); 
digitalWrite(3,HIGH);
digitalWrite(4,HIGH);
digitalWrite(5,HIGH);
digitalWrite(6,HIGH);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(11,HIGH);
digitalWrite(12,HIGH);
digitalWrite(13,HIGH);
delay(500);
digitalWrite(2,LOW);
digitalWrite(3,LOW);
digitalWrite(4,LOW);
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(7,LOW);
digitalWrite(8,LOW);
digitalWrite(9,LOW);
digitalWrite(10,LOW);
digitalWrite(11,LOW);
digitalWrite(12,LOW);
digitalWrite(13,LOW);
}

 if (digitalRead(25) == HIGH) {    //PULSIEREN
  
   display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(30, 0);
  display.print("MODUS");
  display.setTextSize(2);
  display.setCursor(0, 10);
  display.print("PULSIEREN");
  display.display();
  for (int i = 0; i > -1; i = i + x){
    
    analogWrite(2, i);
    analogWrite(3, i);
    analogWrite(4, i);
    analogWrite(5, i);
    analogWrite(6, i);
    analogWrite(7, i);
    analogWrite(8, i);
    analogWrite(9, i);
    analogWrite(10, i);
    analogWrite(11, i);
    analogWrite(12, i);
    analogWrite(13, i);
  
    if (i == 255) {
    x = -1; // Ändere die Richtung des Dimmens auf dem "Peek"
      // Warte 10 Millisekunden
      delay(10);
  }
  }
}
}

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden. Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

F1: Wie sind deine Taster angeschlossen?
F2: Welchen Wert haben die externen Pulldown Widerstände?

F3: Warum legst du di Konstante an verwendest sie aber im Loop aber nicht? Da sind dann Schlampigkeitsfehler vorprogrammiert.

F4: wenn du es eh besser weist, warum machst du es dennoch?

Tipp: statte deinen Sketch mit Ausgaben auf Serial aus, damit du siehst was dein Sketch macht:

So als generellen Tipp rate ich dir mal den Sketch mit STRG-T in der IDE zu formatieren.

A1: Es sind keine taster, ich habe ein funkmodul mit fernbedienung (4 Tasten A,B,C,D) kann leider nicht genau sagen was das ist
A2: ich habe keine Pulldown widerstände verbaut
A3: habe einfach vergessen diese wieder raus zu löschen
A4: weil ich erstmal nur möchte dass es läuft die größe ist mir relativ

Mit Pulldowns läufts theoretisch. Also bekommst du keine passenden Signale von deiner Fernsteuerung.

// https://forum.arduino.cc/t/programme-per-taster-wechseln/1037890
// to be deleted 2022-11

const byte ausPin = 22;
const byte anPin = 23;
const byte blinkPin = 24;
const byte pulsePin = 25;
int x = 1;

int pwm = 0; // actual pwm value

enum class State {AUS, AN, BLINK, PULSE} state;

//#include <Adafruit_SSD1306.h>
//#include <Adafruit_GFX.h>
// a reference to Serial
HardwareSerial &display = Serial;

const byte inputPIN1 = 50;
const byte inputPIN2 = 52;
void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);

  delay(1000);
  for (uint8_t i = 2; i <= 13; i++)
  {
    pinMode(i, OUTPUT);  //LED
    digitalWrite(i, LOW);
  }
  pinMode(ausPin, INPUT);
  pinMode(anPin, INPUT);
  pinMode(blinkPin, INPUT);
  pinMode(pulsePin, INPUT);
}

void loop() {

  if (digitalRead(ausPin) == HIGH)
  {
    state = State::AUS;
    for (uint8_t i = 2; i <= 13; i++)
    {
      digitalWrite(i, LOW);
    }
    display.print("MODUS");
    display.print("AUS"); display.println();
  }
  if (digitalRead(anPin) == HIGH)
  {
    state = State::AN;
    for (uint8_t i = 2; i <= 13; i++)
    {
      digitalWrite(i, HIGH);
    }
    display.print("MODUS");
    display.print("AN"); display.println();
  }
  if (digitalRead(blinkPin) == HIGH)
  {
    state = State::BLINK;
  }
  if (digitalRead(pulsePin) == HIGH)
  {
    state = State::PULSE;
  }

  if (state == State::BLINK)
  {
    display.print("MODUS");
    display.print("BLINKEN");

    for (uint8_t i = 2; i <= 13; i++)
    {
      digitalWrite(i, HIGH);
    }
    delay(500);
    for (uint8_t i = 2; i <= 13; i++)
    {
      digitalWrite(i, LOW);
    }
    delay(500);
  }

  if (state == State::PULSE)
  {
    display.print("MODUS");
    display.print("PULSIEREN"); display.println();
    pwm = pwm + x;
    if (pwm >= 255) {
      x = -1; // Ändere die Richtung des Dimmens auf dem "Peek"
      // Warte 10 Millisekunden
      delay(10);
    }
    if (pwm < 0 )
    {
      x = 1;
      delay (10);
    }
    Serial.println(pwm);
    for (uint8_t i = 2; i <= 13; i++)
    {
      analogWrite(i, pwm);
    }
  }
}

p.s.: du sollst die Konstanten nicht löschen sondern durchgängig verwenden!

Das richtige signal muss ja ankommen, das display schaltet ja um nur die LEDs tun nicht was sie sollen. Auch nicht mit Pulldown, gerade getestet

beschreib mal genau, bei welcher Taster soll was passieren - bzw. was passiert aber anders.
Wenn es anders ist als du dir vorstellst, beschreibe den Fehler.

"tun nicht was sie sollen" sagt gar nichts aus. Der Sketch auf Wokwi beweist das Gegenteil. Das tut was es soll.

Also genaue Fehleranalyse machen:
Z.B. bei Aktivierung des Eingangs AN(23) aktivierst sich die LED an PIN 2 - es sollte aber xx passieren

Bei Taster 1 AUS(22) sollen alle LEDs (2-13) Ausschalten, Display zeigt an AUS : Funktioniert
Bei Taster 2 AN(23) sollen alle LEDs konstant Leuchten, Display zeigt an AN : Funktioniert

Bei Taster 3 Blinken(24) sollen alle LEDs Blinken mit ca 500ms pause, Display zeigt an BLINKEN : hier leuchten die LEDs ca 500ms auf und schalten dann aus und bleiben aus, Display Funktioniert

Bei Taster 4 PULSIEREN(25) sollen die LEDs von Dunkel auf hell Dimmen und dann andersherum, vonn hell auf dunkel, Display zeigt an PULSIEREN : Hier bleiben die LEDs Dunkel, Display Funktioniert

#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_WIDTH 128 // OLED display Breite, in pixels
#define SCREEN_HEIGHT 64 // OLED display Höhe, in pixels
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

enum {aus, an, blinken, pulsen};
byte status = aus;
byte lastStatus = 255;
const byte tastNums = 4;
const byte tastPin[tastNums] = {22, 23, 24, 25};
const byte ledNums = 12;
const byte ledPin[ledNums] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
int ledPWM = 0;

const byte inputPIN1 = 50;
const byte inputPIN2 = 52;
void setup()
{
  // put your setup code here, to run once:
  Serial.begin(115200);
  Serial.println(F("Start..."));
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // I2C address = 0x3C
  delay(1000);
  for (byte b = 0; b < ledNums; b++)
  {
    digitalWrite(b, LOW);
    pinMode(b, OUTPUT);  //LED
  }
  for (byte b = 0; b < tastNums; b++)
  {
    digitalWrite(b, LOW);
    pinMode(b, INPUT);  //LED
  }
}

void loop()
{
  tasteRead();
  switch (status)
  {
    case an:
      ledAn();
      break;
    case aus:
      ledAus();
      break;
    case blinken:
      ledBlinken(500);
      break;
    case pulsen:
      if (lastStatus != status)
      { ledPWM = 0; }
      ledPulsen(10);
      break;
  }
  if (lastStatus != status)
  {
    lastStatus = status;
    printDisplay();
  }
}

void tasteRead()
{
  for (byte b = 0; b < tastNums; b++)
  {
    if (digitalRead(b))
    { status = b; }
  }
}

void ledAn()
{
  for (byte b = 0; b < ledNums; b++)
  {
    digitalWrite(b, HIGH);
  }
}

void ledAus()
{
  for (byte b = 0; b < ledNums; b++)
  {
    digitalWrite(b, LOW);
  }
}

void ledBlinken(const uint32_t intervall)
{
  static uint32_t lastMillis = 0;
  if (millis() - lastMillis > intervall * 2)
  { lastMillis = millis(); }
  for (byte b = 0; b < ledNums; b++)
  {
    if (millis() - lastMillis < intervall)
    {
      digitalWrite(b, HIGH);
    }
    else if (millis() - lastMillis > intervall)
    {
      digitalWrite(b, LOW);
    }
  }
}

void ledPulsen(const uint32_t intervall)
{
  static int x = 1;
  static uint32_t lastMillis = 0;
  if (millis() - lastMillis > intervall)
  {
    lastMillis = millis();
    for (byte b = 0; b < ledNums; b++)
    { analogWrite(b, ledPWM); }
    ledPWM += x;
    if (ledPWM == 255)
    { x = -1; }// Ändere die Richtung des Dimmens auf dem "Peek"
    if (ledPWM == -1)
    {
      x = 1;
      ledPWM = 0;
    }
  }
}

void printDisplay()
{
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(30, 0);
  display.print("MODUS");
  display.setTextSize(2);
  display.setCursor(0, 10);
  switch (status)
  {
    case an:
      display.print(F("AN"));
      break;
    case aus:
      display.print(F("AUS"));
      break;
    case blinken:
      display.print(F("BLINKEN"));
      break;
    case pulsen:
      display.print(F("PULSIEREN"));
      break;
  }
  display.display();
}

Danke dafür, leider funktioniert das so nicht. Die LEDs blinken wie wild und das Display springt schnell durch die anzeigen

Beim Pulsieren leuchten die LEDs jetzt schwach, ich kann aber dann taster drücken wie ich will es bleibt dabei also kein wechsel der modi. Beim Blinken ist es wie vorher leuchtet kurz und dann aus

Dann stimmt Dein Eingang nicht.
Kommentiere die Zeile tasteRead() aus.
Vor dem setup() ist oben die Initialisierung byte status=aus.
Stell den auf blinken.
Dann blinkt es nach dem hochladen.
Stell den auf pulsen, dann macht der das Licht auf und ab.

Wenn das geht, kümmer ich mich um Dein readTaster(), da ich nicht weiss, was Du da hast, werde ich raten.

Ich habe es getestet, beim Blinken leuchten LED (12),(2) und (3) nicht.
Beim pulsen die (12) nicht.

Was meinst du woran das liegen kann mit dem eingang was soll ich da prüfen ?

Das geht nicht.
Ich nehm alles zurück. Da fehlt noch was.

#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_WIDTH 128 // OLED display Breite, in pixels
#define SCREEN_HEIGHT 64 // OLED display Höhe, in pixels
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

enum {aus, an, blinken, pulsen};
byte status = blinken;
byte lastStatus = 255;
const byte tastNums = 4;
const byte tastPin[tastNums] = {22, 23, 24, 25};
const byte ledNums = 12;
const byte ledPin[ledNums] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
int ledPWM = 0;

const byte inputPIN1 = 50;
const byte inputPIN2 = 52;
void setup()
{
  // put your setup code here, to run once:
  Serial.begin(115200);
  Serial.println(F("Start..."));
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // I2C address = 0x3C
  delay(1000);
  for (byte b = 0; b < ledNums; b++)
  {
    digitalWrite(ledPin[b], LOW);
    pinMode(ledPin[b], OUTPUT);  //LED
  }
  for (byte b = 0; b < tastNums; b++)
  {
    digitalWrite(tastPin[b], LOW);
    pinMode(tastPin[b], INPUT);  //LED
  }
}

void loop()
{
  //tasteRead();
  switch (status)
  {
    case an:
      ledAn();
      break;
    case aus:
      ledAus();
      break;
    case blinken:
      ledBlinken(500);
      break;
    case pulsen:
      if (lastStatus != status)
      { ledPWM = 0; }
      ledPulsen(10);
      break;
  }
  if (lastStatus != status)
  {
    lastStatus = status;
    printDisplay();
  }
}

void tasteRead()
{
  for (byte b = 0; b < tastNums; b++)
  {
    if (digitalRead(tastPin[b]))
    { status = b; }
  }
}

void ledAn()
{
  for (byte b = 0; b < ledNums; b++)
  {
    digitalWrite(ledPin[b], HIGH);
  }
}

void ledAus()
{
  for (byte b = 0; b < ledNums; b++)
  {
    digitalWrite(ledPin[b], LOW);
  }
}

void ledBlinken(const uint32_t intervall)
{
  static uint32_t lastMillis = 0;
  if (millis() - lastMillis > intervall * 2)
  { lastMillis = millis(); }
  for (byte b = 0; b <= ledNums; b++)
  {
    if (millis() - lastMillis < intervall)
    {
      digitalWrite(ledPin[b], HIGH);
    }
    else if (millis() - lastMillis > intervall)
    {
      digitalWrite(ledPin[b], LOW);
    }
  }
}

void ledPulsen(const uint32_t intervall)
{
  static int x = 1;
  static uint32_t lastMillis = 0;
  if (millis() - lastMillis > intervall)
  {
    lastMillis = millis();
    for (byte b = 0; b < ledNums; b++)
    { analogWrite(ledPin[b], ledPWM); }
    ledPWM += x;
    if (ledPWM == 255)
    { x = -1; }// Ändere die Richtung des Dimmens auf dem "Peek"
    if (ledPWM == -1)
    {
      x = 1;
      ledPWM = 0;
    }
  }
}

void printDisplay()
{
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(30, 0);
  display.print("MODUS");
  display.setTextSize(2);
  display.setCursor(0, 10);
  switch (status)
  {
    case an:
      display.print(F("AN"));
      break;
    case aus:
      display.print(F("AUS"));
      break;
    case blinken:
      display.print(F("BLINKEN"));
      break;
    case pulsen:
      display.print(F("PULSIEREN"));
      break;
  }
  display.display();
}
1 Like

Mein aufbau ist ziemlich wild da blickt man so nicht durch aber hier mal ein bild von dem funkempfänger den ich an den inputs habe

jetzt leuchten alle LEDs

Schick.
Dann jetzt mal die tastenabfrage wieder einkommentieren.

VIELEN DANK JETZT FUNKTIONIERT AUCH DIE UMSCHALTUNG :smile:

1 Like

Na bitte.
Alles schick :wink:
Viel Erfolg beim Code analysieren. :wink:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.