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

За библиотеку спасибо, просмотрю и попробую применить

Или альтернатива ))

Вот я когда-то делал, был зелёный совсем, может и получше пример найдёте. Модуль RTC другой, но различий больших нет, всё аналогично. Вам нужно только одно прерывание, в примере это ISR( INT0_vect). Ещё проще посмотреть примеры “прерывания ардуино” (attachInterrupt).
https://arduino.ru/forum/pesochnitsa-razdel-dlya-novichkov/problemy-s-upravleniem-solnechnoi-batareei#comment-664147

Извращение какое-то выводить на семисегментнике дни недели. Пятница - ПА?

да, я бы ограничился номером дня недели

Через пару дней на форум придёт новичок с вопросом "Подскажите что в скетче не так? Не могу отобразить текст с прокруткой":smile:

Да ладно! ПН bt CP Чt Пt CБ bc вполне.

Изврат какой-то )))

3 лайка

Мне тоже не нравится такое отображение. Напоминает про старую китайскую железяку с кривыми русскими буквами и исковерканным переводом. Лучше вообще без дня недели.

Ничего вы не понимаете в авангардизме.) Это же 7-ми сегментники!
На них и не такое изображают.
image

2 лайка

5 лайков

Эта библиотека хорошая? Здесь есть управление будильниками как писал ЕвгенийП, я уже начал переделывать под нее, завтра добавлю ShButton, проверю чтоб все работало и тогда буду переходить к прерываниям.

Обьявление переменных одного типа ведь можно делать в одну строку через запятые?
byte hours, minutes, seconds, DoW, date, month, year;

Можно, никто пока не запрещал.

Можно, только не факт, что year поместятся в байт.

Спойлер

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

2 лайка

shButton в предупреждениях выдает такой текст:

In file included from C:\Users\Win1251\AppData\Local\Arduino15\RemoteSketchbook\ArduinoCloud\275b2b69-ee1a-4696-8345-9e80ce3573b0\sketch_jan6a\sketch_jan6a.ino:5:0:
c:\Users\Win1251\Documents\Arduino\libraries\shButton/shButton.h: In member function ‘uint8_t shButton::getButtonFlag(bool)’:
c:\Users\Win1251\Documents\Arduino\libraries\shButton/shButton.h:213:39: warning: unused parameter ‘_clear’ [-Wunused-parameter]
uint8_t getButtonFlag(bool _clear = false)
^~~~~
c:\Users\Win1251\Documents\Arduino\libraries\shButton/shButton.h: In member function ‘void shButton::setButtonFlag(uint8_t)’:
c:\Users\Win1251\Documents\Arduino\libraries\shButton/shButton.h:231:30: warning: unused parameter ‘_flag’ [-Wunused-parameter]
void setButtonFlag(uint8_t _flag)

Пользовательские флаги мне пока не нужны , можно это исправить или просто игнорировать?

Скетч::

#include <LedControl.h>
#include <DHT11.h>
#include <Wire.h>
#include <DS3231.h>
#include <shButton.h>
DS3231 myRTC;
LedControl LC = LedControl(12, 11, 10, 3);
DHT11 dht11(6);
bool century = false;
bool h12Flag;
bool pmFlag;
byte hours, minutes, seconds, DoW, date, month, year;
const int brightSetPin = A0;
byte mode = 0;
long previousMillis = 0;
unsigned long buttonTimer = 0;
unsigned long tempHumidityTimer = 0;
unsigned long emptyTimer = 0;
int temperature = 0;
int humidity    = 0;
shButton setButt(3);
shButton upButt(4);
shButton downButt(5);
void ButtonSetControl();
void ShowTime();
void CheckTime();
void ShowEmptyPlace();
void setup() {
  Serial.begin(9600);
  Wire.begin();
  for (int ledS = 0; ledS < 3; ledS++) {
    LC.shutdown(ledS, false);
    LC.clearDisplay(ledS);
  }
  myRTC.setClockMode(false);
}
void loop() {
  static byte tik = 0;
  if (millis() - buttonTimer > 20) {
    buttonTimer = millis();
    ButtonSetControl();
    if (tik >= 25) {
      CheckTime();
      ShowTime();
      tik = 0;
    }
    tik++;
  }
  if (millis() - tempHumidityTimer > 30000) {
    tempHumidityTimer = millis();
    temperature = dht11.readTemperature();
    humidity = dht11.readHumidity();
  }
  Serial.println(mode);
}
void CheckTime() {
  hours = myRTC.getHour(h12Flag, pmFlag);
  minutes = myRTC.getMinute();
  seconds = myRTC.getSecond();
  DoW = myRTC.getDoW();
  date = myRTC.getDate();
  month = myRTC.getMonth(century);
  year = myRTC.getYear();
 }
