Go Down

Topic: funtion ausfürhung Fehler (Read 3000 times) previous topic - next topic

ChrisSand

vielen dank ( schon wieder  ::) ),

jetzt habe ich es am laufen

Code: [Select]
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}

void loop() {

  static unsigned long letzemalMillisLED = 0;   //Letzte ausführung LED Bling wird beim überschreiben null und nicht in jedem loop neu gesetzt
  static unsigned long letzemalMillisBEEP = 0;  //Letzte ausführung LED Bling wird beim überschreiben null und nicht in jedem loop neu gesetzt
  static bool LedStatus = HIGH;                 //Led Status an oder aus
  static bool beepStatus = HIGH;                //Beep Status an oder aus
  const int LedPin = 4;                         // Pin der LED
  const int beepPin = 8;                        // Pin des Pioezo
  pinMode(LedPin, OUTPUT);                      // Led Pin auf outputt
  static bool frqStatus = HIGH;                 // Status des hohen oder niedirgen frquens
       

  //###LED anaus
  if (millis() - letzemalMillisLED > 200) {    // prüfen nach ober X (400) mSec seit der letzten ausführung um sind dann abfrage durchlaufen
    letzemalMillisLED = millis();              // neue letzte ausfürhung aufschreiben
    digitalWrite(LedPin, LedStatus);           // den Pin auf HIGH oder LOW Setzten (aus LedStatus)
    LedStatus = !LedStatus;                    // Status wechseln
  }

  //beep anaus
  if (millis() - letzemalMillisBEEP > 200) {   // prüfen nach ober X (400) mSec seit der letzten ausführung um sind dann abfrage durchlaufen
    letzemalMillisBEEP = millis();             // neue letzte ausfürhung aufschreiben
    if (beepStatus == HIGH) {                  // Prüft ob er an oder aus schalten soll HIGH = an LOW = aus (else)
      tone(beepPin, frqStatus ? 950 : 700);    // wenn er anschalten soll dann am beepPin und nach dem frwStatus ( frgStatus ? 950 : 700 )
      frqStatus = !frqStatus;                  // Status Frequens wechseln
    } else {
      noTone(beepPin);                         // beepStatus ist LOW dann ausstelen
    }
    beepStatus = !beepStatus;                  // beepStatus wechseln
  }
}




die var. hab ich in bool geändert thx
super vielen dank für die kurze if abfrage das spart viel tipperei und fehler anfälligkeit mit den {}
Einrücken lassen hab ich diesmal das Programm und auch mal wieder was kommentiert

damit ist das jetzt eine endliche Maschiene? und ich habe dsa mit millis() richtig angewenden ? von verstehen will ich noch nicht sprechen dazu muss ich mal ein paar beispiele scripten.

jetzt noch zwei errausforungen oder doch Lernziele ?

1. ich möchte wiessen wie ich im Loop etwas nur dreimal ausführen lasse ...
... mit if und einer static int variablen ?
2. die ablauf des beep in eine funct packen damit ich das immer mal bei einem problem aufrufen kann
...lösung ?

Chris

Serenifly

https://de.wikipedia.org/wiki/Endlicher_Automat

Du hast eine Reihe von Zuständen die dein Programm annehmen kann. Und fest definierte Übergänge zwischen diesen Zuständen (z.B. Zeit abgelaufen, Taster gedrückt, oder sonstige Ereignisse)

ChrisSand

nach dem komplexen (für mich  :) ) Thema des Alarms ging der schalter jetzt schnell!

Code: [Select]
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}

