Помогите разобраться с кодом.
- Войдите на сайт для отправки комментариев
В общем проблема такая. Я далеко не програмист, и вот сижу учусь програмировать на ардуине, хочу сделать терморегулятор с таймером для проверки температуры в емкости по времени. И вроде некоторые процедуры уже расписал, но вот затык в чем. создал процедуру записи параметров в память, все пишет отлично, все хорошо, а с выводом на экран не выходит. Вот код который не могу докурить
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(); } }
у вас значение i и qty равно 1 перед входом в цикл while. Поэтому вы входите в зацикливание при <=. Советую использовать Serial.print() для отладки. Сразу увидите в какой момент какая переменная чему равна
Проблема далеко не в том цикле, что Вы думаете.
Из мелочей, исправьте строку 30.
Если в push Вы пишите в eeprom, то у почитайте про максимальное количество записей в eeprom.
Если проблемы с циклом, как Вам кажется, то оставьте только этот цикл плюс задержку, например в секунду, а остальное выкиньте. Цикл будет работать как надо.
Плюс типы переменных никому неизвестны.
В общем при таких условиях я пас.
qty равно от 1 до 4. Строка приравнивания сделана для исключения неверной записи в память. Не важно какое значение он имеет, все равно цикл уходит в рекурсию. Могу выложить полный код, но предупреждаю что он индусский, так как весь его писал с помощью гугла и какой-то матери.
Про 1000000 циклов перезаписи я знаю. Переменные пишутся только по нажатию клавиши специально для уменьшения количества раз перезаписи впамять
Здесь есть два цикла. loop и while. Это исходные данные. Какой из них зацикливается, кто знает. while выполняется почти без задержек. Аналогичное может происходить и с loop. Это для размышлений. Для поиска, кто циклится, можно поставить задержку в конце loop, секунд на 5. Если мельтешение прекратилось, значит циклится loop. А потом уже искать причины зацикливания. Понятно, что loop всегда циклится, я не про это, а про то, что все, что кроме while работает не так, как задумано.
Все таки 30 строку либо закомментарьте, либо исправьте, если не сейчас, то потом оглоблей обернётся.
Да это котсыль который буду править. Сделан для тогочтобы Обнулять экран без delay. Знаю чтоб подебильному и буду исправлять обязательно
Да это котсыль который буду править. Сделан для тогочтобы Обнулять экран без delay. Знаю чтоб подебильному и буду исправлять обязательно
Разговор глухого со немым. Если Вы считаете, что сравнение k со значением 10 пишется именно так, то мне тут делать нечего.
заменить на
if
( 10 == k ) - немой глухому !
:)
:)