Fehler bei Code für Luftfahrwerksteuerung

Hallo ich habe vor kurzem meine Steuerung für mein Luftfahrwerk fertig bekommen.
Anfangs hatte ich noch zwei knöpfe für hoch und runter. Die habe ich aber jetzt gegen eine IR Fernbedienung getauscht. Seit dem habe ich das Problem das er die Codes immer in dauerschleife abspielt und man kann kein anderes Programm auswählen.

Vielleicht kann mir ja von euch jemand helfen :smiley:

Ps: bin blutiger Anfänger;

Anbei der Code:

// Sensor, Voltage = Drucksensor vorne (A0)
// Sensor1, Voltage1 = Drucksensor hinten(A1)
// 16724175 Taste 1
// 16738455 Taste 0
// 16718055 Taste 2
#include <IRremote.h>
int RECV_PIN = 12;
IRrecv irrecv(RECV_PIN);
decode_results results;


void setup() {
  Serial.begin(9600);
  pinMode(8, OUTPUT); //Luft vorne rein
  pinMode(9, OUTPUT); //Luft vorne raus
  pinMode(7, OUTPUT); // Luft hinten rein
  pinMode(6, OUTPUT); // Luft hinten raus
  irrecv.enableIRIn();


}

void loop() {

  int sensor = analogRead(A0);
  float voltage = sensor * (5 / 1023.00);
  //Serial.println(voltage);

  int sensor1 = analogRead(A1);
  float voltage1 = sensor1 * (5 / 1023.00);
  //Serial.println(voltage1);
  if (irrecv.decode(&results)) {
    Serial.println(results.value, DEC);


    if (results.value == 16724175)
    {
      if (voltage < 1.6) {
        digitalWrite (8, HIGH);
        Serial.println ("Auf vorne");
        delay(500);
        irrecv.resume();
      }
    }
  }


  if (results.value == 16724175) {
    if (voltage1 < 1.6) {
      digitalWrite (7, HIGH);
      Serial.println ("Auf hinten");
      delay(500);
      irrecv.resume();
    }
  }


  if (voltage > 1.6) {
    Serial.println ("OK vorne");
    digitalWrite(8, LOW);
    delay(500);
  }

  if (voltage1 > 1.6) {
    Serial.println ("OK hinten");
    digitalWrite(7, LOW);
    delay(500);
  }

  if (results.value == 16738455) {
    if (voltage > 1.6) {
      digitalWrite (9, HIGH);
      Serial.println ("Ab vorne");
      delay(500);
      irrecv.resume();
    }

    if (voltage < 0.3) {
      Serial.println (voltage);
      digitalWrite(9, LOW);
      delay(500);

    }

    if (results.value == 16738455) {
      if (voltage1 > 1.6) {
        digitalWrite (6, HIGH);
        Serial.println ("Ab hinten");
        delay(500);
        irrecv.resume();
      }

      if (voltage1 < 0.3) {
        Serial.println (voltage);
        digitalWrite(6, LOW);
        delay(500);
      }
      irrecv.resume();

    }
  }

}



Ja.

Ja.

Willst Du helfen?
Dann:
In der Arduino-IDE auf BEARBEITEN - FÜR FORUM KOPIEREN.
Editiere Deinem Ausgangspost indem Du den Code komplett markierst und mit STRG-V mit dem kopierten überschreibst.
Neu speichern.
Das wird...

1 Like

Passt das so?
und vielen dank für den Hinweis :smiley:

n paar "}" zuviel?
An anderer Stelle sehe ich das Problem auch.
Tip: Eine Klammer pro Zeile und dann in der IDE Strg+T zum formatieren drücken, vlt findest Du dann den Fehler selber.

[edit]Typo beseitigt[/edit]

1 Like

Hallo
schaue Dir am besten die CASE/SWITCH Anweisung für den Bearbeitung der IR-Befehle an.

1 Like

Nö.
Nach nem STRG-T passt das :wink:

Zumindest lässt sich das jetzt verarbeiten.
Und ja: Bitte vorher STRG-T drücken.
Dann kann man das auch lesen und vermeidet Nachfragen.

HIER:

  float voltage = sensor * (5 / 1023.00);

Böse.
Sowas hab ich doch heute schon mal gesehen....
Aber egal - ist nicht Frage.

Kannst Du das mal genauer beschreiben?
Ich sag Dir:

        delay(500);

lässt Dich 0,5 Sekunden blind sein.
Und wenn Du den richtigen Punkt nicht erwischt: wieder 0,5 Sekunden.
:candle:

Also vorher ging es mit zwei Buttons.
wenn man zB Button 1 gedrückt hat und der Sensor unter 1,6V angezeigt hat, hat er über Pin 8 solange Luft rein gepumpt bis er auf diesen Wert war.

