Hallo zusammen,
ich bin absoluter Neuling in Sachen Arduino und habe von Programmierung keine Ahnung. Da mich die Möglichkeiten aber faszinieren, habe ich mich etwas eingearbeitet und bin bis jetzt auch zu einem (für mich) befriedigenden Ergebnis gekommen.
Aber jetzt stehe ich vor einem Problem bei dem ich nicht weiterkomme:
Ich möchte bei einem ferngesteuerten Modellschiff Lichter, Radar und ähnliche Sonderfunktionen schalten. Um diese Verbraucher einzuschalten werden Relais verwendet. Diese 8 Relais möchte ich über 4 Schaltkanäle (AN-AUS-AN) der Fernsteuerung schalten. Und zwar sollte es ein Memory-Schalter sein. Also wenn ich einen Schalter kurz einschalte, soll das Relais solange geschaltet bleiben bis ich den selben Schalter erneut schalte.
Einen normalen Schalter (keine Memory-Funktion) habe ich schon programmiert und der funktionierte auch gut.... aber die Memory-Funktion fuxt mich irgendwie
Mein Problem ist, dass die Relais schalten wann und wie sie wollen und nicht wann ich will.
Ich benutze einen Arduino UNO und eine Flysky FS-i6X Fernsteuerung mit einem 10 Kanal Empfänger.
Mein Sketch sieht folgendermaßen aus:
int X = 0;
byte CH7 = A5; // Signaleingang
byte CH8 = A4;
byte CH9 = A3;
byte CH10 = A2;
byte OUT1 = 2;
byte OUT2 = 3; // Schaltausgänge
byte OUT3 = 4;
byte OUT4 = 5;
byte OUT5 = 6;
byte OUT6 = 7;
byte OUT7 = 8;
byte OUT8 = 9;
void setup() {
pinMode(CH7, INPUT); // Definition der Pins Input oder Output
pinMode(CH8, INPUT);
pinMode(CH9, INPUT);
pinMode(CH10, INPUT);
pinMode(OUT1, OUTPUT);
pinMode(OUT2, OUTPUT);
pinMode(OUT3, OUTPUT);
pinMode(OUT4, OUTPUT);
pinMode(OUT5, OUTPUT);
pinMode(OUT6, OUTPUT);
pinMode(OUT7, OUTPUT);
pinMode(OUT8, OUTPUT);
Serial.begin(9600); // zum testen
}
void loop()
{
if (pulseIn <= 10) { // Ohne Signal alles abschalten
digitalWrite (OUT1, LOW);
digitalWrite (OUT2, LOW);
digitalWrite (OUT3, LOW);
digitalWrite (OUT4, LOW);
digitalWrite (OUT5, LOW);
digitalWrite (OUT6, LOW);
digitalWrite (OUT7, LOW);
digitalWrite (OUT8, LOW);
} else{
X = pulseIn(CH7, HIGH, 250000); // Eingangssignal abfragen
int OUT1v = digitalRead (OUT1); // Variable erzeugen, die schau ob Ausgang1 ein- oder ausgeschaltet ist
if ((X>=10) && (X <= 1300) && (OUT1v==LOW)) { // wenn Eingangssignal im Bereich von 10 bis 1300 ms ist und Ausgang1 ausgeschaltet ist
digitalWrite(OUT1, HIGH); // dann Ausgang 1 einschalten
}
delay (300); // kurze Pause, sonst erkennt er den Unterschied nicht
if ((X >= 10) && (X <= 1300) && (OUT1v==HIGH)){ // wenn Eingangssignal im Bereich von 10 bis 1300 ms ist und Ausgang1 eingeschaltet ist
digitalWrite(OUT1, LOW); // dann Ausgang1 ausschalten
}
X = pulseIn(CH7, HIGH, 250000); // Eingangssinal abfragen
int OUT2v = digitalRead (OUT2); // siehe oben, nur mit Ausgang2
if ((X >= 1701) && (OUT2v==LOW)) { // wenn Eingangssignal größer als 1701 ms und Ausgang2 ausgeschaltet ist
digitalWrite(OUT2, HIGH); // Ausgang2 einschalten
}
delay (300); // kurze Pause
if ((X >= 1701) && (OUT2v==HIGH)){ // wenn Eingangssignal größer als 1701 ms und Ausgang2 eingeschaltet ist
digitalWrite(OUT2, LOW); // Ausgang2 ausschalten
}
}
if (pulseIn <= 10) { // ab hier genau das gleiche wie oben, nur mit den weiteren Kanälen und Ausgängen
digitalWrite (OUT1, LOW);
digitalWrite (OUT2, LOW);
digitalWrite (OUT3, LOW);
digitalWrite (OUT4, LOW);
digitalWrite (OUT5, LOW);
digitalWrite (OUT6, LOW);
digitalWrite (OUT7, LOW);
digitalWrite (OUT8, LOW);
} else{
X = pulseIn(CH8, HIGH, 250000);
int OUT3v = digitalRead (OUT3);
if ((X>=10) && (X <= 1300) && (OUT3v==LOW)) {
digitalWrite(OUT3, HIGH);
}
delay (300);
if ((X >= 10) && (X <= 1300) && (OUT3v==HIGH)){
digitalWrite(OUT3, LOW);
}
X = pulseIn(CH8, HIGH, 250000);
int OUT4v = digitalRead (OUT4);
if ((X >= 1701) && (OUT4v==LOW)) {
digitalWrite(OUT4, HIGH);
}
delay (300);
if ((X >= 1701) && (OUT4v==HIGH)){
digitalWrite(OUT4, LOW);
}
}
if (pulseIn <= 10) {
digitalWrite (OUT1, LOW);
digitalWrite (OUT2, LOW);
digitalWrite (OUT3, LOW);
digitalWrite (OUT4, LOW);
digitalWrite (OUT5, LOW);
digitalWrite (OUT6, LOW);
digitalWrite (OUT7, LOW);
digitalWrite (OUT8, LOW);
} else{
X = pulseIn(CH9, HIGH, 250000);
int OUT5v = digitalRead (OUT5);
if ((X>=10) && (X <= 1300) && (OUT5v==LOW)) {
}
delay (300);
if ((X >= 10) && (X <= 1300) && (OUT5v==HIGH)){
digitalWrite(OUT5, LOW);
}
X = pulseIn(CH9, HIGH, 250000);
int OUT6v = digitalRead (OUT6);
if ((X >= 1701) && (OUT6v==LOW)) {
digitalWrite(OUT6, HIGH);
}
delay (300);
if ((X >= 1701) && (OUT6v==HIGH)){
digitalWrite(OUT6, LOW);
}
}
if (pulseIn <= 10) {
digitalWrite (OUT1, LOW);
digitalWrite (OUT2, LOW);
digitalWrite (OUT3, LOW);
digitalWrite (OUT4, LOW);
digitalWrite (OUT5, LOW);
digitalWrite (OUT6, LOW);
digitalWrite (OUT7, LOW);
digitalWrite (OUT8, LOW);
} else{
X = pulseIn(CH10, HIGH, 250000);
int OUT7v = digitalRead (OUT7);
if ((X>=10) && (X <= 1300) && (OUT7v==LOW)) {
digitalWrite(OUT7, HIGH);
}
delay (300);
if ((X >= 10) && (X <= 1300) && (OUT7v==HIGH)){
digitalWrite(OUT7, LOW);
}
X = pulseIn(CH10, HIGH, 250000);
int OUT8v = digitalRead (OUT8);
if ((X >= 1701) && (OUT8v==LOW)) {
digitalWrite(OUT8, HIGH);
}
delay (300);
if ((X >= 1701) && (OUT8v==HIGH)){
digitalWrite(OUT8, LOW);
}
}
}
Ich hoffe, ich habe mich verständlich ausgedrückt und würde mich freuen wenn mir hier jemand helfen kann.
Viele Grüße
Markus