Добрый вечер! Подскажите пожалуйста как запустить режимы в этом коде. Сам вопрос в коментариях с 97 строки Код (Text): #include "Tlc5940.h" #include "tlc_shifts.h" #include <IRremote.h> int recvLED = 13; int recvPin = 11; //вход ИК приемника #define ANALOG_PIN 0 #define SCOPE_PERIOD (2000 * NUM_TLCS) #define LED_PERIOD SCOPE_PERIOD / (NUM_TLCS * 16) IRrecv irReciver(recvPin); decode_results results; byte pinsled[] = { 2, 5, 6 };// пины светодиодов byte digits[][3] = { { 1, 0, 0 } , // digit 0 { 0, 1, 0 } , // digit 1 { 0, 0, 1 } , // digit 2 }; // переключение светодиодов const unsigned long decodeHASH[] = { 0xC101E57B, // Digit 0 0x9716BE3F, // digit 1 0x3D9AE3F7, // digit 2 }; // запись кодов с пульта unsigned long lastTime = 0; void setup() { pinMode(recvLED, OUTPUT); //Все пины на выход digitalWrite(recvLED, LOW); //выключаем при старте Serial.begin(9600); irReciver.enableIRIn(); // Start the receiver for (int i=0; i<3; i++) { pinMode(pinsled[i], OUTPUT); //установка пинов на выход } Tlc.init(); } void loop() { unsigned long recv_value; if (irReciver.decode(&results)) { recv_value = results.value; if ( recv_value != 0xFFFFFFFF ) //Игнорировать значения 0x00 Recived в результате нажатия и удерживания кнопки на пульте дистанционного управления для долго { // Blink the LED each time a button is pressed digitalWrite(recvLED, HIGH); delay(10); digitalWrite(recvLED, LOW); // Выход декодированная хэш-значение для й серийный монитор. Это только для отладки. Serial.println(recv_value, HEX); // Просмотр декодированными значений хеш найти соответствие for (int i=0; i<3; i++) { if ( recv_value == decodeHASH[i] ) // Если полученное значение совпадает с одним из значений в хеш { lastTime = millis(); //Запуск таймер задержки for (int j=0; j<=3; j++) // Установить соответствующие сегменты высокой или низкой, как это определено в цифры [] [] двойной массив digitalWrite(pinsled[j], digits[i][j]); break; // Выход из внутреннего цикла, как мы теперь переключать все необходимые сегменты для отображения соответствующего значения } } } irReciver.resume(); // Читать следующее значение } //Чтобы сохранить выключатель питания всех диодов, если 5 секунд прошло с момента if ( millis() - lastTime >= 5000 ) { for (int k=0; k<=3; k++) digitalWrite(pinsled[k], LOW); lastTime = 0; //Сброс таймер задержки энергосбережение до нуля '0' } if (pinsled[2] == HIGH) { // regim1(); // Как здесь записать чтоб гонялся по кругу void regim1() ???? //и правильно ли я записал условие? } if (pinsled[5] == HIGH) { // void regim2(); } if (pinsled[6] == HIGH) { // void regim0(); } void regim1(); { uint16_t sum = tlc_shiftUp() + analogRead(ANALOG_PIN) * 4; sum = 0; Tlc.set(0, sum); Tlc.update(); delay(LED_PERIOD); } void regim2(); { int direction = 1; for (int channel = 0; channel < NUM_TLCS * 16; channel += direction) { Tlc.clear(); if (channel == 0) { direction = 1; } else { Tlc.set(channel - 1, 1000); } Tlc.set(channel, 4095); if (channel != NUM_TLCS * 16 - 1) { Tlc.set(channel + 1, 1000); } else { direction = -1; } Tlc.update(); delay(75); } } void regim0(); }
Немного продвинулся в коде Оказывается есть странность в библиотеках не могу понять как только в void setup() убираю инициализацию Tlc.init(); Начинают работать светодиоды от пульта стоит подключить тлс пульт не читается. Кто знает в чем проблема? Код (Text): #include "Tlc5940.h" #include "tlc_shifts.h" #include <IRremote.h> #define msg7RESET 8 #define msg7Strobe 12 #define msg7DCout 0 int spectrumRead[8]; int spectrum[7]={ 0,0,0,0,0,0,0}; int delaylValue = 0; int outputValue = 0; int chanelValue = 0; int recvLED = 14; int recvPin = 15; //вход ИК приемника int bridge; // переменая для sum int pinLED = 3; //#define CLEAR_PIN 12 #define ANALOG_PIN 5 #define SCOPE_PERIOD (2000 * NUM_TLCS) #define LED_PERIOD SCOPE_PERIOD / (NUM_TLCS * 16) IRrecv irReciver(recvPin); decode_results results; // пины светодиодов byte pinsled[] = { 2, 5, 6 }; // переключение светодиодов byte digits[][3] = { { 0, 1, 1 } , // режим 0 { 1, 0, 1 } , // режим 1 { 1, 1, 0 } , // режим 2 }; const unsigned long decodeHASH[] = { 0x8C03F, // режим 0 0x820DF, // режим 1 0x8A05F, // режим 2 }; // запись кодов с пульта void setup() { pinMode(msg7RESET, OUTPUT); pinMode(msg7Strobe, OUTPUT); pinMode(recvLED, OUTPUT); //Все пины на выход digitalWrite(recvLED, LOW); //выключаем при старте Serial.begin(9600); irReciver.enableIRIn(); // Start the receiver for (int i=0; i<3; i++) { pinMode(pinsled[i], OUTPUT); //установка пинов на выход digitalWrite(pinsled[i],HIGH);//выключаем при старте } Tlc.init(); } void loop() { unsigned long recv_value; if (irReciver.decode(&results)) { Serial.println(results.value, HEX); recv_value = results.value; if (recv_value != 0xFFFFFFFF ) //Игнорировать значения 0x00 Recived в результате нажатия и удерживания кнопки на пульте дистанционного управления для долго { // Blink the LED each time a button is pressed digitalWrite(recvLED, HIGH); delay(10); digitalWrite(recvLED, LOW); // Выход декодированная хэш-значение для й серийный монитор. Это только для отладки. Serial.println(recv_value, HEX); // Просмотр декодированными значений хеш найти соответствие for (int i=0; i<3; i++) { if ( recv_value == decodeHASH[i] ) // Если полученное значение совпадает с одним из значений в хеш { for (int j=0; j<=3; j++) // Установить соответствующие сегменты высокой или низкой, как это определено в цифры [] [] двойной массив digitalWrite(pinsled[j], digits[i][j]); break; // Выход из внутреннего цикла, как мы теперь переключать все необходимые сегменты для отображения соответствующего значения } } } irReciver.resume(); // Читать следующее значение }
Доподлинно известно, что библиотека IRremote.h задействует таймер, который, который обеспечивает ШИМ на 3 и 11 ногах Ардуино. Если его же задействует Tlc5940.h - возникают проблемы. Видимо это ваш случай.
Разобраться, во-первых, верно ли мое предположение, путем исследования обоих библиотек. Посмотреть, можно-ли что-то изменить в библиотеках, задействовав другой таймер. Возможно, заменить плату на Мегу, потому что там таймеров больше. Это общее направление размышлений.