За библиотеку спасибо, просмотрю и попробую применить
Или альтернатива ))
Вот я когда-то делал, был зелёный совсем, может и получше пример найдёте. Модуль RTC другой, но различий больших нет, всё аналогично. Вам нужно только одно прерывание, в примере это ISR( INT0_vect). Ещё проще посмотреть примеры “прерывания ардуино” (attachInterrupt).
https://arduino.ru/forum/pesochnitsa-razdel-dlya-novichkov/problemy-s-upravleniem-solnechnoi-batareei#comment-664147
Извращение какое-то выводить на семисегментнике дни недели. Пятница - ПА?
да, я бы ограничился номером дня недели
Через пару дней на форум придёт новичок с вопросом "Подскажите что в скетче не так? Не могу отобразить текст с прокруткой"
Да ладно! ПН bt CP Чt Пt CБ bc вполне.
Изврат какой-то )))
Мне тоже не нравится такое отображение. Напоминает про старую китайскую железяку с кривыми русскими буквами и исковерканным переводом. Лучше вообще без дня недели.
Ничего вы не понимаете в авангардизме.) Это же 7-ми сегментники!
На них и не такое изображают.
Эта библиотека хорошая? Здесь есть управление будильниками как писал ЕвгенийП, я уже начал переделывать под нее, завтра добавлю ShButton, проверю чтоб все работало и тогда буду переходить к прерываниям.
Обьявление переменных одного типа ведь можно делать в одну строку через запятые?
byte hours, minutes, seconds, DoW, date, month, year;
Можно, никто пока не запрещал.
Можно, только не факт, что year поместятся в байт.
Спойлер
У нас писарь в уезде был, в пачпортах год рождения одной только циферкой обозначал. Чернила, шельмец, вишь, экономил.
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;
}
}
}
}
Да, это на работу не повлияет
Кстати, я в свое время на основе этой библиотеки сделал свою, пошустрее и с меньшим расходом памяти