я тут опять с часами =) отображение на 1602

SUPERNYAMSTER

✩✩✩✩✩✩✩
19 Дек 2020
27
1
железо:
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);
}
}
Проблемка 0
когда уменьшаем значение 11, 10, 90, 80 показывает. то есть 0 от цифры 10 не убирается.
Проблемка 1
констрайн (значение, 0, 59) видимо не работает. так как на экране у меня начинают и трехзначные цифры вылазить и боротся с lcd.print("<"); поставил костыль присваивание If (OnTime > 59) {OnTime = 59}
проблемка 2.
меню индикатор "<" остается в обоих пунктах. пока поставил косыль
проблемка 3
энкодер пропускает шаги. с энкодерами не имел еще дел, чего то я не знаю

что то где то я написал не граммотно. хотелось бы учится сразу грамоте, а не применению костылей.
 
Изменено:

Старик Похабыч

★★★★★★★
14 Авг 2019
4,272
1,303
Москва
Проблемка 0
Если пишешь двузначное число, а само число однозначное, добавляй пробел.
Проблемка1
работает четко. В коде у тебя он 1) выключен 2) смысл проверять каждый цикл, даже если он не поменялся ? Выведи значение переменной до и после в монитор порта и посмотри.

Проблемка3
Так пробовал ?
Encoder enc(4, 3, 5, TYPE1);
А еще шаги может проаускать, если цикл loop крутиться очень медленно, менее 10 000 раз в секунду
 

SUPERNYAMSTER

✩✩✩✩✩✩✩
19 Дек 2020
27
1
Проблемка 0
Если пишешь двузначное число, а само число однозначное, добавляй пробел.
Проблемка1
работает четко. В коде у тебя он 1) выключен 2) смысл проверять каждый цикл, даже если он не поменялся ? Выведи значение переменной до и после в монитор порта и посмотри.

Проблемка3
Так пробовал ?
Encoder enc(4, 3, 5, TYPE1);
А еще шаги может проаускать, если цикл loop крутиться очень медленно, менее 10 000 раз в секунду
Encoder enc(4, 3, 5, TYPE1); - пробывал. становится все печальнее.
В коде у тебя он 1) выключен 2) смысл проверять каждый цикл. - выключил, так как поставил костыль
Если пишешь двузначное число, а само число однозначное, добавляй пробел. - про пробел понял. как его изобразить еще не изучал.

в целом собранная хрень работает. доделывать буду как нибудь потом/никогда. но знать это надо