Помогите разобраться с кодом.

EstChe
Offline
Зарегистрирован: 28.08.2015

В общем проблема такая. Я далеко не програмист, и вот сижу учусь програмировать на ардуине, хочу сделать терморегулятор с таймером для проверки температуры в емкости по времени. И вроде некоторые процедуры уже расписал, но вот затык в чем. создал процедуру записи параметров в память, все пишет отлично, все хорошо, а с выводом на экран не выходит. Вот код который не могу докурить

qty читается из памяти и записывается туда процедурой push(). может быть от 1 до 4. на нижнюю часть кода не обращайте внимания, это костыль, который потом уберу. Обьясните пожалуйста, почему цикл уходит в рекурсию? Решил проблему костылем, но так как код и так индусский в виду моих знаний и навыков хотелось бы решить нормально, а главное понять что не так!

void loop() 
  { 
    i=1;
    qty=EEPROM.read(255);
    if (qty<1 || qty>4) qty=1;
    byte temppos[qty];
    lcd.setCursor(0, 0);
      if (val<=4){
      while (i<qty){   //Проблема в этом цикле. Если поставить <= цикл превращается в безконеный и инфа мелькает по экрану, а если не ставить, то отображаются не все переменные
       lcd.print("T");
        lcd.print(i);
      lcd.print("=");
      lcd.print(temppos[i]=EEPROM.read(i));
       lcd.print(" ");
       i++;
     }
   
        if(digitalRead(14)==HIGH) {
           val++;      
      delay(400);
      k = 0;
        }
        else 
      { 
        val=0;
        k=k+1 ;
        if (k<2) 
        {
        lcd.clear(); }
        if (k = 10)
        {
          k=2;
        }
      } 
   }
   else
  {
   push();
  }       
 } 

 

Timur007
Offline
Зарегистрирован: 17.05.2015

у вас значение i и qty равно 1 перед входом в цикл while. Поэтому вы входите в зацикливание при <=. Советую использовать Serial.print() для отладки. Сразу увидите в какой момент какая переменная чему равна

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Проблема далеко не в том цикле, что Вы думаете.
Из мелочей, исправьте строку 30.
Если в push Вы пишите в eeprom, то у почитайте про максимальное количество записей в eeprom.

Если проблемы с циклом, как Вам кажется, то оставьте только этот цикл плюс задержку, например в секунду, а остальное выкиньте. Цикл будет работать как надо.
Плюс типы переменных никому неизвестны.
В общем при таких условиях я пас.

EstChe
Offline
Зарегистрирован: 28.08.2015

qty равно от 1 до 4. Строка приравнивания сделана для исключения неверной записи в память. Не важно какое значение он имеет, все равно цикл уходит в рекурсию. Могу выложить полный код, но предупреждаю что он индусский, так как весь его писал с помощью гугла и какой-то матери.

 

Про 1000000 циклов перезаписи я знаю. Переменные пишутся только по нажатию клавиши специально для уменьшения количества раз перезаписи впамять

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Здесь есть два цикла. loop и while. Это исходные данные. Какой из них зацикливается, кто знает. while выполняется почти без задержек. Аналогичное может происходить и с loop. Это для размышлений. Для поиска, кто циклится, можно поставить задержку в конце loop, секунд на 5. Если мельтешение прекратилось, значит циклится loop. А потом уже искать причины зацикливания. Понятно, что loop всегда циклится, я не про это, а про то, что все, что кроме while работает не так, как задумано.
Все таки 30 строку либо закомментарьте, либо исправьте, если не сейчас, то потом оглоблей обернётся.

EstChe
Offline
Зарегистрирован: 28.08.2015

Да это котсыль который буду править. Сделан для тогочтобы Обнулять экран без delay. Знаю чтоб подебильному и буду исправлять обязательно

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

EstChe пишет:

Да это котсыль который буду править. Сделан для тогочтобы Обнулять экран без delay. Знаю чтоб подебильному и буду исправлять обязательно

Разговор глухого со немым. Если Вы считаете, что сравнение k со значением 10 пишется именно так, то мне тут делать нечего.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

заменить на if ( 10 == k ) - немой глухому !
:)

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

kisoft пишет:
Все таки 30 строку либо закомментарьте, либо исправьте, если не сейчас, то потом оглоблей обернётся.

:)