железо:
RTC DS3132
Arduin (UNO, NANO Digisprak)
LCD 1602 I2C
Encoder china круглый высоки TYPE2
Relay синее
Проблемка 0
когда уменьшаем значение 11, 10, 90, 80 показывает. то есть 0 от цифры 10 не убирается.
Проблемка 1
констрайн (значение, 0, 59) видимо не работает. так как на экране у меня начинают и трехзначные цифры вылазить и боротся с lcd.print("<"); поставил костыль присваивание If (OnTime > 59) {OnTime = 59}
проблемка 2.
меню индикатор "<" остается в обоих пунктах. пока поставил косыль
проблемка 3
энкодер пропускает шаги. с энкодерами не имел еще дел, чего то я не знаю
что то где то я написал не граммотно. хотелось бы учится сразу грамоте, а не применению костылей.
RTC DS3132
Arduin (UNO, NANO Digisprak)
LCD 1602 I2C
Encoder china круглый высоки TYPE2
Relay синее
C++:
#include <GyverEncoder.h>
#include <DS3231.h>
#include <LiquidCrystal_I2C.h>
Encoder enc(4, 3, 5, TYPE2);
DS3231 rtc(SDA, SCL);
LiquidCrystal_I2C lcd(0x27,16,2);
Time t;
int Relay = 2;
byte OnTime = 0;
byte OffTime;
int MenuPos = 0;
void setup() {
Serial.begin(9600);
pinMode(Relay, LOW);
rtc.begin();
// rtc.setTime(12, 05, 0); // Установить время 16:29:00
lcd.init(); // Инициализация дисплея
lcd.backlight(); // Подключение подсветки
}
void loop() {
// put your main code here, to run repeatedly:
t = rtc.getTime();
// constrain(OnTime, 0, 59); // минуты не могут быть меньше 0 и больше 59
// constrain(OffTime, 0, 59);
lcd.setCursor(0,0); //тут вывод время, температура(на марсе), значения ВКЛ и ВЫКЛ
lcd.print(rtc.getTimeStr());
lcd.setCursor(10,0);
lcd.print(rtc.getTemp(),1);
lcd.print("C");
lcd.setCursor(0,1);
lcd.setCursor(0,1);
lcd.print("On:");
lcd.setCursor(3,1);
lcd.print(OnTime);
lcd.setCursor(8,1);
lcd.print("Off:");
lcd.setCursor(12,1);
lcd.print(OffTime);
static bool prev_time_to_work = false; // блок для включения реле по значениям ВКЛ ВЫКЛ
bool time_to_work = (t.sec >= OnTime && t.sec <= OffTime );
if ( prev_time_to_work != time_to_work)
{
digitalWrite(Relay, time_to_work);
prev_time_to_work = time_to_work;
}
if(MenuPos > 1) // как бы это что то типа меню, но недоработанно
{
MenuPos=0;
}
if(MenuPos == 0) // OnTime
{
enc.tick();
if (enc.isRightH()) OnTime++;
if (enc.isLeftH()) OnTime--;
if (enc.isRight()) OnTime += 5;
if (enc.isLeft()) OnTime -= 5;
if (enc.isRelease()) MenuPos++; // туда сюда меню от ВКЛ к ВЫКЛ
if(OnTime>59){OnTime=59;}
lcd.setCursor(5,1);
lcd.print("<");
lcd.setCursor(15,1);
lcd.print(" ");
}
else if(MenuPos == 1) //OffTime
{
enc.tick();
if (enc.isRight()) OffTime++;
if (enc.isLeft()) OffTime--;
if (enc.isRightH()) OffTime += 5;
if (enc.isLeftH()) OffTime -= 5;
if (enc.isRelease()) MenuPos++;
if(OffTime>59){OffTime=59;}
lcd.setCursor(15,1);
lcd.print("<");
lcd.setCursor(5,1);
lcd.print(" ");
}
Serial.println(OnTime);
}
}
когда уменьшаем значение 11, 10, 90, 80 показывает. то есть 0 от цифры 10 не убирается.
Проблемка 1
констрайн (значение, 0, 59) видимо не работает. так как на экране у меня начинают и трехзначные цифры вылазить и боротся с lcd.print("<"); поставил костыль присваивание If (OnTime > 59) {OnTime = 59}
проблемка 2.
меню индикатор "<" остается в обоих пунктах. пока поставил косыль
проблемка 3
энкодер пропускает шаги. с энкодерами не имел еще дел, чего то я не знаю
что то где то я написал не граммотно. хотелось бы учится сразу грамоте, а не применению костылей.
Изменено: