Hallo liebe Gemeinde,
ich würde mich sehr freuen wenn mir jemand auf die Sprünge hilft. Bin Neuling auf dem Gebiet und versuche mich am Programmieren.(Leider auch mit Hilfe)
Ich habe einen Kanalschalter im Netz gefunden den ich für mein Projekt umgewandelt hab.
Er soll mit einem Schalter der Fernbedienung funktionieren, dabei zählt er die Schalterbetätigungen und addiert sie bis 7. Hat er 7 Schaltzustände erreicht setzt er alle Ausgänge auf 0.
Der Aufbau funktioniert bei mir leider nur an Kanal 1, ich komm nicht drauf warum der nächste Kanal nicht geschaltet wird.
Danke für eure Hilfe
Hier noch der Sketch den ich verwende
Code://Bibliotheken laden //#include "Servo.h" #include "makros.h" #include "debug.h" //#define USE_TIMER_5 #include "RCReceive.h" //Globale-Variablen Deklarieren const int AusgabePin[]={7,8,9,10,11,12}; //die 6 Ausgabepins festlegen für die Schaltkanäle boolean Anaus[]={LOW,LOW,LOW,LOW,LOW,LOW,LOW}; //Variablen zum Schaltstatus der Kanäle auf LOW deklarieren int i=0;//Zählervariable für schleifen //Zeitmanagemant unsigned long StartZeit=millis();//Zeitsteuerungsvariable zum Schaltintervall berechnen unsigned long VergleichZeit=0;//Zeitsteuerungsvariable zum vergleichen mit SartZeit //unsigned long StartZeitKopf=millis();//Zeitsteuerungsvariable zum Schaltintervall berechnen //unsigned long VergleichZeitKopf=0;//Zeitsteuerungsvariable zum vergleichen mit StartZeitKopf unsigned long zaehlerZeit=millis();//Zeitsteuerungsvariable zum zurücksetzen fals die Timeout Zeit errecht wird unsigned long Vergleichzaehler=0;//Zeitsteuerungsvariable zum vergleichen mit zaehlerZeit boolean w=LOW;//Schaltvariable zum Timeout //Pinbelegung RC-Kanäle const byte PIN_RC = 3;//Variable Empfängerkanal Pin festlegen Kanal 1 Taster byte rcSignal;// Variable für das Empfängersignal 1 Steuert den Multiswitch int Kanalzaehler = 0;// Zähler für den zu schaltenden Kanal int Schaltwert = 210;// wert ab dem der Zähler erhöht wird. Vergleicht den rcSignal wert ist der Signalwert höhe... int schaltzeitk = 80;//kurze schaltzeit ca. eine 10.tel sec zum entprellen int schaltzeitl =550;//Lange schaltzeit dreiviertel Sec. zum schalten eines ausganges int timeout = 10000;// Timer zum zurücksetzen des Schaltbildes int Schaltwertver=0; int t=0;//Schleifen Zählervariable int a=0;// int Langeschaltzeit=0;//Prüfvariable ob die Schaltzeit über schaltzeitl gewesen ist // Der Empfänger RCReceive rcKanal1;//Objekt Kanal 1 festlegen Taster void setup() { rcKanal1.attachInt(PIN_RC);//Objekt Kanal 1 an Pin binden Switch pinMode(AusgabePin[0],OUTPUT);//Ausgabepins für die Schaltfunktionen deklarieren pinMode(AusgabePin[1],OUTPUT); pinMode(AusgabePin[2],OUTPUT); pinMode(AusgabePin[3],OUTPUT); pinMode(AusgabePin[4],OUTPUT); pinMode(AusgabePin[5],OUTPUT); //randomSeed(analogRead(0)); Serial.begin(9600);//Serielle Übertragung durch Kommentar ausgeblendete ist nur zu Kontrollzwecken } void loop() { //Empfänger überwachen if (!rcKanal1.hasError()) { doWork(); // aurufen der "Arbeits-Routine" } else if (rcKanal1.hasError()) // bei Empfangsproblemen dagegen { failSave(); // wird die Failsave-Routine gestartet } } //------------------------------------------------------------------------------- // 01 Funktion Arbeit //------------------------------------------------------------------------------- void doWork() { rcSignal = rcKanal1.getValue(); // den Empfänger auslesen Serial.println("anfang:");//Serielle übertragung ausgeblendet Serial.println(rcSignal); //------------------------------------------------------------------------------- // Timeout //------------------------------------------------------------------------------- if (w==HIGH)//wenn der Timout bereits gstartet ist wird Die Schaltsequenz zurück gesetzt, sofern die Bedingungen erfüllt sind { Vergleichzaehler=millis()-zaehlerZeit;//Laufzeit des Timout vergleichen if (Vergleichzaehler>timeout) { Kanalzaehler=0; a=0;//Kurze schaltzeit für den Kanalzähler zurücksetzen Langeschaltzeit=0;//Kanal Schalten zurücksetzen StartZeit=millis();// Startzeit neu setzen w=LOW; } } //------------------------------------------------------------------------------- // Empfangsignal1 auswerten //------------------------------------------------------------------------------- if (rcSignal < Schaltwert)//wenn das ausgelesene Empfängersignal kleiner als der schaltwert ist { if (w==LOW)//ist es der erste schaltvorgang? { w=!w;//w HIGH setzen zaehlerZeit=millis();//Timeout Zeit starten } multiswitch();//aufrufen der multiswitch-Routine if (Langeschaltzeit==1)//wenn der Schaltimpuls lang war... { Kanalschalten();}//aufrufen der Kanalschalten-Routine } else//Werte zurücksetzen wenn das RC-Signal1 nicht in schaltposition ist { a=0;//Kurze schaltzeit für den Kanalzähler auf null setzen Langeschaltzeit=0;//Kanal Schalten auf null setzen StartZeit=millis();// Startzeit neu setzen } } //------------------------------------------------------------------------------- // 02 Funktion multiswitch zum auslesen des Schaltbildes //------------------------------------------------------------------------------- void multiswitch() { VergleichZeit=millis()-StartZeit;//wieviel zeit ist seit dem letzten zurücksetzen der Werte vergangen if (VergleichZeit > schaltzeitk)//ist die schaltzeit über der kurzen Schaltzeit?? { if (a==0)// Wird diese schleife zum ersten mal durchlaufen ?? { a=1;//wird auf 1 gesetzt damit der Kanalzäler nur einmal pro Schalterbewegung erhöht wird Kanalzaehler++;//den Kanalzähler (Ausgang) um 1 erhöhen if (Kanalzaehler>7)//Wenn der Kanalzäler größer als 7... { Kanalzaehler=0;}// ...ist wird er auf 0 zurückgesetzt } if (VergleichZeit > schaltzeitl)//Wenn die Schaltzeit lang war { Langeschaltzeit=1;//wird auf eins gesetzt damit ein Kanal geschaltet wird Anaus[Kanalzaehler-1]=!Anaus[Kanalzaehler-1];//Schaltzustand toggeln } } Serial.println(Langeschaltzeit); Serial.println(Kanalzaehler); } //------------------------------------------------------------------------------- // 03 Funktion Ausgabekanal schalten //------------------------------------------------------------------------------- void Kanalschalten() { //Schaltet einen Kanal an bzw. aus switch(Kanalzaehler) { case 1:// Schaltet Kanal 1 digitalWrite (AusgabePin[0],Anaus[0]); break; case 2:// Schaltet Kanal 2 digitalWrite (AusgabePin[1],Anaus[1]); break; case 3:// Schaltet Kanal 3 digitalWrite (AusgabePin[2],Anaus[2]); break; case 4:// Schaltet Kanal 4 digitalWrite (AusgabePin[3],Anaus[3]); break; case 5:// Schaltet Kanal 5 digitalWrite (AusgabePin[4],Anaus[4]); break; case 6:// Schaltet Kanal 6 digitalWrite (AusgabePin[5],Anaus[5]); break; case 7:// Wenn der Kanalzähler auf 7 steht werden alle Kanäle ausgeschaltet digitalWrite (AusgabePin[0],LOW); digitalWrite (AusgabePin[1],LOW); digitalWrite (AusgabePin[2],LOW); digitalWrite (AusgabePin[3],LOW); digitalWrite (AusgabePin[4],LOW); digitalWrite (AusgabePin[5],LOW); //Anaus[0]=LOW; break; } Kanalzaehler=0;//setzt den Kanalzähler nach dem Schalten eines Kanals zurück w=LOW;//Timeout zurücksetzen } //-------------------------------------------------------------------------------------- // 08 Funktion FailSave Kanal 1 wird eigentlich nicht gebraucht sieht aber wichtig aus //-------------------------------------------------------------------------------------- void failSave() { //Blinksignal des Scheinwerfer zur Erkennung das ein Fehler mit dem Empfänger vorliegt for (int i=0; i<5; i++) { digitalWrite(13,HIGH); delay(50); digitalWrite(13,LOW); delay(50); } }







Zitieren

Lesezeichen