[Gelöst] Problem mit delay und Taster

Hallo

Ich bin noch neu in dem ganzem Thema habe aber schon einige einfache bis mittelschwere Programme geschrieben.

Ich versuche gerade ein LED Panel mit einem ESP8266 anzusteuern.
Mit einem Taster und dem Switch Case Befehl steuere ich jede Anzeige des Panels einzeln an.
Bis dahin hat auch alles gut geklappt.

Jetzt möchte ich noch ein Aktiven Buzzer ansteuern der bei jeder Anzeige eine eigene Tonfolge abspielt.
Habe dort auch schnell bemerkt das ich dort mit einem delay nicht weiterkomme, da der Taster dadurch blockiert wird.
Habe es auch schon mit dem Blink without delay Tutorial probiert, leider bin ich mit dem Ergebnis nicht so ganz zufrieden.

void loop() {
 digitalWrite(1, HIGH);
 delay(10);
 digitalWrite(1, LOW);
 delay(10);
 digitalWrite(1, HIGH);
 delay(10);
 digitalWrite(1, LOW);
 delay(10);
 digitalWrite(1, HIGH);
 delay(10);
 digitalWrite(1, LOW);
 delay(10);
 digitalWrite(1, HIGH);
 delay(10);
 digitalWrite(1, LOW);
 delay(10);
 digitalWrite(1, HIGH);
 delay(10);
 digitalWrite(1, LOW);
 delay(10);
 digitalWrite(1, HIGH);
 delay(10);
 digitalWrite(1, LOW);
 delay(10);
 digitalWrite(1, HIGH);
 delay(10);
 digitalWrite(1, LOW);
 delay(10);
 digitalWrite(1, HIGH);
 delay(10);
 digitalWrite(1, LOW);
 delay(10);
 digitalWrite(1, HIGH);
 delay(10);
 digitalWrite(1, LOW);
 delay(10);
 digitalWrite(1, HIGH);
 delay(10);
 digitalWrite(1, LOW);
 delay(10);
 digitalWrite(1, HIGH);
 delay(10);
 digitalWrite(1, LOW);
 delay(10);
 digitalWrite(1, HIGH);
 delay(10);
 digitalWrite(1, LOW);
 delay(10);
 digitalWrite(1, HIGH);
 delay(10);
 digitalWrite(1, LOW);
 delay(10);
 digitalWrite(1, HIGH);
 delay(10);
 digitalWrite(1, LOW);
 delay(10);
 digitalWrite(1, HIGH);
 delay(500);
 digitalWrite(1, LOW);
 delay(100);
 
}

So sollte eine Tonfolge aussehen nur darf später kein delay mehr drinnen sein.

Das ist der ganze Code....

#define Stall 16
#define Door 5
#define Flap 4
#define Gear 0
#define Alternator2 2
#define Alternator1 14
#define Master 12
#define CabinPress 13
#define StallHeat 15
#define WindsHeat 3
#define buzzer 1  

const int button = 10;

int i = 0;

int buttonState;
int lastState = 0;


void setup() {
  
  pinMode(Stall, OUTPUT);
  pinMode(Door, OUTPUT);
  pinMode(Flap, OUTPUT);
  pinMode(Gear, OUTPUT);
  pinMode(Alternator2, OUTPUT);
  pinMode(Alternator1, OUTPUT);
  pinMode(Master, OUTPUT);
  pinMode(CabinPress, OUTPUT);
  pinMode(StallHeat, OUTPUT);
  pinMode(WindsHeat, OUTPUT);
  pinMode(buzzer, OUTPUT);
  pinMode(button,INPUT_PULLUP);

}

void loop() {  
  buttonState = digitalRead(button);

  if (lastState == HIGH && buttonState == LOW) {
    i ++;
      if (i > 10) {
        i = 0; 
      }
      lowSetzen();
  }

  switch(i) {
    case 0:  
    lowSetzen();
    break;
    case 1:
      digitalWrite(Master, HIGH);
      //Hier sollte die Buzzer Tonfolge rein.
    break;
    case 2:
      digitalWrite(Gear, HIGH);
    break;
    case 3:
      digitalWrite(Stall, HIGH);
    break;
    case 4:
      digitalWrite(StallHeat, HIGH);
    break;
    case 5:
      digitalWrite(Alternator1, HIGH);
    break;
    case 6:
      digitalWrite(Flap, HIGH);
    break;
    case 7:
      digitalWrite(CabinPress, HIGH);
    break;
    case 8:
      digitalWrite(WindsHeat, HIGH);
    break;
    case 9:
      digitalWrite(Alternator2, HIGH);
    break;
    case 10:
      digitalWrite(Door, HIGH);
    break;
  }
  lastState = buttonState;
}

void lowSetzen() {
  digitalWrite(Master, LOW);
  digitalWrite(Gear, LOW);
  digitalWrite(Stall, LOW);
  digitalWrite(StallHeat, LOW);
  digitalWrite(Alternator1, LOW);
  digitalWrite(Flap, LOW);
  digitalWrite(CabinPress, LOW);
  digitalWrite(WindsHeat, LOW);
  digitalWrite(Alternator2, LOW);
  digitalWrite(Door, LOW);
  digitalWrite(buzzer, HIGH);
}

Gibt es eine Möglichkeit das umzusetzen?
Wenn ja wie?

Danke schonmal im voraus.

Gruß
Maurice

Hallo
ich denke mal hier kann eine zeit- und/oder ereignisgesteuerte Schrittkette weiterhelfen.

Hallo,
für mich ist das ein Blinker der 16 mal blinkt. Was spricht gegen blinkWithoutdelay und einem Zähler der bis 16 zählt. Da ganze in einer eigen funktion mit einem Return und Übergabewert der das startet.

bool hupe(bool on)

Heinz

Nachtrag. wäre schön wenn Du Deinen Text so formatierst das man auch alles lesen kann, da stimmt was nicht mit dem Zeilenumbruch.

Ich denke es handelt sich um einen passiven Buzzer, und Du willst mit den 10ms einen Ton erzeugen. Dazu gibt es tone(). allerdings ab ca. 40Hz.

Wenn Du doch einen "Blinker" willst, dann hätte ich schnell einen Vorschlag für Dich gestrickt.
Heinz

const byte onpin = 2;
const byte hupepin = 13;
bool on;
void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  pinMode(onpin, INPUT_PULLUP);
  pinMode(hupepin, OUTPUT);
}
void loop() {
  // put your main code here, to run repeatedly:

  on = !digitalRead(onpin);
  digitalWrite(hupepin, hupe(on));
}

bool hupe(bool on) {
  static uint32_t altzeit;
  static byte count;
  static bool flag;
  static bool blinker=false;
  if (on & !flag) {
    count = 32;
  }
  if (count > 0) {
    if (millis() - altzeit >= 100) {
      altzeit = millis();
      blinker = !blinker;
      count--;
      Serial.println(blinker);
    }
    if (!on) flag = false;
    return (blinker);
  }
}

Rentner:
für mich ist das ein Blinker der 16 mal blinkt

Der Sketch war nur ein Beispiel.
Die Zeiten werden später noch verändert.
Es handelt sich um einen Aktiven Buzzer, je nach länge des Pulses und der Pause hört es sich dann anderst an.

Trotzdem danke für die Antwort

Maurice

Hallo,

Du brauchst also unterschiedliche Zeiten während des gesamten Vorganges für jeden "Schritt". Dann macht es Sinn wen Du das auch so schreibst und nicht ein Beispiel zeigst mit dem 32 mal 10ms ablaufen.

In dem Fall macht eine Schrittkette (Ablaufsteuerung ) 32 Schritte, dann tatsächlich mehr Sinn. Das ist aber dann auch ein bisschen mehr Aufwand, geht aber auch.

Theoretisch könntest Du in meinem Beispiel die Wartezeit für jeden counter wert in einem Array hinterlegen und dann darauf abfragen.

if (millis() - altzeit >=warte[count]) {

Heinz

Der Sketch war nur ein Beispiel.

Dieser Sketch ist auch nur ein Beispiel, für einen Arduino UNO.

Er zeigt unterschiedliche Handlungsstränge:

  1. Das originale Blink Beispiel, als Hauptprogramm
  2. Dazu nebenläufig, die Auswertung der Seriellen Schnittstelle
  3. Die Piepfolge als Task, während das Hauptprogramm im delay() ruht
#include <TaskMacro.h> 


constexpr byte buzzer {3};

constexpr int elemente {10};
using PiepFolge = unsigned int [elemente];

PiepFolge a {100,1000,100,1000,100,1000,100,1000,100,1000};
PiepFolge b {1000,100,1000,100,1000,100,1000,100,1000,100};

unsigned int *folge {nullptr}; // Übergabemerker

Task piepDingen()
{
  static int i;
  taskBegin();
  while(1)
  {
    taskWaitFor(folge);
    digitalWrite(buzzer,0);
    for(i=0;i<elemente;i++)
    {
      taskPause(folge[i]);
      digitalWrite(buzzer,! digitalRead(buzzer));
    }
    digitalWrite(buzzer,1);
    folge = nullptr;  // Merker konsumieren
  }
  taskEnd();
}



void setup() 
{
  pinMode(LED_BUILTIN, OUTPUT); // aus Blink.ino
  Serial.begin(9600);
  digitalWrite(buzzer,1);
  pinMode(buzzer, OUTPUT); 
}


void yield() 
{
  switch(Serial.read())
  {
    case 'a': folge = a; Serial.println('a'); break;
    case 'b': folge = b; Serial.println('b'); break;
  }
  piepDingen();
}


void loop() // Hauptprogramm, Blink aus den Beispielen
{
  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);                       // wait for a second
}

Ablaufsteuerung
Meine Standardantwort zu Ablaufsteuerungen:

Eine Stichworte Sammlung für Google Suchen:
Endlicher Automat,
ProtoThreads,
State Machine,
Multitasking,
Coroutinen,
Ablaufsteuerung,
Schrittkette,
BlinkWithoutDelay,

Automat (Informatik)
Blink Without Delay
Die Nachtwächter Erklärung

MicroBahner/MobaTools
Intervall Macro
Multitasking Macros
INTERVAL Ersatzstoff
CooperativeTask

mau179:
... Wenn ja wie?

Programmiere nach dem Strickmuster eines „endlichen Automaten“. Problem beim Verständnis dieses Strickmusters ist meistens die „Pausen-Denke“. Evtl. hilft mein Geschreibsel hier.

Gruß

Gregor

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