Probleme mir IR Bibliothek & Motor mit Endschaltern

Hallo liebe gemeinde,
nach tagelangem versuchen & recherchieren muss ich mich jetzt an euch wenden.

Ich programmiere nun schon seit einiger Zeit am Arduino und habe mein Projekt bis auf eine letzte funktion schon abgeschlossen.
Mein Programmierhintergrund liegt in der Steuerungstechnik (SPS Siemens S7, udgl). bin aber am arduino doch noch relativ am Anfang

Overview für mein Modellbauprojekt

Alle funktionen werden über eine IR Fernbedienung gesteuert (diverse LED kreise, Servos, Steppermotor, & Motor mit Endschaltern)
Ich habe die Funktionen zum Testen immer einzeln programmiert und dann in das Hauptsketch eingefügt und entsprechend angepasst. hat bis dato immer problemlos funktioniert.

Soweit so gut.

Nun zu meinem eigentlichen Problem: Motoransteuerung mit 2 Endlagenschaltern:

Dies ist mein Testcode der funktioniert allein (eigentlich recht simpel)

const int EIN = A1; //taster statt IR FB *pulldown
const int AUS = A2; //taster statt IR FB *pulldown
const int EndeEIN = 4;
const int EndeAUS = 3;

const int RampeAUF = 12;
const int RampeZU = 13;

int EINState = 0;
int AUSState = 0;
int EndeEINState = 0;
int EndeAUSState = 0;



void setup() {
pinMode(EIN,INPUT);
pinMode(AUS,INPUT);
pinMode(EndeEIN,INPUT); //endschalter Rampe 
pinMode(EndeAUS,INPUT); //endschalter Rampe
pinMode(RampeAUF,OUTPUT);//Motor AUF
pinMode(RampeZU,OUTPUT);//Motor ZU

EINState = digitalRead(EIN);
AUSState = digitalRead(AUS);
EndeEINState = digitalRead(EndeEIN);
EndeAUSState = digitalRead(EndeAUS);


if (EndeEINState == LOW && EndeAUSState ==LOW) { //beide endschalter aus Rampe ZU
  digitalWrite (RampeZU,HIGH);
}
}

void loop() {
EINState = digitalRead(EIN);
AUSState = digitalRead(AUS); 
EndeEINState = digitalRead(EndeEIN);
EndeAUSState = digitalRead(EndeAUS);




if (EINState == HIGH && EndeAUSState == HIGH){
  digitalWrite(RampeAUF,HIGH);

}

if (AUSState == HIGH && EndeEINState ==HIGH){
  digitalWrite(RampeZU,HIGH);
}

if (EndeEINState == HIGH) {
  digitalWrite(RampeAUF,LOW);
}

if (EndeAUSState == HIGH) {
  digitalWrite(RampeZU,LOW);
}

}

und dies ist der Code mit der IR Bibliothek. ich habe die beiden taster durch IR Funktion erstetzt.
Ich habe die Bibliothek bereits als quelle ausgemacht warum es nicht funktioniert. Verstehe aber nicht warum.
Und da mein Hauptsketch darauf beruht weiß nun nicht wie ich das obige Beispiel so umfunktionieren muss, dass es mit der IR funktioniert.

#include <IRremote.h>

const int RampeAUF =  12; //Ansteuerung Motor Rampe AUF über Doppel H Brücke Modul
const int RampeZU =   13; //Ansteuerung Motor Rampe ZU über Doppel H Brücke Modul

const int EndeAUF =   4;  //Endschalter Rampe AUF
const int EndeZU =    3;  //Endschalter Rampe ZU

int EndeAUFState =  0;
int EndeZUState =   0;

int currentstate =  0;

int RECV_PIN = 2; // PinEingang für den IR Empfänger

 
IRrecv irrecv(RECV_PIN);
decode_results results;



void setup() {
pinMode(RampeAUF, OUTPUT);  //Motor Rampe AUF
pinMode(RampeZU,  OUTPUT);  //Motor Rampe Zu
pinMode(EndeAUF,  INPUT);   //Endschalter Rampe AUF
pinMode(EndeZU,   INPUT);   //Endschalter Rampe ZU
EndeAUFState=digitalRead(EndeAUF); //Auslesen Endschalter Rampe AUF
EndeZUState=digitalRead(EndeZU);  //Auslesen Endschalter Rampe ZU

if (EndeAUFState == LOW && EndeZUState == LOW){ //wenn keiner der Endschalter der Rampe betätigt ist fährt Motor Rampe automatisch zu
  digitalWrite(RampeZU, HIGH);
}

Serial.begin(9600);
irrecv.enableIRIn();
}

