Hallo zusammen,
im Sketch unten findet man eine kleine Lichtsteuerung mit IR Fernbedienung.
So, wie der Sketch dort geschrieben ist, funktioniert er auch.
Aber:
Meine PWM-Pins für R,G,B sind ie die Ausgänge 6, 9, und 10.
Im ersten entwurf hatte ich die Pins 9, 10, und 11 verwendet. An sonsten alles identisch, wie unten.
Ergebnis:
Aus Pin 11 kam kein PWM.
In einem anderen Sketch hatte ich ebenfalls Pin 11, und da lief er.
Ok, dachte ich, der Ard. Nano ist hin, aber dem war nicht so.
Hat einer eine Idee, warum bei dem Sketch unten B icht funktioniert, wenn es auf Pin 11 ausgegeben werden soll?
Gibt es dafür eine Erklärung?
#include <IRremote.h>
int RECV_PIN = A1;
IRrecv irrecv(RECV_PIN);
decode_results results;
int active;
int velocity=50;
int brightness = 0;
int R = 10;
int G = 9;
int B = 6;
int Red;
int Green;
int Blue;
int angle = 0;
int circle = 1;
int dir = 1;
bool an = 0;
unsigned long lastCode;
unsigned char pwmtable[40] = {0, 0, 0, 1, 2, 3, 4, 6, 8, 10, 13, 16, 19, 23, 27, 31, 36, 41, 47, 52, 59, 65, 72, 80, 88, 96, 105, 114, 123, 133, 143, 154, 165, 177, 189, 201, 214, 227, 241, 255};
void setup()
{
pinMode (R, OUTPUT); // R
pinMode (G, OUTPUT); // G
pinMode (B, OUTPUT); // B
pinMode (A1, INPUT); //IR-in
pinMode (13, OUTPUT); //not necessary, just for Test purposes
irrecv.enableIRIn();
Serial.begin(115200);
}
void loop() {
//Serial.println(an);
digitalWrite (13, an);
//Serial.println(brightness);
//Serial.println(lastCode);
if (an == 0) {
analogWrite(R, 0);
analogWrite(G, 0);
analogWrite(B, 0);
}
if (irrecv.decode(&results)) {
//Serial.print(results.value); Serial.print(" "); Serial.println(lastCode);
if (results.value == 4294967295) {
results.value = lastCode;
}
if (results.value == 16769565) { // ch+, an/aus
an = !an;
delay(50);
}
if ((results.value == 16754775) && (an == 1)) //+, heller
{
lastCode = results.value;
brightness -= 5;
if (brightness <= 0)brightness = 0;
delay(20);
}
if ((results.value == 16769055) && (an == 1)) //-, dunkler
{
lastCode = results.value;
brightness += 5;
if (brightness >= 255)brightness = 255;
delay(20);
}
irrecv.resume();
//lastCode=results.value;
}
// Wiederholcode ist 4294967295
if ((results.value == 16724175 || active==1) && (an == 1)) // 1, weiß
{
//Serial.println(" Es wurde taste 1 gedrückt");
lastCode = results.value;
active=1;
analogWrite(R, 255 - brightness);
analogWrite(G, 255 - brightness);
analogWrite(B, 255 - brightness);
}
if ((results.value == 16718055 || active==2) && (an == 1)) // 2, blau
{
// Serial.println(" Es wurde taste 2 gedrückt");
lastCode = results.value;
active=2;
analogWrite(R, 0);
analogWrite(G, 0);
analogWrite(B, 255 - brightness);
}
if ((results.value == 16743045 || active==3) && (an == 1)) // 3, Cyan
{
// Serial.println(" Es wurde taste 3 gedrückt");
lastCode = results.value;
active=3;
analogWrite(R, 0);
analogWrite(G, 255 - brightness);
analogWrite(B, 255 - brightness);
}
if ((results.value == 16716015 || active==4) && (an == 1)) // 4, gelb
{
// Serial.println(" Es wurde taste 4 gedrückt");
lastCode = results.value;
active=4;
analogWrite(R, 255 - brightness);
analogWrite(G, 255 - brightness);
analogWrite(B, 0);
}
if ((results.value == 16726215 || active==5) && (an == 1)) // 5, grün
{
// Serial.println(" Es wurde taste 5 gedrückt");
lastCode = results.value;
active=5;
analogWrite(R, 0);
analogWrite(G, 255 - brightness);
analogWrite(B, 0);
}
if ((results.value == 16734885 || active==6) && (an == 1)) // 6, rot
{
// Serial.println(" Es wurde taste 6 gedrückt");
lastCode = results.value;
active=6;
analogWrite(R, 255 - brightness);
analogWrite(G, 0);
analogWrite(B, 0);
}
if ((results.value == 16728765 || active==7) && (an == 1)) // 7, magenta
{
//Serial.println(" Es wurde taste 7 gedrückt");
lastCode = results.value;
active=7;
analogWrite(R, 255 - brightness);
analogWrite(G, 0);
analogWrite(B, 255 - brightness);
}
if ((results.value == 16730805 || active==8) && (an == 1)) { // 8, Regenbogenschleife
lastCode = results.value;
active=8;
angle = circle;
if (circle >= 240){
circle=240;
dir=-dir;
}
if (circle<=0){
circle=0;
dir=-dir;
}
if (angle < 40)
{
Red = 0;
Green = pwmtable[angle];
Blue = 255;
}
else if (angle < 80)
{
angle -= 40;
Red = 0;
Green = 255;
Blue = pwmtable[39 - angle];
}
else if (angle < 120)
{
angle -= 80;
Red = pwmtable[angle];
Green = 255;
Blue = 0;
}
else if (angle < 160)
{
angle -= 120;
Red = 255;
Green = pwmtable[39 - angle];
Blue = pwmtable[angle];
}
else if (angle < 200)
{
angle -= 160;
Red = 255;
Green = 0;
Blue = pwmtable[39 - angle];
}
else if (angle < 240)
{
angle -= 200;
Red = 255;
Green = pwmtable[angle];
Blue = pwmtable[angle];
}
analogWrite(R, Red);
analogWrite(G, Green);
analogWrite(B, Blue);
circle = circle + dir;
delay(velocity);
//Serial.print("Rot = ");Serial.println(Red);
//Serial.print("Grün = ");Serial.println(Green);
//Serial.print("Blau = ");Serial.println(Blue);
}
Serial.print(brightness);Serial.print(" activ = ");Serial.println(active);
// hier noch Resevefunktionen( schneller / langsamer soll die Variable velocty beeinflussen.
//if (results.value == 16712445) // >>|, schneller
//if (results.value == 16720605) // |<<, langsamer
//if (results.value == 16736925)
//if (results.value == 16736925)
}