Frequenzteiler - LED nur bei jedem Xten Durchlauf blinken lassen

Moin,

ich messe 3 Lüfterdrehzahlen im Bereich von etwa 1200 - 1700 rpm. Das sind 20 - 28,3Hz.
Diese Frequenz wird auch jeweils auf einer hardwaregesteuerten LED ausgegeben.
In dem Frequenzbereich kann das menschliche Auge nicht mehr eindeutig unterscheiden, ob die LEDs flackern (=Lüfter dreht) oder dauerhaft leuchten (=Stillstand auf HIGH Pegel).
Deswegen möchte ich drei softwaregesteuerte LEDs mit niedrigerer Frequenz blinken lassen.
Der Teiler soll einstellbar sein, d.h. z.B. nur bei jedem 2., 4. oder 10. Impuls einmal die LED blinken lassen (ich will ausprobieren was davon am besten aussieht, dann wird das nicht mehr geändert).
Da ich die LED aber nicht mit einem delay(xxx) eine Weile an lassen kann, kann ich sie erst wieder nach einigen Impulsen ausschalten.
Und da geht mir jetzt langsam die Luft aus.

Die drei Ausgabe LED Pins und Pinmodes habe ich schon im Sketch drin.
Allerdings fehlt noch in der Loop wie ich diese ansteuere.
Der Rest des Sketches läuft seit Monaten einwandfrei.

//#define AUSGABE           // Serielle Ausgabe aktiv (kann man auskommentieren wenn die serielle Ausgabe der Daten nicht gewünscht ist)
//#define AUSGABEschleifen  // Serielle Ausgabe Anzahl Schleifen aktiv (kann man auskommentieren wenn die serielle Ausgabe der durchlaufenden Schleifen nicht gewünscht ist)
#define LEDsenden         // Die blaue ESP12 LED blinkt beim senden (kann man auskommentieren wenn die LED Anzeige nicht gewünscht ist)
#define DATENsenden         // Die Daten werden an den Server gesendet (kann man auskommentieren zum offline testen)
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266HTTPClient.h>
ESP8266WiFiMulti WiFiMulti;
#ifdef LEDsenden
  byte LEDsend = 2;      // Arduino Pin vom der ESP12 onboard LED