void loop() {

  static unsigned long letzemalMillisLED = 0;   //Letzte ausführung LED Bling wird beim überschreiben null und nicht in jedem loop neu gesetzt
  static unsigned long letzemalMillisBEEP = 0;  //Letzte ausführung LED Bling wird beim überschreiben null und nicht in jedem loop neu gesetzt
  static unsigned long letzemalMillisKlick = 0;  //Letzte ausführung LED Bling wird beim überschreiben null und nicht in jedem loop neu gesetzt
  static bool LedStatus = HIGH;                 //Led Status an oder aus
  static bool beepStatus = HIGH;                //Beep Status an oder aus
  const int LedPin = 4;                         // Pin der LED
  const int beepPin = 8;                        // Pin des Pioezo
  pinMode(LedPin, OUTPUT);                      // Led Pin auf outputt
  static bool frqStatus = HIGH;                 // Status des hohen oder niedirgen frquens
  const int tasterPin = 11;                     // Pin des tasters
  pinMode(tasterPin, INPUT);                    // TasterPin als input festlegen
  pinMode(2, OUTPUT);                    // TasterPin als input festlegen
 
  //### Taster abfragen

if(millis()-letzemalMillisKlick > 200 && digitalRead(tasterPin) == HIGH){
  letzemalMillisKlick = millis();
  //jetzt alles zu dem auslösen mit dem taster
}
     

  //###LED anaus
  if (millis() - letzemalMillisLED > 200) {    // prüfen nach ober X (400) mSec seit der letzten ausführung um sind dann abfrage durchlaufen
    letzemalMillisLED = millis();              // neue letzte ausfürhung aufschreiben
    digitalWrite(LedPin, LedStatus);           // den Pin auf HIGH oder LOW Setzten (aus LedStatus)
    LedStatus = !LedStatus;                    // Status wechseln
  }

  //beep anaus
  if (millis() - letzemalMillisBEEP > 200) {   // prüfen nach ober X (400) mSec seit der letzten ausführung um sind dann abfrage durchlaufen
    letzemalMillisBEEP = millis();             // neue letzte ausfürhung aufschreiben
    if (beepStatus == HIGH) {                  // Prüft ob er an oder aus schalten soll HIGH = an LOW = aus (else)
      tone(beepPin, frqStatus ? 950 : 700);    // wenn er anschalten soll dann am beepPin und nach dem frwStatus ( frgStatus ? 950 : 700 )
      frqStatus = !frqStatus;                  // Status Frequens wechseln
    } else {
      noTone(beepPin);                         // beepStatus ist LOW dann ausstelen
    }
    beepStatus = !beepStatus;                  // beepStatus wechseln
  }
}




functionen & anzahl druchläufe schaue ich mir dann morgen mal an...

christian


ChrisSand

Hallo zusammen,

ich habe in zwischenzeit viel gelesen und ein paar videos geschaut.

Ich habe meinen Automatenloop versuch auf ein dreimal Blinken mit einem taster zu bringen.

Code: [Select]

static bool Taster_Status = 0;
static unsigned int letzte_mal_Taste = 0;
static unsigned int letzte_mal_led_wechsel = 0;
static bool Led_status = 0;
static bool Led_an_aus = 1;
static int i = 0;
const int tasterPin = 11;
const int LedPin = 4;

void setup(){
pinMode(tasterPin,INPUT);
pinMode(LedPin,OUTPUT);
}


void loop()
{

 //taster abfragen
  if (millis() - letzte_mal_Taste > 200 && digitalRead(tasterPin) == HIGH) {  // wenn interval >200 und ein eingang am tasterpin dann...
    letzte_mal_Taste = millis();                                              // letzte ausführung in die var schreiben
    Led_status = 1;                                                           // Led_Status auf 1 dh. bitte dreimal blinken
  }


  //led 3 mal blinken
  if (millis() - letzte_mal_led_wechsel > 100 && Led_status  == 1 && i < 7) { // wenn Interval <100 und i < 7 LED status = 1 dann
    digitalWrite(LedPin, (Led_an_aus= !Led_an_aus));                          // LedPin mit status (LOW/HIGH) beschreiben das wird dann noch jedes mal gedreht
    letzte_mal_led_wechsel = millis();                                        // letzte ausführung in die var schreiben
    i++;                                                                      // dann i eins erhöhen
    if (i == 7) {                                                             // wenn i größer als 7 ist schleife abrechnen
      Led_status = 0;                                                         // LED Status auf 0 setzten
      i = 0;                                                                  // i wieder auf 0 für den nächsten druchlauf
    digitalWrite(LedPin, LOW);                                                // Led auf jeden fall ausschalten
    }
  }
}



das Funktioniert auch aber nur wenn ich zum schluss die led auf aus LOW stelle.

wenn ich das richtig verstanden habe ist das jetzt ein endlicher Automat bei dehm ich jetzt weitere taster oder sensoren abfragen kann und diese dann actions auslösen?

chris

PS: Gibt es noch tipps zum Code?

ChrisSand

