6 fach Lüftersteuerung hängt immer wieder und reagiert nicht mehr

Das Programm funktioniert gut, aber nach bestimmte Zeit bleibt der Arduino Micro einfach hängen. Es läuft unterschiedlich lang gut, dann hängt es auf einmal.
Ich konnte im Programm nichts finden, wo es hängen bleiben könnte.

void loop()
{
  potiVar = analogRead(potiPinA0) ;             // Liest das Potentiometer aus
  fanSpeed = map(potiVar, 0, 1023, 60, 255);   // Verteilt den PWM Wert über den Messbereich des Potis
  analogWrite(fanPin9, fanSpeed);               // Gibt die Variable mit PWM aus
 
  // Alle 1000ms die Drehzal auslesen
  if((millis() - tachoMillis) == abfrZeit1)
  {    
    flankenZeit = pulseIn(tacho1Pin3, LOW);  // Abfrage der Zeit pro Puls in Mikrosekunden
    umdrZeit = ((flankenZeit * 4)/1000);     // Berechnung der Zeit pro Umdrehung in Millisekunden
    rps = (1000/umdrZeit);                   // Umrechnung auf Umdrehungen pro Sekunde
    rpm1 = (rps*6);                          // Schritt 1 zur Rundung auf 10er Schritte der Drehzahl
    rpm1 = (rpm1*10);                        // Schritt 2 zur Rundung auf 10er Schritte der Drehzahl
    Serial.print(" L1: ");                   // Ausgabe der Drehzahl im Seriellen Monitor
    Serial.print(rpm1);                      // Ausgabe der Drehzahl im Seriellen Monitor
    if (((fanSpeed*8)-(fanSpeed))>rpm1)      // Alarm bei 10% Drehzahlverlust
    {
      digitalWrite(0,LOW); digitalWrite(1,HIGH);
    }
    else 
    {  
      digitalWrite(0,HIGH); digitalWrite(1,LOW); 
    }
    //tachoMillis = millis();      // aktualisiert um die nächsten 1000ms zählen zu können 
  }
  if((millis() - tachoMillis) == abfrZeit2)
  {    
    flankenZeit = pulseIn(tacho2Pin4, LOW);  // Abfrage der Zeit pro Puls in Mikrosekunden
    umdrZeit = ((flankenZeit * 4)/1000);     // Berechnung der Zeit pro Umdrehung in Millisekunden
    rps = (1000/umdrZeit);                   // Umrechnung auf Umdrehungen pro Sekunde
    rpm2 = (rps*6);                          // Schritt 1 zur Rundung auf 10er Schritte der Drehzahl
    rpm2 = (rpm2*10);                        // Schritt 2 zur Rundung auf 10er Schritte der Drehzahl
    Serial.print(" L2: ");                   // Ausgabe der Drehzahl im Seriellen Monitor
    Serial.print(rpm2);                      // Ausgabe der Drehzahl im Seriellen Monitor
    if (((fanSpeed*8)-(fanSpeed))>rpm2)      // Alarm bei 10% Drehzahlverlust
    {
      digitalWrite(2,LOW); digitalWrite(A1,HIGH);
    }
    else 
    {  
      digitalWrite(2,HIGH); digitalWrite(A1,LOW); 
    }
    //tachoMillis = millis();      //  aktualisiert um die nächsten 1000ms zählen zu können 
  }
  if((millis() - tachoMillis) == abfrZeit3)
  {    
    flankenZeit = pulseIn(tacho3Pin5, LOW);  // Abfrage der Zeit pro Puls in Mikrosekunden
    umdrZeit = ((flankenZeit * 4)/1000);     // Berechnung der Zeit pro Umdrehung in Millisekunden
    rps = (1000/umdrZeit);                   // Umrechnung auf Umdrehungen pro Sekunde
    rpm3 = (rps*6);                          // Schritt 1 zur Rundung auf 10er Schritte der Drehzahl
    rpm3 = (rpm3*10);                        // Schritt 2 zur Rundung auf 10er Schritte der Drehzahl
    Serial.print(" L3: ");                   // Ausgabe der Drehzahl im Seriellen Monitor
    Serial.print(rpm3);                      // Ausgabe der Drehzahl im Seriellen Monitor
    if (((fanSpeed*8)-(fanSpeed))>rpm3)      // Alarm bei 10% Drehzahlverlust
    {
      digitalWrite(A2,LOW); digitalWrite(A4,HIGH);
    }
    else 
    {  
      digitalWrite(A2,HIGH); digitalWrite(A4,LOW);
    }
    //tachoMillis = millis();      //  aktualisiert um die nächsten 1000ms zählen zu können 
  }
  if((millis() - tachoMillis) == abfrZeit4)
  {    
    flankenZeit = pulseIn(tacho4Pin6, LOW);  // Abfrage der Zeit pro Puls in Mikrosekunden
    umdrZeit = ((flankenZeit * 4)/1000);     // Berechnung der Zeit pro Umdrehung in Millisekunden
    rps = (1000/umdrZeit);                   // Umrechnung auf Umdrehungen pro Sekunde
    rpm4 = (rps*6);                          // Schritt 1 zur Rundung auf 10er Schritte der Drehzahl
    rpm4 = (rpm4*10);                        // Schritt 2 zur Rundung auf 10er Schritte der Drehzahl
    Serial.print(" L4: ");                   // Ausgabe der Drehzahl im Seriellen Monitor
    Serial.print(rpm4);                      // Ausgabe der Drehzahl im Seriellen Monitor
    if (((fanSpeed*8)-(fanSpeed))>rpm4)      // Alarm bei 10% Drehzahlverlust
    {
      digitalWrite(A3,LOW); digitalWrite(A5,HIGH);
    }
    else 
    {  
      digitalWrite(A3,HIGH); digitalWrite(A5,LOW);
    }
    //tachoMillis = millis();      //  aktualisiert um die nächsten 1000ms zählen zu können 
  }
  if((millis() - tachoMillis) == abfrZeit5)
  {    
    flankenZeit = pulseIn(tacho5Pin7, LOW);  // Abfrage der Zeit pro Puls in Mikrosekunden
    umdrZeit = ((flankenZeit * 4)/1000);     // Berechnung der Zeit pro Umdrehung in Millisekunden
    rps = (1000/umdrZeit);                   // Umrechnung auf Umdrehungen pro Sekunde
    rpm5 = (rps*6);                          // Schritt 1 zur Rundung auf 10er Schritte der Drehzahl
    rpm5 = (rpm5*10);                        // Schritt 2 zur Rundung auf 10er Schritte der Drehzahl
    Serial.print(" L5: ");                   // Ausgabe der Drehzahl im Seriellen Monitor
    Serial.print(rpm5);                      // Ausgabe der Drehzahl im Seriellen Monitor
    if (((fanSpeed*8)-(fanSpeed))>rpm5)      // Alarm bei 10% Drehzahlverlust
    {
      digitalWrite(10,LOW); digitalWrite(11,HIGH);
    }
    else 
    {  
      digitalWrite(10,HIGH); digitalWrite(11,LOW);
    }
    //tachoMillis = millis();      // aktualisiert um die nächsten 1000ms zählen zu können 
  }
  if((millis() - tachoMillis) == abfrZeit6)
  {    
    flankenZeit = pulseIn(tacho6Pin8, LOW);  // Abfrage der Zeit pro Puls in Mikrosekunden
    umdrZeit = ((flankenZeit * 4)/1000);     // Berechnung der Zeit pro Umdrehung in Millisekunden
    rps = (1000/umdrZeit);                   // Umrechnung auf Umdrehungen pro Sekunde
    rpm6 = (rps*6);                          // Schritt 1 zur Rundung auf 10er Schritte der Drehzahl
    rpm6 = (rpm6*10);                        // Schritt 2 zur Rundung auf 10er Schritte der Drehzahl
    Serial.print(" L6: ");                   // Ausgabe der Drehzahl im Seriellen Monitor
    Serial.print(rpm6);                      // Ausgabe der Drehzahl im Seriellen Monitor
    if (((fanSpeed*8)-(fanSpeed))>rpm6)      // Alarm bei 10% Drehzahlverlust
    {
      digitalWrite(12,LOW); digitalWrite(13,HIGH);
    }
    else 
    {  
      digitalWrite(12,HIGH); digitalWrite(13,LOW);
    }
    Serial.print(" Soll: ");                 // Ausgabe der Drehzahl im Seriellen Monitor
    Serial.print(fanSpeed*8);                // Ausgabe der Drehzahl im Seriellen Monitor
    Serial.print(" Timer: ");                // Ausgabe der Drehzahl im Seriellen Monitor
    Serial.print(millis());                  // Ausgabe der Drehzahl im Seriellen Monitor
    Serial.print(" C: ");                    // Ausgabe der Drehzahl im Seriellen Monitor
    counter = counter + 1 ;
    Serial.println(counter);                 // Ausgabe der Drehzahl im Seriellen Monitor
    tachoMillis = millis();       // aktualisiert um die nächsten 1000ms zählen zu können 
  }
}