void loop() {
  
  if (irrecv.decode(&results)) {
  unsigned int value = results.value;
  Serial.println(results.value);
  irrecv.resume();

EndeAUFState  = digitalRead(EndeAUF); //Auslesen Endschalter Rampe AUF
EndeZUState   = digitalRead(EndeZU);  //Auslesen Endschalter Rampe ZU

if (results.value == 16736925 && EndeZUState == HIGH){
  digitalWrite(RampeAUF,HIGH);
}

if (results.value == 16754775 && EndeAUFState == HIGH) {
  digitalWrite(RampeZU,HIGH);
}

if (EndeZUState == HIGH){
 digitalWrite(RampeZU,LOW);
}

if (EndeAUFState == HIGH){
  digitalWrite(RampeAUF,LOW);
}

}
}

ich bin für jeden vorschlag und unterstützung dankkbar!

Wie bist du da drauf gekommen, dass es an der Library liegt ?
Wenn das stimmen sollte, kannst du doch mal eine andere Library verwenden.

Z.B. IRremot
Eine andere Idee habe ich nicht, da du keinerlei Fehlerhinweise gibst.

HotSystems:
Eine andere Idee habe ich nicht, da du keinerlei Fehlerhinweise gibst.

hoppla, hab ich vor lauter geschreibe tatsächlich vergessen zu erwähnen. DANKE für den Hinweis! :astonished: :astonished:

der Teil mit den Endschalter funktioniert nicht.
es wird einfach nicht erkannt dass die geschalten haben.

if (EndeEINState == HIGH) {
  digitalWrite(RampeAUF,LOW);
}

if (EndeAUSState == HIGH) {
  digitalWrite(RampeZU,LOW);
}

eigentlich das einfachste was es gibt :confused:

HotSystems:
Wie bist du da drauf gekommen, dass es an der Library liegt ?

ich vermute, dass es daran liegen muss, da dies die einzige änderung ist vom Testsketch zum implementieren der IR Funktion.

Wie gesagt, auch bin bin ziemlich ratlos, da es ja nicht wirklich kompliziert scheint.

casaria2:
hoppla, hab ich vor lauter geschreibe tatsächlich vergessen zu erwähnen. DANKE für den Hinweis! :astonished: :astonished:

der Teil mit den Endschalter funktioniert nicht.
es wird einfach nicht erkannt dass die geschalten haben.

if (EndeEINState == HIGH) {

digitalWrite(RampeAUF,LOW);
}

if (EndeAUSState == HIGH) {
  digitalWrite(RampeZU,LOW);
}




eigentlich das einfachste was es gibt :confused: 


ich vermute, dass es daran liegen muss, da dies die einzige änderung ist vom Testsketch zum implementieren der IR Funktion.

Wie gesagt, auch bin bin ziemlich ratlos, da es ja nicht wirklich kompliziert scheint.

Wie soll das auch funktionieren.
Deine Variablen die du in der if-Abfrage verwendest, wird ja nicht gefüllt.
Und wenn du immer nur Code-Fragmente postest, wird das lesen auch nicht leichter.

    EndeAUFState  = digitalRead(EndeAUF); //Auslesen Endschalter Rampe AUF
    EndeZUState   = digitalRead(EndeZU);  //Auslesen Endschalter Rampe ZU

Endschalter dürfen nicht innerhalb von

if (irrecv.decode(&results)) {}

stehen, da sie sonst nur bei einem neuen IR-Code abgefragt werden. Wäre jetzt mal mein spontaner Gedanke :slight_smile:

Mit Strg+t kannst Du in der IDE formatieren, dann hast Du einen besseren Überblick, geht mir zumindest so.

agmue:

    EndeAUFState  = digitalRead(EndeAUF); //Auslesen Endschalter Rampe AUF

EndeZUState  = digitalRead(EndeZU);  //Auslesen Endschalter Rampe ZU



Endschalter dürfen nicht innerhalb von 


if (irrecv.decode(&results)) {}



stehen, da sie sonst nur bei einem neuen IR-Code abgefragt werden. Wäre jetzt mal mein spontaner Gedanke :) 

Mit Strg+t kannst Du in der IDE formatieren, dann hast Du einen besseren Überblick, geht mir zumindest so.

Und diese Variablen heißen anders als die in Post #2.
Er vermischt da einiges.

ich hab ja anscheinend für einige verwirrung gesorgt, sorry. :confused:
und danke für den Input.

Ich versuche habe die Bezeichnungen nun angeglichen.

