LED часы Arduino Nano 3.0, Ds3231,DHT11,MAX7219

Доброго времени суток! Хочу создать часы на семисегментных индикаторах с раздельными показаниями времени, даты, и температуры с влажностью. Прочитал книгу Белова А. В. “Arduino от азов программирования до создания практических устройств”, радиолюбительством занимаюсь с 7 класса, в основном повторением схем из сети, с контроллерами раньше не связывался. Решил попробовать сделать часы (всегда нравились часы на сегментах) на Ардуино и если получится то буду дальше пробовать. Пересмотрел много примеров, захотел сделать часы под мои задачи. Часы, минуты, секунды на большом дисплее, а дата, день недели, влажность и температура на отдельных семисегментных индикаторах. Заказ с али Arduino Nno v3, DS3231, DHT11, 200 ультраярких сид 5мм зеленого цвета. В местном интернет- магазине заказал 4 мс MAX7219. Изучил документацию и попробовал писать скетч. Есть несколько вопросов к опытным людям. 1. Не могу нормально сообразить установку времени кнопками, нужна помощь. По моэй логике при нажатии кнопки Set должен запускатся режым настройки, который взависимости от количества нажатий кнопки будет менять параметры для настройки, а кнопками Up и Down менять выбранный параметр + или -. Пример настройки и библиотеку брал с страницы Урок 18. Подключение RTC часы реального времени с кнопками - Описания, примеры, подключение к Arduino и пыталься добавить защиту от дребезга. В текущем состоянии скетча, при нажатии Set меняются поочередно с/м/ч/д/м/г/д.н. и к ним добавляется единица, на Up и Down не реакции. 2. Будет ли работать большой дисплей по схеме прилагаемой на картинке, и как я понимаю при таком включении потеряется авторегулировка яркости. DS3231 подключена к а4, А5; MAX 7219 D12, D11, D10; DHT11 к D5. Два модуля индикаторов по 8 разрядов собраны по схеме с даташыта из индикаторов, випаянных когдато с торговых весов. Большой индикатор собран на макетных платах с али по схеме с общим анодом, часы минуты 5 сид и 200 Ом резистор на сегмент, секунды - 4 сид и 400 Ом. В приложении: скетч, библиотека iarduino_rtc, схема управления большым индикатором, 8 разрядных индикаторов (не так развел мс, и пришлось паять не стой стороны, 100 пЙ и 10мкФ напаянны на мс ).






Вы приложили много труда и хочется вам помочь - но сейчас вы можете испротить все своим неправильным заходом в форум.

Текст в первом сообщении абсолютно нечитаем. Попробуйте разбить его на абзацы и четче выделить главную мысль - что именно вы пытаетесь сделать и в чем проблема.
Вопросы выделите в отдельный абзац и старайтесь формулировать яснее

2 лайка

Версия Arduino IDE 2.2.1. нем могу понять как добавить к сообщению архив

Как отредактировать отправленное сообщение, я первый раз на форуме?

зачем? что в нем?

Хочу предупредить, что не в традициях этого форума скачивать и распаковывать архивы, все должно быть выложено непосредственно в ветку.

Попробую написать первый пост заново.

Доброго времени суток! Хочу создать часы на семисегментных индикаторах с раздельными показаниями времени, даты, и температуры с влажностью. Прочитал книгу Белова А. В. “Arduino от азов программирования до создания практических устройств”, радиолюбительством занимаюсь с 7 класса, в основном повторением схем из сети, с контроллерами раньше не связывался. Решил попробовать сделать часы (всегда нравились часы на сегментах) на Ардуино и если получится то буду дальше пробовать.

Пересмотрел много примеров, захотел сделать часы под мои задачи. Часы, минуты, секунды на большом дисплее, а дата, день недели, влажность и температура на отдельных семисегментных индикаторах. Заказ с али Arduino Nаno v3, DS3231, DHT11, 200 ультраярких сид 5мм зеленого цвета. В местном интернет- магазине заказал 4 мс MAX7219. Изучил документацию и попробовал писать скетч. Есть несколько вопросов к опытным людям.