Jetzt stehen bei dem Serielen Monitor keine Wert mehr wie zB Luft vorne ok sondern es ist wie wenn ich permanent auf der Taste oben wäre.

Ich denke das Problem ist Deine komische Schachtelung, die nicht zielführend ist.
Ich sage Dir, Du hast Dich mit den if/if/if/ Ebenen verhauhen:


void loop()
{
  int sensor = analogRead(A0);
  float voltage = sensor * (5 / 1023.00);
  //Serial.println(voltage);
  int sensor1 = analogRead(A1);
  float voltage1 = sensor1 * (5 / 1023.00);
  //Serial.println(voltage1);
  if (irrecv.decode(&results))
  {
    Serial.println(results.value, DEC);
    if (results.value == 16724175) //<- !!!
    {
      if (voltage < 1.6)
      {
        digitalWrite (8, HIGH);
        Serial.println ("Auf vorne");
        delay(500);
        irrecv.resume();
      }
    }
  }
  if (results.value == 16724175) //<- !!!
  {
    if (voltage1 < 1.6)
    {
      digitalWrite (7, HIGH);
      Serial.println ("Auf hinten");
      delay(500);
      irrecv.resume();
    }
  }
  if (voltage > 1.6)
  {
    Serial.println ("OK vorne");
    digitalWrite(8, LOW);
    delay(500);
  }
  if (voltage1 > 1.6)
  {
    Serial.println ("OK hinten");
    digitalWrite(7, LOW);
    delay(500);
  }
  if (results.value == 16738455)
  {
    if (voltage > 1.6)
    {
      digitalWrite (9, HIGH);
      Serial.println ("Ab vorne");
      delay(500);
      irrecv.resume();
    }
    if (voltage < 0.3)
    {
      Serial.println (voltage);
      digitalWrite(9, LOW);
      delay(500);
    }
    if (results.value == 16738455)
    {
      if (voltage1 > 1.6)
      {
        digitalWrite (6, HIGH);
        Serial.println ("Ab hinten");
        delay(500);
        irrecv.resume();
      }
      if (voltage1 < 0.3)
      {
        Serial.println (voltage);
        digitalWrite(6, LOW);
        delay(500);
      }
      irrecv.resume();
    }
  }
}

Schau Dir an, wo sich die Abfragen in welcher Einrückung befinden.
Das ist nicht manuell gemacht, sondern Dein Code mit STRG-T.

1 Like

also ich habe eigentlich nur
if (digitalRead(12); gegen if (results.value == 16724175) getauscht.
vorher hat es ja einwandfrei geklappt. :smiley:

jetzt schreibt er mir diesen Fehler im seriellen Monitor :

The function decode(&results)) is deprecated and may not work as expected! Just use decode() without a parameter and IrReceiver.decodedIRData. .

danach erkennt er keine Signale mehr von der IR Fernbedienung.

Das ist eine Warnung. Die gibt es im Compilerfenster. Hinweis darauf, das Du Dich einer neueren Verarbeitung zuwenden sollst.

Nochmal:
Ich werde aus dem Code nicht schlau.
Beschreibe was Du da machen willst!
Oder bring den Code der mit Tasten funktionierte.
Dann könnte man mit hoher Wahrscheinlichkeit richtig raten.

Also wenn auf meiner Fernbedienung taste 1 gedrückt wird soll der Ardurino checken wie viel Spannung auf den Sensoren anliegt. Sollte diese Spannung unter 1,6V sein soll er über ein Magnetventil so viel Luft in das System pumpen bis 1,6V erreicht sind. (das ganze geht über 2 Pinouts für das Magnetventiel und 1 Input für den Sensor 2x ( Vorderachse und Hinterachse)

Wenn Ich auf der Fernbedienung Taste 0 drücke soll der Ardurino checken ob mehr wie 0,3V anliegen wenn ja soll er die Luft ablassen bis der Sensor den Wert 0,3V erreicht hat.
(2 Pinouts für Magnetventil und 1 Input für den Sensor)

Hallo
Sollen wir jetzt Deinen Sketch berichtigen oder schaust du dir dafür die SWITCH/CASE Anweisung an.
BTW. Die Funktion irrecv.resume(); brauchst Du nur einmal aufrufen, dann wenn der IR-Empfänger ein neues Datum zur Verfügung gestellt hat.
Viel Erfolg und Spass beim Codieren.

Zwei StateMachine.
Nicht mehr und nicht weniger.
ABER!
Du hast sowas drin:

    if (results.value == 16724175)
    {
      if (voltage < 1.6)
      {
        digitalWrite (8, HIGH);
        Serial.println ("Auf vorne");
        delay(500);
        irrecv.resume();
      }
    }
  }
  if (results.value == 16724175)
  {
    if (voltage1 < 1.6)
    {
      digitalWrite (7, HIGH);
      Serial.println ("Auf hinten");
      delay(500);
      irrecv.resume();
    }
  }
  if (voltage > 1.6)
  {
    Serial.println ("OK vorne");
    digitalWrite(8, LOW);
    delay(500);
  }
  if (voltage1 > 1.6)
  {
    Serial.println ("OK hinten");
    digitalWrite(7, LOW);
    delay(500);
  }

