Часы с настройкой времени и даты

Тема в разделе "Arduino & Shields", создана пользователем ImrDuke, 24 дек 2015.

  1. ImrDuke

    ImrDuke Гик

    Как преобразовать год из 2015 -> 15
    Значение 2015 получаю от DS1302. Что бы год мог поместиться в тип byte
     
  2. ANV

    ANV Гуру

    year_byte = year_int % 100
     
    ImrDuke нравится это.
  3. DrProg

    DrProg Вечный нерд

    year_byte = year_int - 2000;

    ))
     
    ИгорьК и ImrDuke нравится это.
  4. Onkel

    Onkel Гуру

    не, у anv лучше, без обид - если что -нибудь сбойнет по питанию и часы встанут в 1980 (или какой там год по умолчанию при отключении батарейки), то у вас будет непонятно что, а у anv будет 80.
    До кучи, ide ардуино автоматически конвертирует типы, из целого в байт? Если бы я писал на с, я написал бы
    = (undigned char) (... что - то типа Int),т.е. если где есть неоднозначность, всегда четко указать, к какому типу надо приводить. В ваших с anv примерах явно приводить результат операции с целыми к типу "байт" не нужно?
     
  5. Sindbad

    Sindbad Гик

    Если цель получить 15, то надо отнять 2000. Если цель - получить байт, то лучше отнимать 1970, это стандарт де-факто для С. http://playground.arduino.cc/Code/Time
     
  6. Sindbad

    Sindbad Гик

    IDE использует вполне настоящий компилятор С/С++. Правила приведения типов полностью соответствуют тому, как это положено делать по стандартам этих языков. для беззнакового байта обычно используют тип
    Код (C++):
    uint8_t
     
  7. Onkel

    Onkel Гуру

    это не с стандарт, это для всего стандарт, "рождество христово" для программеров. но тс думаю нужно просто отображать год и не занимать лишний байт, так что %100 даст верный результат и не приведет к непоняткам при сбросе времени - даст 70.
     
  8. Sindbad

    Sindbad Гик

    А чтобы байт не занимать, можно время в time_t хранить, всего четыре байта и время с точностью до секунды.
     
  9. Onkel

    Onkel Гуру

    а можно вообще его не хранить, опрашивать часы. но это про текущее, тс скорее всего базульку под расписание на много лет вперед генерит.
     
  10. DrProg

    DrProg Вечный нерд

    Меня опередили.
     
    ИгорьК нравится это.
  11. ImrDuke

    ImrDuke Гик

    Не совсем. Просто делаю настройку времени\даты, а время + дата + знак сохранения в одну строчку не влазят.
     
  12. Максим B

    Максим B Гуру

    Кодом потом не поделитесь, а лучше полностью проектом ???
     
  13. ImrDuke

    ImrDuke Гик

    Проект в стадии разработки.
    Процедурой установки времени\даты поделюсь.

    Код (C++):

    #include <DS1302.h>
    #include <LiquidCrystal.h>
    #include <Bounce2.h>

    #define Knopka_SET  6
    #define Knopka_MENU 7

    Bounce debouncer1 = Bounce();
    Bounce debouncer2 = Bounce();
    Time hm;
    long previousMillis_V = 0;
    long interval_V = 400;
    static byte ErrV=0;
    static byte FLAG=0;

    DS1302 rtc(10, 8, 9);
    LiquidCrystal lcd(12,11,5,4,3,2);

    void setClock(){ // установка часов
      byte pos = 1;  // позиция курсора
      byte second, minute, hour, dayOfWeek, day, month, year;  
      FLAG=0;        //
      hm = rtc.getTime(); //
      hour = hm.hour;
      minute = hm.min;
      day = hm.date;
      month = hm.mon;
      year = hm.year % 100;

      lcd.clear();
      lcd.setCursor(3,0);
      lcd.print("CLOCK SET");
      while (FLAG == 0){ // крутим   цикл  
        lcd.setCursor(pos, 1); // устанавливаем курсор согласно позиции
        if (millis()- previousMillis_V >= interval_V) {
          if (ErrV==0) {
            lcd.setCursor(0, 1);
            if (hour<10) lcd.print("0");  
            lcd.print(hour, DEC);    //часы
            lcd.print(":");          // разделитель
            if (minute<10) lcd.print("0");
            lcd.print(minute, DEC);  // минуты
            lcd.print(" ");          // разделитель
            if (day < 10) lcd.print("0");
            lcd.print(day, DEC);     // день
            lcd.print("/");          // разделитель
            if (month < 10) lcd.print("0");
            lcd.print(month, DEC);   // месяц
            lcd.print("/");          // разделитель
            if (year < 10) lcd.print("0");
            lcd.print(year, DEC);    // год
            lcd.print(" \x7E");      // спец.символ
          }
          else {
            lcd.print("\xFF");       // спец.символ
          }
          ErrV=!ErrV;  
          previousMillis_V=millis();
        }
        if ( debouncer2.update() ) {
          if ( debouncer2.read() == LOW) {
            if ( pos < 13) pos += 3;  
            else if (pos > 14) FLAG=2;
            else if (pos > 12) pos += 2;
          }
        }    
        if (debouncer1.update()) {
          if (debouncer1.read() == LOW) {
            if (pos == 1 )       hour++;  
            else if (pos == 4 )  minute++;      
            else if (pos == 7 )  day++;
            else if (pos == 10 ) month++;
            else if (pos == 13 ) year++;
            else if (pos == 15 ) FLAG=1;
          }
        }      
        if (hour > 23)        hour   = 0;
        else if (minute > 59) minute = 0;
        else if (day > 31)    day    = 0;
        else if (month > 12)  month  = 1;
        else if (year > 99)   year   = 0;
      }// конец цикла
      if (FLAG == 1) {
        //УСТАНОВКА ВРЕМЕНИ ДЛЯ ЧАСОВ
        rtc.setTime(hour,minute,00); // Set the time (24hr format)
        rtc.setDate(day, month, year + 2000); // Set the date
        lcd.clear();
        lcd.setCursor(5, 0);
        lcd.print("Saved");
        delay(1500);
      }
    }

    void setup() {
      rtc.halt(false);
      rtc.writeProtect(false);

      lcd.begin(16, 2);
      lcd.clear();

      pinMode(Knopka_SET,INPUT_PULLUP);
      debouncer1.attach(Knopka_SET);
      debouncer1.interval(5);

      pinMode(Knopka_MENU,INPUT_PULLUP);
      debouncer2.attach(Knopka_MENU);
      debouncer2.interval(5);
    }

    void loop() {
      setClock();
    }
     
     
    Последнее редактирование: 25 дек 2015
    Максим B нравится это.