помогите с часами

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

  1. Flynny

    Flynny Нуб

    сделал часы с датой и временем , но месяц переходит на 32.

    Код (C++):

    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>

    LiquidCrystal_I2C lcd(0x3F,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display
    int date[13][5] = {{2016,2017,2018,2019,2020},
                       {31,31,31,31,31},
                       {29,28,28,28,29},
                       {31,31,31,31,31},
                       {30,30,30,30,30},
                       {31,31,31,31,31},
                       {30,30,30,30,30},
                       {31,31,31,31,31},
                       {31,31,31,31,31},
                       {30,30,30,30,30},
                       {31,31,31,31,31},
                       {30,30,30,30,30},
                       {31,31,31,31,31}};

    int hours = 23;
    int minutes = 59;
    int seconds = 30;

    int day = 31;
    int month = 1;
    int year = 0;

    void setup()
    {
      lcd.init();                  
      lcd.backlight();
      lcd.print("clock v2");
      lcd.setCursor(0 , 1);
      lcd.print("by Nimond");
    delay(5000);
    }

    void loop()
    {
      if(seconds == 60){
        seconds = 0;
        minutes = minutes + 1;
      }
      if(minutes == 60){
        minutes = 0;
        hours = hours + 1;
      }
      if(hours == 24){
        hours = 0;
        day = day + 1;
      }
      if(day == date[month,year]){
        day = 1;
        month = month + 1;
      }
      if(month == 13){
        month = 1;
        year = year + 1;
      }
     
     
    lcd.clear();
    lcd.setCursor(3 , 0);
    lcd.print(hours);
    lcd.print(":");
    lcd.print(minutes);
    lcd.print(":");
    lcd.print(seconds);

    lcd.setCursor(3 , 1);
    lcd.print(day);
    lcd.print(";");
    lcd.print(month);
    lcd.print(";");
    lcd.print(2016 + year);

    seconds = seconds + 1;
    delay(1000);
    }
    Код (Text):
    C:\Users\Garro\AppData\Local\Temp\arduino_modified_sketch_185507\SerialDisplay.pde: In function 'void loop()':

    C:\Users\Garro\AppData\Local\Temp\arduino_modified_sketch_185507\SerialDisplay.pde:58:28: warning: ISO C++ forbids comparison between pointer and integer [-fpermissive]

       if(day == date[month,year]){

                                ^


    Скетч использует 4 174 байт (1%) памяти устройства. Всего доступно 253 952 байт.
    Глобальные переменные используют 379 байт (4%) динамической памяти, оставляя 7 813 байт для локальных переменных. Максимум: 8 192 байт.
     
  2. Flynny

    Flynny Нуб

    понимаю , что тут проблема с указателями , но я в них слаб , кто может подкиньте хорошую статейку , пожалуйста))
     
  3. Flynny

    Flynny Нуб

    пробовал сделать вот так , с указателелем , но не особо вышло
     

    Вложения:

  4. а зачем массив?
     
  5. Flynny

    Flynny Нуб

    календарь , в принципе получается что только для февраля , я уже понял , что можно сделать и без массива , но уже принципиально надо разобраться в чем ошибка.
     
  6. Flynny

    Flynny Нуб

    без массива , для корректной смены месяца нужно 2 доп if для 30 и 31 и куй знает какая конструкция для февраля (вообще не шарю в датах , високосных годах и тд.)
     
  7. ANV

    ANV Гуру

    day == date[month][year]
     
  8. AlexU

    AlexU Гуру

    Может не стоит изобретать велосипед, а воспользоваться готовым решением из состава библиотеки avr-libc. А именно реализацией time.h. Правда для более точного подсчета времени придется чуть подредактировать wiring.c, точнее обработчик прерывания нулевого таймера -- добавить функционал для подсчета секунд и вызова функции system_tick() каждую секунду. Либо можно внутри loop() обеспечить вызов system_tick() раз в секунду, но это не очень красивое решение.
     
  9. Securbond

    Securbond Гуру

    А в чем прикол изобретать велосипед ??? … модуль DS3231 за 45 руб никак не купить?
     
    Пушной звер нравится это.