#endif
const long BaudRate = 74880;              // Serielle Verbindungsgeschwindigkeit für die serielle Ausgabe
const int Messzeit = 60000;               // 60000 Millisekunden = 60 Sekunden = Umdrehungen pro Minute
unsigned long Startzeit;                  // Merker für die Zeit in Millisekunden seit letzten Aufruf der Funktion. Millis zählt immer weiter hoch seit dem Einschalten des Controllers
const int sensorPin[3] = {14,12,13};      // the number of the sensorPin[0...2]  (original: 14,12,13 bzw. D5, D6, D7)
const int LED[3] = {5,4,15};           // the number of the LED[0...2]  (original: 5,4,15 bzw. D1, D2, D8)
unsigned long Schleifen;                  // wie viele Schleifen wurden in der Messzeit durchlaufen? (Müssen mehr sein als die gemessene Frequenz)
int i;                                    // Zählvariable
int Sensor[3]={1,1,1};                    // Array Variable für den ausgelesenen Wert, muss am Anfang 1 sein
int OldSensor[3]={1,1,1};                 // Array Variable für den vorigen ausgelesenen Wert, muss am Anfang 1 sein
int rpm[3]={0,0,0};                       // Array Variable für den ausgelesenen Wert, muss am Anfang 0 sein
const char WiFiSSID[] = "xxxxx";          // Router SSID
const char WiFiPSK[]  = "xxxxxxxxxxxxxxxxxxx";    // Router Password
const String host = "xxxxxxxxxxxxx";          // Server IP Adresse
const unsigned int port = xx;
const String url_start = "/middleware.php/data/";         // Unterordner für die Werteablage
const String url_stop = ".json?operation=add&value=";     // Dateierweiterung für die Werteablage und Parameter
byte maxwait = 120;
char *UUID[3] = {                          // Die UUID's der abzulegenden Kanäle werden in ein char array hinterlegt
"xxxxxxxxxxxxxxxxxxxx",    // UUID des 0. Kanals "Drehzahl Zuluft"
"xxxxxxxxxxxxxxxxxxxx",    // UUID des 1. Kanals "Drehzahl Abluft"
"xxxxxxxxxxxxxxxxxxxx"};   // UUID des 2. Kanals "Drehzahl Fortluft"
//****************************************
bool waitWifi() {
  while((WiFiMulti.run() != WL_CONNECTED) && maxwait > 0) {
    #ifdef AUSGABE
      Serial.println("Wait Wifi");
    #endif
    delay(1000);
    maxwait--;
  }
  if(WiFiMulti.run() == WL_CONNECTED) return true;
  return false;
}
//****************************************
void sendHttpData(String url) {
  HTTPClient http;
  if(waitWifi()) {
    #ifdef AUSGABE
      Serial.print("GET: "); Serial.println(url);
    #endif
  http.begin(host, port, url); //HTTP
  int httpCode = http.GET();
  #ifdef AUSGABE
    if(httpCode) {
      if(httpCode == 200) {
        String payload = http.getString();
        Serial.println(payload);
      }else{
        Serial.print("HTTP "); Serial.println(httpCode);
      }
      } else {
        Serial.print("[HTTP] GET... failed, no connection or no HTTP server\n");
      }
    #endif
    }else{
    #ifdef AUSGABE
      Serial.print("No WiFi available\n");
    #endif
    }
}
//****************************************
void WertSenden(int i) {
  String url_temp = "";
  url_temp = url_start;
  url_temp += UUID[i];
  url_temp += url_stop;
  url_temp += rpm[i];
  #ifdef AUSGABE
    Serial.println(url_temp);
  #endif
  #ifdef DATENsenden
    sendHttpData(url_temp);                       // ------------------Daten senden-----------------
  #endif
}
//****************************************
void setup() {
  #ifdef AUSGABEschleifen           // wird nur kompiliert, wenn serielle Ausgabe aktiv ist
    Serial.begin(BaudRate);         // Starten der seriellen Ausgabe die mit einem seriellen Monitor angesehen werden kann
  #endif
  #ifdef AUSGABE                    // wird nur kompiliert, wenn serielle Ausgabe aktiv ist
    Serial.begin(BaudRate);         // Starten der seriellen Ausgabe die mit einem seriellen Monitor angesehen werden kann
    Serial.println("BOOT");
    Serial.print("Wifi...");
  #endif
  WiFiMulti.addAP(WiFiSSID, WiFiPSK);
  #ifdef AUSGABE
    Serial.println("OK");
  #endif
  pinMode(sensorPin[0], INPUT);   // Initialisiert Pin sensorPin[0] als einen Input
  pinMode(sensorPin[1], INPUT);   // Initialisiert Pin sensorPin[1] als einen Input
  pinMode(sensorPin[2], INPUT);   // Initialisiert Pin sensorPin[2] als einen Input
  pinMode(LED[0], OUTPUT);     // Initialisiert Pin LED[0] als einen Output
  pinMode(LED[1], OUTPUT);     // Initialisiert Pin LED[1] als einen Output
  pinMode(LED[2], OUTPUT);     // Initialisiert Pin LED[2] als einen Output
  for (int i=0; i<3; i++){           // Schleife 0-2
    digitalWrite(LED[i], LOW);  // LED[i] ausschalten
    }
  #ifdef LEDsenden
    pinMode(LEDsend, OUTPUT);     // Initialisiert Pin LEDsend als einen Output
    digitalWrite(LEDsend, HIGH);  // LEDsend ausschalten      // LEDsend ausschalten
  #endif
  Startzeit=millis();           // Startzeit merken
}
//****************************************
void loop() {
  for (int i=0; i<3; i++){           // Schleife 0-2
    yield();                         // Dem Prozessor Zeit für seine internen Prozesse geben und somit einen automatischen RESET verhindern
    Sensor[i]=digitalRead(sensorPin[i]);
    if (Sensor[i]==HIGH && OldSensor[i]==LOW){
      rpm[i]++;}
      OldSensor[i]=Sensor[i];
    }
  #ifdef AUSGABEschleifen               
    Schleifen++;
  #endif
  if (millis()-Startzeit>=Messzeit){      // Wenn der Messinterval abgelaufen ist Werte ausgeben und senden
     rpm[0]=rpm[0]/2;                     // Die Sensoren machen zwei Impulse pro Umdrehung, daher geteilt durch 2
     rpm[1]=rpm[1]/2;                     // Die Sensoren machen zwei Impulse pro Umdrehung, daher geteilt durch 2
     rpm[2]=rpm[2]/2;                     // Die Sensoren machen zwei Impulse pro Umdrehung, daher geteilt durch 2
    #ifdef AUSGABE          
      Serial.print("rpm1: ");
      Serial.print(rpm[0]);
      Serial.print("   rpm2: ");
      Serial.print(rpm[1]);
      Serial.print("   rpm3: ");
      Serial.println(rpm[2]);
    #endif
    #ifdef AUSGABEschleifen  
      Serial.print("Schleifen durchlaufen: ");
      Serial.println(Schleifen);
    #endif
    for (int i=0; i<3; i++){           // Schleife 0-2 um die Werte zu senden
      WertSenden(i);                   // Wert(i) senden
      digitalWrite(LED[i], LOW);       // LED[i] ausschalten
      #ifdef LEDsenden
        digitalWrite(LEDsend, LOW);    // LEDsend einschalten für einen gesendeten Wert
        delay(30);                     // 30 Millisekunden warten
        digitalWrite(LEDsend, HIGH);   // LEDsend ausschalten
        delay(30);                     // 30 Millisekunden warten
      #endif
    }
    rpm[0]=0;
    rpm[1]=0;
    rpm[2]=0;
    Schleifen=0;
    Startzeit=millis();
  }
}