war ja auch zu schön....

Code: [Select]

static bool Taster_Status = 0;
static unsigned int letzte_mal_Taste = 0;
static unsigned int letzte_mal_led_wechsel = 0;
static bool Led_status = 0;
static bool Led_an_aus = 1;
static int i = 0;
const int tasterPin = 11;
const int LedPin = 4;

void setup(){
pinMode(tasterPin,INPUT);
pinMode(LedPin,OUTPUT);
Serial.begin(9600);
}


void loop()
{

 //taster abfragen
  unsigned long currentMillis = millis();
  if ( currentMillis - letzte_mal_Taste > 300 && digitalRead(tasterPin) == HIGH) {  // wenn interval >200 und ein eingang am tasterpin dann...
    letzte_mal_Taste = currentMillis;                                              // letzte ausführung in die var schreiben
    Led_status = 1;                                                           // Led_Status auf 1 dh. bitte dreimal blinken
  }


  //led 3 mal blinken
  unsigned long currentMillis2 = millis();
  if (currentMillis2 - letzte_mal_led_wechsel > 200 && Led_status  == 1 && i < 7) { // wenn Interval <100 und i < 7 LED status = 1 dann
    digitalWrite(LedPin, Led_an_aus);                                         // LedPin mit status (LOW/HIGH) beschreiben das wird dann noch jedes mal gedreht
    Led_an_aus= !Led_an_aus;                                                  // Status LED wechseln
    letzte_mal_led_wechsel = currentMillis2;                                        // letzte ausführung in die var schreiben
    i++;                                                                      // dann i eins erhöhen
    if (i == 7) {                                                             // wenn i größer als 7 ist schleife abrechnen
      Led_status = 0;                                                         // LED Status auf 0 setzten
      i = 0;                                                                  // i wieder auf 0 für den nächsten druchlauf
    digitalWrite(LedPin, LOW);                                                // Led auf jeden fall ausschalten
    }
  }
  if (i==0){
  }else{
    Serial.println(i);
    Serial.println(letzte_mal_led_wechsel);
  }
}


Ich habe noch den " Led_an_aus= !Led_an_aus" aus dem digitalwrit als ! Led_an_aus genommen das wollte der uno so nicht, wenn aber die var letzte_mal_led_wechsel überläuft wird diese wieder auf null gesetzt das ist soweit okay aber dann funktioniert aber die zuweisung nicht mehr  "letzte_mal_led_wechsel = currentMillis2;"

was mache ich falsch?

chris

ChrisSand

achso die led flackert dann nur noch wenn ich den taster gedrückt halte!

combie

#36
Aug 22, 2017, 10:47 pm Last Edit: Aug 23, 2017, 12:44 am by combie
Hmmm...

Ich habe es versucht...
Aber ich verstehe deinen Code nicht.

Mir fehlt eine klare Strukturierung.

Offensichtlich möchtest du da zwei endliche Automaten bauen.
Einer soll die Taster Eingaben verarbeiten, mit entprellen und Wiederholverriegelung.
Und der andere soll irgendwelche Leuchtmeldungen abgeben.

Aus meiner Sicht hast du die beiden Automaten hart miteinander verwoben.
Zu weitgehend.

Weniger, und übersichtliche Bedingungen, würde ich mir wünschen.
Auch eine klare Benennung der Zustände.



Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

ChrisSand

habt gedult mit mir, diesen sketch habe ich noch mal neu geschrieben in der hofflung jetzt klarer zu schreiben und weniger komplex habe versucht so viel wie möglich zu beschreiben und gut einzurücken.

der Sketch macht auch das was er soll, auch wenn die var previousMillis & previousMillis2 übergelaufen sind.

was kann ich verbessern?

Code: [Select]
byte ledPin = 4;                  // LED liegt am (digitalen) Pin 13
static boolean value = HIGH;             // Startwert der LED in der ersten schleife immer anmachen dann 7 mal im wechsel bis aus (HIGH LED an LOW LED aus)
unsigned long previousMillis = 0; // speichert wie viele Sekunden seit derletzten Änderung vergangen sind für den taster
unsigned long previousMillis2 = 0; // speichert wie viele Sekunden seit derletzten Änderung vergangen sind für das LED blinken
unsigned long interval = 300;    // Interval zwischen zwei Änderungen Taster zum entprellen
byte tasterpin = 11;            // Pin an dem der taster abgefragt wird
bool Status_schalter = LOW;     // Status des taster
byte i = 0;                     // Zähler für die if abfrage zum durchlaufen des blinkens (<7 = weiter blinken >7 stopp kein blingen mehr nötig)

