- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 8 von 8

Thema: Mehr als eine "if" Abfrage. Programm friert ein?

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    27.02.2012
    Ort
    50KM über Hamburg
    Beiträge
    128

    Mehr als eine "if" Abfrage. Programm friert ein?

    Anzeige

    Praxistest und DIY Projekte
    Hallo,
    Mein Frequenzumrichter hat 4 (x1-x4) Eingänge. Wenn man Sie auf LOW setzt, ergeben sich je nach Konstellation 16 Frequenzen. Die er dann ausführt, wenn man x6(Vorwärts) auch auf LOW setzt.
    Als Temperaturquelle dient ein MAX 6675 Modul mit "K" Fühler.
    Regeln möchte ich die Drehzahl des Abgasgebläses, meines alten Holzvergasers.
    Die Temperatur liegt bei 220°C. Die möchte ich auf 170-180° bringen.

    Nun funktioniert es mit einer if Abfrage einwandrei.
    Aber wenn ich eine weitere zufüge, friert das Programm ein.
    Code:
    #include <LiquidCrystal.h>
    LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
    const int numRows = 2;
    const int numCols = 16;
    
    #include <max6675.h>
    
    
    const int max6675SO = 9; // Serial Output am PIN 9
    const int max6675CS = 10; // Chip Select am PIN 10
    const int max6675CLK = 13; // Serial Clock am PIN 13
    
    const int x1 = A1; //Analog Ausgänge
    const int x2 = A2; //zum Transistor
    const int x3 = A3;
    const int x4 = A4;
    const int x6 = 6;
    
    
    // Initialisierung der MAX6675 Bibliothek mit
    // den Werten der PINs
    MAX6675 ktc(max6675CLK, max6675CS, max6675SO);
    
    const float Temp1 = 30;//Das sind die einzustellenden
    const float Temp2 = 29;//Gradzahlen des Abgases
    const float Temp3 = 28;
    const float Temp4 = 27;
    const float Temp5 = 26;
    const float Temp6 = 25;
    const float Temp7 = 24;
    const float Temp8 = 23;
    const float Temp9 = 22;
    const float Temp10 = 137;
    const float Temp11 = 136;
    const float Temp12 = 135;
    const float Temp13 = 134;
    const float Temp14 = 133;
    const float Temp15 = 128;
    
    
    void setup() {
      lcd.begin(numCols, numRows);//Start
      Serial.begin(9600); // Begin der Seriellen Kommunikation mit 9600 Baud
      delay(500); // eine kleine Pause damit der Sensor sich kalibriert
      pinMode(x1, OUTPUT); // Analog Ausgang
      pinMode(x2, OUTPUT);
      pinMode(x3, OUTPUT);
      pinMode(x4, OUTPUT);
      pinMode(x6, OUTPUT);
    
    }
    
    void loop() {
      lcd.setCursor(0, 0); //1. Reihe 1.Zeichen
      lcd.print("Abgastemperatur");  //Schreibt das Wort
      lcd.setCursor(10, 1); //2. Reihe
      lcd.print("Grad");
      lcd.setCursor(2, 1); //2. Reihe 4.Zeichen
      lcd.print(ktc.readCelsius());  //Schreibt den Wert
    
      digitalWrite(x6, HIGH);//Solange Spannung anliegt-High. Der Frequenzumrichter liefert 16 Volt, die gegen COM gesetzt werden. Deshalb sind da noch NPN Tranistoren zwischen.
    
      // Lesen des Temperaturwertes in Grad Celsius
      float temperatur = ktc.readCelsius();
    
    
      if ((temperatur < Temp1) || (temperatur > Temp2))
      {
        digitalWrite(x1, LOW);
      }
      else
      {
        digitalWrite(x1, HIGH);
        delay(1000);
    
    //Das Funktioniert bis hier. Aber wenn ich die folgende if
    //dazustelle,friert das Programm ein
    
      }
      if ((temperatur < Temp2) || (temperatur > Temp3))
      {
        digitalWrite(x2, LOW);
      }
      else
      {
        digitalWrite(x2, HIGH);
        delay(1000);
      }
    
    
    
      Serial.print(ktc.readCelsius());
      Serial.println("C");
    
    
      // 500ms Pause bis zum nächsten Durchlauf
      delay(1000);
    }
    }
    Arduino ist trotz Arduino Kochbuch nicht meine Welt. Trotzdem knacke ich daran rum.
    Vieles funktioniert auch. Aber so richtig begreifen tue ich es nicht.
    Also keine große Hoffnung auf Läuterung verschwenden.
    Ganz zufrieden bin ich mit dem Max 6675 nicht. Manchmal fangen die Gradzahlen das schwimmen an. Teils 6°. Irgendwann kriegt er sich dann wieder ein.
    Deshalb greife ich vielleicht auf einen PT1000 mit Messwandler zurück.

    Nett wäre, wenn ich den Fehler wüsste und eine Lösung hätte.
    Dankeschön
    Achim

  2. #2
    HaWe
    Gast
    hat du schon mal so etwas getestet...?

    if (statement1) {...}
    else
    if (statement2) {...}
    else
    if (statement3) {...}
    else
    if (statement4) {...}

    else {...} // default

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    also grundsätzlich klingt das mit dem code fetzen ohne wissen über den vernwendeten controller/board unmöglich, aber du hast hier mehrere probleme mit dem code die zu nebeneffekten führen können die man nicht ohne die hardware zu haben abschätzen kann

    gib mal bitte in deinem code beispiel auch realisitsche temperaturen an denn diese werte 30,29,28 etc. machen die ifs völlig sinnfrei, die sind immer true
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    27.02.2012
    Ort
    50KM über Hamburg
    Beiträge
    128
    Danke HaWe,
    habe ich probiert.Negativ.
    Wahrscheinlich nicht wie Du meintest.

    Code:
    if (Temp1) {digitalWrite (x1,HIGH);}
    
    else
    if (Temp2) {digitalWrite(x2,HIGH);}
    
    else
    if (Temp3) {digitalWrite(x1,HIGH);}
    else
    if (Temp4) {digitalWrite(x1,HIGH);}
    Hallo Ceos,
    Sind die Codes nicht überall gleich?
    Ich teste immer mit einem Uno. Der ist fertig auf einem Steckbrett.
    Das läuft dann auch auf dem Promini oder ATTYNI.
    Habe ich damit nur Glück gehabt?
    Die Temperaturen habe ich gewählt, damit ich mit der Hand die Temperaturen ändern kann.
    Der Frequenzumrichter hat mehrere Eingänge.
    Nur fand ich den Multiblock so einfach. Ich kann jeder der 16 Möglichkeiten eine Frequenz zuweisen.
    Zuerst versuchte ich ihn mit Spannung zu regeln.
    10 oder 5 Volt sind möglich. Leider bekam ich die PWM vom Arduino nicht so gut glatt. Dem Frequenzumrichter war es zu rauh.
    Spannungsgesteuert macht für mich mehr Sinn(Das begreife ich so halb)
    Bei diesem Max 6675 Typ K Auswerter, brauchte ich ewig, bis ich überhaupt wusste, auf welchen Wert ich mich beziehen muss. (Auf "temperatur", hoffe das stimmt).

    Nun hatte ich heute Zeit und den Wärmetauscher des Ofens modifiziert.
    Soweit ich das sehe, läuft er jetzt schon ohne Zutun mit 160°C.
    Dann bräuchte ich nur eine if. Einmal über 140°C= 50Hz. Einmal unter 140°C = 30Hz.
    Das geht ja mit der einen if.
    Trotzdem noch eine Frage:

    digitalWrite(x2,x3,x4, LOW);

    Wenn mehrere Ausgänge das Gleiche machen sollen. Wie fasse ich das zusammen?
    Ich mache keinen Hehl draus, ich komme mit dem Programmieren ganz schlecht klar.

    Das Ganze hat wohl überhaupt keinen Zweck. Wenn ich den TYP K Fühler auf über 100°C erhitze, habe ich wenn es unter 100°C werden, 3 Stellen hinterm Punkt. Also 98.345°C zum Beispiel.
    Geändert von achso (24.01.2019 um 16:39 Uhr)

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    27.02.2012
    Ort
    50KM über Hamburg
    Beiträge
    128
    Es hat geklappt.
    Dadurch, dass ich den Wärmetauscher umgebaut habe, erübrigt sich eine ausgiebige elektronische Steuerung.
    Der Code funktioniert, aber benutzen kann ich ihn nicht.
    Das K Modul schwimmt zu stark.
    Das schein normal zu sein.
    Einen PID REX 100FK02 hatte ich mir zum Testen bestellt.
    Den habe ich nur an den Oszi gehängt.
    Auch hier schwingt es zwischen LOW und HIGH nur so rum. Solange die Temperatur 2°C vor dem Schaltpunkt und 6° hinter dem Schaltpunkt liegt, schalte er sauber durch. Aber in diesem Bereich ist es eine Katastrophe. Merkwürdigerweise gibt es meinem Metrawatt Thermometer (TYP-K) sowas nicht.

    Also warte ich, bis Pollin meinen Kram geschickt hat und baue das mit dem PT1000 auf.

    Danke für Eure Anregungen und Tipps!
    Achim


    Code:
    #include <LiquidCrystal.h>
    LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
    const int numRows = 2;
    const int numCols = 16;
    
    #include "max6675.h" //Die MAX6675 Bibliothek
    
    const int max6675SO = 9; // Serial Output am PIN 8
    const int max6675CS = 10; // Chip Select am PIN 9
    const int max6675CLK = 13; // Serial Clock am PIN 10
    
    
    
    // Initialisierung der MAX6675 Bibliothek mit
    // den Werten der PINs
    MAX6675 ktc(max6675CLK, max6675CS, max6675SO);
    const double x1 = A1; //Prog 105 Ausgänge über Transistor
    const double x2 = A2; //Prog 106 zum Umrichter
    const double x3 = A3; //Prog 108
    const double x4 = A4; //Prog 112
    const double x6 = 6;
    //Abgastemperatur
    const float Temp1 = 30;//über 150°
    const float Temp2 = 28;//145°-150°
    const float Temp3 = 26;//140°-145°
    const float Temp4 = 24;//unter 140°
    
    
    
    const long oneSecond = 1000;
    const long oneMinute = oneSecond * 60;
    
    void setup() {
      lcd.begin(numCols, numRows);//Start
      Serial.begin(9600); // Begin der Seriellen Kommunikation mit 9600 Baud
      delay(500); // eine kleine Pause damit der Sensor sich kalibriert
      pinMode(x1, OUTPUT); //Programm 105 Ausgang
      pinMode(x2, OUTPUT);//Programm 106
      pinMode(x3, OUTPUT);
      pinMode(x4, OUTPUT);//Programm 108
      pinMode(x6, OUTPUT);//FWD=Start
    }
    
    void loop()
    {
    
      lcd.setCursor(0, 0); //1. Reihe 1.Zeichen
      lcd.print("Abgastemperatur");  //Schreibt das Wort
      lcd.setCursor(10, 1); //2. Reihe
      lcd.print("Grad");
      lcd.setCursor(2, 1); //2. Reihe 4.Zeichen
      lcd.print(ktc.readCelsius());  //Schreibt den Wert
    
      digitalWrite(x6, HIGH);//Startet den Umrichter
    
    
      // Lesen des Temperaturwertes in Grad Celsius
      double temperatur = ktc.readCelsius();
    
      if (temperatur > Temp1) //über 155°C
    
      {
        digitalWrite(x1, HIGH);//Ist Programm 105 soll auf 40HZ
      }
      else
      {
        digitalWrite(x1, LOW);
    
      }
    
      if ((temperatur < Temp2) ||  (temperatur > Temp1)) //über 145°, aber
        //unter 150°
    
      {
        digitalWrite(x2, LOW);// Programm 106, ca 43 HZ
      } else {
        digitalWrite(x2, HIGH);
      }
      if ((temperatur < Temp3) ||  (temperatur > Temp2)) //über 140°, aber
        //unter 145°
    
      {
        digitalWrite(x3, LOW);// Programm 106, ca 46 HZ
      } else {
        digitalWrite(x3, HIGH);
      }
      if ((temperatur < Temp4) ||  (temperatur > Temp3)) //über 135°, aber
        //unter 140°
    
      {
        digitalWrite(x4, LOW);// Programm 106, ca 50 HZ
      } else {
        digitalWrite(x4, HIGH);
      }
      if (temperatur < Temp4) // unter 135°
      {
        digitalWrite(x4, HIGH);//Programm 108,weniger als 25HZ
    
      }
      else
      {
        digitalWrite(x4, LOW);
    
      }
      Serial.print(temperatur);
      Serial.println("C");
    
    
    
      // 500ms Pause bis zum nächsten Durchlauf
      delay(1000);
    }

  6. #6
    shedepe
    Gast
    Wenn es schwimmt verpass ihm doch einen Tiefpassfilter z.b. in Form eines gleitenden Mittelwerts.

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    27.02.2012
    Ort
    50KM über Hamburg
    Beiträge
    128
    Danke shedepe,
    das ist es!
    Habe ich auch gleich was drüber gefunden.
    Bisher habe ich es mit Pausen versucht. Es geht fast.
    Ein anderes Problem:
    Der Frequenzumwandler hat auf seinen Eingängen eine Spannung von ca 16V. Wenn man diese gegen gnd legt, macht er dass, was ihm eingegeben wurde.
    Aber auf den offenen Ausgängen liegt eine Restwelligkeit. Nun hatte ich schon die Ausgänge(Sind die A1-A4, D`s ist nicht frei.) mit NPN Trans. versorgt. Diese schalten gegen GND.(In meiner grenzwertigen Dösigkeit hoffte ich, dass die NPN so träge reagieren, dass das Problem weg ist. War wohl nichts.)
    Trotz puffern mit 100n. Das muß doch vom flatterigen MAX6675 kommen??
    Das Beste wäre wohl, ich würde Optokoppler verwenden. Dann wäre der Nano total vom Frequenzumrichter getrennt?
    Heute nicht mehr.
    Dankeschön!
    Achim

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    27.02.2012
    Ort
    50KM über Hamburg
    Beiträge
    128
    Nur noch mal als Rückmeldung.
    Getestet hatte ich ja am Schreibtisch. Kurze Leitungen, Arduino auf dem Steckbrett.
    Spannungsquelle USB oder auch Netzteil.
    Hier schwamm die Anzeige wie beschrieben.
    Dann hatte ich nur am Schluß ein 15 Sekunden Delay eingefügt und den Nano in einen DIN-A4 Blatt großen Kasten gesetzt. Hier sind noch 6 x SSD Relais, Ein Meanwell Netzteil und diverse Bauteile eng verbaut.
    Dadrüber im extra Gehäuse der Frequenzumrichter. Der Fühler im Rauchrohr des Holzvergasers.
    Das verückte ist, nichts schwimmt mehr. Der Nano steuert 1/4° genau, ohne zu zittern, den Umrichter.
    Ich bin natürlich begeistert. Auch wenn es rätselhaft ist.
    Danke für eure Hilfe.
    Es ist schön, nicht alleine da stehen zu müssen.

    Alles Gute und helft weiter so toll.
    Achim

Ähnliche Themen

  1. Antworten: 3
    Letzter Beitrag: 31.05.2011, 09:35
  2. Linux SerialStream.h friert ein bei Open("/dev/ttyUSB0")
    Von TomSawer im Forum Software, Algorithmen und KI
    Antworten: 5
    Letzter Beitrag: 19.04.2011, 10:42
  3. Antworten: 10
    Letzter Beitrag: 19.03.2009, 20:13
  4. 20x4Display: Abfrage "Busy-Flag" reagiert nicht
    Von Dolfo im Forum Assembler-Programmierung
    Antworten: 0
    Letzter Beitrag: 17.10.2007, 22:56
  5. Stückliste "Mehr Spass mit ASURO Band II"
    Von gandalfsz im Forum Asuro
    Antworten: 0
    Letzter Beitrag: 25.02.2007, 19:30

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test