Заливаю скетч #include "CyberLib.h" #include "TM1637.h" #define CLK 11 // пин 11 #define DIO 12 // пин 12 TM1637 tm1637(CLK,DIO); #define ON 1 #define OFF 0 #include <IRstD.h> IRrecvstd irrecvstd(4); decode_resultsstd res_std; #define MAXMILLIS 4294967295 unsigned long timme; unsigned long timelapsed = 0; int chas = 0; int minuta = 0; int secunda = 0; ///////////// B1 //////////////////// uint8_t B1_flag = ReadEEPROM_Byte(1); uint8_t B1chas_vkl = ReadEEPROM_Byte(2); uint8_t B1minut_vkl = ReadEEPROM_Byte(3); uint8_t val_shim = ReadEEPROM_Byte(4); uint8_t flag_disp = 0; uint8_t flag_zel_led = 0; int buzzerPin = 5; int8_t TimeDisp[] = {0x00,0x00,0x00,0x00}; int8_t BudDisp[] = {0x00,0x00,0x00,0x00}; unsigned char ClockPoint = 1; void setup() { tm1637.set(val_shim); tm1637.init(); pinMode(buzzerPin, OUTPUT); D7_Out; D7_Low; D10_Out; if(B1_flag) D10_High; else D10_Low; Serial.begin(57600); irrecvstd.enableIRInstd(); } void loop() { if(irrecvstd.decodestd(&res_std)) { if(res_std.valuestd == 1886442794) // Прибавление часов { analogWrite(buzzerPin, 255); chas++; if(chas > 23) chas = 0; disp(); analogWrite(buzzerPin, 0); } if(res_std.valuestd == 1886430554) // Убавление часов { analogWrite(buzzerPin, 255); chas--; if(chas < 1) chas = 0; disp(); analogWrite(buzzerPin, 0); } if(res_std.valuestd == 1886397914) // Прибавление минут { analogWrite(buzzerPin, 255); minuta++; if(minuta > 59) minuta = 0; disp(); analogWrite(buzzerPin, 0); } if(res_std.valuestd == 1886446874) // Убавление минут { analogWrite(buzzerPin, 255); minuta--; if(minuta < 1 || minuta > 60) minuta = 0; disp(); analogWrite(buzzerPin, 0); } if(flag_disp && res_std.valuestd == 551521650) // Прибавление часов будильника { analogWrite(buzzerPin, 255); B1chas_vkl++; if(B1chas_vkl > 23) B1chas_vkl = 0; WriteEEPROM_Byte(2, B1chas_vkl); disp(); analogWrite(buzzerPin, 0); } if(flag_disp && res_std.valuestd == 551547150) // Убавление часов будильника { analogWrite(buzzerPin, 255); B1chas_vkl--; if(B1chas_vkl < 1 || B1chas_vkl > 24) B1chas_vkl = 0; WriteEEPROM_Byte(2, B1chas_vkl); disp(); analogWrite(buzzerPin, 0); } if(flag_disp && res_std.valuestd == 551489010) // Прибавление минут будильника { analogWrite(buzzerPin, 255); B1minut_vkl++; if(B1minut_vkl > 59) B1minut_vkl = 0; WriteEEPROM_Byte(3, B1minut_vkl); disp(); analogWrite(buzzerPin, 0); } if(flag_disp && res_std.valuestd == 551514510) // Убавление минут будильника { analogWrite(buzzerPin, 255); B1minut_vkl--; if(B1minut_vkl < 1 || B1minut_vkl > 60) B1minut_vkl = 0; WriteEEPROM_Byte(3, B1minut_vkl); disp(); analogWrite(buzzerPin, 0); } if(res_std.valuestd == 551505585) // Вкл/Откл будильник { analogWrite(buzzerPin, 255); B1chas_vkl = ReadEEPROM_Byte(2); B1minut_vkl = ReadEEPROM_Byte(3); if(B1_flag) { B1_flag = 0; D10_Low; } else { B1_flag = 1; D10_High; } disp(); WriteEEPROM_Byte(1, B1_flag); analogWrite(buzzerPin, 0); } if(res_std.valuestd == 551521905) // Вывод будильника на дисплей { analogWrite(buzzerPin, 255); flag_zel_led = 0; if(flag_disp) { flag_disp = 0; D7_Low; } else { flag_disp = 1; D7_High; } disp(); analogWrite(buzzerPin, 0); } if(res_std.valuestd == 551525475) // Подсветка + { analogWrite(buzzerPin, 255); val_shim++; if(val_shim > 7) val_shim = 7; WriteEEPROM_Byte(4, val_shim); tm1637.set(val_shim); disp(); delay_ms(10); analogWrite(buzzerPin, 0); } if(res_std.valuestd == 551519355) // Подсветка - { analogWrite(buzzerPin, 255); val_shim--; if(val_shim < 1 || val_shim > 254) val_shim = 0; WriteEEPROM_Byte(4, val_shim); tm1637.set(val_shim); disp(); delay_ms(10); analogWrite(buzzerPin, 0); } if(res_std.valuestd == 551519865) // +10 минутотсрочка { analogWrite(buzzerPin, 255); B1minut_vkl = B1minut_vkl + 10; if(B1minut_vkl > 59) { B1minut_vkl = 10; B1chas_vkl++; if(B1chas_vkl>23) B1chas_vkl=0; } delay_ms(5); analogWrite(buzzerPin, 0); flag_disp = 1; D7_High; disp(); delay_ms(300); flag_disp = 0; D7_Low; } Serial.println(res_std.valuestd); // Удалитьпослепрограммированияпульта irrecvstd.resumestd(); res_std.valuestd = 0; } unsigned long currtime = millis(); if(currtime > timme) timelapsed = (currtime - timme); else timelapsed = (MAXMILLIS - timme + currtime); if(timelapsed > 999) { timme = currtime; if(flag_disp) { flag_zel_led++; if(flag_zel_led > 59) { flag_zel_led = 0; flag_disp = 0; D7_Low; analogWrite(buzzerPin, 255); delay_ms(5); analogWrite(buzzerPin, 0); } } secunda++; if(secunda > 59) { secunda=0; minuta++; if(minuta > 59) { minuta=0; chas++; if(chas>23) chas=0; } } disp(); } if(B1_flag) { if(chas == B1chas_vkl && minuta == B1minut_vkl) { buzz(); } if(chas == B1chas_vkl && minuta == B1minut_vkl && secunda == 59) { B1minut_vkl = B1minut_vkl + 10; if(B1minut_vkl > 59) { B1minut_vkl = 10; B1chas_vkl++; if(B1chas_vkl>23) B1chas_vkl=0; } } } } //END LOOP void buzz() { if(B1_flag) { analogWrite(buzzerPin, 30); delay_ms(100); analogWrite(buzzerPin, 50); delay_ms(100); } analogWrite(buzzerPin, 0); delay_ms(100); } void disp() { if(!flag_disp) { ClockPoint = (~ClockPoint) & 0x01; if(ClockPoint)tm1637.point(POINT_ON); else tm1637.point(POINT_OFF); TimeDisp[0] = chas / 10; TimeDisp[1] = chas % 10; TimeDisp[2] = minuta / 10; TimeDisp[3] = minuta % 10; tm1637.display(TimeDisp); } else { tm1637.point(POINT_ON); BudDisp[0] = B1chas_vkl / 10; BudDisp[1] = B1chas_vkl % 10; BudDisp[2] = B1minut_vkl / 10; BudDisp[3] = B1minut_vkl % 10; tm1637.display(BudDisp); } } выдает ошибку Arduino: 1.6.12 (Windows 7), Плата:"Arduino/Genuino Mega or Mega 2560, ATmega2560 (Mega 2560)" bud1:22: error: 'ReadEEPROM_Byte' was not declared in this scope 'ReadEEPROM_Byte' was not declared in this scope останавливается на строчке B1chas_vkl = ReadEEPROM_Byte(2); Хотя в самом начале она определена.
@Игорь2016, у вас не установлена библиотека CyberLib http://www.cyber-place.ru/showthread.php?p=3789#post3789
Библиотеку установил. Спасибо. Тут же следующая поползла ошибка \ 'disp' was not declared in this scope \ и теперь уже встает на строке \ disp(); \ Здесь вроде тоже все определено.
Установите библиотеки IRstD - http://istarik.ru/file/IRstD.zip и TM1637 - во вложении. У меня скетч собрался без ошибок (IDE 1.6.11)
А во вложении это / arduino-1.6.12/libraries/ / IRstD установил через / добавить zip библиотеку / остальные (TM1637, CyberLib, ) пишет библиотека уже существует.
Заработало спасибо. Установил дополнительно eeprom библиотеку. Буду пробовать считывать коды пульта. Пока выходит всякая дребедень / !фйщ#Л#— / .
Часы устанавливаются и идут. При установке часов и будильника щелкает подтверждение нажатия. Стоит часам дойти до срабатывания будильника, часы замирают на какое то время, в динамике тишина, кнопки с пульта отказываются принимать команды.Часы восстанавливаются, кнопки нет.Динамик молчит. На последней секунде в программе получается нет перехода на подачу сигнала будильника и перехода для приема ик импульсов. Может кто поможет?
Если хотели гонять числа по-кругу, то фигня какая-то получилась: Код (C++): minuta--; if(minuta < 1 || minuta > 60) minuta = 0; Может так: Код (C++): minuta--; if(minuta < 0) minuta = 59;
Немножко некогда было. Попробовал изменить код,но эффект тот же самый. Т.е. ставлю будильник на 11:52. До этого точки мигают. Наступает 11:52, точки перестают мигать,сигнала никакого не подается.Наступает 11:53,точки начинают моргать,но управление с пульта уже не работает (ни одна кнопка).Сам сигнал похоже в скетче не прописан, вот только в какое место его вставить, А с управлением что то не пойму,почему так.
Для чего Вы используете "delay_ms()" вместо "delay()"? Вообще бузер у Вас пищит хотя бы на какие-то действия? Вот этот код: "if(timelapsed > 999)" что делает, отсчитывает секунды? Переменная "unsigned long timme;" никак не инициализирована перед первым использованием "if(currtime > timme)" - проинициализируйте нулем. Как раз "timelapsed" инициализировать не обязательно, т. к. значение ей будет присвоено обязательно. Не очень понятны такие навороты: Код (C++): unsigned long currtime = millis(); if(currtime > timme) timelapsed = (currtime - timme); else timelapsed = (MAXMILLIS - timme + currtime); if(timelapsed > 999) { timme = currtime; . . . } Так разве не работает: Код (C++): unsigned long currtime = millis(); if(currtime - timme > 999) { timme = currtime; . . . } Не проще для мигание точкой такой код: Код (C++): bool ClockPoint = true; . . . void disp() { if(!flag_disp) { ClockPoint = !ClockPoint; if(ClockPoint) tm1637.point(POINT_ON); else tm1637.point(POINT_OFF); . . . } В функции "buzz()" проверять флаг "B1_flag" не нужно, т. к. сама эта функция будет вызвана только когда этот флаг установлен. Для начала разберитесь с пищалкой.
Ребята. Объясните пожалуйста. Почему, когда делаешь компиляцию,иногда нормально проходит,иногда вылазит ошибка и встает на "disp();". Переустанавливаю все библиотеки, в том числе и CyberLib - помогает, но ни всегда. Вылазит хаотично, даже если в коде ничего не меняешь.
Х. з. почему. Попробуйте другую версию Arduino IDE, в т. ч. сборку от arduino.org. Лучше качать не инсталятор, а в архиве, что бы старый IDE то же остался.
Если размер кода критичен, то _delay_ms() позволяет неплохо его уменьшить. Особенно актуально на МК с малым размером памяти типа Аттини13, там обычный delay() сразу отъест треть памяти. Кроме того, _delay_ms() позволяет использовать число дробное и меньше нуля, например 1.25 или 0.75, что иногда полезно для точного выставления задержки и чего обычным delay() не получить.