Bin blind, suche Fehler in if/else Funktion. Außerdem: brauche Hilfe beim EEPROM Code

Moin,

ich versuche mich derzeit an der Programmieurng meiens ersten Arduino Projektes und habe zwei Probleme (A + B) an denne ich derzeit nicht weiterkomme.

Anliegend mein Sketch.

A. Zeile 151 - 159

Hier wusste ich mir nicht anders zu helfen, als if/else Abfragen miteinander zu verknüpfen. Tatsächlich komme ich aber so nicht in "void automat" und auch nicht in "void kalibr" sondern hänge in der letzen 'else' zeile 155 fest --> Ergebnis servo.write(anglerauf)

Wie müsste ich die Zeilen umformulieren um zu den genannten Bedingungen die gewünschten Funktionen ansteuern zu können?

Zur Erklärung:

Die Schaltung soll drei Zustände kennen.

  1. void automat

ODER

  1. void kalibr

ODER

  1. servo.write(anglerauf)

Nur einer der drei Zustände soll, in Abhängigkeit der aufgeführten Variablen, gültig sein.

Ich habe das ganze auch mal als drei einzelne if Abfragen umgeschrieben, aber das klappt auch nicht. Auch hier "klemme" ich in servo.write(anglerauf) fest.

s. dazu den zweiten Sketch.

B.

Ich möchte die Ausschläges des Servos über einen Poti kalibrieren (void kalibr) und die eingestellten Werte im EEPROM speichern (zwei Positionen: setrauf bzw setrunter) um die Einstellungen nicht jedesmal von vorne vornehmen zu müssen.

Mit welcher EEPROM Funktion ist das am zielführendsten? Ich konnte hierzu noch kaum Vorarbeit leisten und wäre für konkrete Codierungsvorschläge sehr dankbar.

Ohne die angesprochene void kalibr Funktion klappt die void automat Funktion. Das habe ich bereits in einem weiteren Sketch getestet.

Vielen Dank und Viele Grüße, Hoosy

ERSTER SKETCH --> MIT DIESEM SKETCH MÖCHTE ICH DIE SCHALTUNG AUFBAUEN


#include <Servo.h>
#include <EEPROM.h>

Servo servo;

bool s1 = false;  //Taster Drosselklappe auf
bool s2 = false;  //Taster Drosselklappe zu
bool s3 = false;  //Taster Gangwahl auf raufschalten
bool s4 = false;  //Taster Gangwahl auf runterschalten
bool s5 = false;  //Taster Gangwahl zwangsweise auf rauf
bool s6 = false;  //Schalter System an oder aus
bool s7 = false;  //Schalter für Set Funktion
bool s8 = false;  //Tatser für Set Funktion

unsigned long timer1 = 0;  // Entpreller Timer s1
unsigned long timer2 = 0;  // Entpreller Timer s2
unsigned long timer3 = 0;  // Entpreller Timer s3
unsigned long timer4 = 0;  // Entpreller Timer s4
unsigned long timer5 = 0;  // Entpreller Timer s5
unsigned long timer6 = 0;  // Entpreller Timer s6
unsigned long timer7 = 0;  // Entpreller Timer s7
unsigned long timer8 = 0;  // Entpreller Timer s8

bool s1an = false;  //Zwischenvariable für s1
bool s2an = false;  //Zwischenvariable für s2
bool s3an = false;  //Zwischenvariable für s3
bool s4an = false;  //Zwischenvariable für s4
bool s5an = false;  //Zwischenvariable für s5
bool s6an = false;  //Zwischenvariable für s6
bool s7an = false;  //Zwischenvariable für s7
bool s8an = false;  //Zwischenvariable für s8

bool RAUF = false;       // Ergebnis fuer raufschalten
bool RUNTER = false;     // Ergebnis für runterschalten
bool automatan = false;  // Ergebnis ob automat an sein soll
bool kalibran = false;   // Ergebnis ob Kalibrierung an sein soll
bool kalibran1 = false;  // Ergebnis ob Kalibrierung an sein soll final

