[code]
/******************************************************************************
* Author: Michael Kriegers
* Projekt: Weiche LEGO-Eisenbahn
* Beschreibung: IR-Signale steuern vier Srevos auf Positionen im Tastbetrieb
*
* 04/03/2019 erstellt erste Versuche
* 05/03/2019 ausgebaut auf vier Servos
* 07/03/2019 Abschaltung der Servos mit weiterem Ausgang
* 09/03/2019 diverses Bugging
*
*****************************************************************************/
#include <IRremote.h>
#include <Servo.h>
int irPin = 2; //Pin am Arduino Nano für den IR Receiver
char buff[50];
struct servo
{
int max_pos; //Position 2 des Servos
int min_pos; //Position 1 des Servos
int geschw; //Geschwindigkeit des Servos (kleiner = schneller)
int Freigabe; //Ausgang zum einschalten des Servo_1
int Impuls; //Impulsausgang fuer das Servo
long code;
bool merker; //Positionsmerker
}Antrieb[4];
IRrecv irrecv(irPin); //Objekt initialisieren für die IR Übertragung
decode_results results;
Servo Weiche[4]; // create servo object to control a servo
void setup()
{
//Vorbelegung der Variablen aus dem Struct
Antrieb[0]={180,15,6,6,5,0x2cb6,false}; // Taste Rot auf Fernbedienung
Antrieb[1]={180,15,6,8,7,0xFFFF9A65,false}; // Taste Grün auf Fernbedienung
Antrieb[2]={180,15,6,10,9,0xFFFFA25D,false};// Taste Blau auf Fernbedienung
Antrieb[3]={180,15,6,12,11,0x22DD,false}; // Taste Weis auf Fernbedienung
pinMode(irPin, INPUT); //Den IR Pin als Eingang deklarieren.
for(int i=0;i<4;i++)
{
pinMode(Antrieb[i].Freigabe, OUTPUT); //Ausgang zum Einschalten des Servo
Weiche[i].attach(Antrieb[i].Impuls); // Zuordnug Ausgang zum Servo
}
pinMode(3, OUTPUT);digitalWrite(3, LOW);//Spannungsversorgung für IR-Sensor (GND)
pinMode(4, OUTPUT);digitalWrite(4, HIGH);//Spannungsversorgung für IR-Sensor (VCC)
irrecv.enableIRIn(); //Den IR Pin aktivieren
Serial.begin(9600); //Serielle kommunikation mit 9600 Baud beginnen.
}
void loop()
{
if (irrecv.decode(&results)) //Wenn etwas gelesen wurde dann...
{
//Ausgabe des Wertes auf die Serielle Schnittstelle.
int value = results.value;
Serial.println(value, HEX);
for (int t=0;t<4;t++)
{
if ((value == Antrieb[t].code)&&(Antrieb[t].merker == false))
{
digitalWrite(Antrieb[t].Freigabe, HIGH); //Servo einschalten
for (int i=Antrieb[t].max_pos;i>Antrieb[t].min_pos;i--)
{
Weiche[t].write(i); // setzt das Servo auf Wert
delay(Antrieb[t].geschw); // Wartezeit
}
delay(500);
digitalWrite(Antrieb[t].Freigabe, LOW); //Servo ausschalten
sprintf(buff,"Weiche %i in Position 1",t);
Serial.println(buff);
Antrieb[t].merker = true;
value = 0;
}
if (( value == Antrieb[t].code)&&(Antrieb[t].merker == true))
{
for (int i=Antrieb[t].min_pos;i<Antrieb[t].max_pos;i++)
{
digitalWrite(Antrieb[t].Freigabe, HIGH); //Servo einschalten
Weiche[t].write(i); // setzt das Servo auf Wert
delay(Antrieb[t].geschw); // Wartezeit
}
delay(500);
digitalWrite(Antrieb[t].Freigabe, LOW); //Servo ausschalten
sprintf(buff,"Weiche %i in Position 2",t);
Serial.println(buff);
Antrieb[t].merker = false;
value = 0;
}
}
irrecv.resume(); // auf den nächsten Wert warten
}
}
[/Code]