Помогите с куском кода!!!

Maka
Offline
Зарегистрирован: 24.10.2015

Пожалуйста, ткните где ошибка :

#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. 

Maka
Offline
Зарегистрирован: 24.10.2015

Не пойму за что мне игнор такой... :(  

Похоже ошибка где-то здесь :

hh[i] = t[i]/h;

 

mm[i] = t[i]%h/m;
 
t[i] = (hh[i]*h)+(mm[i]*m);
 

Я ведь правильно перевожу секунды в часы и минуты, и наоборот? У меня сейчас если hh > 9 то t становится десятизначным числом, чего не должно быть по идее.

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

Ну, переполнение-то понятно откуда. В строке 46 Вы уж hh[i] и mm[i] сначала преобразуйте во что-нибудь более длинное, а потом уж умножайте.

Но там у Вас и без этого ...

Строка 30 является мусором, т.к. i в этом месте больше 6 не станет никогда.

Строки 37, 38, 41, 42 очень странные. Как Вы это понимаете. Вот, например

if (AKeys.Key5() && !Key_P_Old) ++hh[i]%24;

ну, и что она по-Вашему делает? Можете объяснть?

 

Maka
Offline
Зарегистрирован: 24.10.2015

Да, строка 30 не нужна, уже понял, исправил. Строка 

if (AKeys.Key5() && !Key_P_Old) ++hh[i]%24;

плюсует с ограничением hh[i] до 23.

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

Maka пишет:

Строка 

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) {}

 

Maka
Offline
Зарегистрирован: 24.10.2015

Таки да, не огрананичивает... С ограничением позже разберусь. 

t[i] = ((long)hh[i]*m)+((long)mm[i]*m);   ничего не дает

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

Maka пишет:

Таки да, не огрананичивает... С ограничением позже разберусь. 

t[i] = ((long)hh[i]*m)+((long)mm[i]*m);   ничего не дает

Из того, что это не единственная ошибка, не следует, что её исправлять не надо.

Поставьте перед этой строкой печать hh[i], m и mm[i] - посмотрите чему равны. НАверняка, увидите что-то интересное

Maka
Offline
Зарегистрирован: 24.10.2015

Поставил печатать 

Serial.print(hh[i]);

    Serial.print(" ");
    Serial.print(h);
    Serial.print(" ");
    Serial.print(mm[i]);
    Serial.print(" ");
    Serial.println(m);
получил 
8 3600 31 60
8 3600 31 60
8 3600 31 60
8 3600 31 60
8 3600 31 60
8 3600 31 60
8 3600 31 60
8 3600 31 60
 
 
Maka
Offline
Зарегистрирован: 24.10.2015

в общем то то что и надо

Maka
Offline
Зарегистрирован: 24.10.2015

Это если 

uint32_t SunriseStart[7] = {30660, ...

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

Ну, а результат-то t[i] чего не напечатали? Неинтересно?

Думаю, что если Вы преобразования не убрали, то всё получится правильно. Попробуйте.

Maka
Offline
Зарегистрирован: 24.10.2015

Так, спасибо большое, разобрался! Теперь ограничения пропишу...

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

Валяйте.