int setrauf;           // abgelesener winkel über poti bei raufschalten, in eeprom gespeichert
int setrunter;         // abgelesener winkel über poti bei runterschalten, in eeprom gespeichert
int set;               // abgelesener Winkel über poti
int anglerauf = 150;   //Servostellung set raufschalten --> 150 Platzhalter, eigentlich angelrauf = setrauf
int anglerunter = 40;  //Servostellung set runterschalten --> 40 Platzhalter, eigentlich angelrunter = setrunter



void setup() {


  servo.attach(11);  //Servomotor
  servo.write(90);
  pinMode(3, INPUT_PULLUP);  // Taster Drosselklappe auf
  pinMode(4, INPUT_PULLUP);  // Taster Drosselklappe zu
  pinMode(5, INPUT_PULLUP);  // Taster Gangwahl auf raufschalten
  pinMode(6, INPUT_PULLUP);  // Taster Gangwahl auf runterschalten
  pinMode(7, INPUT_PULLUP);  // Taster Gangwahl zwangsweise auf rauf
  pinMode(8, INPUT_PULLUP);  // Schalter System an oder aus
  pinMode(9, OUTPUT);        // LED System ist an
  pinMode(10, OUTPUT);       // LED System ist aus
  pinMode(13, OUTPUT);       // LED Gangwahl auf raufschalten
  pinMode(12, OUTPUT);       // LED Gangwahl auf runterschalten
  pinMode(2, INPUT_PULLUP);  // Schalter für Set Funktion an oder aus
  pinMode(1, INPUT_PULLUP);  //Taster für Einspeichern/Set des Winkels
}

void loop() {

  s1 = digitalRead(3);
  s2 = digitalRead(4);
  s3 = digitalRead(5);
  s4 = digitalRead(6);
  s5 = digitalRead(7);
  s6 = digitalRead(8);
  s7 = digitalRead(2);
  s8 = digitalRead(1);



  if (s1 == true) {
    timer1 = millis();
  }

  if (s2 == true) {
    timer2 = millis();
  }

  if (s3 == true) {
    timer3 = millis();
  }

  if (s4 == true) {
    timer4 = millis();
  }

  if (s5 == true) {
    timer5 = millis();
  }

  if (s6 == true) {
    timer6 = millis();
  }

  if (s7 == true) {
    timer7 = millis();
  }

  if (s8 == true) {
    timer8 = millis();
  }

  if (s7 == false && millis() - timer7 > 25) {
    s7an = true;
  } else {
    s7an = false;
  }

  if (s6 == false && millis() - timer6 > 25) {
    s6an = true;
  } else {
    s6an = false;
  }

  if (s3 == false && millis() - timer3 > 25) {
    s3an = true;
  } else {
    s3an = false;
  }

  if (s4 == false && millis() - timer4 > 25) {
    s4an = true;
  } else {
    s4an = false;
  }

  if (s6an == true && s7an == false || s6an == true && s7an == true) {  // Schalter System an und Schalter Set Funktion an oder aus
    automatan = true;
    kalibran = false;
  } else {                                                              // Schalter System aus und Schalter Set Funktion an oder aus
    automatan = false;
    kalibran = true;
  }

  if (kalibran == true && s7an == true) {                               // Schalter System aus und Schalter Set Funktion an
    kalibran1 = true;
  } else {
    kalibran1 = false;
  }


  if (automatan == true && kalibran1 == false) {                        // Schalter System an und Schalter Set Funktion aus
    void automat();
  } else if (automatan == false && kalibran1 == true) {                 // Schalter System aus und Schalter Set Funktion an
    void kalibr();
  } else if (automatan == false && kalibran1 == false) {                // Schalter System aus und Schalter Set Funktion aus
    servo.write(anglerauf);
  } else {
    servo.write(90);
  }



  if (s3an == true) {  // LED Gangwahl auf raufschalten
    digitalWrite(13, true);
  } else {
    digitalWrite(13, false);
  }
  if (s4an == true) {  // LED Gangwahl auf runterschalten
    digitalWrite(12, true);
  } else {
    digitalWrite(12, false);
  }
  if (s6an == true) {  // LED System ist an
    digitalWrite(9, true);
  } else {
    digitalWrite(9, false);
  }
  if (s6an == false) {  // LED System ist aus
    digitalWrite(10, true);
  } else {
    digitalWrite(10, false);
  }
}


//################################################################
//#                  Funktionen                                  #
//################################################################

void automat() {

  if (s1 == false && millis() - timer1 > 25) {
    s1an = true;
  } else {
    s1an = false;
  }

  if (s2 == false && millis() - timer2 > 25) {
    s2an = true;
  } else {
    s2an = false;
  }

  if (s5 == false && millis() - timer5 > 25) {
    s5an = true;
  } else {
    s5an = false;
  }

  if (s1an == true && s2an == false || s1an == true && s2an == true || s1an == false && s2an == false) {
    RAUF = true;
    RUNTER = false;
  } else {
    RAUF = false;
    RUNTER = true;
  }

  if (RUNTER == true && s5an == false) {
    servo.write(anglerunter);
  } else {
    servo.write(anglerauf);
  }

  if (RAUF == true) {
    servo.write(anglerauf);
  }
}

void kalibr() {

  set = analogRead(0);

  set = map(set, 0, 1023, 0, 180);

  if (s8 == false && millis() - timer8 > 25) {
    s8an = true;
  } else {
    s8an = false;
  }
  if (s3an == true && s8an == true) {
    setrauf = set;
  }

  if (s4an == true && s8an == true) {
    setrunter = set;
  }

  servo.write(set);
}

ZWEITER SKETCH --> OHNE ELSE ABFRAGE


#include <Servo.h>
#include <EEPROM.h>

Servo servo;

bool s1 = false;  //Taster Drosselklappe auf
bool s2 = false;  //Taster Drosselklappe zu
bool s3 = false;  //Taster Gangwahl auf raufschalten
bool s4 = false;  //Taster Gangwahl auf runterschalten
bool s5 = false;  //Taster Gangwahl zwangsweise auf rauf
bool s6 = false;  //Schalter System an oder aus
bool s7 = false;  //Schalter für Set Funktion
bool s8 = false;  //Tatser für Set Funktion

unsigned long timer1 = 0;  // Entpreller Timer s1
unsigned long timer2 = 0;  // Entpreller Timer s2
unsigned long timer3 = 0;  // Entpreller Timer s3
unsigned long timer4 = 0;  // Entpreller Timer s4
unsigned long timer5 = 0;  // Entpreller Timer s5
unsigned long timer6 = 0;  // Entpreller Timer s6
unsigned long timer7 = 0;  // Entpreller Timer s7
unsigned long timer8 = 0;  // Entpreller Timer s8

bool s1an = false;  //Zwischenvariable für s1
bool s2an = false;  //Zwischenvariable für s2
bool s3an = false;  //Zwischenvariable für s3
bool s4an = false;  //Zwischenvariable für s4
bool s5an = false;  //Zwischenvariable für s5
bool s6an = false;  //Zwischenvariable für s6
bool s7an = false;  //Zwischenvariable für s7
bool s8an = false;  //Zwischenvariable für s8

bool RAUF = false;       // Ergebnis fuer raufschalten
bool RUNTER = false;     // Ergebnis für runterschalten
bool automatan = false;  // Ergebnis ob automat an sein soll
bool kalibran = false;   // Ergebnis ob Kalibrierung an sein soll
bool kalibran1 = false;  // Ergebnis ob Kalibrierung an sein soll final

