часы с будильником и ик пультом

Тема в разделе "Arduino & Shields", создана пользователем Игорь2016, 3 ноя 2016.

  1. Игорь2016

    Игорь2016 Нерд

    Заливаю скетч
    #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);
    Хотя в самом начале она определена.
     
    Максим B нравится это.
  2. ZAZ-965

    ZAZ-965 Гуру

  3. Игорь2016

    Игорь2016 Нерд

    Библиотеку установил. Спасибо. Тут же следующая поползла ошибка \ 'disp' was not declared in this scope \
    и теперь уже встает на строке \ disp(); \ Здесь вроде тоже все определено.
     
  4. ZAZ-965

    ZAZ-965 Гуру

    Установите библиотеки IRstD - http://istarik.ru/file/IRstD.zip и TM1637 - во вложении. У меня скетч собрался без ошибок (IDE 1.6.11)
     

    Вложения:

    • TM1637.zip
      Размер файла:
      7,8 КБ
      Просмотров:
      242
  5. Игорь2016

    Игорь2016 Нерд

    А во вложении это / arduino-1.6.12/libraries/ / IRstD установил через / добавить zip библиотеку / остальные (TM1637, CyberLib, ) пишет библиотека уже существует.
     
  6. Игорь2016

    Игорь2016 Нерд

    Заработало спасибо. Установил дополнительно eeprom библиотеку. Буду пробовать считывать коды пульта. Пока выходит всякая дребедень / !фйщ#Л#— / .
     
  7. Игорь2016

    Игорь2016 Нерд

     
  8. Игорь2016

    Игорь2016 Нерд

    Часы устанавливаются и идут. При установке часов и будильника щелкает подтверждение нажатия. Стоит часам дойти до срабатывания будильника, часы замирают на какое то время, в динамике тишина, кнопки с пульта отказываются принимать команды.Часы восстанавливаются, кнопки нет.Динамик молчит. На последней секунде в программе получается нет перехода на подачу сигнала будильника и перехода для приема ик импульсов.
    Может кто поможет?
     
  9. fogary

    fogary Гик

    Если хотели гонять числа по-кругу, то фигня какая-то получилась:
    Код (C++):
    minuta--;
    if(minuta < 1 || minuta > 60) minuta = 0;
    Может так:
    Код (C++):
    minuta--;
    if(minuta < 0) minuta = 59;
     
  10. Игорь2016

    Игорь2016 Нерд

    Немножко некогда было. Попробовал изменить код,но эффект тот же самый. Т.е. ставлю будильник на 11:52.
    До этого точки мигают. Наступает 11:52, точки перестают мигать,сигнала никакого не подается.Наступает 11:53,точки начинают моргать,но управление с пульта уже не работает (ни одна кнопка).Сам сигнал похоже в скетче не прописан, вот только в какое место его вставить, А с управлением что то не пойму,почему так.
     
  11. fogary

    fogary Гик

    Я Вам про установку времени писал, а не про точку и будильник. :confused:
     
  12. fogary

    fogary Гик

    Для чего Вы используете "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" не нужно, т. к. сама эта функция будет вызвана только когда этот флаг установлен.

    Для начала разберитесь с пищалкой.
     
  13. Игорь2016

    Игорь2016 Нерд

    Ребята. Объясните пожалуйста. Почему, когда делаешь компиляцию,иногда нормально проходит,иногда вылазит ошибка и встает на "disp();". Переустанавливаю все библиотеки, в том числе и CyberLib - помогает, но ни всегда. Вылазит хаотично, даже если в коде ничего не меняешь.
     
  14. fogary

    fogary Гик

    Х. з. почему. Попробуйте другую версию Arduino IDE, в т. ч. сборку от arduino.org. Лучше качать не инсталятор, а в архиве, что бы старый IDE то же остался.
     
  15. ostrov

    ostrov Гуру

    Если размер кода критичен, то _delay_ms() позволяет неплохо его уменьшить. Особенно актуально на МК с малым размером памяти типа Аттини13, там обычный delay() сразу отъест треть памяти. Кроме того, _delay_ms() позволяет использовать число дробное и меньше нуля, например 1.25 или 0.75, что иногда полезно для точного выставления задержки и чего обычным delay() не получить.
     
  16. fogary

    fogary Гик

    Спасибо за разъяснение.
    Гуглом "_delay_ms()" находил; "delay_ms()" как у автора - это одно и то же?
     
  17. ostrov

    ostrov Гуру

    Правильно _delay_ms()