DS3231 подключена к а4, А5; MAX 7219 D12, D11, D10; DHT11 к D5. Два модуля индикаторов по 8 разрядов собраны по схеме с даташита из индикаторов, випаянных когдато с торговых весов, конденсаторы 100 пФ и 10мкФ напаянны на мс. Большой индикатор собран на макетных платах с али по схеме с общим анодом, часы и минуты 5 сид и 200 Ом резистор на сегмент, секунды - 4 сид и 400 Ом.

Есть два вопроса к знающим:

  1. Не могу нормально сообразить установку времени кнопками, нужна помощь.

По моей логике при нажатии кнопки Set должен запускатся режым настройки, который взависимости от количества нажатий кнопки будет менять параметры для настройки, а кнопками Up и Down менять выбранный параметр + или -. Пример настройки и библиотеку брал с страницы Урок 18. Подключение RTC часы реального времени с кнопками - Описания, примеры, подключение к Arduino и пыталься добавить защиту от дребезга. В текущем состоянии скетча, при нажатии Set меняются поочередно с/м/ч/д/м/г/д.н. и к ним добавляется единица, на Up и Down не реакции.

  1. Будет ли работать большой дисплей по схеме прилагаемой на картинке, и как я понимаю при таком включении потеряется авторегулировка яркости. Нужна подсказка по устройству внешней цепи регулировки яркости. Не могу понять как настраивается ток индикаторов в MAX7219, резистор Iset по даташиту 9.5к, нужно ли его подбирать под конкретный индикатор или ограничить уровень програмно?

Извиняюсь за неправильное редактирование, по форумам в основном только читаю, не создавал тем еще ни разу. Русский не мой родной, заранее извиняюсь за грамматические ошыбки.

Хотел приложить архив с библиотекой и файлами разводки схем .lay и схему управления большым индикатором в .spl7 но не разобрался как. Версия библиотеки iarduino_rtc 2.0.1, Arduino IDE 2.2.1. Заранее спасибо.

Как-то странно скетч вставился. Или это только я его так вижу - без полосы прокрутки?
Причём по кнопке “копировать” копируется правильно всё содержимое, там внизу ещё функция есть.

Но где в скетче кнопка входа в режим настроек проверяется, я так и не нашёл. Какой-то это не последний вариант скетча.

выбирайте противонапрвленные стрелки в окне кода (полный экран)

