Помогите с куском кода!!!
- Войдите на сайт для отправки комментариев
Пт, 02/12/2016 - 17:59
Пожалуйста, ткните где ошибка :
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3f, 20, 4);
#include <AnalogKey5.h>
AnalogKey5 AKeys(740, 325, 4, 500, 140, 15);
boolean Key_P_Old, Key_M_Old, Key_L_Old, Key_R_Old, Key1_Old;
uint32_t SunriseStart[7] = {30660, 30720, 30840, 34440, 34500, 38100, 30600};
char lcdPRT1[20];
char lcdPRT2[20];
char lcdPRT3[20];
char lcdPRT4[9];
char* lcdP[4] = {"L1-%02d:%02d L2-%02d:%02d ", "L3-%02d:%02d L4-%02d:%02d ",
"L5-%02d:%02d L6-%02d:%02d ", "L7-%02d:%02d"};
int h = 3600;
byte m = 60;
int MenuItem;
bool hm;
void Set(){
if (AKeys.Key1() && !Key1_Old) hm =!hm;
Key1_Old = AKeys.Key1();
}
void Menuitem(){
if (AKeys.Key3() && !Key_L_Old) MenuItem--;
if (AKeys.Key4() && !Key_R_Old) MenuItem++;
if (MenuItem < 0) MenuItem = 0;
Key_R_Old = AKeys.Key4();
Key_L_Old = AKeys.Key3();
}
void lcd1 (uint32_t *t){
for (byte i = 0; i<7; i++){
if(i > 6) i = 0;
byte hh[7];
byte mm[7];
hh[i] = t[i]/h;
mm[i] = t[i]%h/m;
if(i == MenuItem){
if(hm){
if (AKeys.Key5() && !Key_P_Old) ++hh[i]%24;
if (AKeys.Key2() && !Key_M_Old) --hh[i]%232;
}
else{
if (AKeys.Key5() && !Key_P_Old) ++mm[i]%60;
if (AKeys.Key2() && !Key_M_Old) --mm[i]%196;
}
Key_P_Old = AKeys.Key5();
Key_M_Old = AKeys.Key2();
t[i] = (hh[i]*h)+(mm[i]*m);
}
sprintf(lcdPRT1,lcdP[0], hh[0],mm[0],hh[1],mm[1]);
sprintf(lcdPRT2,lcdP[1], hh[2],mm[2],hh[3],mm[3]);
sprintf(lcdPRT3,lcdP[2], hh[4],mm[4],hh[5],mm[5]);
sprintf(lcdPRT4,lcdP[3], hh[6], mm[6]);
}
lcd.setCursor(1,0);
lcd.print(lcdPRT1);
lcd.setCursor(1,1);
lcd.print(lcdPRT2);
lcd.setCursor(1,2);
lcd.print(lcdPRT3);
lcd.setCursor(1,3);
lcd.print(lcdPRT4);
}
void setup() {
Serial.begin(9600);
lcd.init();
lcd.backlight();
}
void loop() {
Set();
Menuitem();
AKeys.Refresh(analogRead(A0));
lcd1 (SunriseStart);
}
Суть этого такая - есть переменные времени в секундах от начала суток, упакованные в массив. Переменная делится на часы и минуты, кнопками оные изменяются и собираются обратно в секунды. Паралельно с помощью sprintf часы и минуты подаются на экран. Проблема с часами - во время увеличения - уменьшения происходит выход за пределы uint32_t.
Не пойму за что мне игнор такой... :(
Похоже ошибка где-то здесь :
Я ведь правильно перевожу секунды в часы и минуты, и наоборот? У меня сейчас если hh > 9 то t становится десятизначным числом, чего не должно быть по идее.
Ну, переполнение-то понятно откуда. В строке 46 Вы уж hh[i] и mm[i] сначала преобразуйте во что-нибудь более длинное, а потом уж умножайте.
Но там у Вас и без этого ...
Строка 30 является мусором, т.к. i в этом месте больше 6 не станет никогда.
Строки 37, 38, 41, 42 очень странные. Как Вы это понимаете. Вот, например
if(AKeys.Key5() && !Key_P_Old) ++hh[i]%24;ну, и что она по-Вашему делает? Можете объяснть?
Да, строка 30 не нужна, уже понял, исправил. Строка
if(AKeys.Key5() && !Key_P_Old) ++hh[i]%24;плюсует с ограничением hh[i] до 23.
Строка
if(AKeys.Key5() && !Key_P_Old) ++hh[i]%24;плюсует с ограничением hh[i] до 23.
Да, неужели? :)
Не верьте. она Вас обманывает! Не делает она этого.
Попробуйте вот такой скетч для проверки
void setup(void) { Serial.begin(115200); for (int i=0, n = 0; i < 100; i++) { ++n%24; Serial.println(n); } } void loop(void) {}Таки да, не огрананичивает... С ограничением позже разберусь.
t[i] = ((long)hh[i]*m)+((long)mm[i]*m); ничего не дает
Таки да, не огрананичивает... С ограничением позже разберусь.
t[i] = ((long)hh[i]*m)+((long)mm[i]*m); ничего не дает
Из того, что это не единственная ошибка, не следует, что её исправлять не надо.
Поставьте перед этой строкой печать hh[i], m и mm[i] - посмотрите чему равны. НАверняка, увидите что-то интересное
Поставил печатать
Serial.print(hh[i]);
в общем то то что и надо
Это если
uint32_t SunriseStart[7] = {30660, ...
Ну, а результат-то t[i] чего не напечатали? Неинтересно?
Думаю, что если Вы преобразования не убрали, то всё получится правильно. Попробуйте.
Так, спасибо большое, разобрался! Теперь ограничения пропишу...
Валяйте.