Da uns die Variablendeklarationen fehlen, kann man dazu wenig sagen.

Die Zeitvergleiche sollten >= anstelle == sein, wenn Du verschiedene Wartezeiten nutzen wills, braucht wohl jede ihr eigenes tachoMillis und warum sind die Zuweisungen zu tachoMillis auskommentiert?

Gruß Tommy

Ich sehe ich gerade, dass du grundsätzlich nicht auf Postings antwortest.
Also keine Hilfe von mir.

Die Zeitvergleiche habe ich auf >= abgeändert.
Den tachoMillis brauche ich nur einmal zum Schluss, sonst wird nur der erste Lüfter gesteuert.

hier ist das komplette Programm!

//Konstanten
const int tacho1Pin3 = 3;       // Pin des Tachosignals des Lüfters
const int tacho2Pin4 = 4;       // Pin des Tachosignals des Lüfters
const int tacho3Pin5 = 5;       // Pin des Tachosignals des Lüfters
const int tacho4Pin6 = 6;       // Pin des Tachosignals des Lüfters
const int tacho5Pin7 = 7;       // Pin des Tachosignals des Lüfters
const int tacho6Pin8 = 8;       // Pin des Tachosignals des Lüfters
const int fanPin9 = 9;          // PWM Anschluss des Lüfter
const int potiPinA0 = A0 ;      // Potenzometer am analogen Eingang A0 angeschlossen
 
// Variablen
int fanSpeed = 0;              // Variable für die Lüftergeschwindigkeit
int potiVar = 0 ;              // Variable zum speichern des Potentiometereingangs
int abfrZeit1 = 10;          // Zeitabstand für die Abfragen des Tachosignals
int abfrZeit2 = 500;          // Zeitabstand für die Abfragen des Tachosignals
int abfrZeit3 = 1000;          // Zeitabstand für die Abfragen des Tachosignals
int abfrZeit4 = 1500;          // Zeitabstand für die Abfragen des Tachosignals
int abfrZeit5 = 2000;          // Zeitabstand für die Abfragen des Tachosignals
int abfrZeit6 = 2500;          // Zeitabstand für die Abfragen des Tachosignals
int counter = 0;
unsigned long tachoMillis = abfrZeit1;  // Zeitabstand für Pulse Stretching Funktion
float rps = 0;                 // Variable mit Kommastelle zur Berechnung der Umdrehungen pro Sekunde
int rpm1 = 0;                  // Variable für die gemittelte Drehzahl
int rpm2 = 0;                  // Variable für die gemittelte Drehzahl
int rpm3 = 0;                  // Variable für die gemittelte Drehzahl
int rpm4 = 0;                  // Variable für die gemittelte Drehzahl
int rpm5 = 0;                  // Variable für die gemittelte Drehzahl
int rpm6 = 0;                  // Variable für die gemittelte Drehzahl
int checkfan = 0;
float umdrZeit = 0;            // Variable mit Kommastelle für die Zeit pro Umdrehung des Lüfters
float flankenZeit =0;          // Variable mit Kommastelle für die Zeit pro Puls des Lüfters
  
  
void setup()
{
  TCCR1B = TCCR1B & 0b11111000 | 0x01;    //Timer 1 (PWM pins 5 & 6)
  Serial.begin(57600);           // Baudrate für die Ausgabe am Seriellen Monitor
  pinMode(fanPin9, OUTPUT);      // Setzt den Lüfter Pin als Ausgang
  pinMode(tacho1Pin3, INPUT);     // Setzt den Tacho Pin als Eingang
  pinMode(tacho2Pin4, INPUT);     // Setzt den Tacho Pin als Eingang
  pinMode(tacho3Pin5, INPUT);     // Setzt den Tacho Pin als Eingang
  pinMode(tacho4Pin6, INPUT);     // Setzt den Tacho Pin als Eingang
  pinMode(tacho5Pin7, INPUT);     // Setzt den Tacho Pin als Eingang
  pinMode(tacho6Pin8, INPUT);     // Setzt den Tacho Pin als Eingang
  pinMode(potiPinA0, INPUT);     // Setzt den Poti Pin als Eingang
  pinMode(A1, OUTPUT);           // Setzt den Analog1 Pin als Ausgang
  pinMode(A2, OUTPUT);           // Setzt den Analog2 Pin als Ausgang
  pinMode(A3, OUTPUT);           // Setzt den Analog3 Pin als Ausgang
  pinMode(A4, OUTPUT);           // Setzt den Analog4 Pin als Ausgang
  pinMode(A5, OUTPUT);           // Setzt den Analog5 Pin als Ausgang
  pinMode(10, OUTPUT);           // Setzt den digital Pin als Ausgang
  pinMode(11, OUTPUT);           // Setzt den digital Pin als Ausgang
  pinMode(12, OUTPUT);           // Setzt den digital Pin als Ausgang
  pinMode(13, OUTPUT);           // Setzt den digital Pin als Ausgang
  pinMode(0, OUTPUT);           // Setzt den digital Pin als Ausgang
  pinMode(1, OUTPUT);           // Setzt den digital Pin als Ausgang
  pinMode(2, OUTPUT);           // Setzt den digital Pin als Ausgang
}