#include <LedControl.h>
#include <iarduino_RTC.h>
#include <DHT11.h>
#include <Wire.h>
LedControl LC = LedControl(12, 11, 10, 3);
iarduino_RTC watch(RTC_DS3231);                         
DHT11 dht11(5);
const int setButt = 4;
const int upButt = 3;
const int downButt = 2; 
const int brightSetPin = A0;
const int dividerDotsPin = 6;
int dividerDotsState = LOW;
int mode = 0;
long previousMillis = 0;       
void setup(){
   delay(300);                                                
  Serial.begin(9600);                                     
  watch.begin();
  Wire.begin();  
    for (int ledS=0; ledS<3; ledS++){
      LC.shutdown(ledS, false);
      LC.clearDisplay(ledS);} 
    for (int butts=2; butts<5; butts++){
     pinMode (butts, INPUT_PULLUP);} 
     pinMode (dividerDotsPin, OUTPUT); 
     //watch.settime(0,28,18,10,1,24,2)   ;                                   
}                                                           
void loop(){ 
  int brightSetVol = analogRead(brightSetPin) / 50;
    if (brightSetVol < 0){brightSetVol = 2;}
    for (int ledS=0; ledS<3; ledS++){
    LC.setIntensity(ledS, brightSetVol);}     
  int temperature = dht11.readTemperature();
  int humidity = dht11.readHumidity();
   watch.gettime(); 
    LC.setDigit(0,0,watch.Hours/10,false );
    LC.setDigit(0,1,watch.Hours%10,true);
    LC.setDigit(0,2,watch.minutes/10,false);
    LC.setDigit(0,3,watch.minutes%10,true);
    LC.setDigit(0,4,watch.seconds/10,false);
    LC.setDigit(0,5,watch.seconds%10,false);
    switch(watch.weekday){
      case 0:                             //  ПН
      LC.setRow(0,6,0b01110110);                   
      LC.setRow(0,7,0b00110111); break;
      case 1:                           //  ВТ
      LC.setRow(0,6,0b01111111);                      
      LC.setRow(0,7,0b00001111); break;
      case 2:                           //  СР
      LC.setRow(0,6,0b01001110);
      LC.setRow(0,7,0b01100111); break;
      case 3:                           //  ЧТ
      LC.setRow(0,6,0b00110011);
      LC.setRow(0,7,0b00001111); break;
      case 4:                          //  ПТ
      LC.setRow(0,6,0b01110110);
      LC.setRow(0,7,0b00001111); break;
      case 5:                         //  СБ
      LC.setRow(0,6,0b01001110);
      LC.setRow(0,7,0b00011111); break;
      case 6:                         //  НД 
      LC.setRow(0,6,0b00110111);
      LC.setRow(0,7,0b00111101); break;
    }  
    LC.setDigit(1,0,watch.day/10,false );
    LC.setDigit(1,1,watch.day%10,true);
    LC.setDigit(1,2,watch.month/10,false);
    LC.setDigit(1,3,watch.month%10,true);
    LC.setDigit(1,4,2,false);
    LC.setDigit(1,5,0,false); 
    LC.setDigit(1,6,watch.year/10,false);
    LC.setDigit(1,7,watch.year%10,false);
      if (temperature < 0) {
         LC.setRow(2,0,0b0000001);}
    LC.setDigit(2,1,temperature/10,false);
    LC.setDigit(2,2,temperature%10,false);
    LC.setRow(2,3,0b01100011);
    LC.setRow(2,4,0b01001110);
    LC.setDigit(2,5,humidity/10,false); 
    LC.setDigit(2,6,humidity%10,false);
    LC.setRow(2,7,0b00110111);

unsigned long currentMillis = millis(); 
int interval = 1000;   
  if(mode == 0 ){
    if(currentMillis - previousMillis >= interval) previousMillis = currentMillis;
    if (dividerDotsState == LOW)dividerDotsState = HIGH;
    else  dividerDotsState = LOW;
    digitalWrite(dividerDotsPin, dividerDotsState);}
  
  ButtonSetControl();
  }
  void ButtonSetControl(){  
  bool setFlag = LOW;
  bool upFlag = LOW;
  bool downFlag = LOW;
 
  if(mode){
      watch.blinktime(mode,2);    
    if (digitalRead(upButt == LOW && upFlag == LOW)){
        upFlag = HIGH;
             switch (mode){ 
      /* сек */ case 1: watch.settime(0,                                   -1, -1, -1, -1, -1, -1);   break;
      /* мин */ case 2: watch.settime(-1, (watch.minutes==59?0:watch.minutes+1), -1, -1, -1, -1, -1); break;
      /* час */ case 3: watch.settime(-1, -1, (watch.Hours==23?0:watch.Hours+1),     -1, -1, -1, -1); break;
      /* дни */ case 4: watch.settime(-1, -1, -1, (watch.day==31?1:watch.day+1),         -1, -1, -1); break;
      /* мес */ case 5: watch.settime(-1, -1, -1, -1, (watch.month==12?1:watch.month+1),     -1, -1); break;
      /* год */ case 6: watch.settime(-1, -1, -1, -1, -1, (watch.year==99?0:watch.year+1),       -1); break;
      /* д.н.*/ case 7: watch.settime(-1, -1, -1, -1, -1, -1, (watch.weekday==6?0:watch.weekday+1) ); break;}
          }
           if(digitalRead(upButt) == HIGH && upFlag == HIGH){upFlag = LOW;}
    if(digitalRead(downButt) == LOW && downFlag == LOW ){
         downFlag = HIGH;
          switch (mode)
                {                                   
      /* сек */ case 1: watch.settime(0,                                   -1, -1, -1, -1, -1, -1);   break;
      /* мин */ case 2: watch.settime(-1, (watch.minutes==0?59:watch.minutes-1), -1, -1, -1, -1, -1); break;
      /* час */ case 3: watch.settime(-1, -1, (watch.Hours==0?23:watch.Hours-1),     -1, -1, -1, -1); break;
      /* дни */ case 4: watch.settime(-1, -1, -1, (watch.day==1?31:watch.day-1),         -1, -1, -1); break;
      /* мес */ case 5: watch.settime(-1, -1, -1, -1, (watch.month==1?12:watch.month-1),     -1, -1); break;
      /* год */ case 6: watch.settime(-1, -1, -1, -1, -1, (watch.year==0?99:watch.year-1),       -1); break;
      /* д.н.*/ case 7: watch.settime(-1, -1, -1, -1, -1, -1, (watch.weekday==0?6:watch.weekday-1) ); break;}
      }
         if(digitalRead(downButt) == HIGH && downFlag == HIGH){downFlag = LOW;}
      }
    return; }