Das wird nischt.
Du fragst zweimal auf 16724175 ab - allerdings ist das Erste noch nach der Abfrage, ob überhaupt Daten vorhanden sind.
Das zweite Mal ist .resume() schon gelaufen.
Und Du trennst die Aktionen nicht sauber.

Und spätestens hier:

 if (results.value == 16738455)
  {
    if (voltage > 1.6)
    {
      digitalWrite (9, HIGH);
      Serial.println ("Ab vorne");
      delay(500);
      irrecv.resume();
    }
    if (voltage < 0.3)
    {
      Serial.println (voltage);
      digitalWrite(9, LOW);
      delay(500);
    }
    if (results.value == 16738455)

ist Schluß.

Wenn Du das mit Tasten schon mal hattest, dann würde ich mich darüber sehr freuen es zu sehen.
Und ja, dann bau ich dazu was.

ok also neu schreiben?
wenn ja wie?
ich schaue mir jetzt mal diese Switch/case Anweisung an vielleicht werde ich daraus schlau.
lg

Hallo
Vielleicht hilft das Tutorial weiter.

1 Like

Nein.

Das will ich sehen!
Zeig es.

also bei dieser Switch/Case Methode blicke ich gar nicht durch :smiley:

Hab leider den Sketch nicht mehr aber wie oben schon gesagt habe ich nur digtitalRead mit dem IR Signal ausgetauscht.
Bin es ja so ca 3 Tage gefahren.
lg

Na sowas aber auch, dann wünsche ich dir noch viel Spass bei unserem gemeinsamen Hooy.

1 Like

Ich glaub Dir nicht.
Aber egal.
Hier ein Vorschlag, damit Du wenigstens irgendwas hast, was geht.
Ausgangspunkt ist Dein Post #12 - So wie da geschrieben.

Der Code kompiliert nicht.
Aber zeigt Dir wie es geht.
Den Rest musst Du selbst machen.
Iss ja nu nicht so schwer.

Im Übrigen, wenn Du nur 2 Tasten abfragen willst, solltest Du nicht drei vorsehen...

Na denn. e.

// Sensor, Voltage = Drucksensor vorne (A0)
// Sensor1, Voltage1 = Drucksensor hinten(A1)
// 16724175 Taste 1
// 16738455 Taste 0
// 16718055 Taste 2
#include <IRremote.h>
const byte RECV_PIN = 12;
IRrecv irrecv(RECV_PIN);
decode_results results;

const byte sensorVorne = A0;
const byte sensorHinten = A1;

const byte abluftHinten = 6;
const byte zuluftHinten = 7;
const byte zuluftVorne = 8;
const byte abluftVorne = 9;

void setup()
{
  Serial.begin(9600);
  pinMode(abluftHinten, OUTPUT); //Luft vorne rein
  pinMode(zuluftHinten, OUTPUT); //Luft vorne raus
  pinMode(zuluftVorne, OUTPUT); // Luft hinten rein
  pinMode(abluftVorne, OUTPUT); // Luft hinten raus
  irrecv.enableIRIn();
}

void loop()
{
  static bool aufpumpen = false;
  static bool ablassen = false;
  float voltageVorne = analogRead(sensorVorne) * (5 / 1023.00);
  float voltageHinten = analogRead(sensorHinten) * (5 / 1023.00);
  //Serial.println(voltage1);
  if (irrecv.decode(&results))
  {
    Serial.println(results.value, DEC);
    if (results.value == 16724175)
    {
      aufpumpen = true;
      ablassen = false;
    }
    else if (results.value == 16738455)
    {
      aufpumpen = false;
      ablassen = true;
    }
    irrecv.resume();
  }
  if (aufpumpen)
  {
    if (voltageVorne < 1.6)
    {
      zuluftVorne = HIGH;
    }
    else
    {
      zuluftVorne = LOW;
    }
    if (voltageHinten < 1.6)
    {
      zuluftHinten = HIGH;
    }
    else
    {
      zuluftHinten = LOW;
    }
    if (!zuluftVorne && !zuluftHinten)
    {
      aufpumpen=!aufpumpen;
    }
1 Like