void setup()
{
  pinMode(ledPin, OUTPUT);      // Setzt den ledPin als Ausgang
  pinMode(tasterpin, INPUT);   // setzt den tasterpin auf eingang
  Serial.begin(9600);         // s-monitor gestartet.
  Serial.println("## Arduino gestartet Serial Montor kann Daten ausgeben ###");
}

void loop()
{

  if (millis() - previousMillis > interval && digitalRead(tasterpin) == HIGH)  // abfrage auf entprellung des tastest und ob er gedrückt wurde
  {
    previousMillis = millis();   // aktuelle Zeit abspeichern
    Status_schalter = HIGH;     // schalter ist gedrückt worden
  }
  // #123 jetzt das led licht wechseln
    if (Status_schalter == HIGH) // wenn der taster gedrückt wurde #Schalter
    {
        if (millis() - previousMillis2 > 100) // weniger als 100msec vergangen sind seit dem letzten durchlaufen der schleife
         {
          Serial.println("letzte millis"); //ausgaben für den S-Monitor
          Serial.println(previousMillis2);
          Serial.println("status schalter");
          Serial.println(Status_schalter);
          Serial.println("LED value");
          Serial.println(value);
          Serial.println("i");
          Serial.println(i);
            previousMillis2 = millis(); //schleife durchlaufen neue letzte ausfühurng abspeichern
            digitalWrite(ledPin, value); // in der var value steht im start immer High
            value = !value;  // für den nächsten druchlauf schon mal von High <> low wechseln der var. value
            i++;            // für jeden druchlauf i um eines erhöhen
           
              if (i > 7)         // diese abfrage ist für die anzahl der durchläufe wir bei jedem durchlauf mit abgefragt und wenn i > 7....
                                 // dann wird der schalter_status auf LOW gesetzt dann wird die LED abrage nichtmehr durchlaufen bei #schalter
                                 // damit wird die abfrage  "#123 jetzt das led licht wechseln" verlassen
                {
                    Status_schalter = LOW;
                    i = 0;            // 7 mal erreich var i wieder auf 0 setzte für den nächsten durchlauf
                }
          }
  }
}


danke chris

michael_x

Quote
was kann ich verbessern?
Hab nur mal die erste Zeile gelesen:
Quote
byte ledPin = 4;                  // LED liegt am (digitalen) Pin 13
Fragt sich nur, wie viele Fehler das sind ;)

Gegenvorschlag:
const byte ledPin = LED_BUILTIN; // Beim Uno  Pin13

Generell schreibe ich an den Anfang eines Sketches gern, welche Pins wie belegt sind (Sowie eine kurze Beschreibung, was der Sketch macht bzw. machen sollte), um eine Übersicht zu haben.
Die Pin-Belegung als echte C++ Definition hat den Vorteil, dass Beschreibung und Wirklichkeit nicht so leicht widersprüchlich sind.


Aber mit byte statt int ist da schon viel Gutes drin ;)

combie

Quote
habt gedult mit mir
Aber klar doch...

Quote
was kann ich verbessern?
Hier ist noch eine logische Verknüpfung, welche man vereinfachen kann:
  if (millis() - previousMillis > interval && digitalRead(tasterpin) == HIGH)

Das durchnummerieren von Variablen betrachte ich als Fehler:
 previousMillis & previousMillis2


Die 2 Aufgaben, Blinken und Tasterauswertung lassen sich noch weiter von einander trennen. Wurstbildung in loop() halte ich für vermeidungswürdig.

Deine Variablen donnern dir den globalen Namensraum zu.
Das wird dir auf die Füße fallen, wenn der Code größer wird, oder du Teile wiederverwenden möchtest.


Mit den genannten leichten Umbauten, aber sonst unverändert: (ungetestet)
Code: [Select]

const byte ledPin = 4;                  // LED liegt am (digitalen) Pin 13
const unsigned long interval = 300;    // Interval zwischen zwei Änderungen Taster zum entprellen
const byte tasterpin = 11;            // Pin an dem der taster abgefragt wird

