Arduino + a4001sr + 74ch4049h

Тема в разделе "Arduino & Shields", создана пользователем dreadfull, 4 апр 2021.

  1. akl

    akl Гуру

    (numbers_array[unit], BIN) это на аналог 0b11011010 - это всего лишь команда для функции print что надо соответствующим образом преобразовать число 0b11011010 (или какое-то из чисел numbers_array[unit]) в строку символов "11011010" или соответствующую
     
  2. dreadfull

    dreadfull Гик

    чертовщина какая-то!!!!!
    в посте №7 есть код в котором я указывал
    Код (C++):
    shiftOut(dataPin, clockPin, LSBFIRST, numbers_array[unit]);
    и оно не работало, а теперь при той же строке (как вы пишете без "BIN") всё работает!!!! циферки побежали!!!!
     
  3. akl

    akl Гуру

    никакой чертовщины - в посте номер 7 в shiftout приходила переменная unit, которая была объявлена в начале в виде глобальной, после этого создавалась локальная переменная с тем же именем, в которую уже запихивалось что надо и шло в сериал. я же писал про лишние объявления переменных
     
    dreadfull нравится это.
  4. dreadfull

    dreadfull Гик

    а потом по вашей рекомендации я удалил в начале те переменные и всё? писец как это тупо)
    циферка нуль отображалась не корректно. должно было быть
    Код (C++):
     B11111100,
    следующий этап. как заставить цифру держатся конкретного индикатора??? тут понятно что нужен ещё один байт, но принцип неясен, что искать? где смотреть????
     
  5. dreadfull

    dreadfull Гик

    ахахахахаха второй байт не понадобился)))) всё работает...... вроде:p
     
  6. dreadfull

    dreadfull Гик

    итак, теперь осталось переставить попарно индикаторы, найти RTCдатчик и облагородить корпс.
    вот так сейчас выглядит 430 секунд (на камеру плохо передаются цвета, в живую просто огнь!!!)
    отдельная благодарочка, плюсик в карму и много бабра akl!
    так что тема закрыта.
     

    Вложения:

  7. parovoZZ

    parovoZZ Гуру

    зачем что-то пилить, если можно закинуть в регистр UART напрямую? Без этих ваших прокладок наворотов
     
  8. akl

    akl Гуру

    Serial.write практически это и делает, только по нормальному - с кольцевым буфером, прерываниями и т.д. Но ТСу надо было не просто положить байт, а сделать форматированный вывод числа в виде строки. это более-менее способно делать Serial.print, но оно не имеет возможности печатать несуществующие ноли для ровного вида, что умеет делать printf и аналоги, но оные в свою очередь не умеют в двоичный формат
     
  9. dreadfull

    dreadfull Гик

    ну ядрёное коропучело!!!!!
    ну чего сложно то так???(
    не стал работать со старым модулем DS1302 , а прикупил современный DS3231. библиотеку скачал от сюда:
    https://iarduino.ru/file/235.html
    открыл пример в библиотеке, прописал вход-выход, выбрал показывать часы-минуты-секунды и всё вроде как заиграло, монитор порта прям пишет без пробелов 6 символов с часы-минуты-секунды. и тут бы радоваться но... не работает.
    Код (C++):
     #define pin_SW_SDA 3                                    // Назначение любого вывода Arduino для работы в качестве линии SDA программной шины I2C.
    #define pin_SW_SCL 9                                    // Назначение любого вывода Arduino для работы в качестве линии SCL программной шины I2C.
    #include <Wire.h>                                       // Библиотека iarduino_RTC будет использовать методы и функции библиотеки Wire.
    #include <iarduino_RTC.h>                                   // Подключаем библиотеку iarduino_RTC для работы с модулями реального времени.
    iarduino_RTC watch(RTC_DS3231);                         // Объявляем объект watch для работы с RTC модулем на базе чипа DS3231, используется шина I2C.
                                                                //
    void setup(){                                               //
        delay(300);                                             // Ждем готовности модуля отвечать на запросы.
        Serial.begin(9600);                                     // Инициируем передачу данных в монитор последовательного порта на скорости 9600 бод.
        watch.begin();                                          // Инициируем работу с модулем.
    }                                                           //
    void loop(){                                                //
        if(millis()%1000==0){                                   // Если прошла 1 секунда.
          Serial.println(watch.gettime("H:i:s"));     // Выводим время.
          delay(1);                                             // Приостанавливаем скетч на 1 мс, чтоб не выводить время несколько раз за 1мс.
        }                                                       //
    }
    при попытке watch.gettime("seconds") прировнять к переменной int,
    Код (C++):
    int now1=(watch.gettime("seconds"));
    компиляция происходит но есть ошибка
    Код (C++):

    C:\Users\dread\Documents\Arduino\big_clock\big_clock.ino:35:25: warning: invalid conversion from 'char*' to 'int' [-fpermissive]

     {int now1=(watch.gettime("seconds"));

     
    получается что где-то в библиотеке наши числа находятся в массиве и не могут принадлежать к int.
    что делать, как тут побороть задачку эту?
     
  10. akl

    akl Гуру

    а инструкцию прочитать?
    https://github.com/iarduino/iarduino_RTC/blob/master/iarduino_RTC/iarduino_RTC.h
    если требуется получить время в виде цифр, то можно вызвать функцию gettime() без параметра, после чего получить время из переменных
    // seconds секунды 0-59
    // minutes минуты 0-59
    // hours часы 1-12
    // Hours часы 0-23
    // midday полдень 0-1 (0-am, 1-pm)
    // day день месяца 1-31
    // weekday день недели 0-6 (0-воскресенье, 6-суббота)
    // month месяц 1-12
    // year год 0-99

    но да, библиотека слишком уж замороченная. для полноценной работы с этими часами достаточно пары функций по 10 строчек.
     
  11. dreadfull

    dreadfull Гик

    ошибка какая-то

    Код (C++):
    C:\Users\dread\Documents\Arduino\big_clock\big_clock.ino: In function 'void loop()':

    big_clock:55:35: error: invalid use of void expression

         Serial.println(watch.gettime());     // Выводим время.
     
  12. akl

    akl Гуру

    watch.gettime() не возвращает никакие цифры - она принимает указатель на строку, и меняет эту строку возвращая указатель на нее обратно. если вызвать функцию без параметров, то она не возвращает вообще ничего. чтобы получить время надо сделать так

    Код (C++):
    watch.gettime();
    int sec = seconds;
    int min = minutes;
    int hrs = hours;
     
    и т.д. seconds minutes hours и прочие это переменные которые сидят в библиотеке и в которых появится время сразу после вызова функции watch.gettime();
     
    dreadfull нравится это.
  13. dreadfull

    dreadfull Гик

    я тупой, извините. всё заработало. вы правы.
     
  14. dreadfull

    dreadfull Гик

    теперь вроде работает и корректно отображается
    осталось только кнопку подшить....
    Код (C++):
    #define dataPin  10  // пин подключен к входу DS
    #define latchPin 11  // пин подключен к входу ST_CP
    #define clockPin 12  // пин подключен к входу SH_CP
    #define pin_SW_SDA 2                                    // Назначение любого вывода Arduino для работы в качестве линии SDA программной шины I2C.
    #define pin_SW_SCL 3                                    // Назначение любого вывода Arduino для работы в качестве линии SCL программной шины I2C.
    byte numbers_array[10] = { // cоздаём массив цифр 0-9 в двоичном коде
      B11111100,
      B01100000,
      B11011010,
      B11110010,
      B01100110,
      B10110110,
      B10111110,
      B11100000,
      B11111110,
      B11110110     // 9
    };
    #include <iarduino_RTC.h>                 // Подключаем библиотеку iarduino_RTC для работы с модулями реального времени.
    iarduino_RTC watch(RTC_DS3231);

    void setup()
    {  Serial.begin(9600);
       pinMode(latchPin, OUTPUT);// устанавливаем режим работы пинов OUTPUT
       pinMode(clockPin, OUTPUT);
       pinMode(dataPin, OUTPUT); // ставим HIGH на "защёлку", чтобы регистр не принимал сигнал
       digitalWrite(latchPin, HIGH);
       watch.begin();
    }

    void loop()
    { watch.gettime();
        int hundredsofthousands =  watch.Hours/10%10;  // вычисляем десятки часов
        int tensofthousands =  watch.Hours%10;       // вычисляем часы
        int thousands =  watch.minutes/10%10;              // вычисляем десятки минут
        int hundreds =  watch.minutes%10;                // вычисляем  минуты
        int tens =  watch.seconds/10%10;                     // вычисляем десятки секунд
        int unit =  watch.seconds%10;                        // вычисляем секунды
        Serial.print("tens");Serial.print((tens)); Serial.println((unit));
        Serial.print("thousands");Serial.print((thousands)); Serial.println((hundreds));
        digitalWrite(latchPin, LOW);
        shiftOut(dataPin, clockPin, LSBFIRST, numbers_array[hundredsofthousands]);// отправляем на регистр байт секундой
        shiftOut(dataPin, clockPin, LSBFIRST, numbers_array[tensofthousands]);// отправляем на регистр байт секундой
        shiftOut(dataPin, clockPin, LSBFIRST, numbers_array[thousands]);// отправляем на регистр байт секундой
        shiftOut(dataPin, clockPin, LSBFIRST, numbers_array[hundreds]);// отправляем на регистр байт секундой
        shiftOut(dataPin, clockPin, LSBFIRST, numbers_array[tens]);// отправляем на регистр байт секундой
        shiftOut(dataPin, clockPin, LSBFIRST, numbers_array[unit]);// отправляем на регистр байт секундой
        digitalWrite(latchPin, HIGH);
        delay(1000);
    }
     
  15. dreadfull

    dreadfull Гик

    к библиотеке нашёл пример полного управлением всех параметров с выводом их на дисплей lcd1602. пример был слишком мудрёный да и настройка даты мне была не к чему.
    Код (C++):
    // Подключаем библиотеки:
    #include <Wire.h>                            // подключаем библиотеку для работы с шиной I2C
    #include <iarduino_RTC.h>                    // подключаем библиотеку для работы с RTC модулем
    iarduino_RTC time(RTC_DS1307);               // объявляем  переменную для работы с RTC модулем,  указывая название модуля
    // Объявляем переменные и константы:
    const uint8_t PIN_button_SET  = 2;           // указываем номер вывода arduino, к которому подключена кнопка SET
    const uint8_t PIN_button_UP   = 3;           // указываем номер вывода arduino, к которому подключена кнопка UP
    const uint8_t PIN_button_DOWN = 4;           // указываем номер вывода arduino, к которому подключена кнопка DOWN
          uint8_t VAR_mode_SHOW   = 1;           // режим вывода: 1-время 2-дата
          uint8_t VAR_mode_SET    = 0;           // режим установки времени: 0-нет 1-сек 2-мин 3-час 4-день 5-мес 6-год 7-день_недели
    void setup() {
      pinMode(PIN_button_SET,  INPUT);           // устанавливаем режим работы вывода кнопки, как "вход"
      pinMode(PIN_button_UP,   INPUT);           // устанавливаем режим работы вывода кнопки, как "вход"
      pinMode(PIN_button_DOWN, INPUT);           // устанавливаем режим работы вывода кнопки, как "вход"
      delay(300);                                // ждем 300мс
      time.begin();                              // инициируем RTC модуль
    }
    void loop(){
      if(millis()%1000==0){                      // если прошла 1 секунда
          lcd.setCursor(0, 0);                   // устанавливаем курсор в позицию: столбец 0, строка 0
          lcd.print("iArduino.ru");              // выводим текст "iArduino.ru"
          lcd.setCursor(0, 1);                   // устанавливаем курсор в позицию: столбец 0, строка 1
        if(VAR_mode_SHOW==1){                    // если установлен режим вывода времени
          lcd.print(time.gettime("H:i:s"));      // выводим время
        }
        if(VAR_mode_SHOW==2){                    // если установлен режим вывода даты
          lcd.print(time.gettime("d-m-Y   D"));  // выводим дату
        }
        delay(1);                                // приостанавливаем на 1 мс, чтоб не выводить время несколько раз за 1мс
      }
      Func_buttons_control();                    // передаём управление кнопкам
    }
    // Функция управления кнопками:
    void Func_buttons_control(){
      uint8_t i=0;
      time.blinktime(VAR_mode_SET);                                  // мигаем устанавливаемым параметром (если VAR_mode_SET больше 0)
    //Если часы находятся в режиме установки даты/времени
      if(VAR_mode_SET){
    //  Если нажата кнопка UP
        if(digitalRead(PIN_button_UP  )){
          while(digitalRead(PIN_button_UP)){delay(50);}              // ждём пока мы не отпустим кнопку UP
          switch (VAR_mode_SET){                                     // инкремент (увеличение) устанавливаемого значения
          /* сек */ case 1: time.settime(0,                                   -1, -1, -1, -1, -1, -1); break;
          /* мин */ case 2: time.settime(-1, (time.minutes==59?0:time.minutes+1), -1, -1, -1, -1, -1); break;
          /* час */ case 3: time.settime(-1, -1, (time.Hours==23?0:time.Hours+1),     -1, -1, -1, -1); break;
          /* дни */ case 4: time.settime(-1, -1, -1, (time.day==31?1:time.day+1),         -1, -1, -1); break;
          /* мес */ case 5: time.settime(-1, -1, -1, -1, (time.month==12?1:time.month+1),     -1, -1); break;
          /* год */ case 6: time.settime(-1, -1, -1, -1, -1, (time.year==99?0:time.year+1),       -1); break;
          /* д.н.*/ case 7: time.settime(-1, -1, -1, -1, -1, -1, (time.weekday==6?0:time.weekday+1) ); break;
          }
        }
    //  Если нажата кнопка DOWN
        if(digitalRead(PIN_button_DOWN)){
          while(digitalRead(PIN_button_DOWN)){delay(50);}            // ждём пока мы её не отпустим
          switch (VAR_mode_SET){                                     // декремент (уменьшение) устанавливаемого значения
          /* сек */ case 1: time.settime(0,                                   -1, -1, -1, -1, -1, -1); break;
          /* мин */ case 2: time.settime(-1, (time.minutes==0?59:time.minutes-1), -1, -1, -1, -1, -1); break;
          /* час */ case 3: time.settime(-1, -1, (time.Hours==0?23:time.Hours-1),     -1, -1, -1, -1); break;
          /* дни */ case 4: time.settime(-1, -1, -1, (time.day==1?31:time.day-1),         -1, -1, -1); break;
          /* мес */ case 5: time.settime(-1, -1, -1, -1, (time.month==1?12:time.month-1),     -1, -1); break;
          /* год */ case 6: time.settime(-1, -1, -1, -1, -1, (time.year==0?99:time.year-1),       -1); break;
          /* д.н.*/ case 7: time.settime(-1, -1, -1, -1, -1, -1, (time.weekday==0?6:time.weekday-1) ); break;
          }
        }
    //  Если нажата кнопка SET
        if(digitalRead(PIN_button_SET)){
          while(digitalRead(PIN_button_SET)){                        // ждём пока мы её не отпустим
            delay(10);
            if(i<200){i++;}else{lcd.clear();}                        // фиксируем, как долго удерживается кнопка SET, если дольше 2 секунд, то стираем экран
          }
          if(i<200){                                                 // если кнопка SET удерживалась меньше 2 секунд
            VAR_mode_SET++;                                          // переходим к следующему устанавливаемому параметру
            if(VAR_mode_SHOW==1 && VAR_mode_SET>3){VAR_mode_SET=1;}  // возвращаемся к первому устанавливаемому параметру
            if(VAR_mode_SHOW==2 && VAR_mode_SET>7){VAR_mode_SET=4;}  // возвращаемся к первому устанавливаемому параметру
          }else{                                                     // если кнопка SET удерживалась дольше 2 секунд, то требуется выйти из режима установки даты/времени
            VAR_mode_SET=0;                                          // выходим из режима установки даты/времени
          }
        }
    //Если часы находятся в режиме вывода даты/времени
      }else{
    //  Если нажата кнопка SET
        if(digitalRead(PIN_button_SET)){
          while(digitalRead(PIN_button_SET)){delay(10);              // ждём пока мы её не отпустим
            if(i<200){i++;}else{lcd.clear();}                        // фиксируем, как долго удерживается кнопка SET, если дольше 2 секунд, то стираем экран
          }
          if(i<200){                                                 // если кнопка SET удерживалась меньше 2 секунд
            lcd.clear();                                             // стираем экран
            VAR_mode_SHOW=VAR_mode_SHOW==1?2:1;                      // меняем режим вывода: дата/время
          }else{                                                     // если
            if(VAR_mode_SHOW==1){VAR_mode_SET=1;}                    // если установлен режим вывода времени, то устанавливаемый параметр - секунды
            if(VAR_mode_SHOW==2){VAR_mode_SET=4;}                    // если установлен режим вывода даты,    то устанавливаемый параметр - день
          }
        }
      }
    }
    решил всё вырезать и реализовать простейшее управление кнопка 1 (UP) увеличение количества часов, кнопка 2 (DOWN) увеличение количества минут. логика простая если кнопка 1 = вкл, увеличивать количество часов командой watch.settime( watch.Hours, watch.minutes==59?0: watch.minutes+1);, если нет (else) возврат строки с датой и временем watch.gettime();. но не работает....
    Код (C++):
    if(digitalRead(PIN_button_UP==HIGH )){
          watch.settime( watch.Hours, watch.minutes==59?0: watch.minutes+1);
          delay(500);
         }  
         else{
          watch.gettime();
          }
        if(digitalRead(PIN_button_DOWN==HIGH)){
         watch.settime( watch.Hours==23?0: watch.Hours+1 , watch.minutes  );
         delay(500);
        }
        else{
          watch.gettime();
          }
     
  16. b707

    b707 Гуру

    пипец какой-то:
    Код (C++):
    if(digitalRead(PIN_button_UP==HIGH )){
    dreadfull - вы на форуме 7 лет! - и до сих пор не выучили даже синтаксис функции digitalRead() ??
    Не пробовали книжку почитать - что-нить типа "ардуино для детей от 3х до 6-ти" ? :))
     
  17. dreadfull

    dreadfull Гик

    [QUOTE="b707, post: 283627, [/QUOTE]

    пробовал, лет 7 назад. на карантине стало скучно, решил молодость вспомнить и прям ваще мрак)
     
  18. b707

    b707 Гуру

    ну попробуйте еще (я имею в виду почитать)
    А то сейчас "ваще мрак" - это ваша тема и вопросы в ней...
     
  19. akl

    akl Гуру

    изучать погромирование при помощи ардуины довольно трудно, а с другой стороны без изучения погромирования с ардуиной трудно что-то нормальное делать. Поэтому рекомендую сперва изучить (конечно установив какую-нибудь среду и выполняя упражнения) несколько первых глав книжки "керниган ритчи язык программирования си"
     
  20. dreadfull

    dreadfull Гик

    а в чём проблема то? суть команды вроде как знаю - прочитать состояние пина (1,0). что не так-то?

    просто тут уже думал что обезумел, пин5 никак не хотел видеть изменеия состояния входа, дошло до самого простого кода, а он - молчит.видать умер, а вот на 4 всё ок. я ведь честно не кричу что Гуру, Сансей и Учитель, просто появилось время и возможность. ну подскажите, поправиьте явные ошибки.
    пока разобрался команда работает
    Код (C++):
     watch.settime(-1, watch.minutes+1);