Lieben Gruß,
Chris

Dann wirf doch erst mal alles raus, was nichts mit dem Blinken zu tun hat,
Und dann einen Zähler einführen für die 3.

Gruß Tommy

Hmm, ich dachte eher in eine andere Richtung.

Ich habe ja jeweils schon einen Zähler für die drei Drehzahlen. rpm[0], rpm[1] und rpm[2],
Dann brauche ich doch keine neuen Zähler einführen.
Wenn rpm[0] z.b. 10 erreicht, dann soll die LED[0] eingeschaltet werden.
Wenn rpm[0] z.b. 15 erreicht, dann soll die LED[0] ausgeschaltet werden.
Wenn rpm[0] z.b. 20 erreicht, dann soll die LED[0] eingeschaltet werden.
Wenn rpm[0] z.b. 25 erreicht, dann soll die LED[0] ausgeschaltet werden.
...usw.
Natürlich will ich nun nicht die ganzen Zeilen hinschreiben, sondern dies irgendwie mit einer Berechnung entscheiden.
Irgendwie mit Teilen und Rest oder sowas. Ich weiß aber nicht genau wie man das in C / Arduino macht.

Lieben Gruß,
Chris

würde da folgenden Ansatz wählen:

Lies die RPM aus und leite davon deine Wunsch-Frequenz fürs Blinken ab.
Diese Frequenz übergibst du einem Blink-Led Objekt, und lässt das Objekt sich um die Blinkerei kümmern.

bei einem Lüfter/LED hätt' ich es auch noch nach dem Muster BlinkWithoutDelay gemacht, aber 3 x schreit regelrecht nach OOB.

Hmm, ich hatte gehofft das mit einem 2 oder 3 Zeiler zusätzlich zu realisieren.

Mit Objekten fange ich bei Null an.... was ist das?!

Objekte
:smiling_imp: :smiling_imp: :smiling_imp: :smiling_imp:

Ich hab das mal überflogen. Ich glaube Turbo Pascal ist auch eine Objekt orientierte Programmiersprache, in der ich vor 25 Jahren mal einiges programmiert habe. Da hatte ich noch Zeit. Dann sind aber 20 Jahre ohne Programmieren vergangen.
Eure Ratschläge wirklich in allen Ehren, aber leider bin ich kein Informatiker, der damit was anfangen könnte.
Ich hatte auch nicht vor meinen Code komplett umzukrempeln und anders zu strukturieren. Mir reicht es wenn es läuft, und das tut es sehr gut. Ist mir auch egal ob ich Speicher spare und der dann ungenutzt brach liegt oder ob ich etwas mehr Speicher verbrauche, dann wird dem wenigstens nicht langweilig. Bezahlt ist der Speicher ja schon, denn kann der auch ruhig was tun.
Ich möchte auch nicht tiefer in die Programmierung einsteigen als es unbedingt Not tut. Dafür habe ich leider keine Zeit. Wirklich leider, aber man hat im Leben leider viel zu wenig Zeit um alles zu erledigen was man gerne möchte.
Daher reicht es mir wenn es quick und dirty funktioniert.
Ich brauche nur eine kleine Erweiterung von meinem für mich perfekt lauffähigem Sketch, um die LEDs in einer etwas niedrigeren Frequenz blinken zu lassen. Mehr kann ich leider nicht leisten.
Kann mir jemand auf diesem Weg, den ich beschreiten will, helfen?

Lieben Gruß und lieben Dank,
Chris

themanfrommoon:
Ich brauche nur eine kleine Erweiterung von meinem für mich perfekt lauffähigem Sketch, um die LEDs in einer etwas niedrigeren Frequenz blinken zu lassen. Mehr kann ich leider nicht leisten.
Kann mir jemand auf diesem Weg, den ich beschreiten will, helfen?

Ich helfe gerne Menschen die etwas lernen wollen.

Bie Menschen denen ihre Zeit zu schade ist etwas zu lernen, das sie dann von mir abgreifen können, helfe ich nicht.

Oder wie jemand anderes kürzlich sagte:

Dafür habe ich leider keine Zeit. Wirklich leider, aber man hat im Leben leider viel zu wenig Zeit um alles zu erledigen was man gerne möchte.

themanfrommoon:
Hmm, ich dachte eher in eine andere Richtung.

Ich habe ja jeweils schon einen Zähler für die drei Drehzahlen. rpm[0], rpm[1] und rpm[2],
Dann brauche ich doch keine neuen Zähler einführen.
Wenn rpm[0] z.b. 10 erreicht, dann soll die LED[0] eingeschaltet werden.
Wenn rpm[0] z.b. 15 erreicht, dann soll die LED[0] ausgeschaltet werden.
Wenn rpm[0] z.b. 20 erreicht, dann soll die LED[0] eingeschaltet werden.
Wenn rpm[0] z.b. 25 erreicht, dann soll die LED[0] ausgeschaltet werden.
...usw.
Natürlich will ich nun nicht die ganzen Zeilen hinschreiben, sondern dies irgendwie mit einer Berechnung entscheiden.
Irgendwie mit Teilen und Rest oder sowas. Ich weiß aber nicht genau wie man das in C / Arduino macht.

Lieben Gruß,
Chris

Mit RPM wird das nicht gehen. Du mußt die Impulse zählen; aber das machst Du ja

for (int i=0; i<3; i++){           // Schleife 0-2
    yield();                         // Dem Prozessor Zeit für seine internen Prozesse geben und somit einen automatischen RESET verhindern
    Sensor[i]=digitalRead(sensorPin[i]);
    if (Sensor[i]==HIGH && OldSensor[i]==LOW){
      rpm[i]++;}
      OldSensor[i]=Sensor[i];
    }