bool Status_schalter = LOW;     // Status des taster (Übergabe Merker)

void blinkAbhandlung();
void impulsGeber();


void setup()
{
  pinMode(ledPin, OUTPUT);      // Setzt den ledPin als Ausgang
  pinMode(tasterpin, INPUT);   // setzt den tasterpin auf eingang
  Serial.begin(9600);         // s-monitor gestartet.
  Serial.println("## Arduino gestartet Serial Montor kann Daten ausgeben ###");
}

void loop()
{
    impulsGeber();
    blinkAbhandlung();
}

//-----------------------------



void impulsGeber()
{
  unsigned long previousMillis = 0; // speichert wie viele Sekunden seit derletzten Änderung vergangen sind für den taster
  if(!digitalRead(tasterpin))  previousMillis = millis();
  if (millis() - previousMillis > interval)  // abfrage auf entprellung des tastest und ob er gedrückt wurde
  {
    previousMillis = millis();   // aktuelle Zeit abspeichern
    Status_schalter = HIGH;     // schalter ist gedrückt worden
  }
}


void  blinkAbhandlung()
{
    static boolean value = HIGH;             // Startwert der LED in der ersten schleife immer anmachen dann 7 mal im wechsel bis aus (HIGH LED an LOW LED aus)
    static unsigned long previousMillis = 0; // speichert wie viele Sekunden seit derletzten Änderung vergangen sind für das LED blinken
    static byte i = 0;                     // Zähler für die if abfrage zum durchlaufen des blinkens (<7 = weiter blinken >7 stopp kein blingen mehr nötig)


  // #123 jetzt das led licht wechseln
    if (Status_schalter == HIGH) // wenn der taster gedrückt wurde #Schalter
    {
        if (millis() - previousMillis > 100) // weniger als 100msec vergangen sind seit dem letzten durchlaufen der schleife
         {
          Serial.println("letzte millis"); //ausgaben für den S-Monitor
          Serial.println(previousMillis);
          Serial.println("status schalter");
          Serial.println(Status_schalter);
          Serial.println("LED value");
          Serial.println(value);
          Serial.println("i");
          Serial.println(i);
            previousMillis = millis(); //schleife durchlaufen neue letzte ausfühurng abspeichern
            digitalWrite(ledPin, value); // in der var value steht im start immer High
            value = !value;  // für den nächsten druchlauf schon mal von High <> low wechseln der var. value
            i++;            // für jeden druchlauf i um eines erhöhen
           
              if (i > 7)         // diese abfrage ist für die anzahl der durchläufe wir bei jedem durchlauf mit abgefragt und wenn i > 7....
                                 // dann wird der schalter_status auf LOW gesetzt dann wird die LED abrage nichtmehr durchlaufen bei #schalter
                                 // damit wird die abfrage  "#123 jetzt das led licht wechseln" verlassen
                {
                    Status_schalter = LOW;
                    i = 0;            // 7 mal erreich var i wieder auf 0 setzte für den nächsten durchlauf
                }
          }
  }
}




Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

ChrisSand

Hab nur mal die erste Zeile gelesen:
Fragt sich nur, wie viele Fehler das sind ;)

Gegenvorschlag:
const byte ledPin = LED_BUILTIN; // Beim Uno  Pin13

Generell schreibe ich an den Anfang eines Sketches gern, welche Pins wie belegt sind (Sowie eine kurze Beschreibung, was der Sketch macht bzw. machen sollte), um eine Übersicht zu haben.
Die Pin-Belegung als echte C++ Definition hat den Vorteil, dass Beschreibung und Wirklichkeit nicht so leicht widersprüchlich sind.


Aber mit byte statt int ist da schon viel Gutes drin ;)
Es packt einen ja dann der bau trieb wenn das dann mal funktioniert... deswegen hatte ich noch eine LED an Pin 4 geschaltet zum spielen (und die Kinder wollten eine große "Lampe" :-) ).

Frage:

Wie würde sich millis() verhalten wenn ich das in eine func schreibe? und die in dem endlichen Automaten aufrufe
Code: [Select]

