У меня огромная проблема с моим Arduino, управляющим моей полосой RGB-LED. Я могу контролировать синий и зеленый канал без каких-либо проблем (все значения от 0 до 255 работают), но мой красный канал действительно не хочет работать … Я могу управлять им, но он только включается и выключается (0 и 255) но все остальные частоты ШИМ не будут работать. Это просто выключит светодиоды. Действительно странная вещь заключается в том, что я могу исключить, что это может происходить из-за аппаратного сбоя, потому что, когда я запускаю новый эскиз и просто приказываю Arduino (Nano) управлять методом настройки, каждый канал для каждого значения работает как чудо … Я слепой или в чем проблема с моим кодом?
Я действительно надеюсь, что любой из вас сможет мне помочь.
#include <IRremote.h>
#include <EEPROM.h>
//Pins for RGB LEDs
#define rotPin 11 //redLED
#define gruenPin 6 // green LED
#define blauPin 9 // blue LED
//EEPROM 0=red, 1=green, 2=blue
int rVal, gVal, bVal;
boolean ersterStart = true;//IR-recevier Stuff
const int RECV_PIN = A0; // Pin of the IR-Receiver
IRrecv irrecv(RECV_PIN); // defining of a receiver object
decode_results results; // variable for saving the IR-results
//IR-Codes for the IR transmitter
#define on 16236607
#define off 16203967
#define dunkler 16220287
#define heller 16187647
#define rot 16195807
#define gruen 16228447
#define blau 16212127
#define weiss 16244767
#define hellrot 16191727
#define orange 16199887
#define orangebraun 16189687
#define gelb 16197847
#define dunkelgrün 16224367
#define hellesdunkelgrün 16232527
#define hellgrün 16222327
#define tuerkis 16230487
#define dunkelblau 16208047
#define ultramarine 16216207
#define dunkelviolett 16206007
#define violett 16214167
#define flash 16240687
#define strobe 16248847
#define fadebtn 16238647
#define smooth 16246807
//Variables for Fading (fade())
byte r, g, b;
char farbe = 'b'; // letter for current color (Blue)
int fadePause = 8; // time for fading steps; smaller = faster, bigger = slower
int halteZeit = 500; // pause time between colors
unsigned long fadeZeit = 0; // variable for saving the current millis()
boolean ersterLauf = true; // needed to check if it's the first run of the program
boolean fadeOn = false; // defines if fademode should be turned on
void setup()
{
pinMode(rotPin, OUTPUT);
pinMode(gruenPin, OUTPUT);
pinMode(blauPin, OUTPUT);
ersterLauf=true;
irrecv.enableIRIn(); // initializes IR-receiver
Serial.begin(9600);
if(EEPROM.read(3)==1){
fadeOn=true;
}
else{
fadeOn=false;
}
if(fadeOn == false){
analogWrite(rotPin,EEPROM.read(0));
analogWrite(gruenPin,EEPROM.read(1));
analogWrite(blauPin,EEPROM.read(2));
}
}void loop(){
if (irrecv.decode(&results)) {
//IR-basecodes
if(results.value == on){
analogWrite(rotPin, EEPROM.read(0));
analogWrite(gruenPin, EEPROM.read(1)); //load RGB values from EEPROM
analogWrite(blauPin, EEPROM.read(2));
irrecv.resume();
}
if(results.value == off){ //turns all LEDs off
analogWrite(rotPin,0);
analogWrite(gruenPin,0);
analogWrite(blauPin,0);
irrecv.resume();
}
if(results.value == weiss){ // turns on white color
analogWrite(rotPin,255);
analogWrite(gruenPin,255);
analogWrite(blauPin,255);
EEPROM.write(0,255);
EEPROM.write(1,255);
EEPROM.write(2,255);
irrecv.resume();
}
if(results.value == rot){ // turns on red color
analogWrite(rotPin,255);
analogWrite(gruenPin,0);
analogWrite(blauPin,0);
EEPROM.write(0,255);
EEPROM.write(1,0);
EEPROM.write(2,0);
irrecv.resume();
}
if(results.value == gruen){ // turns on green color
analogWrite(rotPin,0);
analogWrite(gruenPin,255);
analogWrite(blauPin,0);
EEPROM.write(0,0);
EEPROM.write(1,255);
EEPROM.write(2,0);
irrecv.resume();
}
if(results.value == blau){ // turns on blue color
analogWrite(rotPin,0);
analogWrite(gruenPin,0);
analogWrite(blauPin,255);
EEPROM.write(0,0);
EEPROM.write(1,0);
EEPROM.write(2,255);
irrecv.resume();
}
irrecv.resume();
}
if(Serial.available() > 0){
delay(500); // Serial Input Base-Code
if(Serial.peek() == 'r'){ //controls red color (not working properly)
Serial.read();
rVal = Serial.parseInt();
analogWrite(rotPin, rVal);
EEPROM.write(0, rVal);
}
if(Serial.peek() == 'g'){ //controls green color
Serial.read();
gVal = Serial.parseInt();
analogWrite(gruenPin, gVal);
EEPROM.write(1, gVal);
}
if(Serial.peek() == 'b'){ //controls blue color
Serial.read();
bVal = Serial.parseInt();
analogWrite(blauPin, bVal);
EEPROM.update(2, bVal);
}
if(Serial.peek() == 'f'){ //controls fading
Serial.read();
int fval = Serial.parseInt();
if(fval==1){
fadeOn = true;
}
if(fval==0){
fadeOn = false;
ersterLauf = true;
}
EEPROM.update(3,fval);
}
while(Serial.available() > 0){
Serial.read();
}
}fade();
}void fade(){ //fading function
// Blaue LED beim ersten Durchlauf einblenden
if (ersterLauf == true && millis()- fadeZeit > fadePause && fadeOn == true)
{
// Wenn b kleiner als 255 ist...
if (b < 255)
{
b++; // Zählt b um 1 hoch
analogWrite(blauPin, b); // Ausganbe von b am LED Pin
fadeZeit = millis(); // Aktuelle Zeit speichern
}
// Wenn b bei 255 angekommen UND die halteZeit vergangen ist...
if (b == 255 && (millis()- fadeZeit) > (fadePause + halteZeit))
{
ersterLauf = false; // Erster Lauf ist abgeschlossen
}
}
// Wenn ersterLauf abgeschlossen ist UND fadePause vergangen ist...
if (ersterLauf == false && millis()- fadeZeit > fadePause && fadeOn == true && fadeOn == true)
{
// Wechsel von Blau zu Lila
if (farbe == 'b')
{
// Wenn r kleiner als 255 ist...
if (r < 255)
{
r++; // Zählt r um 1 hoch
analogWrite(rotPin, r); // Ausganbe von r am LED Pin
fadeZeit = millis(); // Aktuelle Zeit speichern
}
// Wenn r bei 255 angekommen UND die halteZeit vergangen ist...
if (r == 255 && millis()- fadeZeit > fadePause + halteZeit)
{
farbe = 'l'; // Ändere Frabe auf "l" (Lila)
}
}
// Wechsel von Lila zu Rot
if (farbe == 'l')
{
// Wenn b größer als 0 ist...
if (b > 0)
{
b--; // Zählt b um 1 runter
analogWrite(blauPin, b); // Ausganbe von b am LED Pin
fadeZeit = millis(); // Aktuelle Zeit speichern
}
// Wenn b bei 0 angekommen UND die halteZeit vergangen ist...
if (b == 0 && millis()- fadeZeit > fadePause + halteZeit && fadeOn == true)
{
farbe = 'r'; // Ändere Frabe auf "r" (Rot)
}
}
// Wechsel von Rot zu Gelb
if (farbe == 'r')
{
// Wenn g kleiner als 255 ist...
if (g < 255)
{
g++; // Zählt g um 1 hoch
analogWrite(gruenPin, g); // Ausganbe von g am LED Pin
fadeZeit = millis(); // Aktuelle Zeit speichern
}
// Wenn g bei 255 angekommen UND die halteZeit vergangen ist...
if (g == 255 && millis()- fadeZeit > fadePause + halteZeit && fadeOn == true)
{
farbe = 'y'; // Ändere Frabe auf "y" (Gelb)
}
}
// Wechsel von Gelb zu Gruen
if (farbe == 'y')
{
// Wenn r größer als 0 ist...
if (r > 0)
{
r--; // Zählt r um 1 runter
analogWrite(rotPin, r); // Ausganbe von r am LED Pin
fadeZeit = millis(); // Aktuelle Zeit speichern
}
// Wenn r bei 0 angekommen UND die halteZeit vergangen ist...
if (r == 0 && millis()- fadeZeit > fadePause + halteZeit && fadeOn == true)
{
farbe = 'g'; // Ändere Frabe auf "g" (Grün)
}
}
// Wechsel von Gruen zu Petrol
if (farbe == 'g')
{
// Wenn b kleiner als 255 ist...
if (b < 255)
{
b++; // Zählt b um 1 hoch
analogWrite(blauPin, b); // Ausganbe von b am LED Pin
fadeZeit = millis(); // Aktuelle Zeit speichern
}
// Wenn b bei 255 angekommen UND die halteZeit vergangen ist...
if (b == 255 && millis()- fadeZeit > fadePause + halteZeit && fadeOn == true)
{
farbe = 'p'; // Ändere Frabe auf "p" (Petrol)
}
}
// Wechsel von Petrol zu Blau
if (farbe == 'p')
{
// Wenn g größer als 0 ist...
if (g > 0)
{
g--; // Zählt g um 1 runter
analogWrite(gruenPin, g); // Ausganbe von g am LED Pin
fadeZeit = millis(); // Aktuelle Zeit speichern
}
// Wenn g bei 0 angekommen UND die halteZeit vergangen ist...
if (g == 0 && millis()- fadeZeit > fadePause + halteZeit && fadeOn == true)
{
farbe = 'b'; // Ändere Frabe auf "b" (Blau)
}
}
}
}
Хорошо, проблема только что была решена. Похоже, что IRremote Libary использует таймер, связанный с ШИМ-таймером на выводе 11. Чтобы решить эту проблему, я просто подключил вывод красного цвета к другому выводу ШИМ на Nano (вывод 5), и теперь он работает как очарование.
в любом случае спасибо за вашу помощь 🙂
Других решений пока нет …