Коррекция показаний во второй строке LCD 1602

Тер-Петросян
Offline
Зарегистрирован: 24.02.2017
[code]
#include <EEPROM.h>
#include <Wire.h>
#include <LiquidCrystal.h>

#define DS1307_I2C_ADDRESS 0x68

LiquidCrystal lcd(6, 7, 8, 9, 10, 11);

const byte outPin = 5; // выход на реле

byte setMinClockOn; // 
byte setHorClockOn;
byte setMinClockOff; // 
byte setHorClockOff;

byte key(){ //// для кнопок ЛСДшилда
  int val = analogRead(0);
    if (val < 50) return 5;
    else if (val < 250) return 3;
    else if (val < 450) return 4;
    else if (val < 650) return 2;
    else if (val < 850) return 1;
    else return 0;  
}

/////////// часы ..
byte decToBcd(byte val){
  return ( (val/10*16) + (val%10) );
}

byte bcdToDec(byte val){
  return ( (val/16*10) + (val%16) );
}

void setDateDs1307(byte second,        // 0-59
                   byte minute,        // 0-59
                   byte hour,          // 1-23
                   byte dayOfWeek,     // 1-7
                   byte dayOfMonth,    // 1-28/29/30/31
                   byte month,         // 1-12
                   byte year)          // 0-99
{
   Wire.beginTransmission(DS1307_I2C_ADDRESS);
   Wire.write(0);
   Wire.write(decToBcd(second));    
   Wire.write(decToBcd(minute));
   Wire.write(decToBcd(hour));     
   Wire.write(decToBcd(dayOfWeek));
   Wire.write(decToBcd(dayOfMonth));
   Wire.write(decToBcd(month));
   Wire.write(decToBcd(year));
   Wire.endTransmission();
}

void getDateDs1307(byte *second,
          byte *minute,
          byte *hour,
          byte *dayOfWeek,
          byte *dayOfMonth,
          byte *month,
          byte *year)
{

  Wire.beginTransmission(DS1307_I2C_ADDRESS);
  Wire.write(0);
  Wire.endTransmission();

  Wire.requestFrom(DS1307_I2C_ADDRESS, 7);

  *second     = bcdToDec(Wire.read() & 0x7f);
  *minute     = bcdToDec(Wire.read());
  *hour       = bcdToDec(Wire.read() & 0x3f); 
  *dayOfWeek  = bcdToDec(Wire.read());
  *dayOfMonth = bcdToDec(Wire.read());
  *month      = bcdToDec(Wire.read());
  *year       = bcdToDec(Wire.read());
}
////
void setClock(){ // установка часов
  byte pos = 1;
  byte second, minute, hour,dayOfWeek, dayOfMonth, month, year; 
    getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
  
  
    lcd.clear();
    lcd.blink();

   while(key() != 1){ // крутим   цикл   
    byte KEY = key(); // читаем состояние кнопок
      delay(200);
    lcd.setCursor(0, 0);     // выводим инфу
     if (hour < 10) lcd.print("0");
    lcd.print(hour);
    lcd.print(":");
     if (minute < 10) lcd.print("0"); 
    lcd.print(minute);  
    lcd.print(" ");     
     if (dayOfMonth < 10) lcd.print("0");
    lcd.print(dayOfMonth);
    lcd.print("/");
     if (month < 10) lcd.print("0");
    lcd.print(month);
    lcd.print("/");
     if (year < 10) lcd.print("0");
    lcd.print(year);
    lcd.setCursor(pos, 0); // устанавливаем курсор согласно позиции
    lcd.setCursor(3, 1);
     if (dayOfWeek < 10) lcd.print("0");
    lcd.print(dayOfWeek);
    lcd.setCursor(pos, 0); // устанавливаем курсор согласно позиции
    
    if (KEY == 5 && pos < 16) pos += 3; // крутим позицию
    else if (KEY == 2 && pos > 1) pos -= 3;
    
    else if (pos == 1 && KEY == 3) hour++; // крутим значения
    else if (pos == 1 && KEY == 4) hour--;
    else if (pos == 4 && KEY == 3) minute++;
    else if (pos == 4 && KEY == 4) minute--; 
    else if (pos == 19 && KEY == 3) dayOfWeek++; 
    else if (pos == 19 && KEY == 4) dayOfWeek--;    
    else if (pos == 7 && KEY == 3) dayOfMonth++;
    else if (pos == 7 && KEY == 4) dayOfMonth--;   
    else if (pos == 10 && KEY == 3) month++;
    else if (pos == 10 && KEY == 4) month--;    
    else if (pos == 13 && KEY == 3) year++;
    else if (pos == 13 && KEY == 4) year--;  
    
    
    
    if (hour > 23) hour = 0;
    else if (minute > 59) minute = 0;
    else if (dayOfWeek > 7) dayOfWeek = 1;
    else if (dayOfMonth > 31) dayOfMonth = 0;
    else if (month > 12) month = 1;
    else if (year > 99) year = 0;
   
  }// конец цикла
  
 setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year); 
   lcd.noBlink(); 
   lcd.clear();
   lcd.print("     Saved");
   delay(1500);
}///

