Є корекція через меню!
Наскільки я розібрався з EEPROM, в адреси з 0 до 4 записуються загальні параметри:
ledContrast, ledLight, температура води, мінімальні оберти кулера, максимальні оберти кулера. А далі Alarm починається з 100-го байта. Тобто від 5 до 99 все вільно.
Оскільки корекція може бути зі знаком + або -, то нам підходить змінна типу int, а вона займає 2 байти. Отже використаю для неї байти 5 та 6.
Вся процедура вийшла розмазаною по коду, буду показувати step by step.
Замість #define CorrTime -8
//#define CorrTime -8 // коррекция хода системных часов [Сек]
int CorrTime = -8; // або 0 або скільки треба
тут же або нижче, але до void setup() вставимо:
byte highb;
byte lowb;
EEPROM може бути забитий чим завгодно, наприклад 255. Два байти разом дадуть 32767. Кнопками міняти буде ду-у-у-уже довго. Для того щоб виставити швидко 0 або кілька секунд, при першому завантаженні скетчу розкоментуйте цю пару рядків, що додайте у блок // Init EEPROM
// EEPROM.write(5, highByte(CorrTime)); // set for first time
// EEPROM.write(6, lowByte(CorrTime));
після
maxCool = EEPROM.read(4); // максимальные обороты для охлаждения воды
вставимо:
highb = EEPROM.read(5);
lowb = EEPROM.read(6);
CorrTime = word(highb,lowb);
Спускаємось до приблизно 350 рядка де знаходимо
byte menu_hh;
byte menu_mi;
і додаємо:
int menu_cor;
Спускаємось по коду аж до блоку
case 131: // nastroika sistema ------
Після menu_mi = time.min;
і перед break;
вставляємо:
menu_cor = CorrTime;
Тепер основна частина в блоці case 1311: // Time -------
Мабуть приведу цей блок повністю з виділеними вставками:
case 1311: // Time -----------------------------------------------------------------
{
myGLCD.setFont(SmallFont);
myGLCD.clrScr();
myGLCD.print("wremq",1,0);
myGLCD.print("korr.",1,35);
myGLCD.print(rtc.getTimeStr(FORMAT_SHORT),RIGHT,0) ;
myGLCD.drawLine(0,8,83,8);
myGLCD.drawLine(0,9,83,9);
if((cur_item == 1)&&cur_item_edit)
myGLCD.invertText(true);
myGLCD.printNumI(menu_hh,26,20,2,'0');
myGLCD.invertText(false);
myGLCD.print(":",39,20);
if((cur_item == 2)&&cur_item_edit)
myGLCD.invertText(true);
myGLCD.printNumI(menu_mi,46,20,2,'0');
myGLCD.invertText(false);
if((cur_item == 3)&&cur_item_edit) // my add
myGLCD.invertText(true); //
myGLCD.printNumI(menu_cor,35,35,2,'0'); //
myGLCD.invertText(false); //
if(cur_item == 1)
myGLCD.drawRoundRect(25,18,39,28);
if(cur_item == 2)
myGLCD.drawRoundRect(45,18,59,28);
if(cur_item == 3) // my add
myGLCD.drawRoundRect(34,33,58,42); //
switch(key){
case BUTTON_UP:
if(!cur_item_edit){
cur_item--;
if(cur_item < 1)
cur_item
= 3;
}else{
if(cur_item == 1){
menu_hh++;
if(menu_hh == 24)
menu_hh = 0;
}
if(cur_item == 2){
menu_mi++;
if(menu_mi == 60)
menu_mi = 0;
}
if(cur_item == 3){
menu_cor++;
}
}
break;
case BUTTON_DOWN:
if(!cur_item_edit){
cur_item++;
if(cur_item
> 3)
cur_item = 1;
}else{
if(cur_item == 1){
if(menu_hh == 0)
menu_hh = 23;
else
menu_hh--;
}
if(cur_item == 2){
if(menu_mi == 0)
menu_mi = 59;
else
menu_mi--;
}
if(cur_item == 3){
menu_cor--;
}
}
break;
case BUTTON_OK:
if(cur_item_edit){
switch(cur_item){
case 1:
rtc.setTime(menu_hh, time.min, 0); // Set the time to 12:00:00 (24hr format)
break;
case 2:
rtc.setTime(time.hour, menu_mi, 0); // Set the time to 12:00:00 (24hr format)
break;
case 3:
CorrTime = menu_cor;
EEPROM.write(5, highByte(CorrTime)); // correction value in seconds
EEPROM.write(6, lowByte(CorrTime));
break;
}
cur_item_edit = false;
}else
cur_item_edit = true;
break;
case BUTTON_CANCEL:
cur_item_edit = false;
cur_menu = 131;
cur_item = 1;
break;
}
myGLCD.update();
break;
}
Ось і все. Тепер в меню де виставляється час, додалась можливість виставити корекцію.
Думаю, що зрозуміло виклав. Будуть питання - велкам
