Блок с датойБлок с временемБлок с возрастом сайта
Mr.ALB

    Анатолий Беляев (aka Mr.ALB). Персональный сайт

    Да пребудут с вами Силы СВЕТА!

     

    Ардуино (Arduino). #28

    Часы на RTC DS3231, с расширенными функциями v3.x

    Продолжение проекта часов Часы на RTC DS3231, с расширенными функциями. После наработок в программе Универсальный таймер по управлению устройством с помощью всего трёх кнопок, пришёл к мнению, что такое управление необходимо внедрить в программу часов, созданных ранее.


    Примечание: в тексте при наведении мышки на * появляется дополнительная информация.

    Описание

    Предыдущий проект #21 Часы на RTC DS3231, с расширенными функциями подвергся сильнейшей переработке и поэтому решил под этот проект выделить отдельную страницу. Схема упростилась благодаря тому, что для управления используется всего три кнопки:

    • [MODE] - Настройка
    • [MINUS] - Убавить [-]
    • [PLUS] - Прибавить [+]

    Переход по пунктам меню параметров настройки осуществляется по нажитаю на кнопку [MODE]. Во 2-м разряде индикатора выводится номер параметра. Далее каждый параметр может настраиваться кнопками [MINUS] и [PLUS]. Значение параметра отображается в 3-м и 4-м разрядах индикатора. Всего возможно настраивать 9* параметров:

    1. Активность будильника 0|1
    2. Установка часов будильника 0...23
    3. Установка минут будильника 0...59
    4. Активность показа дополнительных параметров* 0|12022-06-01
    5. Настройка часов 0...23
    6. Настройка минут 0...59
    7. Яркость индикатора 0...7
    8. Коэф. коррекции температуры для DS3231 +/-10° => 0...20.
      Значение температуры вычисляется через отнимание 10, так:
      –1° => установить 9   => 9-10 = -1°
      +1° => установить 11 => 11-10 = +1°
    9. Коэффициент коррекции давления -5.0/+4.9 мм рт.ст. => 0..99.
      Значение коррекции вычисляется через отнимание 50 и деление на 10, так:
      +0.5 mm => установить 55 => 55-50 =  5 / 10 = +0.5 mm
      –0.5 mm => установить 45 => 45-50 = -5 / 10 = –0.5 mm
    10. Автоматическая регулировка яркости индикатора в зависимости от освещённости (только с версии v3.72) 0|1.

    Индикация текущих значений при mode = 0:

    • Время с DS3231
    • Температура с DS1820/DS3231
    • Давление с BMP280

    Выход из меню настройки параметров осуществляется через выбор mode = 0 (следующее нажатие [MODE] после 4-го* или 9-го* параметра) или автоматически через 16 секунд бездействия в меню настройки параметров.

    Для удобства пользования часами сделал так, чтобы дополнительные параметры скрывались и показывались только первые пункты с активизацией и настройкой будильника, что добавляет удобства в пользовании часами и устраняет случайное изменение настроек времени и параметров коррекции датчиков. При необходимости произвести коррекцию времени или параметров датчиков – можно включить показ дополнительных параметров. Потом показ дополнительных параметров* автоматически убирается через 30 секунд работы часов в режиме индикации времени.

    2022-06-01

    Схема часов

    Схема часов проще, чем в предыдущем проекте. Убрал лишние кнопки. Теперь осталось всего три кнопки для полного управления настройками часов. В остальном схема подобная предыдущим. Маленькая особенность: подключил управление индикатором к контактам 2 и 3 Ардуино.

    Схема электрическая принципиальная для скетча #28
    Pic 1. Схема электрическая принципиальная для скетча #28


    Перечень элементов

    1. U1 – Arduino UNO R3, Arduino Pro Mini, LGT8F328P, WAVGAT Nano или другое.
    2. U2 – Модуль питания AC-DC на 5...6 В.
    3. U3 – Модуль стабилизатора на +3,3 В, если нет на плате Arduino.
    4. U4 – Модуль датчика абсолютного давления BMP280 (допустимо без него).
    5. DD1 – Датчик температуры семейства DS1820 (допустимо без него).
    6. RTC1 – Модуль реального времени DS3231.
    7. R1 – Резистор 4.7 кОм (при наличии датчика DS1820).
    8. R2 – Резистор 10 кОм (4.7кОм...12кОм).
    9. HL1 – Дисплей 4-х разрядный 7-и сегментный TM1637.
    10. HL2 – Светодиод красный.
    11. SA1 – Выключатель (любой).
    12. SB1...SB3 – Микрокнопка (любая).
    13. BA1 – Buzzer активный.
    14. R3* - фоторезистор 100 кОм
    15. R4* - резистор 20 кОм


    Скетч часов

    Скетч часов претерпел сильные изменения, написаны новые функции вывода на индикатор. Постарался сделать всё более понятным и интуитивным. Главная особенность программы в том, что в неё заложена условная компиляция и автоматическое определение подключенных устройств (датчиков).

    Условная компиляция позволяет легко перенастраивать скетч под любой используемый МК. Работоспособность программы проверена на следующих МК:

    • Arduino Uno R3;
    • Arduino Nano, Arduino Pro Mini;
    • LGT8F328P *, WAVGAT Pro Mini *;
    • WAVGAT Nano *.

    Ниже на фото все проверенные платы Arduino, кроме Arduino Uno R3 (в кадр не вошла).

    Проверенные платы
    Pic 2. Проверенные платы

    Скетч написан так, что при наличии датчиков DS1820 и BMP280, будут выводится значения с них, но если этих датчиков нет, или нет какого-то любого из них, то выводиться значения будут только с подключенных. Если не подключен внешний датчик семейства DS1820, то температура будет выводиться со встроенного датчика температуры модуля реального времени. Проверка наличия подключенных датчиков осуществляется при включении. До включения можно подсоединять или отсоединять датчики, а после включения программа сама определит наличие датчиков и будет выводить их значения при индикации.

    Весь код подробно закомментирован. Хочу лишь обратить внимание, что запись/чтение значения в/из EEPROM были проверены со всеми платами, кроме WAVGAT Nano *. Вначале запись в эту плату не удавалась, а потом не стал добавлять код для этой платы для работы с EEPROM.

    Сам скетч и библиотеки можно скачать ниже в подразделе Приложение.



    Скетч v3.21*

    Этот вариант несколько причудливыйчасы, кроме всего прочего, ещё и измеряют напряжение до +20 В. Измерение проводится через пин A1. Этот вариант тестировался только на Arduino Nano, т.е. работать будет только для МК AVR ATMega328.

    Сам скетч v3.21 не публикую, это закрытая разработка, но если вам всё же хочется скопировать этот вариант для себя, то в Приложении есть архив с .hex файлами и программкой загрузчиком gcUploader этого .hex файла в Ардуино через обычное подключение по USB.

    Для этого варианта добавлены ещё два параметра:

      10. Активность измерения напряжения 0|1
      11. Коррекция измерения напряжения -5.0/+4.9 В =>0..99.
      
        Значение коррекции вычисляется через_
        отнимание 50 и деление на 10, так:
        
        -0.3 В => 47 => 47-50 = -3 /10 = -0.3 В
        +0.1 В => 51 => 51-50 = +1 /10 = +0.1 В
    

    При включении часов, происходит тестирование индикатора, потом выводятся параметры подключенных датчиков и последним выводится на индикатор активность измерителя напряжения в 3-м и 4-м разрядах в виде:

        0U – измерение не активно, 
        1U – измерение напряжения активно
      

    Попутно, при тестировании этой программы, обнаружил, что USB компьютера, к которому подключено Ардуино, выдаёт всего 4,6В.



    Конструкция часов

    Макетирование на плате WAVGAT Pro Mini. Долго она ждала своего часа улыбка. В итоге даже она заработала и получается, что можно использовать любую доступную плату Arduino вплоть до самых бюджетных вариантов.

    Напомню, что для программирования WAVGAT Pro Mini как и для программирования LGT8F328P, необходимо в среде Arduino IDE установить ядро LGT8F.

    Макет на <i>WAVGAT Pro Mini</i>
    Pic 3. Макет на WAVGAT Pro Mini

    Итак, дошли руки до конструкции часов. Наиболее просто – это взять конструкцию от часов версии v1 Часы на RTC DS3231 и TM1637 и доработать под скетч v3.71*, что собственно, и сделал. Далее смотрите фото как всё получилось.

    Электронная начинка часов версии v1. Доработка
    Pic 4. Электронная начинка часов версии v1. Доработка

    Добавлен светодиод HL2 – сигнализирующий, что включен будильник. Добавлен буззер BA1.

    Электронная начинка часов версии v1. Доработка
    Pic 5. Электронная начинка часов версии v1. Доработка

    Добавил модуль с датчиком давления BMP280. Модуль расчитан на напряжение +5В, что позволяет не добавлять стабилизатор на +3,3В.

    Добавлен модуль с датчиком давления BMP280
    Pic 6. Добавлен модуль с датчиком давления BMP280

    Дорабатываем корпус часов. Проделал вентиляционные отверстия в верхней панели, для циркуляции воздуха, что необходимо для более правильного измерения температуры встроенным датчиком температуры модуля BMP280.

    Доработка конструкции часов
    Pic 7. Доработка конструкции часов

    В задней стенке сделаны вентиляционные щели, через которые забирается внешний воздух.

    Доработка конструкции часов
    Pic 8. Доработка конструкции часов

    В передней стенке справа просверлено отверсти, в которое будет вставлен светодиод HL2. На панели кнопок два лишних отверстия заклеены и оставлены только три отверстия под кнопки управления.

    Доработка конструкции часов
    Pic 9. Доработка конструкции часов

    Часы собраны. Будильник отключен.

    Доработка конструкции часов
    Pic 10. Доработка конструкции часов

    Будильник включен, о чём указывает свечение светодиода HL2. На этом конструкция новых часов закончена. Часы работают. Удобно смотреть температуру и давление.

    Доработка конструкции часов
    Pic 11. Доработка конструкции часов

    Доработка

    Версия v3.5. Изменена функция fnSetParamMode – настраевыемый параметр меняет своё значение по кругу, если нажимать только какую-либо одну кнопку [MINUS] или [PLUS]

    Ниже изменённая функция, её можно скопировать и заменить ту, которая в проекте, либо скачать скетч v3.4 в Приложении.
      /**************************************************
         Функция: установка параметра в mode
         2022-04-16 Mr.ALB v1
         2022-06-13 Mr.ALB v2
       *************************************************/
      byte fnSetParamMode
      (
        byte  mode_param,      // Устанавливаемый параметр (+/-)
        byte  mode_param_min,  // Минимальное значение (+/-)
        byte  mode_param_max   // Максимальное значение
      )
      {
        if (fnScanButton(BT_PLUS))
        { // Нажата кнопка "Плюс"
          if (mode_param != mode_param_max) mode_param++;
          else
            mode_param = mode_param_min;
          fnClickButton(21);
        }
        if (fnScanButton(BT_MINUS))
        { // Нажата кнопка "Минус"
          if (mode_param != mode_param_min) mode_param--;
          else 
            mode_param = mode_param_max;
          fnClickButton(21);
        }
        delay(21);
        return  mode_param;
      }
    

    Версия v3.5 Сохранение флага активности будильника setAlarm в EEPROM, сделано для защиты от кратковременного пропадания напряжения питания.



    Версия v3.6. Изменена функция fnSetParamMode – добавлен выбор типа изменения параметра: циклически / не циклически. По умолчанию стоит значение true, если требуется чтобы параметр не менялся по кругу, задайте значение false. Скетч смотрите в Приложении. Код модифицированной функции смотрите ниже:
      /**************************************************
         Функция: установка параметра в mode
         2022-04-16 Mr.ALB v1
         2022-06-13 Mr.ALB v2
         2022-06-22 Mr.ALB v2.1
       *************************************************/
      byte fnSetParamMode
      (
        byte mode_param,      // Устанавливаемый параметр (+/-)
        byte mode_param_min,  // Минимальное значение (+/-)
        byte mode_param_max,  // Максимальное значение
        bool flag_cycl = true // Изменение параметра по кругу
      )
      {
        if (fnScanButton(BT_PLUS))
        { // Нажата кнопка "Плюс"
          if (mode_param != mode_param_max) mode_param++;
          else
            if (flag_cycl) mode_param = mode_param_min;
          fnClickButton(21);
        }
        if (fnScanButton(BT_MINUS))
        { // Нажата кнопка "Минус"
          if (mode_param != mode_param_min) mode_param--;
          else 
            if (flag_cycl) mode_param = mode_param_max;
          fnClickButton(21);
        }
        delay(21);
        return  mode_param;
      }
    


    Версия v3.7. Думается, что ещё можно сделать хорошего в уже работающей программе? Однако... Полная переделка программы. Устранение ошибки отсчёта времени для автоматического выхода в режим индикации текущей информации (mode=0). Для управления индикатором на основе TM1637 использована иная библиотека. Сокращён код основной программы. Библиотеку и скетч можно скачать ниже. И всё это благодаря тому, что пытался подружить мою Arduino на ATTiny24/44/84 с индикатором на TM1637. Там это вышло и сразу захотелось распространить на уже имеющиеся скетчи. За несколько часов всё переделал и отладил.

    Версия v3.71. У подписчиков возникли проблемы в выводом точек на индикаторе. Есть такие модификации индикаторов у которых точки не на 2-м разряде. Доработал библиотечный файл. Сейчас, при выводе часов, можно, по необходимости, включать все точки сразу. Попутно скетч был изменён и управление миганием точек идёт за счёт функции millis(). Прерывания по таймеру Timet1 убраны. Код программы сократился и упростился.

    Версия v3.61. Устранена ошибка в автоматическом выходе в режим индикации текущих значений (mode=0).

    Версия v3.71. Небольшие доработки небольших неудобств улыбка.

    Версия v3.72. По просьбам подписчиков добавлена автоматическая регулировка яркости индикатора. Соответственно добавлен 10-й параметр в меню для включения или отключения автоматической регулировки яркости. Изменение освещённости проверяется каждые 30 секунд, если освещённость изменилась, то регулируется яркость индикатора. Всего 4-е градации яркости: 1, 2, 3, 5. Проверялось на Arduino Nano ATMega328P, для LGT8F придётся изменить уровни, т.к. там максимальное значение 4096 (12 битное АЦП (0...4095)). Так же придётся подстроить уровни под свой фоторезистор. У меня делитель из фоторезистора R3 100кОм и резистора R4 20кОм.

    Схема v3.72, в которой реализована автоматическая регулировка яркости индикатора в зависимости от освещённости. Скетч можно скачать в Приложении.

    Схема электрическая принципиальная для скетча #28 v3.72
    Pic 12. Схема электрическая принципиальная для скетча #28 v3.72


    Версия v3.72. Улучшена автоматическая регулировка яркости индикатора. Архив в приложении обновлён.

    Версия v3.73. Добавлен 11-й пункт меню: Вкл./Откл. индикации давления*.


    Версия v3.74 Минималистичная версия: Просто часы с будильником и автоматической регулировкой яркости, которую можно отключить через меню. Размер скетча 8090 байт.

    Схема электрическая принципиальная для скетча #28 v3.74
    Pic 13. Схема электрическая принципиальная для скетча #28 v3.74

    Приложение

    Примечание:
    Наведите курсор на синюю звёздочку для чтения дополнительной информации.

    Используемые библиотеки и программы:

    В заключение можно сказать, что это, на данный момент, самая лучшая программа часов, в которой реализованы расширенные функции и, которая работает со всеми имеющимися у меня разновидностями Arduino и их клонами. Очень мне это нравится!

    2022-06-15
    Спасибо за внимание, Анатолий Беляев

    На развитие сайта и проектов Arduino

    Ниже на форме выберите/укажите сумму и источник перевода:
        Кошелёк Ю-money или
        Карта банка: Visa, MasterCard, МИР, Alfa-bank


    Yoomoney.ru (Яндекс.Деньги)  
    9516

    Другим способом оказать помощь на развитие сайта.


    . Mr.ALB

    . Mr.ALB
    Предыдущая страница Страница 29 Далее