void setOnOff(){
  byte pos = 0;
  lcd.clear();
  lcd.blink();

  while(key() != 1){
   byte KEY = key();
   delay(200);
   lcd.setCursor(1, 1);
   lcd.print("set");
   lcd.setCursor(0, 0);
    if (setHorClockOn < 10) lcd. print("0");
   lcd.print(setHorClockOn);
   lcd.print(":");
    if (setMinClockOn <10) lcd. print("0");
   lcd.print(setMinClockOn);
   lcd.print(" ");
    if (setHorClockOff < 10) lcd. print("0");
   lcd. print(setHorClockOff);
   lcd.print(":");
    if (setMinClockOff <10) lcd. print("0");
   lcd.print(setMinClockOff);

    lcd.setCursor(pos, 0);

    if (KEY == 5 && pos < 9) pos += 3;
    else if (KEY == 2 && pos > 1) pos += 3;

    else if (pos == 0 && KEY == 3) setHorClockOn++;
    else if (pos == 0 && KEY == 4) setHorClockOn--;
    else if (pos == 3 && KEY == 3) setMinClockOn++;
    else if (pos == 3 && KEY == 4) setMinClockOn--;
    else if (pos == 6 && KEY == 3) setHorClockOff++;
    else if (pos == 6 && KEY == 4) setHorClockOff--;
    else if (pos == 9 && KEY == 3) setMinClockOff++;
    else if (pos == 9 && KEY == 4) setMinClockOff--;

    if (setHorClockOn > 23) setHorClockOn = 0;
    else if (setMinClockOn > 59) setMinClockOn = 0;
    else if (setHorClockOff > 23) setHorClockOff = 0;
    else if (setMinClockOff > 59) setMinClockOff = 0;
  }
   lcd.noBlink();
   lcd.clear();

   EEPROM.write(0, setMinClockOn);
   EEPROM.write(1, setHorClockOn);
   EEPROM.write(3, setMinClockOff);
   EEPROM.write(4, setHorClockOff);

   lcd.print("Saved");
   delay(1500);
}
   
void menu(){
  lcd.clear();
  char menuTxt[2][15] = {"set ON/OFF >>", "set clock  >>"};
  byte pos = 0;
  
  while(1){  
    delay(200);  
    byte KEY = key();
    
    lcd.setCursor(0, 0);
    lcd.print(pos+1);
    lcd.print(".");
    lcd.print(menuTxt[pos]);
    
    if (KEY == 3 && pos != 0) pos--;
    else if (KEY == 4 && pos < 1) pos++;
    
   
    else if (KEY == 5 && pos == 1) setClock(); 
  }
}  
 
void setup(){
  Wire.begin(); 
  lcd.begin(16, 2);
  lcd.clear();
  
  pinMode(outPin, OUTPUT);
  digitalWrite(outPin, LOW);
  
  setMinClockOn = EEPROM.read(0);
  setHorClockOn = EEPROM.read(1);
  setMinClockOff = EEPROM.read(3);
  setHorClockOff = EEPROM.read(4);
}