Встречно-отвергнутые? :smiley:

1 лайк

Также вставляется. Больше 95 строчки не показывает.

Ну ка я попробую:
Не, тоже больше 95 не показывает и прокрутки нет (хотя я отформатировал и на превью всё видно)…

Вы задаёте категорически не те вопросы, правда.

Это не вопрос.

Может и будет, но вопрос совсем не тот, который Вам бы надо задать.

Вам бы лучше начать не с этих вопросов, а с проекта. Вот тут бы Вы могли получить реально ценную помощь и половина Ваших нынешних вопросов бы отпала сама собой.

Вот, например, Вы пишете

Зачем она Вам? В смысле не подсказка, а “внешняя цепь”? 7219 имеет цифровое управление яркостью через регистр “Intensity”. Вот и пользуйтесь им. Резистор ставьте на максималку (20mA), а яркостью управляйте программно. Благодаря такому подходу, вы тут же получаете бесплатную “вкусняшку” - возможность поставить копеечный фототранзистор и автоматически управлять яркостью в зависимости от текущей освещённости в помещении, чтобы ночью не слепило.

И таких моментов много. Например, я бы не стал вообще использовать светодиоды и 7219, а поставил бы такие же 5мм адресные светодиоды. “Вкусняшки” - на порядок меньше проводов/дорожек и соединений, а также возможность изменять цвета и яркость каждого светодиода в отдельности (Вы знаете, что точки в двоеточии должны быть немножко менее яркими, чем цифры - органичнее смотрится). Можно, например, сделать, чтобы цифры краснели перед срабатыванием будильника или какие-то температурные “зашквары” выделять тем же цветом, например.

Я бы начал с обсуждения проекта, а не с обсуждения частных вопросов, которые нужно решать на фоне неудачно принятых проектных решений.

:slight_smile:
Столько сделано и бац… умные светодиоды.

1 лайк

ои дорогие не напасесся :slight_smile:

Согласен с вами по всем вопросам. Вся работа стала через недоработанный проект.

Регулировку яркости программно я задействовал через делитель из фоторезистора с А0 на 5В и 10к резистора с А0 на общий. Просто на основном дисплее теряется программная регулировка, ведь на сколько я понял при инверсии через 2003А ШИМ с МАХ уже не работает. Точки разделителя планирую подключить через ключ на 2 транзисторах и яркость изменять не планирую, подберу резистор по визуальному восприятию яркости.

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

Я выбрал именно эту библиотеку потому, что в ней есть функцыя blinktime(), которая позволяет мигать устанавливаемім значением, и вроде она показалась мне проще (но мигать параметрами пока не удалось).

Этот скетч уже далеко не первый, я пытался приспособить код из ссылки указанной в описании, уже с неделю потратил на его изучение и адаптацию и пока не могу заставить его работать. Это основная проблема, 50% работы сделано, вывод данных на дисплей работает. Хотя МАХ7219 мне не нравится, больше с ней связыватся не буду. Подкупило то, что с ней можно сделать много дополнительных экранов для вывода информации.

В матрице 8 на 32 выходит 4 р. штука.
VID_20220807_174907
VID_20220807_180947

Видите ли, по сравнением с ценой программы цена аппаратной части пренебрежимо мала.
Поэтому, чтобы упростить программу имеет смысл выкинуть то, что купили, и заменить тем, что упростит программирование.

1 лайк

Мне вот такие понравились. Но побоялся что китайцы большой ток пускают на индикаторы и прийдется резисторы перепаивать да и дороговато, но я уже нагородил огород больше половины их стоимости.

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

Вы меня лучше подтолкните к правильному решению задачи с настройко или ткните в пример похожей реализации, пожалуйста.