Hey Leute!
Ich würde gern meinen Mega so programmieren, dass er mithilfe einer Fernbedienung und eines IR Receivers jeweils unterschiedliche "Funktionen" ausführt.
Und zwar sozusagen jeweils in einer Schleife, bis eine andere Taste / Funkion gewählt wird.
Ich bin bereits darauf gestoßen, dass das mit einem Timer bzw. Interrupts funktionieren soll....
Hier mal mein aktueller Code... leider ohne Funktion... es wird kein IR Code mehr empfangen...Vielleicht kann mir einer Helfen...
Lieben dank schonmal!!
#include <TimerOne.h>
#include <IRremote.h>
int RECV_PIN = 11; // IR-Receiver PIN
int led = 12; // Satus-LED PIN
int modus; // Modus für Interrupt-Abfrage
int ledr = 6; // RGB LED rot PIN
int ledg = 7; // RGB LED grün PIN
int ledb = 8; // RGB LED blau PIN
int SerialBuffer = 0;
int RedSum = 0; // Farbsumme von VLC über serial ROT
int GreenSum = 0; // Farbsumme von VLC über serial grün
int BlueSum = 0; // Farbsumme von VLC über serial Blau
int RedVal=1; // Variablen für Fader
int BlueVal=1; // "
int GreenVal=1; // "
int i=1; // Zählervariable für Fader
int timerwert = 50; // Timer Zeit für Interrupt in ms
int fadespeed = 10; // Speed für Fade --> 1: extrem schnell
// --> 10: normal
// --> 100: extrem langsam
String readString;
/////////////////////////////////////////////////////////////////////////////////////
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup()
{
pinMode(ledr, OUTPUT); // Setzen der RGB LED Pins als Output
pinMode(ledg, OUTPUT); // Setzen der RGB LED Pins als Output
pinMode(ledb, OUTPUT); // Setzen der RGB LED Pins als Output
pinMode(led, OUTPUT); // Status-LED als Output setzen
Serial.begin(38400); // Serial Verbindung zu VLC
// Serial.begin(9600);
irrecv.enableIRIn(); // Start vom IR-Empfang
// Ethernet.begin(mac, ip, gateway, subnet); // Server Starteb
// server.begin();
Timer1.initialize(timerwert); // Initialisieren des Timer-Interrupts
Timer1.attachInterrupt(leseIR); // IR-Einlesen von Interr. ausführen lassen
}
void leseIR(){
// Ständige Abfrage ob Wert von IR Empfangen, trotz LOOP
if (irrecv.decode(&results)){
switch (results.value) {
case 0xFF10EF: // Modus Fade (DIY 4)
modus = 1;
break;
case 0xFF906F: // Modus pcambi (DIY 5)
modus = 2;
break;
// DIY 1 FF30CF
// DIY 2 FBB04F
// DIY 3 FF708F
// DIY 4 FF10EF
// DIY 5 FF906F
// DIY 6 FF50AF
case 0xFF02FD: //Power
modus = 0;
digitalWrite(led, HIGH); // Status LED EIN
delay(500); // Pause 0,5s
digitalWrite(led, LOW); // Status LED AUS
setColor(0, 0, 0); // RGB LEDs ausschalten
break;
/////////////////////
//Standart RGB Remote
/////////////////////
case 0xFFA25D: //Blau 0,0,255
modus = 0;
setColor(0, 0, 255);
break;
case 0xFF1AE5: //Rot
modus = 0;
setColor(255, 0, 0);
break;
case 0xFF9A65://Grün
modus = 0;
setColor(0, 255, 0);
break;
case 0xFF22DD: //Weiss
modus = 0;
setColor(255, 255, 255);
break;
case 0xFF2AD5: //orange
modus = 0;
setColor(255, 165, 0);
break;
case 0xFFAA55://Grün mitrtel
modus = 0;
setColor(124, 252, 0);
break;
case 0xFF926D: //blau mittel
modus = 0;
setColor(92, 172, 238);
break;
case 0xFF12ED: //rosa
modus = 0;
setColor(255, 228, 196);
break;
} // Switch ENDE
} // Empfange IR ENDE
irrecv.resume(); // Receive the next value
} // Lese IR ENDE
void setColor (int red, int green, int blue) {
// RGB LED: write inverted value for each color
analogWrite(ledr, 255 - red);
analogWrite(ledg, 255 - green);
analogWrite(ledb, 255 - blue);
delay(1000);
}
///////////////////
/// Fade //////////
///////////////////
void fade(int Speed){
analogWrite(ledr,255-RedVal);
analogWrite(ledb,255-BlueVal);
analogWrite(ledg,255-GreenVal);
RedVal =((i<255)*i)+((i>=255)*255)+((i>511)*(512-i))+((i>766)*(i-766))+((i>=1276)*(i-1276))+((i>1530)*(1530-i))+((i>1786)*(1786-i));
GreenVal =(i<256)*(1)+(i>255)*(i-255)+(i>510)*(510-i)+(i>1020)*(1020-i)+(i>1274)*(i-1274)+(i>1530)*(i-1531)+(i>1785)*(3571-(2*i));
BlueVal =(i<764)*(1)+(i>765)*(i-765)+(i>1020)*(1020-i)+(i>1786)*(1786-i);
if(i>2040){
i = 1;
}
i++;
delay(Speed);
} // Fade ENDE
void pcambi(){
////////////////
////////////////
digitalWrite(led, HIGH); // Status LED EIN
delay(50); // Pause 0,5s
digitalWrite(led, LOW); // Status LED AUS
delay(50);
digitalWrite(led, HIGH); // Status LED EIN
delay(50); // Pause 0,5s
digitalWrite(led, LOW); // Status LED AUS
delay(50);
digitalWrite(led, HIGH); // Status LED EIN
delay(50); // Pause 0,5s
digitalWrite(led, LOW); // Status LED AUS
void loop() {
if(modus==1){ // Abfrage pb Modus:1 in Interrupt gesetzt
fade(fadespeed); // Starte Fade
}
if(modus==2){ // Abfrage pb Modus:2 in Interrupt gesetzt
pcambi(); // pcaMBI
}
if(modus==3){ // Abfrage pb Modus:3 in Interrupt gesetzt
//starteServer();
}
} // LOOP Ende