der Testsketch funktioniert soweit. Hab es hier mit seperatem "void RampeAUF1 & void RampeZU1" versucht. geht aber auch wenns nur so im void loop steht. Aber das wißt ihr selbst besser als ich :slight_smile:

#include <IRremote.h>

const int RampeAUF =  12; //Ansteuerung Motor Rampe AUF über Doppel H Brücke Modul
const int RampeZU =   13; //Ansteuerung Motor Rampe ZU über Doppel H Brücke Modul

const int EndeAUF =   4;  //Endschalter Rampe AUF
const int EndeZU =    3;  //Endschalter Rampe ZU

int EndeAUFState =  0;
int EndeZUState =   0;

int RECV_PIN = 2; // PinEingang für den IR Empfänger


IRrecv irrecv(RECV_PIN);
decode_results results;



void setup() {
  pinMode(RampeAUF, OUTPUT);  //Motor Rampe AUF
  pinMode(RampeZU,  OUTPUT);  //Motor Rampe Zu
  pinMode(EndeAUF,  INPUT);   //Endschalter Rampe AUF
  pinMode(EndeZU,   INPUT);   //Endschalter Rampe ZU
  EndeAUFState = digitalRead(EndeAUF); //Auslesen Endschalter Rampe AUF
  EndeZUState = digitalRead(EndeZU); //Auslesen Endschalter Rampe ZU

  if (EndeAUFState == LOW && EndeZUState == LOW) { //wenn keiner der Endschalter der Rampe betätigt ist fährt Motor Rampe automatisch zu
    digitalWrite(RampeZU, HIGH);
  }

  Serial.begin(9600);
  irrecv.enableIRIn();
}

void loop() {

  if (irrecv.decode(&results)) {
    unsigned int value = results.value;
    Serial.println(results.value);
    irrecv.resume();
  }

  EndeAUFState  = digitalRead(EndeAUF); //Auslesen Endschalter Rampe AUF
  EndeZUState   = digitalRead(EndeZU);  //Auslesen Endschalter Rampe ZU

  if (results.value == 16736925) {
    RampeAUF1();
  }

  if (results.value == 16754775) {
    RampeZU1();
  }

  if (EndeZUState == HIGH) {
    digitalWrite(RampeZU, LOW);
  }

  if (EndeAUFState == HIGH) {
    digitalWrite(RampeAUF, LOW);
  }
}


void RampeAUF1() {
  if (results.value == 16736925 && EndeZUState == HIGH) {
    digitalWrite(RampeAUF, HIGH);
  }
}

void RampeZU1() {
  if (results.value == 16754775 && EndeAUFState == HIGH) {
    digitalWrite(RampeZU, HIGH);
  }
}

und jetzt mein Hauptsketch mit allen funktionen.
Wenn ich das Testsketch nun in den hauptsketch integriere funktioniert die Ansteuerung des Motor und die Endschalter nicht mehr.
Ich habe es, wie im Testsketch mit eigenen voids für Rampe auf & zu probiert... ohne erfolg. selbiges bei den endschaltern...
ich habe wie vorgeschlagen versucht die Endschalter aus dem "irrecv.decode" rauszunehmen und unten anzufügen (wie im Test wo es funktioniert).

Code im nächsten Post (da nur 9000 zeichen zulässig sind)

Sorry, hat ein etwas gedauert, da ich nur 1 post alle 5min machen kann.
Hier nun der Hauptsketch:

/*
    FB Belegung:
      Powertaste: ALLE LED Kreise AUS Servos in position ZU
      Taste 0: ALLE LED Kreise EIN
      Taste 1: LED Kreis 1 EIN / AUS
      Taste 2: LED Kreis 2 EIN / AUS
      Taste 3: LED Kreis 3 EIN / AUS
      Taste 4: LED Kreis 4 EIN / AUS
      Taste 5: LED Kreis 5 EIN / AUS

      Taste 6: Stepper Motor 360° im Uhrzeigersinn, 360° gegen den Uhrzeigersinn 2x

      Taste 7: Servomotor 1 AUF / ZU
      Taste 8: Servomotor 2 AUF / ZU

      Taste Pfeil: Oben Rampe ZU
      Taste Pfeil: Unten Rampe AUF

*/


#include <IRremote.h>
#include <Stepper.h>
#include <Servo.h>

const int RampeAUF =  12; //Ansteuerung Motor Rampe AUF über Doppel H Brücke Modul
const int RampeZU =   13; //Ansteuerung Motor Rampe ZU über Doppel H Brücke Modul
const int EndeAUF =   4;  //Endschalter Rampe AUF
const int EndeZU =    3;  //Endschalter Rampe ZU