void loop()
{
  potiVar = analogRead(potiPinA0) ;             // Liest das Potentiometer aus
  fanSpeed = map(potiVar, 0, 1023, 60, 255);   // Verteilt PWM Wert über den Bereich des Potis
  analogWrite(fanPin9, fanSpeed);               // Gibt die Variable mit PWM aus
 
  // Alle 1000ms die Drehzal auslesen
  if((millis() - tachoMillis) == abfrZeit1)
  {   
    flankenZeit = pulseIn(tacho1Pin3, LOW);  // Abfrage der Zeit pro Puls in Mikrosekunden
    umdrZeit = ((flankenZeit * 4)/1000);     // Berechnung der Zeit pro Umdr. in Millisekunden
    rps = (1000/umdrZeit);                   // Umrechnung auf Umdrehungen pro Sekunde
    rpm1 = (rps*6);                          // Schritt 1 zur Rundung auf 10er Schritte der Drehzahl
    rpm1 = (rpm1*10);                        // Schritt 2 zur Rundung auf 10er Schritte der Drehzahl
    Serial.print(" L1: ");                   // Ausgabe der Drehzahl im Seriellen Monitor
    Serial.print(rpm1);                      // Ausgabe der Drehzahl im Seriellen Monitor
    if (((fanSpeed*8)-(fanSpeed))>rpm1)      // Alarm bei 10% Drehzahlverlust
    {
      digitalWrite(0,LOW); digitalWrite(1,HIGH);
    }
    else
    { 
      digitalWrite(0,HIGH); digitalWrite(1,LOW);
    }
  }
  if((millis() - tachoMillis) == abfrZeit2)
  {   
    flankenZeit = pulseIn(tacho2Pin4, LOW);
    umdrZeit = ((flankenZeit * 4)/1000);     
    rps = (1000/umdrZeit);                  
    rpm2 = (rps*6);                        
    rpm2 = (rpm2*10);                       
    Serial.print(" L2: ");                 
    Serial.print(rpm2);                     
    if (((fanSpeed*8)-(fanSpeed))>rpm2)     
    {
      digitalWrite(2,LOW); digitalWrite(A1,HIGH);
    }
    else
    { 
      digitalWrite(2,HIGH); digitalWrite(A1,LOW);
    }
  }
  if((millis() - tachoMillis) == abfrZeit3)
  {   
    flankenZeit = pulseIn(tacho3Pin5, LOW);  
    umdrZeit = ((flankenZeit * 4)/1000);    
    rps = (1000/umdrZeit);                
    rpm3 = (rps*6);                      
    rpm3 = (rpm3*10);                    
    Serial.print(" L3: ");                 
    Serial.print(rpm3);                   
    if (((fanSpeed*8)-(fanSpeed))>rpm3)   
    {
      digitalWrite(A2,LOW); digitalWrite(A4,HIGH);
    }
    else
    { 
      digitalWrite(A2,HIGH); digitalWrite(A4,LOW);
    }
  }
  if((millis() - tachoMillis) == abfrZeit4)
  {   
    flankenZeit = pulseIn(tacho4Pin6, LOW);  
    umdrZeit = ((flankenZeit * 4)/1000);     
    rps = (1000/umdrZeit);                 
    rpm4 = (rps*6);                         
    rpm4 = (rpm4*10);                       
    Serial.print(" L4: ");                 
    Serial.print(rpm4);                    
    if (((fanSpeed*8)-(fanSpeed))>rpm4)     
    {
      digitalWrite(A3,LOW); digitalWrite(A5,HIGH);
    }
    else
    { 
      digitalWrite(A3,HIGH); digitalWrite(A5,LOW);
    }
  }
  if((millis() - tachoMillis) == abfrZeit5)
  {   
    flankenZeit = pulseIn(tacho5Pin7, LOW);  
    umdrZeit = ((flankenZeit * 4)/1000);    
    rps = (1000/umdrZeit);                 
    rpm5 = (rps*6);                   
    rpm5 = (rpm5*10);                       
    Serial.print(" L5: ");             
    Serial.print(rpm5);                      
    if (((fanSpeed*8)-(fanSpeed))>rpm5)     
    {
      digitalWrite(10,LOW); digitalWrite(11,HIGH);
    }
    else
    { 
      digitalWrite(10,HIGH); digitalWrite(11,LOW);
    }
  }
  if((millis() - tachoMillis) == abfrZeit6)
  {   
    flankenZeit = pulseIn(tacho6Pin8, LOW); 
    umdrZeit = ((flankenZeit * 4)/1000);   
    rps = (1000/umdrZeit);                 
    rpm6 = (rps*6);                         
    rpm6 = (rpm6*10);                        
    Serial.print(" L6: ");                   
    Serial.print(rpm6);                      
    if (((fanSpeed*8)-(fanSpeed))>rpm6)      
    {
      digitalWrite(12,LOW); digitalWrite(13,HIGH);
    }
    else
    { 
      digitalWrite(12,HIGH); digitalWrite(13,LOW);
    }
    Serial.print(" Soll: ");                 
    Serial.print(fanSpeed*8);               
    Serial.print(" Timer: ");               
    Serial.print(millis());                 
    Serial.print(" C: ");                    
    counter = counter + 1 ;
    Serial.println(counter);               
    tachoMillis = millis();      // Die TachoMillis wird aktualisiert 
  }
}

Ich hatte Dir noch mehr geantwortet. Das ignorierst Du einfach?

Gruß Tommy

Tommy56:
Ich hatte Dir noch mehr geantwortet. Das ignorierst Du einfach?

Gruß Tommy

Sorry, habe nicht auf Quote gedruckt. Hier ist das komplette Programm!

