Спойлер
Не понятно , что вы хотите делать 1 раз в секунду.
У вас получается, просто присваиваете previousMillis = currentMillis;, и больше ничего
Спойлер
Функцию ButtonSetControl() так и не выложили
Не понятно , что вы хотите делать 1 раз в секунду.
У вас получается, просто присваиваете previousMillis = currentMillis;, и больше ничего
Функцию ButtonSetControl() так и не выложили
Вот вот…))
Я когда-то давно на старом форуме тоже выкладывал свои часы на MAX7219. Они правда на матрицах, но может что-нибудь вас интересующее там найдёте в части настройки кнопками.
Хочу показать как я сделал установку времени с помощью двух кнопок (часы, минуты). Может есть более простые методы? И вообще насколько правилен мой подход? Использую планировщик, запускается раз в 90 мс, вызывает процедуру обрабатывающую нажатие кнопок. Применительно к часам, при нажатии кнопки часы прибавляется единица к текущему времени, изменённое время устанавливается в DS3231 и отображается на индикаторе. В приведённой программе специально всё упростил, выкинул всё лишнее. Оставил вывод на Serial сообщения о нажатии кнопки.
#include <Tasker.h> //https://github.com/joysfera/arduino-tasker
#include <Debounce.h> //https://github.com/wkoch/Debounce
#define TASKER_MAX_TASKS 7
Tasker tasker;
const byte HourPin = 6;
const byte MinutePin = 7;
Debounce ButtonHour(HourPin);
Debounce ButtonMinute(MinutePin);
int hourKorr, minuteKorr, currHour, currMinute;
void setup() {
tasker.setInterval(buttonsCheck, 90);
Serial.begin(9600);
void loop() {
tasker.loop();
Serial.println("Программа крутится в цикле");
}
void buttonsCheck() {
if (ButtonHour.justPressed()) {
hourKorr=currHour+1;
if (hourKorr>23) hourKorr=0;
// watch.settime(-1,-1,hourKorr,-1,-1,-1,-1); // Записываем время в модуль: сек, мин, час, число, месяц, год четыре цифры, день недели. "-1" - параметр не изменяем
// writeArduinoOn7Segment(); // Отображаем на 7Seg
Serial.println("Нажали кнопку часы");
delay(2000);
}
if (ButtonMinute.justPressed()) {
minuteKorr=currMinute+1;
if (minuteKorr>59) minuteKorr=0;
// watch.settime(0,minuteKorr,-1,-1,-1,-1,-1); // Записываем время в модуль: сек, мин, час, число, месяц, год четыре цифры, день недели. "-1" - параметр не изменяем
// writeArduinoOn7Segment(); // Отображаем на 7Seg
Serial.println("Нажали кнопку минуты");
delay(2000);
}
}
void ButtonSetControl(){
bool setFlag = LOW;
bool upFlag = LOW;
bool downFlag = LOW;
watch.blinktime(mode,2);
if(digitalRead(setButt) == LOW && setFlag == LOW ){
setFlag = 1;
mode++;
if(mode > 7){mode=0;}
if(digitalRead(setButt) == HIGH && setFlag == HIGH){
setFlag = LOW;}
if(mode){
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;
}
}
}
unsigned long currentMillis = millis();
int interval = 1000;
if(mode == 0 ){
if(currentMillis - previousMillis >= interval){
previousMillis = currentMillis;
dividerDotsState = !dividerDotsState;
digitalWrite(dividerDotsPin, dividerDotsState);}
else
dividerDotsState = LOW;
}
``` так лучше?
else пожалуй лишний
Пожалуй
Как бы теперь можно и проверить, мигают ли разделительные точки с заданной частотой 0.5 Гц?)))
могу посоветовать такую последовательность действий (я бы сделал так)выбросьте все и для начала добейтесь нормального вывода знаков на индикатор, потом прикрутите мигание нужных разрядов, потом ууправлениие кнопками и т.д…
Попытался сделать минимальный рабочий скетч с RTC, чтобы как можно меньше изменять ваш исходный.
Дело это непростое))) За дефицитом времени - сокращённый вариант, только секунды , минуты и часы. По аналогии несложно будет сделать. Мигалку не трогал и не проверял, т.к. вывод в сериал, если делать , то по другому. У меня в Proteus нет ds3231, делал на ds1302, не проблема поменять.
По поводу библиотеки советую почитать здесь #3
https://forum.arduino.ru/t/ne-rabotaet-vremya-na-module-chasov-realnogo-vremeni-ds1302/12811/3
#include <iarduino_RTC.h>
iarduino_RTC watch(RTC_DS1302, 2, 3, 4);
//заменить на нужный модуль
#define sek_ TIME[0]
#define min_ TIME[1]
#define hour_ TIME[2]
#define day_ TIME[3]
#define mon_ TIME[4]
#define year_ TIME[5]
#define wday_ TIME[6]
const int setButt = 5;
const int upButt = 6;
const int downButt = 7;
int mode = 0;
bool setFlag = LOW;
byte TIME[7] = {0, 51, 21, 27, 10, 15, 2};
//массив для хранения времени
unsigned long buttonTimer = 0;
void printTime();
void checkTime();
void ButtonSetControl();
void setup() {
for (int butts = 5; butts < 8; butts++) {
pinMode (butts, INPUT_PULLUP);
}
delay(300);
Serial.begin(9600);
delay(300);
watch.begin();
watch.settime(sek_, min_, hour_, day_, mon_, year_, wday_);
}
void loop() {
static byte tik = 0;
if (millis() - buttonTimer > 20) {
buttonTimer = millis();
ButtonSetControl();
if (tik >= 50) {
if (!setFlag) {
checkTime();
}
printTime();
tik = 0;
}
tik++;
}
}
void checkTime() {
watch. gettime();
sek_ = watch.seconds;
min_ = watch.minutes;
hour_ = watch.Hours;
}
void printTime() {
for (int poz = 2; poz >= 0; poz--) {
Serial.print(TIME[poz]);
Serial.print(" ");
}
Serial.println();
}
void ButtonSetControl() {
static byte setButtstat = 0;
static bool upFlag = LOW;
static bool downFlag = LOW;
watch.blinktime(mode, 2);
int setBUTTON = digitalRead(setButt);
//отрабатываем все возможные состояния кнопки SET
// 4 нажатия и 4 отпускания(сокращённый вариант: сек, мин, час)
if (setBUTTON == LOW && setButtstat == 0 ) {
setFlag = true;
setButtstat = 1;
mode = 1;
}
if (setBUTTON == HIGH && setButtstat == 1) {
setButtstat = 2;
}
if (setBUTTON == LOW && setButtstat == 2) {
setButtstat = 3;
mode = 2;
}
if (setBUTTON == HIGH && setButtstat == 3) {
setButtstat = 4;
}
if (setBUTTON == LOW && setButtstat == 4) {
setButtstat = 5;
mode = 3;
}
if (setBUTTON == HIGH && setButtstat == 5) {
setButtstat = 6;
}
if (setBUTTON == LOW && setButtstat == 6) {
setButtstat = 7;
mode = 0;
}
if (setBUTTON == HIGH && setButtstat == 7) {
setButtstat = 0;
setFlag = false;
watch.settime(sek_,min_, hour_, -1, -1, -1, -1);//
// устанавливаем время непосредственно перед выходом из меню
//чтобы не убежало)))
}
if (mode) {
int upBUTTON = digitalRead(upButt);
if (upBUTTON == LOW && upFlag == LOW) {
upFlag = HIGH;
switch (mode) {
/* сек */ case 1: sek_ += 1; if (sek_ > 59)sek_ = 0; break;
/* мин */ case 2: min_ += 1; if (min_ > 59)min_ = 0; break;
/* час */ case 3: hour_ += 1; if (hour_ > 23)hour_ = 0; 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 (upBUTTON == HIGH && upFlag == HIGH) {
upFlag = LOW;
}
int downBUTTON = digitalRead(downButt);
if (downBUTTON == LOW && downFlag == LOW ) {
downFlag = HIGH;
switch (mode)
{
/* сек */ case 1: if (sek_ < 2 )sek_ = 1; sek_ -= 1; break;
/* мин */ case 2: if (min_ < 2 )min_ = 1; min_ -= 1; break;
/* час */ case 3: if (hour_ < 2 )hour_ = 1; hour_ -= 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 (downBUTTON == HIGH && downFlag == HIGH) {
downFlag = LOW;
}
//return;
}
}
Я немного переделал управление с прмошью сторонней библиотеки virtual button (показалась вроде попроще) и установка времени заработала с тем кодом что есть. Днем вылоду что получилось. Насчет библиотеки, я так понял конкретно эту использовать не стоит? Тут есть еще один прикол, секунды на дисплее показываются както странно, иногда нужная цыфра загорается немного раньше но за ней следующяя уже нормально. Точность хода не сбивается, но выглядит немного странно… Может ли это быть изза библиотеки или это проблема с передачей данных на драйвер?
Нам, любителям, полезно прислушаться к профессионалам, хотя я не люблю бросать дело на пол-пути. Я бы допилил что есть, а в “следующей версии прошивки” уже делал по другому.
Может и в библиотеке, а может, и, скорее всего, в криво написанном коде
#include <LedControl.h>
#include <iarduino_RTC.h>
#include <DHT11.h>
#include <Wire.h>
#include <VirtualButton.h>
struct MyBtn : public VButton {
MyBtn(uint8_t pin) {
_pin = pin;
pinMode(_pin, INPUT_PULLUP);
}
bool tick() {
return poll(!digitalRead(_pin));
}
uint8_t _pin;
};
MyBtn setButt (2);
MyBtn upButt(3);
MyBtn downButt (4);
LedControl LC = LedControl(12, 11, 10, 3);
iarduino_RTC watch(RTC_DS3231);
DHT11 dht11(5);
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);}
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();
watch.blinktime(mode);
setButt.tick();
upButt.tick();
downButt.tick();
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;
dividerDotsState = !dividerDotsState;
digitalWrite(dividerDotsPin, dividerDotsState);}
if(mode!= 0){
digitalWrite(dividerDotsPin,LOW);}
}
Serial.println(mode);
ButtonSetControl();
}
void ButtonSetControl(){
bool setFlag = LOW;
bool upFlag = LOW;
bool downFlag = LOW;
if ((setButt.click())||(setButt.step())){
mode++;
if(mode > 7){mode=0;}
}
if(mode){
if ((upButt.click())||(upButt.step())){
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 ((downButt.click())||(downButt.step())){
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;}
}
}
return;
}
unsigned long currentMillis = millis();
int interval = 1000;
if(mode == 0 ){
if(currentMillis - previousMillis >= interval){
previousMillis = currentMillis;
dividerDotsState = !dividerDotsState;
digitalWrite(dividerDotsPin, dividerDotsState);}
if(mode!= 0){
digitalWrite(dividerDotsPin,LOW);}
}
Serial.println(mode);
ButtonSetControl();
}
void ButtonSetControl(){
bool setFlag = LOW;
bool upFlag = LOW;
bool downFlag = LOW;
if ((setButt.click())||(setButt.step())){
mode++;
if(mode > 7){mode=0;}
}
if(mode){
if ((upButt.click())||(upButt.step())){
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 ((downButt.click())||(downButt.step())){
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;}
}
}
return;
Сейчас почему-то не могу заставить работать мигание устанавливаемым параметром watch.blinktime().
Кнопки срабатывают с задержкой где то 1-2 сек, что не очень удобно, надо еще посмотреть настройки в библиотеке virtualButton. Понял что выбрал не лучшие библиотеки, но их в IDE много и новичку не сразу понятно что из них лучше не использовать.
Подскажите, что делать с странным отображением секунд,
вводить задержку перед отображением или все таки сменить библиотеку?
Текущая обстановка:
Ардуина, кнопки, RTC, датчик температуры, делитель с фоторезистором и прототип разделителя в виде одного светодиода на макетной плате;
Проводами подключены последовательно 2 самостоятельно собранных 8-ми разрядных индикатора на MAX7219 и б/у семисегментниках;
Скетч работает, но:
а) Странно отображает секунды;
б)Не хочет мигать устанавливаемым параметром (игрался с функцией библиотеки но пока не добился нужного результата);
в)Работа кнопок с великоватой задержкой, не очень удобно управлять, хотя и работает.
Завтра в выходной буду разбиратся с основным большим дисплеем на светодидах и его огороде.
Пока на работе не покупателей, убрал лишнее из кода и снабдил его комментариями так как я его понимаю.
#include <LedControl.h> // Подключение библиотек
#include <iarduino_RTC.h>
#include <DHT11.h>
#include <Wire.h>
#include <VirtualButton.h>
struct MyBtn : public VButton { // Настройка Virtual_Button
MyBtn(uint8_t pin) {
_pin = pin;
pinMode(_pin, INPUT_PULLUP);
}
bool tick() {
return poll(!digitalRead(_pin));
}
uint8_t _pin;
};
MyBtn setButt (2); // Обявление кнопок
MyBtn upButt(3);
MyBtn downButt (4);
LedControl LC = LedControl(12, 11, 10, 3); // Обьявление типа RTC и ее подключение к модулю
iarduino_RTC watch(RTC_DS3231); // Указание датчика темп./влажности и его подключение
DHT11 dht11(5);
const int brightSetPin = A0; // Обьявление пина для датчика света (фоторезистор)
const int dividerDotsPin = 6; // Обьявление пина разделител. точек (будет управлятся через ключ)
int dividerDotsState = LOW; // Переменная для хранениясостояния раздел. точек
int mode = 0; // Переменная для хранения состояния режима настройки
long previousMillis = 0; // Переменная для хранения состояния текущего времени для работы разд.
void setup(){
delay(300); // Задержка для иициализации LCD из примера, нужна ли здесь?
Serial.begin(9600); // Инициал. вывода в посл. порт для отладки через монитор порта
watch.begin(); // Инициал. работи модуля RTC
Wire.begin(); // Инициал. в I2C, вроде как нужна подключенных библиотек
for (int ledS=0; ledS<3; ledS++){ // Вывод всех дисплеев с спящего режыма и их очистка
LC.shutdown(ledS, false);
LC.clearDisplay(ledS);}
pinMode (dividerDotsPin, OUTPUT); // Настройка пина раздел. точек
//watch.settime(0,28,18,10,1,24,2) ; // Начальная установка времени в RTC(используется только один раз при
// при первой прощивке, после прошиваетсяс закоментированной строчкой )
}
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(); // Получение времени с RTC в виде цыфровых значений
watch.blinktime(mode); // Заставляе gettime() мигать устанавливаемым параметром (пока не
setButt.tick(); // разобрался где его лучше поместить)
upButt.tick(); // Запуск обработчика кнопок для каждой из них
downButt.tick();
LC.setDigit(0,0,watch.Hours/10,false ); // Вывод на 1-ый дисплей времени и дня недели
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){ // Вывод дня недели в виде 2-ух символов
case 0: // ПН (ПH)
LC.setRow(0,6,0b01110110);
LC.setRow(0,7,0b00110111); break;
case 1: // ВТ (8t)
LC.setRow(0,6,0b01111111);
LC.setRow(0,7,0b00001111); break;
case 2: // СР (CP)
LC.setRow(0,6,0b01001110);
LC.setRow(0,7,0b01100111); break;
case 3: // ЧТ (4t)
LC.setRow(0,6,0b00110011);
LC.setRow(0,7,0b00001111); break;
case 4: // ПТ (Пt)
LC.setRow(0,6,0b01110110);
LC.setRow(0,7,0b00001111); break;
case 5: // СБ (Cb)
LC.setRow(0,6,0b01001110);
LC.setRow(0,7,0b00011111); break;
case 6: // НД (Hd)
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); // 2 В качестве тысяных года
LC.setDigit(1,5,0,false); // 0 В качестве сотых года, работа после 2100 года не нужна
LC.setDigit(1,6,watch.year/10,false); // Пускай хотяб лет 5 поработают...
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;
dividerDotsState = !dividerDotsState;
digitalWrite(dividerDotsPin, dividerDotsState);} // Принудительное гашение разделителя в режымах настройки
if(mode!= 0){
digitalWrite(dividerDotsPin,LOW);}
}
Serial.println(mode); // Вывод режима в порт для отладки пока не работает blinktime
ButtonSetControl(); // Передача упраления на функцию установки времени кнопками
}
void ButtonSetControl(){
if ((setButt.click())||(setButt.step())){ // Обработка нажатия кнопки установки и переключение режымов
mode++;
if(mode > 7){mode=0;}
}
if(mode){
if ((upButt.click())||(upButt.step())){ // Обработка нажатия кнопки вверх, работа на нажатие и удержание
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 ((downButt.click())||(downButt.step())){ // Обработка нажатия кнопки вниз, работа на нажатие и удержание
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;}
}
}
return; // Выход из функции настройки времени кнопками
}
LC.setRow(2,7,0b00110111); // Вывод значка влажности Н
unsigned long currentMillis = millis(); // Настройка мигания разделителя в рабочем режыме
int interval = 1000;
if(mode == 0 ){
if(currentMillis - previousMillis >= interval){
previousMillis = currentMillis;
dividerDotsState = !dividerDotsState;
digitalWrite(dividerDotsPin, dividerDotsState);} // Принудительное гашение разделителя в режымах настройки
if(mode!= 0){
digitalWrite(dividerDotsPin,LOW);}
}
Serial.println(mode); // Вывод режима в порт для отладки пока не работает blinktime
ButtonSetControl(); // Передача упраления на функцию установки времени кнопками
}
void ButtonSetControl(){
if ((setButt.click())||(setButt.step())){ // Обработка нажатия кнопки установки и переключение режымов
mode++;
if(mode > 7){mode=0;}
}
if(mode){
if ((upButt.click())||(upButt.step())){ // Обработка нажатия кнопки вверх, работа на нажатие и удержание
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 ((downButt.click())||(downButt.step())){ // Обработка нажатия кнопки вниз, работа на нажатие и удержание
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;}
}
}
return; // Выход из функции настройки времени кнопками
}