на строил под свои нужды скеч и обарудование но когда переделал его под управление с ик пульта, столкнулся с проблеммой. запросы остаются в results.value. после чего при попытке настройки часов он мне значения начинает листать с огромной скорастью вместо того чтоб добовлять по одному. если кто знает как исправить подскажите плиз вот мой скетч Код (C++): #include <IRremote.h> #include <iarduino_RTC.h> #include <FastLED.h> #include <OneWire.h> #include <DallasTemperature.h> #define ONE_WIRE_BUS 2 #define NUM_LEDS 86 //Your number of leds #define LED_TYPE WS2812B //Your chip in led-strip #define COLOR_ORDER GRB //Type of led-strip #define BRIGHTNESS 150 //Brigghtness for led-strip #define LED_PIN 9 //Logic pin for led-strip #define max_bright 255 #define min_bright 10 #define bright_constant 150 IRrecv irrecv(4); // указываем вывод, к которому подключен приемник decode_results results; CRGB leds[NUM_LEDS]; iarduino_RTC time(RTC_DS3231); //Your time-module(DS1302, DS1307, DS3231) OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); byte digits[12][21] = {{0,0,0, 1,1,1, 1,1,1, 1,1,1, 1,1,1, 1,1,1, 1,1,1}, // Digit 0 {0,0,0, 1,1,1, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 1,1,1}, // Digit 1 {1,1,1, 0,0,0, 1,1,1, 1,1,1, 0,0,0, 1,1,1, 1,1,1}, // Digit 2 {1,1,1, 0,0,0, 1,1,1, 1,1,1, 1,1,1, 1,1,1, 0,0,0}, // Digit 3 {1,1,1, 1,1,1, 0,0,0, 1,1,1, 1,1,1, 0,0,0, 0,0,0}, // Digit 4 {1,1,1, 1,1,1, 1,1,1, 0,0,0, 1,1,1, 1,1,1, 0,0,0}, // Digit 5 {1,1,1, 1,1,1, 1,1,1, 0,0,0, 1,1,1, 1,1,1, 1,1,1}, // Digit 6 {0,0,0, 0,0,0, 1,1,1, 1,1,1, 1,1,1, 0,0,0, 0,0,0}, // Digit 7 {1,1,1, 1,1,1, 1,1,1, 1,1,1, 1,1,1, 1,1,1, 1,1,1}, // Digit 8 {1,1,1, 1,1,1, 1,1,1, 0,0,0, 1,1,1, 1,1,1, 1,1,1}, // Digit 9 {1,1,1, 1,1,1, 1,1,1, 1,1,1, 0,0,0, 0,0,0, 0,0,0}, // Digit *0 {1,1,1, 1,1,1, 1,1,1, 0,0,0, 0,0,0, 0,0,0, 0,0,0}}; // Digit C bool TempShow=true; bool LedSettings= false; bool Dot = true; int last_digit = 86; long ledColor = CRGB::Red; long ColorTable[16] = { CRGB::Amethyst, CRGB::Aqua, CRGB::Red, CRGB::Chartreuse, CRGB::DarkGreen, CRGB::DarkMagenta, CRGB::DarkOrange, CRGB::DeepPink, CRGB::Fuchsia, CRGB::Gold, CRGB::GreenYellow, CRGB::LightCoral, CRGB::Tomato, CRGB::Salmon, CRGB::Red, CRGB::Orchid }; void setup() { Serial.begin(9600); // выставляем скорость COM порта irrecv.enableIRIn(); // запускаем прием sensors.begin(); delay(300); time.begin(); FastLED.addLeds<WS2812B, LED_PIN, RGB>(leds, NUM_LEDS); FastLED.setBrightness(BRIGHTNESS); // pinMode(13, OUTPUT); // pinMode(7, INPUT_PULLUP); //Turn Off/On running leds // pinMode(4, INPUT_PULLUP); //Change minutes // pinMode(5, INPUT_PULLUP); //Change hours } void BrightnessCheck() { const byte irbutton = 1; // light sensor pin const byte brightnessLow = 10; // Low brightness value const byte brightnessHigh = 255; // High brightness value const byte brightnessMidl = 100; // High brightness value if (results.value == 16756815) { LEDS.setBrightness(brightnessHigh); irrecv.resume(); // принимаем следующую команду } if (results.value == 16750695) { LEDS.setBrightness(brightnessMidl); irrecv.resume(); // принимаем следующую команду } if (results.value == 16738455){ LEDS.setBrightness(brightnessLow); irrecv.resume(); // принимаем следующую команду } } int Get_Time() { time.gettime(); byte hour = time.Hours; byte minute = time.minutes; byte second = time.seconds; if (second % 2 == 0) {Dot = true;} else {Dot = false;}; return (hour * 100 + minute); }; void TimeToArray() { int Now = Get_Time(); int cursor = 86; if (Dot) { leds[42] = ledColor; //LED flashing leds[43] = ledColor; }else { leds[42] = 0x000000; leds[43] = 0x000000; }; for (int i = 1; i <= 4; i++) { int digit = Now % 10; if (i == 1) { cursor = 0; for (int k = 0; k <= 20; k++) { if (digits[digit][k] == 1) { leds[cursor] = ledColor; } else if (digits[digit][k] == 0) { leds[cursor] = 0x000000; }; cursor ++; }; if (digit != last_digit) {if(LedSettings == 1){}; ledColor = ColorTable[random(16)]; } last_digit = digit; } else if (i == 2) { cursor = 21; for (int k = 0; k <= 20; k++) { if (digits[digit][k] == 1) { leds[cursor] = ledColor; } else if (digits[digit][k] == 0) { leds[cursor] = 0x000000; }; cursor ++; }; } else if (i == 3) { cursor = 44; for (int k = 0; k <= 20; k++) { if (digits[digit][k] == 1) { leds[cursor] = ledColor; } else if (digits[digit][k] == 0) { leds[cursor] = 0x000000; }; cursor ++; }; } else if (i == 4) { cursor = 65; for (int k = 0; k <= 20; k++) { if (digits[digit][k] == 1) { leds[cursor] = ledColor; } else if (digits[digit][k] == 0) { leds[cursor] = 0x000000; }; cursor ++; }; }; Now /= 10; }; }; void TimeChange(){ time.gettime(); int SysHour = time.Hours; int SysMin = time.minutes; // bool ChHourSys = !digitalRead(5); if (results.value == 16753245) { if(SysHour<23){ SysHour++; time.settime(-1,-1,SysHour,-1,-1,-1,-1); // 0 сек, 51 мин, 21 час, 27, октября, 2015 года, вторник irrecv.resume(); // принимаем следующую команду }else{ SysHour=0; time.settime(-1,-1,SysHour,-1,-1,-1,-1); // 0 сек, 51 мин, 21 час, 27, октября, 2015 года, вторник } } // bool ChMinSys = !digitalRead(4); if (results.value == 16769565) { if(SysMin<59){ SysMin++; time.settime(-1,SysMin,-1,-1,-1,-1,-1); // 0 сек, 51 мин, 21 час, 27, октября, 2015 года, вторник irrecv.resume(); // принимаем следующую команду }else{ SysMin=0; time.settime(-1,SysMin,-1,-1,-1,-1,-1); // 0 сек, 51 мин, 21 час, 27, октября, 2015 года, вторник }; }; } void TempToArray(){ if (time.seconds < 20 ) { //////////////////////////////////////////////////////////////////// TempShow = false; return; } else { if (time.seconds > 20 ) { TempShow = true; delay(3000); sensors.requestTemperatures(); float cel = sensors.getTempCByIndex(0); cel = cel*100+150; int celsius = trunc(cel); int cursor = 86; // last led number leds[42]=ledColor; leds[43]=0x000000; for(int i=1;i<=4;i++){ int digit = celsius % 10; // get last digit in time if (i==1){ cursor = 0; for(int k=0; k<=20;k++){ if (digits[10][k]== 1){leds[cursor]=ledColor;} else if (digits[10][k]==0){leds[cursor]=0x000000;}; cursor ++; }; } else if (i==2){ cursor =21; for(int k=0; k<=20;k++){ if (digits[digit][k]== 1){leds[cursor]=ledColor;} else if (digits[digit][k]==0){leds[cursor]=0x000000;}; cursor ++; }; } else if (i==3){ cursor =44; for(int k=0; k<=20;k++){ if (digits[digit][k]== 1){leds[cursor]=ledColor;} else if (digits[digit][k]==0){leds[cursor]=0x000000;}; cursor ++; }; } else if (i==4){ cursor =65; for(int k=0; k<=20;k++){ if (digits[digit][k]== 1){leds[cursor]=ledColor;} else if (digits[digit][k]==0){leds[cursor]=0x000000;}; cursor ++; }; } celsius /= 10; }; }; }; } void loop() { { if ( irrecv.decode( &results )) { // если данные пришли Serial.println( results.value ); // печатаем данные irrecv.resume(); // принимаем следующую команду } BrightnessCheck(); // Check brightness TimeChange(); TimeToArray(); // Get leds array with required configuration TempToArray(); FastLED.show(); // Display leds array }}
Работаете с приёмом ИК не правильно. Вот вы приняли сигнал - if ( irrecv.decode( &results )) и внутри этого блока и разбираете, какую именно кнопку нажали. Не надо в каждую функцию пихать results.value == {} irrecv.resume(); И получается, что вы нажали кнопку, пусть даже случайно, и у вас поменялся час/минута. Как-то не дружелюбно получается.
аа понял что вы ввиду имеите. я это уже исправил. просто думал что он мне этой коммандой обнулит значение в results.value. насчет флагов я тоже в курсе но с ними возни много мне кажется. мне бы results.value обнулить но как это сделать не могу найти пока
а насчет флагов я просто пока не вьеду как этим можно флагами управлять. когда мне параметр обнулить требуется, я конечно не программист но скрипт прочитать сумею и переделать под свои нужды но в данном случае чтото я не пойму что с results.value сделать
нет, похоже не поняли. прочитайте еще раз первую фразу ответа Kindman Он вам советует обрабатывать команды с пульта сразу, как получили, а не тащить их по всем коду. У вас главная проблема в том. что вы взяли чужой код. где не было IR - и прилепили его как бы "сбоку", как изолентой примотали. Получилась ерунда. Вместо того чтоб добавлять команды с пульта в кучу процедур - напишите одну специальную процедуру для работы с IR-пультом, где разом обрабатывайте все команды - и на смену цвета. и на яркость. и на настройку часов. Тогда вам и флаги не понадобятся. и results.value не нужно будет обнулять вовсе
Вам кажется. Старайтесь делать всё правильно сразу, иначе потом переписывать всё заново придется. Тут всё просто - Нажали кнопку "яркость большая" Взвели флаг БОЛЬШАЯ ЯРКОСТЬ, и в программе проверяете, есть флаг - выполнили нужную функцию, сбросили флаг. И так со всем остальным.
ну пищу для размышления вы мне подкинули буду пробывать чтото с этим сделать. спасибо.как что получится отпишу
я снова тут. вот вобщем доработал все вроди работает но проблемма одна осталась. пульт надо направлять ровненько на приемник иначе принимает какуюто билибирду тоесть савсем левые значения. есть способ с этим бароться? вот последняя версия Код (C++): #include <IRremote.h> #include <iarduino_RTC.h> #include <FastLED.h> #include <OneWire.h> #include <DallasTemperature.h> #define ONE_WIRE_BUS 2 #define NUM_LEDS 86 //Your number of leds #define LED_TYPE WS2812B //Your chip in led-strip #define COLOR_ORDER GRB //Type of led-strip #define BRIGHTNESS 150 //Brigghtness for led-strip #define LED_PIN 9 //Logic pin for led-strip #define max_bright 255 #define min_bright 10 #define bright_constant 150 IRrecv irrecv(4); decode_results results; CRGB leds[NUM_LEDS]; iarduino_RTC time(RTC_DS3231); OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); byte digits[12][21] = {{0,0,0, 1,1,1, 1,1,1, 1,1,1, 1,1,1, 1,1,1, 1,1,1}, // Digit 0 {0,0,0, 1,1,1, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 1,1,1}, // Digit 1 {1,1,1, 0,0,0, 1,1,1, 1,1,1, 0,0,0, 1,1,1, 1,1,1}, // Digit 2 {1,1,1, 0,0,0, 1,1,1, 1,1,1, 1,1,1, 1,1,1, 0,0,0}, // Digit 3 {1,1,1, 1,1,1, 0,0,0, 1,1,1, 1,1,1, 0,0,0, 0,0,0}, // Digit 4 {1,1,1, 1,1,1, 1,1,1, 0,0,0, 1,1,1, 1,1,1, 0,0,0}, // Digit 5 {1,1,1, 1,1,1, 1,1,1, 0,0,0, 1,1,1, 1,1,1, 1,1,1}, // Digit 6 {0,0,0, 0,0,0, 1,1,1, 1,1,1, 1,1,1, 0,0,0, 0,0,0}, // Digit 7 {1,1,1, 1,1,1, 1,1,1, 1,1,1, 1,1,1, 1,1,1, 1,1,1}, // Digit 8 {1,1,1, 1,1,1, 1,1,1, 0,0,0, 1,1,1, 1,1,1, 1,1,1}, // Digit 9 {1,1,1, 1,1,1, 1,1,1, 1,1,1, 0,0,0, 0,0,0, 0,0,0}, // Digit *0 {1,1,1, 1,1,1, 1,1,1, 0,0,0, 0,0,0, 0,0,0, 0,0,0}}; // Digit C byte digits2[12][21] = {{0,0,0, 1,1,1, 1,1,1, 1,1,1, 1,1,1, 1,1,1, 1,1,1}, // Digit 0 {0,0,0, 0,0,0, 0,0,0, 1,1,1, 1,1,1, 0,0,0, 0,0,0}, // Digit 1 {1,1,1, 0,0,0, 1,1,1, 1,1,1, 0,0,0, 1,1,1, 1,1,1}, // Digit 2 {1,1,1, 0,0,0, 1,1,1, 1,1,1, 1,1,1, 1,1,1, 0,0,0}, // Digit 3 {1,1,1, 1,1,1, 0,0,0, 1,1,1, 1,1,1, 0,0,0, 0,0,0}, // Digit 4 {1,1,1, 1,1,1, 1,1,1, 0,0,0, 1,1,1, 1,1,1, 0,0,0}, // Digit 5 {1,1,1, 1,1,1, 1,1,1, 0,0,0, 1,1,1, 1,1,1, 1,1,1}, // Digit 6 {0,0,0, 0,0,0, 1,1,1, 1,1,1, 1,1,1, 0,0,0, 0,0,0}, // Digit 7 {1,1,1, 1,1,1, 1,1,1, 1,1,1, 1,1,1, 1,1,1, 1,1,1}, // Digit 8 {1,1,1, 1,1,1, 1,1,1, 0,0,0, 1,1,1, 1,1,1, 1,1,1}, // Digit 9 {1,1,1, 1,1,1, 1,1,1, 1,1,1, 0,0,0, 0,0,0, 0,0,0}, // Digit *0 {1,1,1, 1,1,1, 1,1,1, 0,0,0, 0,0,0, 0,0,0, 0,0,0}}; // Digit C bool TempShow=true; bool LedSettings= true; bool Dot = true; int last_digit = 86; long ledColor = CRGB::Red; int celcall = 150; long ColorTable[16] = { CRGB::Amethyst, CRGB::Aqua, CRGB::Red, CRGB::Chartreuse, CRGB::DarkGreen, CRGB::DarkMagenta, CRGB::DarkOrange, CRGB::DeepPink, CRGB::Fuchsia, CRGB::Gold, CRGB::GreenYellow, CRGB::LightCoral, CRGB::Tomato, CRGB::Salmon, CRGB::Red, CRGB::Orchid }; void setup() { Serial.begin(9600); irrecv.enableIRIn(); sensors.begin(); time.begin(); FastLED.addLeds<WS2812B, LED_PIN, RGB>(leds, NUM_LEDS); FastLED.setBrightness(BRIGHTNESS); } void IrControl() { time.gettime(); int SysHour = time.Hours; int SysMin = time.minutes; const byte brightnessLow = 10; // Low brightness value const byte brightnessHigh = 255; // High brightness value const byte brightnessMidl = 100; // midl brightness value if ( irrecv.decode( &results )) { // если данные пришли Serial.println(results.value,HEX); switch ( results.value ) { case 0x807F48B7: LEDS.setBrightness(brightnessHigh); // High brightness value break; case 0x807F708F: LEDS.setBrightness(brightnessMidl); // midl brightness value break; case 0x807F50AF: LEDS.setBrightness(brightnessLow); // Low brightness value break; case 0x807F00FF: //hour + if(SysHour<23){ SysHour++; time.settime(-1,-1,SysHour,-1,-1,-1,-1); irrecv.resume(); }else{ SysHour=0; time.settime(-1,-1,SysHour,-1,-1,-1,-1); } break; case 0x807F20DF: //hour - if(SysHour<23){ SysHour--; time.settime(-1,-1,SysHour,-1,-1,-1,-1); irrecv.resume(); }else{ SysHour=0; time.settime(-1,-1,SysHour,-1,-1,-1,-1); } break; case 0x807F40BF: //min + if(SysMin<59){ SysMin++; time.settime(-1,SysMin,-1,-1,-1,-1,-1); irrecv.resume(); }else{ SysMin=0; time.settime(-1,SysMin,-1,-1,-1,-1,-1); }; break; case 0x807F609F: //min - if(SysMin<59){ SysMin--; time.settime(-1,SysMin,-1,-1,-1,-1,-1); irrecv.resume(); }else{ SysMin=0; time.settime(-1,SysMin,-1,-1,-1,-1,-1); }; break; case 0x807F08F7: //temp - celcall = celcall-10; break; case 0x807F30CF: //temp + celcall = celcall+10; break; case 0x807F10EF: //temp + ledColor = ColorTable[random(16)]; break; } irrecv.resume(); } } int Get_Time() { time.gettime(); byte hour = time.Hours; byte minute = time.minutes; byte second = time.seconds; if (second % 2 == 0) {Dot = true;} else {Dot = false;}; return (hour * 100 + minute); }; void TimeToArray() { int Now = Get_Time(); int cursor = 86; if (Dot) { leds[42] = ledColor; //LED flashing leds[43] = ledColor; }else { leds[42] = 0x000000; leds[43] = 0x000000; }; for (int i = 1; i <= 4; i++) { int digit = Now % 10; if (i == 1) { cursor = 0; for (int k = 0; k <= 20; k++) { if (digits2[digit][k] == 1) { leds[cursor] = ledColor; } else if (digits2[digit][k] == 0) { leds[cursor] = 0x000000; }; cursor ++; }; } else if (i == 2) { cursor = 21; for (int k = 0; k <= 20; k++) { if (digits[digit][k] == 1) { leds[cursor] = ledColor; } else if (digits[digit][k] == 0) { leds[cursor] = 0x000000; }; cursor ++; }; } else if (i == 3) { cursor = 44; for (int k = 0; k <= 20; k++) { if (digits2[digit][k] == 1) { leds[cursor] = ledColor; } else if (digits2[digit][k] == 0) { leds[cursor] = 0x000000; }; cursor ++; }; } else if (i == 4) { cursor = 65; for (int k = 0; k <= 20; k++) { if (digits[digit][k] == 1) { leds[cursor] = ledColor; } else if (digits[digit][k] == 0) { leds[cursor] = 0x000000; }; cursor ++; }; }; Now /= 10; }; }; void TempToArray(){ if (time.seconds < 20 ) { //////////////////////////////////////////////////////////////////// TempShow = false; return; } else { if (time.seconds > 20 ) { TempShow = true; sensors.requestTemperatures(); float cel = sensors.getTempCByIndex(0); cel = cel*100+celcall; int celsius = trunc(cel); int cursor = 86; // last led number leds[42]=ledColor; leds[43]=0x000000; for(int i=1;i<=4;i++){ int digit = celsius % 10; // get last digit in time if (i==1){ cursor = 0; for(int k=0; k<=20;k++){ if (digits2[10][k]== 1){leds[cursor]=ledColor;} else if (digits2[10][k]==0){leds[cursor]=0x000000;}; cursor ++; }; } else if (i==2){ cursor =21; for(int k=0; k<=20;k++){ if (digits[digit][k]== 1){leds[cursor]=ledColor;} else if (digits[digit][k]==0){leds[cursor]=0x000000;}; cursor ++; }; } else if (i==3){ cursor =44; for(int k=0; k<=20;k++){ if (digits2[digit][k]== 1){leds[cursor]=ledColor;} else if (digits2[digit][k]==0){leds[cursor]=0x000000;}; cursor ++; }; } else if (i==4){ cursor =65; for(int k=0; k<=20;k++){ if (digits[digit][k]== 1){leds[cursor]=ledColor;} else if (digits[digit][k]==0){leds[cursor]=0x000000;}; cursor ++; }; } celsius /= 10; }; }; }; } void loop() { IrControl(); // TimeToArray(); // Get leds array with required configuration TempToArray(); FastLED.show(); // Display leds array }
дело, думаю. не в направлении, а в том что пока происходит вывод на ленту. сигнал на IR приниматся не будет или принимается с ошибками. А вывод на ленту у вас шарашит так часто. как только может ардуина. То есть реально приемнику IR не всегда удается вклинится между посылками данных на диоды Думаю. вам надо вызывать FastLED.show(); только тогда. когда картинка на экране обновилась.
ну хорошо вот смотрите Код (C++): 14:31:08.724 -> 252D06EB 14:31:08.826 -> FFFFFFFF 14:31:08.927 -> FFFFFFFF 14:31:09.063 -> D0C9E18 14:31:09.164 -> FFFFFFFF 14:31:09.297 -> F162FE05 14:31:09.500 -> 807E21B 14:31:09.769 -> DF255B8A 14:31:10.243 -> 81FD 14:31:10.445 -> F09E1B5F 14:31:10.613 -> F5C6AB20 14:31:10.814 -> B7740418 14:31:10.984 -> 944B2FAE 14:31:11.187 -> A1D734AE 14:31:11.354 -> F000CD6C 14:31:11.557 -> 5F0B6031 14:31:11.758 -> 5B758CB0 14:31:11.961 -> DF1B54D4 14:31:12.130 -> 81FC 14:31:12.332 -> 59D82508 14:31:12.501 -> B0F9ECFA это значения нажатия одной и тойже книпки на пульте. причем действительное значение вот это 807E21B может я приемник ни на тот пин посадил или почему он так глючить может?
Загрузите библиотечный тестовый пример от irremote и посмотрите как будет работать там. У меня один пульт Самсунг от старого телевизора себя ведёт так. Все остальные даже с отражением нормально работают.
В любом случае дергать диоды десятки раз в секунду совершенно бестолку. Это надо переписывать. В описании библиотеки IRremote.h сразу указано. что она не будет правильно работать одновременно с адресными диодами: IR does not work right when I use Neopixels (aka WS2811/WS2812/WS2812B)