int setrauf;           // abgelesener winkel über poti bei raufschalten, in eeprom gespeichert
int setrunter;         // abgelesener winkel über poti bei runterschalten, in eeprom gespeichert
int set;               // abgelesener Winkel über poti
int anglerauf = 150;   //Servostellung set raufschalten --> 150 Platzhalter, eigentlich angelrauf = setrauf
int anglerunter = 40;  //Servostellung set runterschalten --> 40 Platzhalter, eigentlich angelrunter = setrunter



void setup() {


  servo.attach(11);  //Servomotor
  servo.write(90);
  pinMode(3, INPUT_PULLUP);  // Taster Drosselklappe auf
  pinMode(4, INPUT_PULLUP);  // Taster Drosselklappe zu
  pinMode(5, INPUT_PULLUP);  // Taster Gangwahl auf raufschalten
  pinMode(6, INPUT_PULLUP);  // Taster Gangwahl auf runterschalten
  pinMode(7, INPUT_PULLUP);  // Taster Gangwahl zwangsweise auf rauf
  pinMode(8, INPUT_PULLUP);  // Schalter System an oder aus
  pinMode(9, OUTPUT);        // LED System ist an
  pinMode(10, OUTPUT);       // LED System ist aus
  pinMode(13, OUTPUT);       // LED Gangwahl auf raufschalten
  pinMode(12, OUTPUT);       // LED Gangwahl auf runterschalten
  pinMode(2, INPUT_PULLUP);  // Schalter für Set Funktion an oder aus
  pinMode(1, INPUT_PULLUP);  //Taster für Einspeichern/Set des Winkels
}

void loop() {

  s1 = digitalRead(3);
  s2 = digitalRead(4);
  s3 = digitalRead(5);
  s4 = digitalRead(6);
  s5 = digitalRead(7);
  s6 = digitalRead(8);
  s7 = digitalRead(2);
  s8 = digitalRead(1);



  if (s1 == true) {
    timer1 = millis();
  }

  if (s2 == true) {
    timer2 = millis();
  }

  if (s3 == true) {
    timer3 = millis();
  }

  if (s4 == true) {
    timer4 = millis();
  }

  if (s5 == true) {
    timer5 = millis();
  }

  if (s6 == true) {
    timer6 = millis();
  }

  if (s7 == true) {
    timer7 = millis();
  }

  if (s8 == true) {
    timer8 = millis();
  }

  if (s7 == false && millis() - timer7 > 25) {
    s7an = true;
  } else {
    s7an = false;
  }

  if (s6 == false && millis() - timer6 > 25) {
    s6an = true;
  } else {
    s6an = false;
  }

  if (s3 == false && millis() - timer3 > 25) {
    s3an = true;
  } else {
    s3an = false;
  }

  if (s4 == false && millis() - timer4 > 25) {
    s4an = true;
  } else {
    s4an = false;
  }

  if (s6an == true && s7an == false || s6an == true && s7an == true) {  // Schalter System an und Schalter Set Funktion an oder aus
    automatan = true;
    kalibran = false;
  } else {  // Schalter System aus und Schalter Set Funktion an oder aus
    automatan = false;
    kalibran = true;
  }

  if (kalibran == true && s7an == true) {  // Schalter System aus und Schalter Set Funktion an
    kalibran1 = true;
  } else {
    kalibran1 = false;
  }


  if (automatan == true && kalibran1 == false) {  // Schalter System an und Schalter Set Funktion aus
    void automat();
  }
  if (automatan == false && kalibran1 == true) {  // Schalter System aus und Schalter Set Funktion an
    void kalibr();
  }
  if (automatan == false && kalibran1 == false) {  // Schalter System aus und Schalter Set Funktion aus
    servo.write(anglerauf);
  }

  if (s3an == true) {  // LED Gangwahl auf raufschalten
    digitalWrite(13, true);
  } else {
    digitalWrite(13, false);
  }
  if (s4an == true) {  // LED Gangwahl auf runterschalten
    digitalWrite(12, true);
  } else {
    digitalWrite(12, false);
  }
  if (s6an == true) {  // LED System ist an
    digitalWrite(9, true);
  } else {
    digitalWrite(9, false);
  }
  if (s6an == false) {  // LED System ist aus
    digitalWrite(10, true);
  } else {
    digitalWrite(10, false);
  }
}


//################################################################
//#                  Funktionen                                  #
//################################################################

void automat() {

  if (s1 == false && millis() - timer1 > 25) {
    s1an = true;
  } else {
    s1an = false;
  }

  if (s2 == false && millis() - timer2 > 25) {
    s2an = true;
  } else {
    s2an = false;
  }

  if (s5 == false && millis() - timer5 > 25) {
    s5an = true;
  } else {
    s5an = false;
  }

  if (s1an == true && s2an == false || s1an == true && s2an == true || s1an == false && s2an == false) {
    RAUF = true;
    RUNTER = false;
  } else {
    RAUF = false;
    RUNTER = true;
  }

  if (RUNTER == true && s5an == false) {
    servo.write(anglerunter);
  } else {
    servo.write(anglerauf);
  }

  if (RAUF == true) {
    servo.write(anglerauf);
  }
}

void kalibr() {

  set = analogRead(0);

  set = map(set, 0, 1023, 0, 180);

  if (s8 == false && millis() - timer8 > 25) {
    s8an = true;
  } else {
    s8an = false;
  }
  if (s3an == true && s8an == true) {
    setrauf = set;
  }

  if (s4an == true && s8an == true) {
    setrunter = set;
  }

  servo.write(set);
}

DRITTER SKETCH --> OHNE VOID KALIBR


#include <Servo.h>

Servo servo;

bool s1 = false;  //Taster Drosselklappe auf
bool s2 = false;  //Taster Drosselklappe zu
bool s3 = false;  //Taster Gangwahl auf raufschalten
bool s4 = false;  //Taster Gangwahl auf runterschalten
bool s5 = false;  //Taster Gangwahl zwangsweise auf rauf
bool s6 = false;  //Schalter System an oder aus

unsigned long timer1 = 0;  // Entpreller Timer s1
unsigned long timer2 = 0;  // Entpreller Timer s2
unsigned long timer3 = 0;  // Entpreller Timer s3
unsigned long timer4 = 0;  // Entpreller Timer s4
unsigned long timer5 = 0;  // Entpreller Timer s5
unsigned long timer6 = 0;  // Entpreller Timer s6

bool s1an = false;  //Zwischenvariable für s1
bool s2an = false;  //Zwischenvariable für s2
bool s3an = false;  //Zwischenvariable für s3
bool s4an = false;  //Zwischenvariable für s4
bool s5an = false;  //Zwischenvariable für s5
bool s6an = false;  //Zwischenvariable für s6

bool RAUF = false;    // Ergebnis fuer raufschalten
bool RUNTER = false;  // Ergebnis für runterschalten

int anglerauf = 150;   //Servostellung set raufschalten
int anglerunter = 40;  //Servostellung set runterschalten



void setup() {

  servo.attach(11);  //Servomotor
  servo.write(90);
  pinMode(3, INPUT_PULLUP);  // Taster Drosselklappe auf
  pinMode(4, INPUT_PULLUP);  // Taster Drosselklappe zu
  pinMode(5, INPUT_PULLUP);  // Taster Gangwahl auf raufschalten
  pinMode(6, INPUT_PULLUP);  // Taster Gangwahl auf runterschalten
  pinMode(7, INPUT_PULLUP);  // Taster Gangwahl zwangsweise auf rauf
  pinMode(8, INPUT_PULLUP);  // Schalter System an oder aus
  pinMode(9, OUTPUT);        // LED System ist an
  pinMode(10, OUTPUT);       // LED System ist aus
  pinMode(13, OUTPUT);       // LED Gangwahl auf raufschalten
  pinMode(12, OUTPUT);       // LED Gangwahl auf runterschalten
}

void loop() {

  s1 = digitalRead(3);
  s2 = digitalRead(4);
  s3 = digitalRead(5);
  s4 = digitalRead(6);
  s5 = digitalRead(7);
  s6 = digitalRead(8);


  if (s1 == true) {
    timer1 = millis();
  }

  if (s2 == true) {
    timer2 = millis();
  }

  if (s3 == true) {
    timer3 = millis();
  }

  if (s4 == true) {
    timer4 = millis();
  }

  if (s5 == true) {
    timer5 = millis();
  }

  if (s6 == true) {
    timer6 = millis();
  }

  if (s6 == false && millis() - timer6 > 25) {
    s6an = true;
  } else {
    s6an = false;
  }

  if (s3 == false && millis() - timer3 > 25) {
    s3an = true;
  } else {
    s3an = false;
  }

  if (s4 == false && millis() - timer4 > 25) {
    s4an = true;
  } else {
    s4an = false;
  }

  if (s6an == true) {                                // Schalter System an oder aus
    automat();
  } else {
    servo.write(anglerauf);
  }

  if (s3an == true) {                                // LED Gangwahl auf raufschalten
    digitalWrite(13, true);
  } else {
    digitalWrite(13, false);
  }
  if (s4an == true) {                                // LED Gangwahl auf runterschalten
    digitalWrite(12, true);
  } else {
    digitalWrite(12, false);
  }
  if(s6an == true){                                  // LED System ist an
    digitalWrite(9, true);
  }else{digitalWrite(9, false);
  }
  if(s6an == false){                                 // LED System ist aus
    digitalWrite(10, true);
  }else{digitalWrite(10, false);
  }
}


//################################################################
//#                  Funktionen                                  #
//################################################################

void automat() {

  if (s1 == false && millis() - timer1 > 25) {
    s1an = true;
  } else {
    s1an = false;
  }

  if (s2 == false && millis() - timer2 > 25) {
    s2an = true;
  } else {
    s2an = false;
  }

  if (s5 == false && millis() - timer5 > 25) {
    s5an = true;
  } else {
    s5an = false;
  }

  if (s1an == true && s2an == false || s1an == true && s2an == true || s1an == false && s2an == false) {
    RAUF = true;
    RUNTER = false;
  } else {
    RAUF = false;
    RUNTER = true;
  }

  if (RUNTER == true && s5an == false) {
    servo.write(anglerunter);
  } else {
    servo.write(anglerauf);
  }

  if (RAUF == true) {
    servo.write(anglerauf);
  }
}

lies in der Referenz zu EEPROM.put und EEPROM.get.

und ich finde es praktisch, wenn man die Werte die ins EEPROM sollen in einer Struktur hält. Dann braucht man sich nicht weiter drum kümmern an welcher Adresse diese genau stehen.

https://wiki-content.arduino.cc/en/Tutorial/LibraryExamples/EEPROMPut

A) Nimm einen anderen Pin. PIN 0/1 sind gleichzeitig Deine Kommunikationsschnittstelle an der der USB hängt. Du kannst alle analogen auch als digitale nehmen.
B) Mach keine magischen Zahlen! Gebe den Pins Namen und verwende die Namen im Code. Du suchst Dich sonst später dämlich, wenn irgendwo etwas schief geht und das editieren, weil sich eine Pinnummer geänder that wird zum Geduldspiel.

  if (automatan == true)
  {
    if (kalibran1 == false)                          // Schalter System an und Schalter Set Funktion aus
    {
      automat();
    }
  }
  else
  {
    if (kalibran1 == true)                     // Schalter System aus und Schalter Set Funktion an
    {
      kalibr();
    }
    else                    // Schalter System aus und Schalter Set Funktion aus
    {
      servo.write(anglerauf);
    }
  }

???
Allerdings ist das ne ganz aufregende Schreibweise.
Ich würde das über Zustandsautomaten machen...

Top :slight_smile: Danke das läuft nun. (Problem A)

Die Schreibweise erklärt sich tatsächlich damit, dass ich zum ersten mal mit der Materie zu tun haben. Ich versuche mich nun am EEPROM und darf ggfs nochmal auf mit ner Frage auf euch zukommen?...

Beste Grüße, Hoosy

Erstmal muss da noch viel gearbeitet werden.
Du hast genau das selbe Problem, wie ich das in einem anderen Post heute schon mal gezeigt habe:

/tmp/arduino_modified_sketch_875577/sketch_aug13c.ino:139:20: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   if (s6an == true && s7an == false || s6an == true && s7an == true)    // Schalter System an und Schalter Set Funktion an oder aus
       ~~~~~~~~~~~~~^~~~~~~~~~~~~~~~

(Achtung die zeilennummer stimmt nicht mit deiner überein, der Code schon)

Ich glaube zu wissen, was das werden soll.

  if (s6an == true)
  {
    if (s7an == false ||
        s7an == true)     // Schalter System an und Schalter Set Funktion an oder aus
    {
      automatan = true;
      kalibran = false;
    }
  }
  else                                                                  // Schalter System aus und Schalter Set Funktion an oder aus
  {
    automatan = false;
    kalibran = true;
  }

Und wenn ich da genau hinsehe, wirkt mir das suspekt.... (Oder kannst Du mir sagen, was S7 noch für einen Zustand haben kann :slight_smile:

klar, das ist natürlich unnötiges geschreibe.

alles was zwischen 138 und 150 steht, resultutiert aus meinem rumgebastel um das problem ab 151 zu lösen aber am ende funktioniert es ja so. ich habs jetzt div male in meinem testaufbau probiert und es macht keine probleme. aber diese zeilen jetzt rauszunehmen mach ich erstmal nicht. es klappt ja auch so...

fasttrue und fastfalse bzw supertrue und superfalse, also im ganzen 6 Zustände :innocent: :wink:
Grüße Uwe

2 Likes

Vorsicht!
Der Compiler mekkert da nicht umsonst?!?!?!
Er hat sich jetzt was ausgedacht udn selbst entschieden. Ob das das ist, was Du willst... ?
Und sei Dir gewiss: Beim nächsten Kompilevorgang kann die Entscheidung ein vollkommen andere sein!
Mach es richtig.
Wenn Du das S7 nicht brauchst, nimm es raus, dann bleibt nur noch ein festes entweder/oder.

alles klar, danke, mache ich :slight_smile:

Hallo hoosy,

willkommen im Arduino-Forum.
Leider nötig geworden:
Wenn du einen Post als zu unfreundlich empfindest kannst du den Post einem Moderator melden. Der Moderator sorgt dann für mehr Freundlichkeit / Disziplin.

Ich persönlich habe es am liebsten wenn bei einem Projekt zunächst einmal ein Gesamtüberblick gegeben wird, was da am Ende gesteuert wird. Taster einlesen und Ausgänge HIGH/LOW schalten ist ja kein Selbstzweck.

Die Taster haben eine bestimmte Bedeutung.
Dazu steht etwas in den Kommentaren. Drosselklappe auf/zu Gangwahl rauf/runter
hört sich nach Verbrennungsmotor in einem Fahrzeug an.

Was für ein Fahrzeug ist das?

  • Ein PKW mit dem Rally gefahren wird?
  • Ein RC-Modellauto Maßstab 1:5? Rennwagen?, Offroad, Truck?, Panzer?

Keine Ahnung.
Es würde zum Verstehen des Codes ganz wesentlich beitragen wenn man diesen Überblick hätte.

Dann wäre hilfreich wenn du einen typischen Ablauf beschreiben würdest.

Du fragst Taster ab und startest dann Timer. Ist das immer ein feststehender Ablauf 1,2,3,4 usw. oder variiert das ständig?

Wenn ich jetzt für jede Code-Zeile 5 mal hin- und herspringen muss um herauszufinden
S1 ist Drosselklappe nach links und S7 ist Gang nach rechts dann analysiere ich den Code nicht. Das ist mir zu umständlich. Das schöne an einer Programmiersprache ist ja gerade das man da richtig Sprache verwenden kann.

bool s1 = false;  //Taster Drosselklappe auf
bool s2 = false;  //Taster Drosselklappe zu
bool s3 = false;  //Taster Gangwahl auf raufschalten
bool s4 = false;  //Taster Gangwahl auf runterschalten
bool s5 = false;  //Taster Gangwahl zwangsweise auf rauf
bool s6 = false;  //Schalter System an oder aus
bool s7 = false;  //Schalter für Set Funktion
bool s8 = false;  //Taster für Set Funktion

Da kann man doch gleich schreiben

bool drosselKlappeAuf  = false;  //Taster Drosselklappe auf
bool drosselKlappeZu   = false;  //Taster Drosselklappe zu
bool gangRauf          = false;  //Taster Gangwahl auf raufschalten
bool gangRunter        = false;  //Taster Gangwahl auf runterschalten
bool gangMussRauf      = false;  //Taster Gangwahl zwangsweise auf rauf
bool systemEin         = false;  //Schalter System an oder aus
bool setFunktionEinAus = false;  //Schalter für Set Funktion
bool setFunktionSetzen = false;  //Taster für Set Funktion

und dann kann man sich die Kommentare sparen weil sich die Namen selbst erklären

bool drosselKlappeAuf  = false;
bool drosselKlappeZu   = false;
bool gangRauf          = false;
bool gangRunter        = false;
bool gangMussRauf      = false;
bool systemEin         = false;
bool setFunktionEinAus = false;
bool setFunktionSetzen = false;

Den Einwand das ist mir zu viel Geschreibe lasse ich nicht gelten.
Doppelklick oder Shift-Strg-Cursor-links um das Wort zu markieren strg-V zum Einfügen.
Garantiert ohne Schreibfehler weil kopiert.

Ebenso bei den IO-pins

drosselAufPin = 3;
drosselZuPin = 4;
gangRaufPin = 5;
gangRunterPin = 6;
gangMussRaufPin = 7;
systemEinPin    = 8;

ledSystemAnPin = 9;
ledSytemAusPin = 10
ledGangRaufPin = 13;
ledGangRunterPin = 12;
schalterFunktPin =  2;
tasterFunkSpPin  =  1;  //<<<<< ANDEREN Pin nehmen !!!!!! A0, A1 etc.

Ob du dieser Empfehlung folgst ist deine Entscheidung. Es macht den Code viel leichter nachvollziehbar wenn da überall Klartext steht. Wenn dir abgekürzte Worte die man aber noch versteht lieber sind auch gut.

vgs

1 Like

Das ist ja nu noch verwirrender als S6 oder S7. Immerhin geht da hervor, das es ein Switch ist.
drosselKlappeAuf ist ein Zustand.
Es ist unmöglich das dieser Zustand true ist, wenn der Zustand drosselKlappeZu auch true ist.
Eine Variablenbezeichnung soll den Inhalt abbilden.
Kommentare sind bei Tastern eigentlich unnötig.

Ein Taster ist kein Switch sondern ein PushButton

.

Im englischen und den Katalogen, ist der übliche Taster ein "taktile switch"

Jo Leude ich danke euch für eure Hilfe.

Das mit dem EEPROM habe ich zwar nicht hinbekommen, aber ich habe stattdessen den Seriellen Monitor eingefügt, über den lese ich dann den Winkel zur Kalibrierung aus und änder dann einfach den Wert im code direkt ab. Ist zwar etwas umständlich, aber es funktioniert und so oft muss ich die Mechanik auch nicht nachjustieren.

Tatsächlich handelt es sich um um (legales) kfz Tuning für ne Rennmofa. Ist nen reines funprojekt, aber darum gehts ja letzlich auch.

Nochmals besten dank für das umformulieren des falschen Codes und für die Hinweise. Jetrzt gehts an die "mechanische Umsetzung".

Beste Grüße, Hoosy

Was ist dein Problem damit?

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.