if (millis() - previousMillis > interval && digitalRead(tasterpin) == HIGH)  // abfrage auf entprellung des tastest und ob er gedrückt wurde
  {
    previousMillis = millis();   // aktuelle Zeit abspeichern
//### hier der aufruf der Func???####
    Status_schalter = HIGH;     // schalter ist gedrückt worden
  }

Was ich vermute: Die abfrage auf millis() (in den Func) würde dann ja nur einmal aufgerufen und diese würde die LED auf an stellen. Aber nicht den welches machen

wenn ich den Aufruf der func aber direkt ohne abfrage in den Loop schreibe würde es gehen? (weil bei jedem durchlauf aufgerufen).

Möchte nur die gerne der Funktionen kennen lernen.

Chris

Code: [Select]

// #123 jetzt das led licht wechseln
    if (Status_schalter == HIGH) // wenn der taster gedrückt wurde #Schalter
    {
        if (millis() - previousMillis2 > 100) // weniger als 100msec vergangen sind seit dem letzten durchlaufen der schleife
         {
          Serial.println("letzte millis"); //ausgaben für den S-Monitor
          Serial.println(previousMillis2);
          Serial.println("status schalter");
          Serial.println(Status_schalter);
          Serial.println("LED value");
          Serial.println(value);
          Serial.println("i");
          Serial.println(i);
            previousMillis2 = millis(); //schleife durchlaufen neue letzte ausfühurng abspeichern
            digitalWrite(ledPin, value); // in der var value steht im start immer High
            value = !value;  // für den nächsten druchlauf schon mal von High <> low wechseln der var. value
            i++;            // für jeden druchlauf i um eines erhöhen
            
              if (i > 7)         // diese abfrage ist für die anzahl der durchläufe wir bei jedem durchlauf mit abgefragt und wenn i > 7....
                                 // dann wird der schalter_status auf LOW gesetzt dann wird die LED abrage nichtmehr durchlaufen bei #schalter
                                 // damit wird die abfrage  "#123 jetzt das led licht wechseln" verlassen
                {
                    Status_schalter = LOW;
                    i = 0;            // 7 mal erreich var i wieder auf 0 setzte für den nächsten durchlauf
                }
          }
  }






combie

Quote
//### hier der aufruf der Func???####
Das ist keine gute Idee!
Aber das hast du ja schon selber erkannt.

Es ist richtig so, dort einen globalen Merker zu setzen.
Oder in der OOP Variante, könnte man dort eine Nachricht versenden.

Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

combie

#42
Aug 24, 2017, 11:32 am Last Edit: Aug 24, 2017, 11:35 am by combie
Quote
Es packt einen ja dann der bau trieb wenn das dann mal funktioniert... deswegen hatte ich noch eine LED an Pin 4 geschaltet zum spielen (und die Kinder wollten eine große "Lampe" :-) ).
Tipp um solche verwirrenden Fehler in Kommentaren zu vermeiden:
Schreibe im Kommentar nicht, "was" es tut, sondern "warum" du es so machst.

Beispiel:
Code: [Select]
const byte ledPin = 4;                  // LED liegt am (digitalen) Pin 13
Code: [Select]
const byte ledPin = 4;                  // Pin der blinkenden LED festlegen

Dann kannst du jederzeit den Pin wechseln, aber der Kommentar bleibt korrekt

Bedenke:
Doppelt gehaltene Information bedeutet auch immer doppelten Wartungsaufwand.
Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

ChrisSand

Aber klar doch...

Hier ist noch eine logische Verknüpfung, welche man vereinfachen kann:
  if (millis() - previousMillis > interval && digitalRead(tasterpin) == HIGH)

Das durchnummerieren von Variablen betrachte ich als Fehler:
 previousMillis & previousMillis2
Weil ich dann den überblick verliere.. ich wollte deswegen in func schreiben das mache ich  VBA auch immer und ggf. kann man dinge ja mehrmals aufrufen deswegen die 1. frage :-)

Die 2 Aufgaben, Blinken und Tasterauswertung lassen sich noch weiter von einander trennen. Wurstbildung in loop() halte ich für vermeidungswürdig.




Deine Variablen donnern dir den globalen Namensraum zu.
Das wird dir auf die Füße fallen, wenn der Code größer wird, oder du Teile wiederverwenden möchtest.
weil ich value benutzt habe? Gibt es eine Guideline für Variablen Namen in C?