void ShowTime() {
  int brightSetVol = analogRead(brightSetPin) / 50;
  if (brightSetVol < 0) { brightSetVol = 2; }
  for (int ledS = 0; ledS < 3; ledS++) {
    LC.setIntensity(ledS, brightSetVol);
  }
  LC.setDigit(0, 0, hours / 10, false);
  LC.setDigit(0, 1, hours % 10, true);
  LC.setDigit(0, 2, minutes / 10, false);
  LC.setDigit(0, 3, minutes % 10, true);
  LC.setDigit(0, 4, seconds / 10, false);
  LC.setDigit(0, 5, seconds % 10, false);
  switch (DoW) {
    case 1:  //  ПН
      LC.setRow(0, 6, 0b01110110);
      LC.setRow(0, 7, 0b00110111);
      break;
    case 2:  //  ВТ
      LC.setRow(0, 6, 0b01111111);
      LC.setRow(0, 7, 0b00001111);
      break;
    case 3:  //  СР
      LC.setRow(0, 6, 0b01001110);
      LC.setRow(0, 7, 0b01100111);
      break;
    case 4:  //  ЧТ
      LC.setRow(0, 6, 0b00110011);
      LC.setRow(0, 7, 0b00001111);
      break;
    case 5:  //  ПТ
      LC.setRow(0, 6, 0b01110110);
      LC.setRow(0, 7, 0b00001111);
      break;
    case 6:  //  СБ
      LC.setRow(0, 6, 0b01001110);
      LC.setRow(0, 7, 0b00011111);
      break;
    case 7:  //  НД
      LC.setRow(0, 6, 0b00110111);
      LC.setRow(0, 7, 0b00111101);
      break;
  }
  LC.setDigit(1, 0, date / 10, false);
  LC.setDigit(1, 1, date % 10, true);
  LC.setDigit(1, 2, month / 10, false);
  LC.setDigit(1, 3, month % 10, true);
  LC.setDigit(1, 4, 2, false);
  LC.setDigit(1, 5, 0, false);
  LC.setDigit(1, 6, year / 10, false);
  LC.setDigit(1, 7, 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);
}
void ButtonSetControl() {
 if (setButt.getButtonState() == BTN_UP ){
    mode++;
      if (mode >= 8){
        mode = 0;
      }
  }
   
if (mode) {
  if (upButt.getButtonState() == BTN_UP){
    switch (mode) {
        /* сек */ case 1:
          myRTC.setSecond(0);
        break;
        /* мин */ case 2:
          myRTC.setMinute(minutes == 59 ? 0 : minutes +1);
          break;
        /* час */ case 3:
          myRTC.setHour(hours == 23 ? 0 : hours + 1);
          break;
        /* дни */ case 4:
          myRTC.setDate(date == 31 ? 1 : date +1);
          break;
        /* мес */ case 5:
          myRTC.setMonth(month == 12 ? 1 : month +1);
          break;
        /* год */ case 6:
          myRTC.setYear(year == 99 ? 0 : year + 1);
         break;
        /* д.н.*/ case 7:
          myRTC.setDoW(DoW == 7 ? 1 : DoW + 1);
          break;
    }
  }
  if (downButt.getButtonState() ==  BTN_UP) {
       switch (mode) {
      /* сек */ case 1:
        myRTC.setSecond(0);
        break;
      /* мин */ case 2:
        myRTC.setMinute(minutes == 0 ? 59 : minutes - 1);
        break;
      /* час */ case 3:
        myRTC.setHour(hours == 0 ? 23 : hours - 1);
        break;
      /* дни */ case 4:
        myRTC.setDate(date == 1 ? 31 : hours - 1);
        break;
      /* мес */ case 5:
        myRTC.setMonth(month == 1 ? 12 : month - 1);
        break;
      /* год */ case 6:
        myRTC.setYear(year == 1 ? 99 : year - 1);
        break;
      /* д.н.*/ case 7:
        myRTC.setDoW(DoW == 1 ? 7 : DoW - 1);
        break;
    }
  }
}
ShowEmptyPlace();
}
void ShowEmptyPlace() {
  if (mode) {
    if (millis() - emptyTimer > 1000) {
      emptyTimer = millis();
      switch (mode) {
        case 1:
          LC.setChar(0, 5, 0b0100000, false);
          LC.setChar(0, 4, 0b0100000, false);
          break;
        case 2:
          LC.setChar(0, 2, 0b0100000, false);
          LC.setChar(0, 3, 0b0100000, true);
          break;
        case 3:
          LC.setChar(0, 0, 0b0100000, false);
          LC.setChar(0, 1, 0b0100000, true);
          break;
        case 4:
          LC.setChar(1, 0, 0b0100000, false);
          LC.setChar(1, 1, 0b0100000, true);
          break;
        case 5:
          LC.setChar(1, 2, 0b0100000, false);
          LC.setChar(1, 3, 0b0100000, true);
          break;
        case 6:
          LC.setChar(1, 6, 0b0100000, false);
          LC.setChar(1, 7, 0b0100000, false);
          break;
        case 7:
          LC.setChar(0, 6, 0b0100000, false);
          LC.setChar(0, 7, 0b0100000, false);
          break;
      }
    }
  }
}

Да, это на работу не повлияет

Кстати, я в свое время на основе этой библиотеки сделал свою, пошустрее и с меньшим расходом памяти