Schiffe Bodo
13.01.2016, 11:22
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
//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);
}
}
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
//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);
}
}