//Konstanten
const int tacho1Pin3 = 3;       // Pin des Tachosignals des Lüfters
const int tacho2Pin4 = 4;       // Pin des Tachosignals des Lüfters
const int tacho3Pin5 = 5;       // Pin des Tachosignals des Lüfters
const int tacho4Pin6 = 6;       // Pin des Tachosignals des Lüfters
const int tacho5Pin7 = 7;       // Pin des Tachosignals des Lüfters
const int tacho6Pin8 = 8;       // Pin des Tachosignals des Lüfters
const int fanPin9 = 9;          // PWM Anschluss des Lüfter
const int potiPinA0 = A0 ;      // Potenzometer am analogen Eingang A0 angeschlossen
 
// Variablen
int fanSpeed = 0;              // Variable für die Lüftergeschwindigkeit
int potiVar = 0 ;              // Variable zum speichern des Potentiometereingangs
int abfrZeit1 = 10;          // Zeitabstand für die Abfragen des Tachosignals
int abfrZeit2 = 500;          // Zeitabstand für die Abfragen des Tachosignals
int abfrZeit3 = 1000;          // Zeitabstand für die Abfragen des Tachosignals
int abfrZeit4 = 1500;          // Zeitabstand für die Abfragen des Tachosignals
int abfrZeit5 = 2000;          // Zeitabstand für die Abfragen des Tachosignals
int abfrZeit6 = 2500;          // Zeitabstand für die Abfragen des Tachosignals
int counter = 0;
unsigned long tachoMillis = abfrZeit1;  // Zeitabstand für Pulse Stretching Funktion
float rps = 0;                 // Variable mit Kommastelle zur Berechnung der Umdrehungen pro Sekunde
int rpm1 = 0;                  // Variable für die gemittelte Drehzahl
int rpm2 = 0;                  // Variable für die gemittelte Drehzahl
int rpm3 = 0;                  // Variable für die gemittelte Drehzahl
int rpm4 = 0;                  // Variable für die gemittelte Drehzahl
int rpm5 = 0;                  // Variable für die gemittelte Drehzahl
int rpm6 = 0;                  // Variable für die gemittelte Drehzahl
int checkfan = 0;
float umdrZeit = 0;            // Variable mit Kommastelle für die Zeit pro Umdrehung des Lüfters
float flankenZeit =0;          // Variable mit Kommastelle für die Zeit pro Puls des Lüfters
 
 
void setup()
{
  TCCR1B = TCCR1B & 0b11111000 | 0x01;    //Timer 1 (PWM pins 5 & 6)
  Serial.begin(57600);           // Baudrate für die Ausgabe am Seriellen Monitor
  pinMode(fanPin9, OUTPUT);      // Setzt den Lüfter Pin als Ausgang
  pinMode(tacho1Pin3, INPUT);     // Setzt den Tacho Pin als Eingang
  pinMode(tacho2Pin4, INPUT);     // Setzt den Tacho Pin als Eingang
  pinMode(tacho3Pin5, INPUT);     // Setzt den Tacho Pin als Eingang
  pinMode(tacho4Pin6, INPUT);     // Setzt den Tacho Pin als Eingang
  pinMode(tacho5Pin7, INPUT);     // Setzt den Tacho Pin als Eingang
  pinMode(tacho6Pin8, INPUT);     // Setzt den Tacho Pin als Eingang
  pinMode(potiPinA0, INPUT);     // Setzt den Poti Pin als Eingang
  pinMode(A1, OUTPUT);           // Setzt den Analog1 Pin als Ausgang
  pinMode(A2, OUTPUT);           // Setzt den Analog2 Pin als Ausgang
  pinMode(A3, OUTPUT);           // Setzt den Analog3 Pin als Ausgang
  pinMode(A4, OUTPUT);           // Setzt den Analog4 Pin als Ausgang
  pinMode(A5, OUTPUT);           // Setzt den Analog5 Pin als Ausgang
  pinMode(10, OUTPUT);           // Setzt den digital Pin als Ausgang
  pinMode(11, OUTPUT);           // Setzt den digital Pin als Ausgang
  pinMode(12, OUTPUT);           // Setzt den digital Pin als Ausgang
  pinMode(13, OUTPUT);           // Setzt den digital Pin als Ausgang
  pinMode(0, OUTPUT);           // Setzt den digital Pin als Ausgang
  pinMode(1, OUTPUT);           // Setzt den digital Pin als Ausgang
  pinMode(2, OUTPUT);           // Setzt den digital Pin als Ausgang
}

void loop()
{
  potiVar = analogRead(potiPinA0) ;             // Liest das Potentiometer aus
  fanSpeed = map(potiVar, 0, 1023, 60, 255);   // Verteilt PWM Wert über den Bereich des Potis
  analogWrite(fanPin9, fanSpeed);               // Gibt die Variable mit PWM aus
 
  // Alle 1000ms die Drehzal auslesen
  if((millis() - tachoMillis) == abfrZeit1)
  {   
    flankenZeit = pulseIn(tacho1Pin3, LOW);  // Abfrage der Zeit pro Puls in Mikrosekunden
    umdrZeit = ((flankenZeit * 4)/1000);     // Berechnung der Zeit pro Umdr. in Millisekunden
    rps = (1000/umdrZeit);                   // Umrechnung auf Umdrehungen pro Sekunde
    rpm1 = (rps*6);                          // Schritt 1 zur Rundung auf 10er Schritte der Drehzahl
    rpm1 = (rpm1*10);                        // Schritt 2 zur Rundung auf 10er Schritte der Drehzahl
    Serial.print(" L1: ");                   // Ausgabe der Drehzahl im Seriellen Monitor
    Serial.print(rpm1);                      // Ausgabe der Drehzahl im Seriellen Monitor
    if (((fanSpeed*8)-(fanSpeed))>rpm1)      // Alarm bei 10% Drehzahlverlust
    {
      digitalWrite(0,LOW); digitalWrite(1,HIGH);
    }
    else
    {
      digitalWrite(0,HIGH); digitalWrite(1,LOW);
    }
  }
  if((millis() - tachoMillis) == abfrZeit2)
  {   
    flankenZeit = pulseIn(tacho2Pin4, LOW);
    umdrZeit = ((flankenZeit * 4)/1000);     
    rps = (1000/umdrZeit);                 
    rpm2 = (rps*6);                       
    rpm2 = (rpm2*10);                       
    Serial.print(" L2: ");                 
    Serial.print(rpm2);                     
    if (((fanSpeed*8)-(fanSpeed))>rpm2)     
    {
      digitalWrite(2,LOW); digitalWrite(A1,HIGH);
    }
    else
    {
      digitalWrite(2,HIGH); digitalWrite(A1,LOW);
    }
  }
  if((millis() - tachoMillis) == abfrZeit3)
  {   
    flankenZeit = pulseIn(tacho3Pin5, LOW); 
    umdrZeit = ((flankenZeit * 4)/1000);   
    rps = (1000/umdrZeit);               
    rpm3 = (rps*6);                     
    rpm3 = (rpm3*10);                   
    Serial.print(" L3: ");                 
    Serial.print(rpm3);                   
    if (((fanSpeed*8)-(fanSpeed))>rpm3)   
    {
      digitalWrite(A2,LOW); digitalWrite(A4,HIGH);
    }
    else
    {
      digitalWrite(A2,HIGH); digitalWrite(A4,LOW);
    }
  }
  if((millis() - tachoMillis) == abfrZeit4)
  {   
    flankenZeit = pulseIn(tacho4Pin6, LOW); 
    umdrZeit = ((flankenZeit * 4)/1000);     
    rps = (1000/umdrZeit);                 
    rpm4 = (rps*6);                         
    rpm4 = (rpm4*10);                       
    Serial.print(" L4: ");                 
    Serial.print(rpm4);                   
    if (((fanSpeed*8)-(fanSpeed))>rpm4)     
    {
      digitalWrite(A3,LOW); digitalWrite(A5,HIGH);
    }
    else
    {
      digitalWrite(A3,HIGH); digitalWrite(A5,LOW);
    }
  }
  if((millis() - tachoMillis) == abfrZeit5)
  {   
    flankenZeit = pulseIn(tacho5Pin7, LOW); 
    umdrZeit = ((flankenZeit * 4)/1000);   
    rps = (1000/umdrZeit);                 
    rpm5 = (rps*6);                   
    rpm5 = (rpm5*10);                       
    Serial.print(" L5: ");             
    Serial.print(rpm5);                     
    if (((fanSpeed*8)-(fanSpeed))>rpm5)     
    {
      digitalWrite(10,LOW); digitalWrite(11,HIGH);
    }
    else
    {
      digitalWrite(10,HIGH); digitalWrite(11,LOW);
    }
  }
  if((millis() - tachoMillis) == abfrZeit6)
  {   
    flankenZeit = pulseIn(tacho6Pin8, LOW);
    umdrZeit = ((flankenZeit * 4)/1000);   
    rps = (1000/umdrZeit);                 
    rpm6 = (rps*6);                         
    rpm6 = (rpm6*10);                       
    Serial.print(" L6: ");                   
    Serial.print(rpm6);                     
    if (((fanSpeed*8)-(fanSpeed))>rpm6)     
    {
      digitalWrite(12,LOW); digitalWrite(13,HIGH);
    }
    else
    {
      digitalWrite(12,HIGH); digitalWrite(13,LOW);
    }
    Serial.print(" Soll: ");                 
    Serial.print(fanSpeed*8);               
    Serial.print(" Timer: ");               
    Serial.print(millis());                 
    Serial.print(" C: ");                   
    counter = counter + 1 ;
    Serial.println(counter);               
    tachoMillis = millis();      // Die TachoMillis wird aktualisiert
  }
}

combie:
Ich sehe ich gerade, dass du grundsätzlich nicht auf Postings antwortest.
Also keine Hilfe von mir.

Die Zeitvergleiche habe ich auf >= abgeändert.
Den tachoMillis brauche ich nur einmal zum Schluss, sonst wird nur der erste Lüfter gesteuert.

hier ist das komplette Programm!

//Konstanten
const int tacho1Pin3 = 3;       // Pin des Tachosignals des Lüfters
const int tacho2Pin4 = 4;       // Pin des Tachosignals des Lüfters
const int tacho3Pin5 = 5;       // Pin des Tachosignals des Lüfters
const int tacho4Pin6 = 6;       // Pin des Tachosignals des Lüfters
const int tacho5Pin7 = 7;       // Pin des Tachosignals des Lüfters
const int tacho6Pin8 = 8;       // Pin des Tachosignals des Lüfters
const int fanPin9 = 9;          // PWM Anschluss des Lüfter
const int potiPinA0 = A0 ;      // Potenzometer am analogen Eingang A0 angeschlossen
 
// Variablen
int fanSpeed = 0;              // Variable für die Lüftergeschwindigkeit
int potiVar = 0 ;              // Variable zum speichern des Potentiometereingangs
int abfrZeit1 = 10;          // Zeitabstand für die Abfragen des Tachosignals
int abfrZeit2 = 500;          // Zeitabstand für die Abfragen des Tachosignals
int abfrZeit3 = 1000;          // Zeitabstand für die Abfragen des Tachosignals
int abfrZeit4 = 1500;          // Zeitabstand für die Abfragen des Tachosignals
int abfrZeit5 = 2000;          // Zeitabstand für die Abfragen des Tachosignals
int abfrZeit6 = 2500;          // Zeitabstand für die Abfragen des Tachosignals
int counter = 0;
unsigned long tachoMillis = abfrZeit1;  // Zeitabstand für Pulse Stretching Funktion
float rps = 0;                 // Variable mit Kommastelle zur Berechnung der Umdrehungen pro Sekunde
int rpm1 = 0;                  // Variable für die gemittelte Drehzahl
int rpm2 = 0;                  // Variable für die gemittelte Drehzahl
int rpm3 = 0;                  // Variable für die gemittelte Drehzahl
int rpm4 = 0;                  // Variable für die gemittelte Drehzahl
int rpm5 = 0;                  // Variable für die gemittelte Drehzahl
int rpm6 = 0;                  // Variable für die gemittelte Drehzahl
int checkfan = 0;
float umdrZeit = 0;            // Variable mit Kommastelle für die Zeit pro Umdrehung des Lüfters
float flankenZeit =0;          // Variable mit Kommastelle für die Zeit pro Puls des Lüfters
  
  
void setup()
{
  TCCR1B = TCCR1B & 0b11111000 | 0x01;    //Timer 1 (PWM pins 5 & 6)
  Serial.begin(57600);           // Baudrate für die Ausgabe am Seriellen Monitor
  pinMode(fanPin9, OUTPUT);      // Setzt den Lüfter Pin als Ausgang
  pinMode(tacho1Pin3, INPUT);     // Setzt den Tacho Pin als Eingang
  pinMode(tacho2Pin4, INPUT);     // Setzt den Tacho Pin als Eingang
  pinMode(tacho3Pin5, INPUT);     // Setzt den Tacho Pin als Eingang
  pinMode(tacho4Pin6, INPUT);     // Setzt den Tacho Pin als Eingang
  pinMode(tacho5Pin7, INPUT);     // Setzt den Tacho Pin als Eingang
  pinMode(tacho6Pin8, INPUT);     // Setzt den Tacho Pin als Eingang
  pinMode(potiPinA0, INPUT);     // Setzt den Poti Pin als Eingang
  pinMode(A1, OUTPUT);           // Setzt den Analog1 Pin als Ausgang
  pinMode(A2, OUTPUT);           // Setzt den Analog2 Pin als Ausgang
  pinMode(A3, OUTPUT);           // Setzt den Analog3 Pin als Ausgang
  pinMode(A4, OUTPUT);           // Setzt den Analog4 Pin als Ausgang
  pinMode(A5, OUTPUT);           // Setzt den Analog5 Pin als Ausgang
  pinMode(10, OUTPUT);           // Setzt den digital Pin als Ausgang
  pinMode(11, OUTPUT);           // Setzt den digital Pin als Ausgang
  pinMode(12, OUTPUT);           // Setzt den digital Pin als Ausgang
  pinMode(13, OUTPUT);           // Setzt den digital Pin als Ausgang
  pinMode(0, OUTPUT);           // Setzt den digital Pin als Ausgang
  pinMode(1, OUTPUT);           // Setzt den digital Pin als Ausgang
  pinMode(2, OUTPUT);           // Setzt den digital Pin als Ausgang
}

void loop()
{
  potiVar = analogRead(potiPinA0) ;             // Liest das Potentiometer aus
  fanSpeed = map(potiVar, 0, 1023, 60, 255);   // Verteilt PWM Wert über den Bereich des Potis
  analogWrite(fanPin9, fanSpeed);               // Gibt die Variable mit PWM aus
 
  // Alle 1000ms die Drehzal auslesen
  if((millis() - tachoMillis) >= abfrZeit1)
  {   
    flankenZeit = pulseIn(tacho1Pin3, LOW);  // Abfrage der Zeit pro Puls in Mikrosekunden
    umdrZeit = ((flankenZeit * 4)/1000);     // Berechnung der Zeit pro Umdr. in Millisekunden
    rps = (1000/umdrZeit);                   // Umrechnung auf Umdrehungen pro Sekunde
    rpm1 = (rps*6);                          // Schritt 1 zur Rundung auf 10er Schritte der Drehzahl
    rpm1 = (rpm1*10);                        // Schritt 2 zur Rundung auf 10er Schritte der Drehzahl
    Serial.print(" L1: ");                   // Ausgabe der Drehzahl im Seriellen Monitor
    Serial.print(rpm1);                      // Ausgabe der Drehzahl im Seriellen Monitor
    if (((fanSpeed*8)-(fanSpeed))>rpm1)      // Alarm bei 10% Drehzahlverlust
    {
      digitalWrite(0,LOW); digitalWrite(1,HIGH);
    }
    else
    { 
      digitalWrite(0,HIGH); digitalWrite(1,LOW);
    }
  }
  if((millis() - tachoMillis) >= abfrZeit2)
  {   
    flankenZeit = pulseIn(tacho2Pin4, LOW);
    umdrZeit = ((flankenZeit * 4)/1000);     
    rps = (1000/umdrZeit);                  
    rpm2 = (rps*6);                        
    rpm2 = (rpm2*10);                       
    Serial.print(" L2: ");                 
    Serial.print(rpm2);                     
    if (((fanSpeed*8)-(fanSpeed))>rpm2)     
    {
      digitalWrite(2,LOW); digitalWrite(A1,HIGH);
    }
    else
    { 
      digitalWrite(2,HIGH); digitalWrite(A1,LOW);
    }
  }
  if((millis() - tachoMillis) >= abfrZeit3)
  {   
    flankenZeit = pulseIn(tacho3Pin5, LOW);  
    umdrZeit = ((flankenZeit * 4)/1000);    
    rps = (1000/umdrZeit);                
    rpm3 = (rps*6);                      
    rpm3 = (rpm3*10);                    
    Serial.print(" L3: ");                 
    Serial.print(rpm3);                   
    if (((fanSpeed*8)-(fanSpeed))>rpm3)   
    {
      digitalWrite(A2,LOW); digitalWrite(A4,HIGH);
    }
    else
    { 
      digitalWrite(A2,HIGH); digitalWrite(A4,LOW);
    }
  }
  if((millis() - tachoMillis) >= abfrZeit4)
  {   
    flankenZeit = pulseIn(tacho4Pin6, LOW);  
    umdrZeit = ((flankenZeit * 4)/1000);     
    rps = (1000/umdrZeit);                 
    rpm4 = (rps*6);                         
    rpm4 = (rpm4*10);                       
    Serial.print(" L4: ");                 
    Serial.print(rpm4);                    
    if (((fanSpeed*8)-(fanSpeed))>rpm4)     
    {
      digitalWrite(A3,LOW); digitalWrite(A5,HIGH);
    }
    else
    { 
      digitalWrite(A3,HIGH); digitalWrite(A5,LOW);
    }
  }
  if((millis() - tachoMillis) >= abfrZeit5)
  {   
    flankenZeit = pulseIn(tacho5Pin7, LOW);  
    umdrZeit = ((flankenZeit * 4)/1000);    
    rps = (1000/umdrZeit);                 
    rpm5 = (rps*6);                   
    rpm5 = (rpm5*10);                       
    Serial.print(" L5: ");             
    Serial.print(rpm5);                      
    if (((fanSpeed*8)-(fanSpeed))>rpm5)     
    {
      digitalWrite(10,LOW); digitalWrite(11,HIGH);
    }
    else
    { 
      digitalWrite(10,HIGH); digitalWrite(11,LOW);
    }
  }
  if((millis() - tachoMillis) >= abfrZeit6)
  {   
    flankenZeit = pulseIn(tacho6Pin8, LOW); 
    umdrZeit = ((flankenZeit * 4)/1000);   
    rps = (1000/umdrZeit);                 
    rpm6 = (rps*6);                         
    rpm6 = (rpm6*10);                        
    Serial.print(" L6: ");                   
    Serial.print(rpm6);                      
    if (((fanSpeed*8)-(fanSpeed))>rpm6)      
    {
      digitalWrite(12,LOW); digitalWrite(13,HIGH);
    }
    else
    { 
      digitalWrite(12,HIGH); digitalWrite(13,LOW);
    }
    Serial.print(" Soll: ");                 
    Serial.print(fanSpeed*8);               
    Serial.print(" Timer: ");               
    Serial.print(millis());                 
    Serial.print(" C: ");                    
    counter = counter + 1 ;
    Serial.println(counter);               
    tachoMillis = millis();      // Die TachoMillis wird aktualisiert 
  }
}

Danke, jetzt funktioniert es. Die Zeitvergleiche habe ich bei einer IF Schleife nicht auf >= abgeändert.

ziege:
Danke, jetzt funktioniert es. Die Zeitvergleiche habe ich bei einer IF Schleife nicht auf >= abgeändert.

Hallo,

es gibt keine if Schleifen das sind Bedingungen

Gruß Heinz