Bei jedem Impuls erhöhst Du einen der 3 zusätzlichen Zähler:
blink[0]++;
if (blink[ i ] >= 5) // Die Zahl gibt den Teiler Für die Frrequenz an. Da 2 impulse pro Umdrehung stimmt das Teilerverhältnis mit der Frequenz.
{
~~ digitalWrite(LED[ i ], digitalRead(LED[ i ]);~~
digitalWrite(LED[ i ], !digitalRead(LED[ i ]);
blink[ i ] = 0;
}

Grüße Uwe

themanfrommoon:
Kann mir jemand auf diesem Weg, den ich beschreiten will, helfen?

Nein. ^^

du verwendest schon OOB für deinen http client.

Außerdem wirst du sehen, dass dir OOB künftig viel Zeit spart.

Daher mal eine OOB Blinkled zugeschnitten für deinen Anwendungsfall. Die deutschen Kommentare sind für dich.

/* Blink a LED in a specific rhythm object orianted programing

  Turns on and off light emitting diodes (LED) connected to a digital pin,
  without using the delay() function. This means that other code can run at the
  same time without being interrupted by the LED code.

*/

// Variante: 3 Blinkled Objekte in einem Array


// Erst brauchen wir die eigentliche Blinkklasse. das sind 36 Zeilen gut investierte Zeilen - dafür wird's dann im Code loop/setup einfach.

class BlinkLed {
    byte state = 1;                    // 0 off, 1 blink
    unsigned long previousMillis;      // last blink timestamp
    uint16_t on = 180;
    uint16_t off = 320;                // 180/320 is according ECE
    const byte ledPin;                 // a GPIO for the LED

  public:
    BlinkLed(byte attachTo, uint16_t _on = 180, uint16_t _off = 320):
      ledPin(attachTo),
      on (_on),
      off (_off)
    {}
    void setup() {
      pinMode(ledPin, OUTPUT);
    }
    void set(uint16_t _on, uint16_t _off) { // modify on/off times during runtime
      on = _on;
      off = _off;
    }
    void setState(byte _state) {           // 1 Switch on blinking; 0 switch off blinking
      state = _state;
    }
    void loop() {
      if (state) {
        uint32_t currentMillis = millis();
        if (digitalRead(ledPin) && currentMillis - previousMillis >= on) {
          previousMillis = currentMillis;            // save the last time you blinked the LED
          digitalWrite(ledPin, LOW);
        }
        else if (!digitalRead(ledPin) && currentMillis - previousMillis >= off) {
          previousMillis = currentMillis;           // save the last time you blinked the LED
          digitalWrite(ledPin, HIGH);
        }
      }
    }
};



// ab nun die Erweiterung der Deklarationen/Definitionen. 
// die hab ich mir von dir geklaut, wobei das meines erachtens besser ein unsigned sein soll, also uint16_t eigentlich!!!
int rpm[3] = {0, 0, 0};                   // Array Variable für den ausgelesenen Wert, muss am Anfang 0 sein


// das brauchst für noiasca's Blinkklasse - zum Blinken legen wir nur die Objekte aus der obigen Klasse an:

BlinkLed led[3] = {          // Array mit den 3 Objekten ... das ist das einzige "komplizierte" hier hierinnen
  BlinkLed(5),
  BlinkLed(4),
  BlinkLed(15)
};

//

void setup() {
  // each LED object has to be called once in the setup
  for (byte i = 0; i < 3; i++)         //anstatt 3 x die setup methode hinzuschreiben, nutzen wir das Array mit den Objekten, das Muster brauchen wir eh noch ein paar Mal.
  {
    led[i].setup();
  }
  Serial.begin(115200);    //only used for debug
}

void loop() {
  // each LED object has to be called once in the loop
  for (byte i = 0; i < 3; i++)
  {
    led[i].loop();                    // jedes Objekt rufen wir einmal auf, das Objekt "weis" selber ob es dann etwas tun muss
  }
  //
  // das kommt in den Teil nachdem deine rpm ausgelesen worden sind.
  for (byte i = 0; i < 3; i++)
  {
    uint16_t newOnTime = rpm[i] / 4;  // Berechnung der neuen Einschaltzeit für die LED mit Teiler auf 4. könnte man auch direkt im .set machen, aber so ist es einfacher zum nachvollziehen
    led[i].set(newOnTime, 320);       // Ich lass die Offzeit auf 320ms, im Prinzip kann man damit aber gleich umgehen
  }

  // eine nicht genutzte Methode in diesem Sketch ist
  // led[0].setState(0);   // zum Ausschalten der BlinkLed
  // bzw:
  // led[0].setState(1);   // zum Einschalten der Blinkled
  
  //
  // put here other code which needs to run:
  //
}

ich fasse zusammen:

  • blinkLed Klasse erstellen
  • 3 Objekte definieren
  • Objekte im Setup aufrufen (braucht es im konkreten wegen der Portdefinitionen)
  • Im Loop jedes Objekt "anticken", damit sie etwas Zeit bekommen und prüfen können ob die Led ein oder ausgeschaltet werden soll

mehr steckt da nicht dahinter.
Nichtblockierendes, skalierendes, individuelles blinken.

die Profis verzeihen mir meinen Code/Erklärungen bitte, ich hab auch erst seit kurzem Entdeckt wie viel Zeit mir OOB sparen kann, soll heißen, stehe auch erst am Anfang.

themanfrommoon:
Lieben Gruß und lieben Dank,
Chris

gern geschehen. Ist ja Sonntag.

Warum wollt ihr eigentlich jeden, der nur ein bisschen mit Arduino arbeiten will, gleich zum OOP Fachmann ausbilden? Arduino wendet sich ausdrücklich auch ein Einsteiger, die gar nicht sooo tief einsteigen wollen. Klar, ganz ohne eigene Mühe und etwas Lernwillen geht es auch nicht.
Aber nicht umsonst kommt das Erstellen von eigenen Klassen in der Referenz und den Tutorials gar nicht vor.
Wer sowas will - ok. Wer es nicht will - auch OK!

themanfrommoon:
Hmm, ich dachte eher in eine andere Richtung.

Ich habe ja jeweils schon einen Zähler für die drei Drehzahlen. rpm[0], rpm[1] und rpm[2],
Dann brauche ich doch keine neuen Zähler einführen.
Wenn rpm[0] z.b. 10 erreicht, dann soll die LED[0] eingeschaltet werden.
Wenn rpm[0] z.b. 15 erreicht, dann soll die LED[0] ausgeschaltet werden.
Wenn rpm[0] z.b. 20 erreicht, dann soll die LED[0] eingeschaltet werden.
Wenn rpm[0] z.b. 25 erreicht, dann soll die LED[0] ausgeschaltet werden.
...usw.
Natürlich will ich nun nicht die ganzen Zeilen hinschreiben, sondern dies irgendwie mit einer Berechnung entscheiden.
Irgendwie mit Teilen und Rest oder sowas. Ich weiß aber nicht genau wie man das in C / Arduino macht.

Lieben Gruß,
Chris

Hallo Chris,
ja, das geht auch mit Teilen und Rest oder so :wink:

Im Prinzip:

if ( (rpm[0] % 5) == 0 ) digitalWrite( ledPin[0], !digitalRead(ledPin[0]) );

Ha!
Endlich jemand der zielorientiert mitdenken und den Overhead weglassen kann :slight_smile: Dich würde ich sofort einstellen wenn ich eine Firma hätte!
Tatsächlich hab ich mir fünf Minuten vor lesen von MicroBahners Beitrag das durch den Kopf gehen lassen und mich an meine alten Turbo Pascal Zeiten erinnert und konnte das ganze mit einem von mir angestrebten Zweizeiler lösen.

if (rpm[i] % 10 == 0) { digitalWrite(LED[i], HIGH); }
if (rpm[i] % 10 == 5) { digitalWrite(LED[i], LOW); }

Beim 1. Durchlauf geht die entsprechende LED an.
Beim 5. Durchlauf geht die LED aus.
Nach 10 Durchläufen wiederholt sich das ganze.
Somit ist die Frequenz um den Faktor 10 herabgesetzt.

MicroBahners Lösung muss ich mir auch noch anschauen, der kriegt das ja sogar in einer Zeile hin.
Chapeau! Du bist mein Held!

if ( (rpm[i] % 5) == 0 ) digitalWrite( LED[i], !digitalRead(LED[i]) );

Nun muss ich allerdings erst noch die Platine löten damit ich das testen kann :slight_smile:

Allen anderen danke ich an dieser Stelle auch nochmal für den Input :slight_smile:

Lieben Gruß,
Chris

Moin,

Hardware fertig gebaut und getestet.

Hmm, so einfach ist das doch nicht.

Damit läuft es leider nicht:

if ( (rpm[i] % 5) == 0 ) digitalWrite( LED[i], !digitalRead(LED[i]) );

Der Gedanke mit dem digitalRead scheint wohl nicht zu funktionieren.
Die Idee finde ich gut, aber die Pins sind ja als OUTPUT definiert.
Das Ergebnis sieht etwas komisch aus, statt konstant zu blinken kann man eine Schwebung im Blinkmuster erkennen. Keine Ahnung was da genau abläuft.

Ich habe dann den Zweizeiler von mir probiert:

if (rpm[i] % 10 == 0) { digitalWrite(LED[i], HIGH); }
if (rpm[i] % 10 == 5) { digitalWrite(LED[i], LOW); }

Das funktioniert einwandfrei :slight_smile: Klein, Smart, läuft :wink:

Lieben Gruß,
Chris

Hallo Chris,

themanfrommoon:
..., aber die Pins sind ja als OUTPUT definiert.

Das macht nichts, Du kannst auch einen OUTPUT-Pin lesen. Das Ergebnis ist der Zustand am Pin - es sei denn, Du hast ihn so stark belastet, dass er in die Knie geht. Aber das wäre dann ein anderes Problem.

themanfrommoon:
Das Ergebnis sieht etwas komisch aus, statt konstant zu blinken kann man eine Schwebung im Blinkmuster erkennen. Keine Ahnung was da genau abläuft.

Da kann ich mir jetzt nichts drunter vorstellen. Aber wenn deine Lösung funktioniert ist es ja gut. Auf die eine zusätzliche Zeile kommt es schließlich nicht an.

Hi

Das wird daran liegen, daß der Zustand
(rpm*%5)==0*
sehr sehr oft vorkommt - also Dein µC einfach dafür zu schnell ist und diese Zeile halt zig Mal abarbeitet, bis %5 eben nicht mehr 0 ist.
In dieser Zeit wird die LED immer wieder AN und AUS geschaltet - je nachdem, ob der µC Das eine gerade Anzahl Male schafft, ist die LED nach der Schwebung wieder im Zustand 'wie davor', oder eben genau anders herum - AN oder AUS und dazwischen 'flimmert' Sie vor sich hin.
In Deinem Code setzt Du halt fünfunddreißig Mal die LED auf HIGH - Das hat für das Auge keinerlei Änderung.
Ob man sich jetzt einfach 'merkt', ob man schon umgeschaltet hat, oder eben tatsächlich (um)schaltet, sollte hier keine Rolle spielen.
MfG

Ja, das wird es sein.
Es kommt darauf an, wo man die Zeile einfügt. Der 1-Zeiler müsste in das if, wo die Flankenerkennung gemacht wird und rpm incrementiert wird. Da kommt er nicht bei jedem loop hin, sondern nur bei den rpm-Flanken.

if ( (rpm % 5) == 0 ) digitalWrite( LED_, !digitalRead(LED*) );[/quote]*
Das funktioniert schon (manchmal).
Beim Arduino UNO, Leonardo und MEGA funktioniert das Lesen eines Ausgangs.
Beim DUE funktioniert das nicht.
Beim ESP8266 weiß ich nicht ob es funktioniert. Da es Dir nicht funktioniert nehme ich mal an, daß es am ESP nicht funktioniert.
Grüße Uwe_

Bei meinem ESP8266 funktioniert das.

Edit: und auf meinem DUE auch ....