void loop()
{
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;  
  getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
  
  // обработка кнопок
  if (key() == 1) menu(); // если нажата селект
  else if (key() == 3) digitalWrite(outPin, HIGH);
  else if (key() == 4) digitalWrite(outPin, LOW);

  // сравниваем время и управляем выходом// 
  if (setMinClockOff == minute && setHorClockOff == hour
      && second == 0) digitalWrite(outPin, LOW);
  if (setMinClockOn == minute && setHorClockOn == hour
      && second == 0) digitalWrite(outPin, HIGH);    
 
 
//   lcd.clear();
    lcd.setCursor(0, 0);
     if (hour < 10) lcd.print("0"); 
    lcd.print(hour); 
    lcd.print(":");
     if (minute < 10) lcd.print("0"); 
    lcd.print(minute);
//  lcd.print(":");
//   if (second < 10) lcd.print("0");
//  lcd.print(second);
//    lcd.setCursor(8, 0); 
//    lcd.print("    ");  
    lcd.setCursor(0, 1);
     if (dayOfMonth < 10) lcd.print("0");
    lcd.print(dayOfMonth);
    lcd.print("/");
     if (month < 10) lcd.print("0");
    lcd.print(month);
    lcd.print("/");
     if (year < 10) lcd.print("0");
    lcd.print(year);
    
    lcd.setCursor(10, 1);
    if(dayOfWeek < 7) lcd.print("0");
    lcd.print(dayOfWeek);

    
    
    
    delay(200); // нужно для нармальной работы кнопок
}

[/code]

Индикатор со стандартными кнопками. В верхней строке показывает часы и минуты разделенные точками в нижней строке число, месяц,год разделенные косой чертой. Затем через две пустышки две цифры дня недели. Когда включается режим коррекции то в верхней строке располагаются: часы и минуты разделенные точками, пустышка и число, месяц,год разделенные косой чертой. Во второй строке две цифры дня недели. Курсор коррекции показаний перемещается кнопками и все корректируется как надо но только в первой строке.На вторую строку он не перемещается и день недели не корректируется. Переместить курсор туда можно, но он все равно меняет показания в первой строке под теми символами где он стоит. Еще он перемещается только через две позиции на третью.Подключен к Ардуино Уно.Как это можно исправить?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Скетч Вы писали?

Тер-Петросян
Offline
Зарегистрирован: 24.02.2017

Их написано и так. Этот по функционалу больше подходит

Клапауций 823
Клапауций 823 аватар
Offline
Зарегистрирован: 13.01.2017

Тер-Петросян пишет:
Как это можно исправить?

а, зачем ты этот вопрос задаёшь всюда, а не автору скетча?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Тер-Петросян пишет:

Их написано и так. Этот по функционалу больше подходит

Понятно, тогда все вопросы - к автору скетча. 

Одно дело помчь тому, у кого не получается и другое - раскапывать чужие коды для халявщика, который считает, что самому работать не нужно, т.к. "их написано и так". Если "написано и так" - пользуйтесь на здоровье. А не устраивает - топайте в "Ищу исполнителя" и заказывайте доработку.

vvadim
Offline
Зарегистрирован: 23.05.2012

автор взял работающий код у ArduinoLab и немного его доработал)))

Клапауций 823
Клапауций 823 аватар
Offline
Зарегистрирован: 13.01.2017

vvadim пишет:

автор взял работающий код у ArduinoLab и немного его доработал)))

прекрасно - теперь мы знаем, вкуда посылать ТС

vvadim
Offline
Зарегистрирован: 23.05.2012

Клапауций 823 пишет:

vvadim пишет:

автор взял работающий код у ArduinoLab и немного его доработал)))

прекрасно - теперь мы знаем, вкуда посылать ТС

да ладно, ArduinoLab мужик нормальный...

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Петросян пишет:
На вторую строку он не перемещается и день недели не корректируется. Переместить курсор туда можно, но он все равно меняет показания в первой строке под теми символами где он стоит. Еще он перемещается только через две позиции на третью.Подключен к Ардуино Уно.Как это можно исправить?
В строках 113-114 меняется позиция курсора на 3, поэтому через две на третью. День недели у тебя в позиции 19 (строки 120-121), а дисплей насколько я понимаю на 16 символов...

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Andy пишет:

Петросян пишет:
На вторую строку он не перемещается и день недели не корректируется. Переместить курсор туда можно, но он все равно меняет показания в первой строке под теми символами где он стоит. Еще он перемещается только через две позиции на третью.Подключен к Ардуино Уно.Как это можно исправить?
В строках 113-114 меняется позиция курсора на 3, поэтому через две на третью. День недели у тебя в позиции 19 (строки 120-121), а дисплей насколько я понимаю на 16 символов...

А ларчик просто открывался!