int EndeAUFState =  0;
int EndeZUState =   0;


int RECV_PIN = 2; // PinEingang für den IR Empfänger

int LED1 = A0;     //LED Kreis 1 zb. Landelicht
int LED2 = A1;     //LED Kreis 2 zb. Innenbeleuchtung
int LED3 = A2;     //LED Kreis 3 zb. Antriebslicht
int LED4 = A3;     //LED Kreis 4
int LED5 = A4;     //LED Kreis 5

int itsONled[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; //für die Berechung des Tastenzustandes 0-9
#define code1 16738455        //Code Taste 1
#define code2 16750695        //Code Taste 2
#define code3 16756815        //Code Taste 3
#define code4 16724175        //Code Taste 4
#define code5 16718055        //Code Taste 5
//Code Taste 6 wird hier nicht benötigt >> schaltet Steppermotor
#define code6 16716015        //Code Taste 7
#define code7 16726215        //Code Taste 8
#define code8 16734885        //Code Taste 9


const int stepsPerRevolution = 2048;                  //Schritte Steppermotor für 360° Umdrehung
Stepper myStepper(stepsPerRevolution, 8, 10, 9, 11);  //Anschlüße StepperMotor Treiber

Servo Motor1;               // Servo für xxx
Servo Motor2;               // Servo für xxx

IRrecv irrecv(RECV_PIN);
decode_results results;



void setup() {
  pinMode(RampeAUF, OUTPUT);  //Motor Rampe AUF
  pinMode(RampeZU,  OUTPUT);  //Motor Rampe Zu
  pinMode(EndeAUF,  INPUT);   //Endschalter Rampe AUF
  pinMode(EndeZU,   INPUT);   //Endschalter Rampe ZU

  pinMode(LED1, OUTPUT);     //LED Kreis 1
  pinMode(LED2, OUTPUT);     //LED Kreis 2
  pinMode(LED3, OUTPUT);     //LED Kreis 3
  pinMode(LED4, OUTPUT);     //LED Kreis 4
  pinMode(LED5, OUTPUT);     //LED Kreis 5

  myStepper.setSpeed(15);

  Motor1.attach(5);           // Servo1 Dachluke PWM Ausgang
  Motor2.attach(6);           // Servo2 xxx PWM Ausgang


  Motor1.write(210);          // Servo1 bei Programmstart geschlossen
  Motor2.write(210);          // Servo2 bei Programmstart geschlossen

  EndeAUFState = digitalRead(EndeAUF); //Auslesen Endschalter Rampe AUF
  EndeZUState = digitalRead(EndeZU); //Auslesen Endschalter Rampe ZU

  if (EndeAUFState == LOW && EndeZUState == LOW) { //wenn keiner der Endschalter der Rampe betätigt ist fährt Motor Rampe automatisch zu
    digitalWrite(RampeZU, HIGH);
  }

  Serial.begin(9600);
  irrecv.enableIRIn();
}



void loop() {

  if (irrecv.decode(&results)) {
    unsigned int value = results.value;
    Serial.println(results.value);
    irrecv.resume();
    if (results.value == 16730805) {      //Bei Taste 0 alle LED Kreise EIN
      digitalWrite (LED1, HIGH);
      digitalWrite (LED2, HIGH);
      digitalWrite (LED3, HIGH);
      digitalWrite (LED4, HIGH);
      digitalWrite (LED5, HIGH);
    }

    switch (value) {
      case code1:
        LEDKreis1();
        break;
      case code2:
        LEDKreis2();
        break;
      case code3:
        LEDKreis3();
        break;
      case code4:
        LEDKreis4();
        break;
      case code5:
        LEDKreis5();
        break;
      case code6:
        ServoMotor1();
        break;
      case code7:
        ServoMotor2();
        break;
    }

    if (results.value == 16743045) {    //wenn Taste 6 gedrückt wird Stepper drehen EIN
      StepperMotor();
    }

    if (results.value == 16736925 && EndeZUState == HIGH) { //Wenn Taste Pfeil Unten gedrückt wird & Endschalter Rampe Zu geschalten hat >> Rampe AUF
      digitalWrite(RampeAUF, HIGH);
    }

    if (results.value == 16754775 && EndeAUFState == HIGH) {  //Wenn Taste Pfeil Oben derückt wird & Endschalter Rampe AUF geschalten hat >> Rampe ZU
      digitalWrite(RampeZU, HIGH);
    }

    /*AUSSCHALTEN*/

    if (results.value == 16712445) {     //wenn Taste POWER gedrückt wird gehen LED1 & LED2 AUS & Servo in Grundstellung
      digitalWrite (LED1, LOW);          //LED1 AUS
      digitalWrite (LED2, LOW);          //LED2 AUS
      digitalWrite (LED3, LOW);          //LED3 AUS
      digitalWrite (LED4, LOW);          //LED4 AUS
      digitalWrite (LED5, LOW);          //LED5 AUS
      Motor1.write(210);                 //Servo1 ZU
      Motor2.write(210);                 //Servo2 ZU 
    }

    irrecv.resume();                    // Springt wieder zum Anfang zurück uns startet Loop neu

  }                                   //ir Recive ENDE

  //Endschalter Motor Rampe

  if (EndeAUFState == HIGH) {
    digitalWrite(RampeAUF, LOW);
  }

  if (EndeZUState == HIGH) {
    digitalWrite(RampeZU, LOW);
  }
}                                   //void loop ENDE




/*Steuerung mit einer Taste EIN & AUS für LED Kreise 1 bis 5*/

void LEDKreis1() {
  if (itsONled[2] == 1 ) {
    digitalWrite(LED1, LOW);
    itsONled[2] = 0;
  } else {
    digitalWrite(LED1, HIGH);
    itsONled[2] = 1;
  }
}

void LEDKreis2() {
  if (itsONled[3] == 1 ) {
    digitalWrite(LED2, LOW);
    itsONled[3] = 0;
  } else {
    digitalWrite(LED2, HIGH);
    itsONled[3] = 1;
  }
}

void LEDKreis3() {
  if (itsONled[4] == 1 ) {
    digitalWrite(LED3, LOW);
    itsONled[4] = 0;
  } else {
    digitalWrite(LED3, HIGH);
    itsONled[4] = 1;
  }
}

void LEDKreis4() {
  if (itsONled[5] == 1 ) {
    digitalWrite(LED4, LOW);
    itsONled[5] = 0;
  } else {
    digitalWrite(LED4, HIGH);
    itsONled[5] = 1;
  }
}

void LEDKreis5() {
  if (itsONled[6] == 1 ) {
    digitalWrite(LED5, LOW);
    itsONled[6] = 0;
  } else {
    digitalWrite(LED5, HIGH);
    itsONled[6] = 1;
  }
}


/*Steuerung Servo 1-2*/

void ServoMotor1() {
  if (itsONled[7] == 1 ) {
    (Motor1.write(210));
    itsONled[7] = 0;
  } else {
    (Motor1.write(20));
    itsONled[7] = 1;
  }
}

void ServoMotor2() {
  if (itsONled[8] == 1 ) {
    (Motor2.write(210));
    itsONled[8] = 0;
  } else {
    (Motor2.write(20));
    itsONled[8] = 1;
  }
}


/*Steuerung Stepper Motor*/

void StepperMotor () {
  myStepper.step(stepsPerRevolution);   //1 Umdrehung im Uhrzeigersinn
  myStepper.step(-stepsPerRevolution);  //1 Umdrehung gegen den Uhrzeigersinn
  myStepper.step(stepsPerRevolution);   //1 Umdrehung im Uhrzeigersinn
  myStepper.step(-stepsPerRevolution);  //1 Umdrehung gegen den Uhrzeigersinn
  digitalWrite(8, LOW);                 //StepperMotor AUS Int1
  digitalWrite(9, LOW);                 //StepperMotor AUS Int2
  digitalWrite(10, LOW);                //StepperMotor AUS Int3
  digitalWrite(11, LOW);                //StepperMotor AUS Int4
}

Das problem liegt nun darin, dass ausser der funktion im void setup (keine Endschalter betätigt = Rampe Zu) nichts funktioniert was die Motorsteuerung betrifft.

entweder denke ich zu kompliziert und hab etwas übersehen, oder es ist so wie ich mir das vorstelle nicht möglich :confused:

ich hoffe nun ist es verständlicher.

Ich verstehs leider nicht :o

Das fehlt in loop():

  EndeAUFState = digitalRead(EndeAUF); //Auslesen Endschalter Rampe AUF
  EndeZUState = digitalRead(EndeZU); //Auslesen Endschalter Rampe ZU

Warum das und alle anderen Werte nicht in case?

if (results.value == 16743045) {

OMG :o :o
doch so einfach :confused: :confused:
Du bist mein Held!

ich will natürlich alles in case reinpacken, wollte aber zuerst mal alles zum laufen bringen.
jetzt kommt, dank deiner hilfe, das feintuning.

ich lern mit jeder funktion dazu.

Danke nochmal!

casaria2:
Danke nochmal!

Bitte gerne :slight_smile: