Проблема с работой часов

Тема в разделе "Arduino & Shields", создана пользователем Виталий75, 22 ноя 2020.

  1. Всем привет. Собрал я часы на ИН-6, проект здесь: http://forum.rcl-radio.ru/viewtopic.php?id=87.но Индикаторы постоянно показывают разную фигню, например 80.88...Железо проверил, все собрано правильно. Значит проблема в скетче. Просмотрел, скетч рабочий, закоментировал управление кнопками, не помогло...Добавил строки для вывода в монитор порта и удивился. Вот кусок кода:
    hh = time.gettime("H");
    mm = time.gettime("i");
    // ss = time.gettime("s");
    delay(1);
    times = hh*100+mm;
    Serial.println(times ); // Выводим время.
    delay(1);
    Строка Serial.println(times ); выводит фигню, каждый раз разную.. Или трехзначное число, или квадратики, или букву.. То же самое при попытке вывода переменных hh и mm.
    А вот строка Serial.println(time.gettime("H")) выводит в монитор значение часов, все верно. Подозреваю, что именно в этом проблема. Есть знатоки, что могут помочь? Всю голову сломал уже... Полный скетч во вложении.
    Вот сообщение компилятора:

    :\Users\Алина\Desktop\Часы на ин6\sketch______6_____1307\sketch______6_____1307.ino: In function 'void setup()':
    C:\Users\Алина\Desktop\Часы на ин6\sketch______6_____1307\sketch______6_____1307.ino:37:21: warning: invalid conversion from 'char*' to 'int' [-fpermissive]
    C:\Users\Алина\Desktop\Часы на ин6\sketch______6_____1307\sketch______6_____1307.ino:38:22: warning: invalid conversion from 'char*' to 'int' [-fpermissive]
    C:\Users\Алина\Desktop\Часы на ин6\sketch______6_____1307\sketch______6_____1307.ino:39:20: warning: invalid conversion from 'char*' to 'int' [-fpermissive]
    C:\Users\Алина\Desktop\Часы на ин6\sketch______6_____1307\sketch______6_____1307.ino:40:21: warning: invalid conversion from 'char*' to 'int' [-fpermissive]
    C:\Users\Алина\Desktop\Часы на ин6\sketch______6_____1307\sketch______6_____1307.ino:41:23: warning: invalid conversion from 'char*' to 'int' [-fpermissive]
    C:\Users\Алина\Desktop\Часы на ин6\sketch______6_____1307\sketch______6_____1307.ino: In function 'void loop()':
    C:\Users\Алина\Desktop\Часы на ин6\sketch______6_____1307\sketch______6_____1307.ino:48:22: warning: invalid conversion from 'char*' to 'char' [-fpermissive]
    C:\Users\Алина\Desktop\Часы на ин6\sketch______6_____1307\sketch______6_____1307.ino:49:22: warning: invalid conversion from 'char*' to 'char' [-fpermissive]
    Скетч использует 11538 байт (37%) памяти устройства. Всего доступно 30720 байт.
    Глобальные переменные используют 639 байт (31%) динамической памяти, оставляя 1409 байт для локальных переменных. Максимум: 2048 байт.
     

    Вложения:

  2. parovoZZ

    parovoZZ Гуру

    В названии путей к файлам не должно быть букв на кириллице.
     
  3. SergeiL

    SergeiL Оракул Модератор

    Где в документации это указано?
    Ну посоветуй еще три раза постучать по корпусу, чтобы помогло :).
    У ТС при компиляции совсем другие ошибки, и компиляция завершилась.
    Опять ерунду пишешь или просто спамишь?
     
  4. Airbus

    Airbus Радиохулиган Модератор

    Поровоз дело говорит.Это как минимум должно быть.Ни в пути установки IDE ни в названии файла не должно быть кириллицы— только латинские буквы. Кстати касается и Студии и Кодвижн и IAR. C:\Users\Alina\In6 типо так. Потом надо смотреть код. Вечером могу проверить и посмотреть не раньше
     
  5. SergeiL

    SergeiL Оракул Модератор

    Да не, у ТС все же компилируется, а варнинги по другой причине.

    Только что проверил, есть в пути каталоги с русскими буквами, нет - одинаково компилируется и одинаково работает.

    Я в принципе не о том.
    ТС спрашивает:
    Ну причем тут:
     
  6. SergeiL

    SergeiL Оракул Модератор

    Вот смотрите:
    Код (C++):
      char times,mm,hh;
    Код (C++):
      times = hh*100+mm;
    times - это 8 бит. Влезут туда часы умноженные на 100 + минуты?

    UPD:
    Те варнинги, которые появились при компиляции указывают на ошибки.
    Их нужно внимательно изучать, а не игнорировать.
    Например компилятор "ругнулся" на строку:
    Код (C++):
        hh = time.gettime("H");
    Нужно посмотреть описание библиотеки, где сказано:
     
    Последнее редактирование: 23 ноя 2020
  7. AlexU

    AlexU Гуру

    Ваш скетч не соответствует указанному проекту. Вы используете другие библиотеки.

    Теперь по поводу используемой Вами библиотеки iarduino_RTC.
    Что-нибудь знаете про динамическое выделение памяти -- malloc()/free() ?
    Если не знаете, то ни в коем случае не используйте функцию time.gettime(), например, time.gettime("y"), time.gettime("m") и подобные.
    Воспользуйтесь лучше публичными свойствами:
    Код (C++):

    ........
    year = time.year;
    month = time.month;
    ........
     
    И тип переменных year, month и подобных должен быть вроде uint8_t, а не char. Иначе Serial.print() будет выдавать чепуху, а не числа.

    UPD: функцию time.gettime() нужно вызывать перед доступом к публичным свойствам.

    По поводу кириллицы в путях к файлам -- не желательно использовать русские буковки, но и запрета нет. Если работает, то ни чего страшного. Но может в неожиданный момент сломаться.
     
    Последнее редактирование: 23 ноя 2020
    Виталий75 нравится это.
  8.  
  9. Я использовал скетч, разработанный автором проекта под дс1307. Впрочем, автор честно признает, что в железе, в отличие от скетча под дс3231 он его не проверял) Обязательно проверю вашу версию и отпишусь.
     
  10. Nekto_nikto

    Nekto_nikto Гик

    Вот тут у человека хорошая библиотека для RTC с примерами, попробуйте
    https://github.com/Makuna/Rtc
     
    Виталий75 нравится это.
  11. akl

    akl Гуру

    если я ниче не путаю, вроде же 1307 от 3231 отличаются только отсутствием будильника и адресом управляющего регистра.

    можно вообще без библиотек обойтись, я вот такие функции нагуглил и доволен
    Код (C++):
    byte decToBcd(byte val){return( (val/10*16) + (val%10) );}
    byte bcdToDec(byte val){return( (val/16*10) + (val%16) );}
    void setDS1307time(byte second, byte minute, byte hour,
    byte dayOfWeek, byte dayOfMonth, byte month, byte year){
      // передаем данные о времени и дате на DS1307:
      Wire.beginTransmission(DS1307_I2C_ADDRESS);
      // выставляем регистр указателей DS1307 на регистр «00h»,
      // т.е. на регистр, в котором хранятся данные о секундах:
      Wire.write(0);
      Wire.write(decToBcd(second)); // задаем секунды
      Wire.write(decToBcd(minute)); // задаем минуты
      Wire.write(decToBcd(hour)); // задаем часы
      Wire.write(decToBcd(dayOfWeek));
      // задаем день недели (1 – это воскресенье, 7 – это суббота)
      Wire.write(decToBcd(dayOfMonth)); // задаем дату (от 1 до 31)
      Wire.write(decToBcd(month)); // задаем месяц
      Wire.write(decToBcd(year)); // задаем год (от 0 до 99)
      Wire.endTransmission();
    }

    void readDS1307time(byte *second, byte *minute, byte *hour,
    byte *dayOfWeek, byte *dayOfMonth, byte *month, byte *year){
      Wire.beginTransmission(DS1307_I2C_ADDRESS);
      // выставляем регистр указателей DS1307 на регистр «00h»:
      Wire.write(0);
      Wire.endTransmission();
      Wire.requestFrom(DS1307_I2C_ADDRESS, 7);
      // запрашиваем у DS1307 семь байтов начиная с регистра «00h»:
      *second = bcdToDec(Wire.read() & 0x7f);
      *minute = bcdToDec(Wire.read());
      *hour = bcdToDec(Wire.read() & 0x3f);
      *dayOfWeek = bcdToDec(Wire.read());
      *dayOfMonth = bcdToDec(Wire.read());
      *month = bcdToDec(Wire.read());
      *year = bcdToDec(Wire.read());
    }

    void writeDS1307ctrl(unsigned char data){
      Wire.beginTransmission(DS1307_I2C_ADDRESS); //device address and STSRT command are queued
      Wire.write(0x07); //Control Register Address is queued
      Wire.write(data); //Data for Control Register is queued
      Wire.endTransmission(); //queued information are transferred under ACK; STOP
    }

    unsigned char readDS1307ctrl(void){
      unsigned char reg=0;
      Wire.beginTransmission(DS1307_I2C_ADDRESS); //device address and STSRT command are queued
      Wire.write(0x07); //Control Register Address is queued
      Wire.endTransmission(); //queued information are transferred under ACK; STOP
      Wire.requestFrom(DS1307_I2C_ADDRESS, 1);
      reg=Wire.read();
      return reg;
    }
     
  12. Nekto_nikto

    Nekto_nikto Гик

    Я их вообще в руках не держал ни разу, до момента, когда потребовалось устанавливать на RTC время и считывать оттуда, поэтому мой выбор именно эта библиотека, т.к. там достаточно понятный пример, на основе которого уже можно построить что то свое. Как то так.
     
  13. Всем привет. С ерундой в переменной times я разобрался, спасибо AlexU за наводку. Оказалось, команда вида time.gettime("H") предназначена для считывания символов в переменную, а я пытался роботать с ней как с числом... Для этого есть другие команды, что есть в описании библиотеки iarduino, пример в куске кода. . Сейчас в times правильное время. Но прикол в том, что часы по прежнему показывают фигню)) Буду ковырять железо... Прошу глянуть код на всякий, может еще где косяк есть)
    Код (C++):
     int an, segm,i=0,times;
      byte a[4],ss,mm,hh;

      /////////////////////////
        hh = time.Hours;
        mm = time.minutes;
        ss = time.seconds;
        times = hh*100+mm;
     

    Вложения:

  14. Можно и так конечно, но малопонятно, скажем так)
     
  15. Спасибо за наводку, глянул. Действительно интересная библиотека.
     
  16. akl

    akl Гуру

    ничего сложного - создаешь переменные
    unsigned char second, minute, hour, dayOfWeek, dayOfMonth, month, year;
    затем делаешь вот так
    readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
    и всё - в переменных лежит всё что надо
     
    Виталий75 нравится это.