Mit den genannten leichten Umbauten, aber sonst unverändert: (ungetestet)
Code: [Select]

const byte ledPin = 4;                  // LED liegt am (digitalen) Pin 13
const unsigned long interval = 300;    // Interval zwischen zwei Änderungen Taster zum entprellen
const byte tasterpin = 11;            // Pin an dem der taster abgefragt wird

bool Status_schalter = LOW;     // Status des taster (Übergabe Merker)

void blinkAbhandlung();
void impulsGeber();


void setup()
{
  pinMode(ledPin, OUTPUT);      // Setzt den ledPin als Ausgang
  pinMode(tasterpin, INPUT);   // setzt den tasterpin auf eingang
  Serial.begin(9600);         // s-monitor gestartet.
  Serial.println("## Arduino gestartet Serial Montor kann Daten ausgeben ###");
}

void loop()
{
    impulsGeber();
    blinkAbhandlung();
}

//-----------------------------



void impulsGeber()
{
  unsigned long previousMillis = 0; // speichert wie viele Sekunden seit derletzten Änderung vergangen sind für den taster
  if(!digitalRead(tasterpin))  previousMillis = millis();
  if (millis() - previousMillis > interval)  // abfrage auf entprellung des tastest und ob er gedrückt wurde
  {
    previousMillis = millis();   // aktuelle Zeit abspeichern
    Status_schalter = HIGH;     // schalter ist gedrückt worden
  }
}


void  blinkAbhandlung()
{
    static boolean value = HIGH;             // Startwert der LED in der ersten schleife immer anmachen dann 7 mal im wechsel bis aus (HIGH LED an LOW LED aus)
    static unsigned long previousMillis = 0; // speichert wie viele Sekunden seit derletzten Änderung vergangen sind für das LED blinken
    static byte i = 0;                     // Zähler für die if abfrage zum durchlaufen des blinkens (<7 = weiter blinken >7 stopp kein blingen mehr nötig)


  // #123 jetzt das led licht wechseln
    if (Status_schalter == HIGH) // wenn der taster gedrückt wurde #Schalter
    {
        if (millis() - previousMillis > 100) // weniger als 100msec vergangen sind seit dem letzten durchlaufen der schleife
         {
          Serial.println("letzte millis"); //ausgaben für den S-Monitor
          Serial.println(previousMillis);
          Serial.println("status schalter");
          Serial.println(Status_schalter);
          Serial.println("LED value");
          Serial.println(value);
          Serial.println("i");
          Serial.println(i);
            previousMillis = millis(); //schleife durchlaufen neue letzte ausfühurng abspeichern
            digitalWrite(ledPin, value); // in der var value steht im start immer High
            value = !value;  // für den nächsten druchlauf schon mal von High <> low wechseln der var. value
            i++;            // für jeden druchlauf i um eines erhöhen
           
              if (i > 7)         // diese abfrage ist für die anzahl der durchläufe wir bei jedem durchlauf mit abgefragt und wenn i > 7....
                                 // dann wird der schalter_status auf LOW gesetzt dann wird die LED abrage nichtmehr durchlaufen bei #schalter
                                 // damit wird die abfrage  "#123 jetzt das led licht wechseln" verlassen
                {
                    Status_schalter = LOW;
                    i = 0;            // 7 mal erreich var i wieder auf 0 setzte für den nächsten durchlauf
                }
          }
  }
}





Danke damit hast du meine eben gestellte frage schon beantwortet ich muss im Loop dann immer wieder beide Funktionen aufrufen!

Danke

ChrisSand

Tipp um solche verwirrenden Fehler in Kommentaren zu vermeiden:
Schreibe im Kommentar nicht, "was" es tut, sondern "warum" du es so machst.

Beispiel:
Code: [Select]
const byte ledPin = 4;                  // LED liegt am (digitalen) Pin 13
Code: [Select]
const byte ledPin = 4;                  // Pin der blinkenden LED festlegen

Dann kannst du jederzeit den Pin wechseln, aber der Kommentar bleibt korrekt

Bedenke:
Doppelt gehaltene Information bedeutet auch immer doppelten Wartungsaufwand.
im Prinzip steht es bei meiner Version ja zwei mal drin.. doof.... und wieder was gelernt.  :)

Go Up