Странные значения переменных
- Войдите на сайт для отправки комментариев
Чт, 07/08/2014 - 12:31
Добрый день
Непонятно, почему такие значения переменных.
делаю таймер обратного отсчёт на Arduino
#include <Password.h> #include <LiquidCrystal.h> //Подключаем библиотеку для работы с LCD #include <Delay.h> #include <IRremote.h> int RECV_PIN = 13; IRrecv irrecv(RECV_PIN); decode_results results; LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2); // инициализируем LCD, указывая управляющие контакты void setup() { lcd.begin(16, 2);// задаем размерность дисплея lcd.print("testing device !"); // выводим на дисплей традиционную фразу Serial.begin(9600); irrecv.enableIRIn(); // Start the receiver } char number_ok; int etalon=100; char user_pwd; long prevmicros = 80000;//переменная для хранения значений таймера int sek=00;//значение секунд int sd=0; int minu=59;//значение минут int chas=2;//значение часов boolean counter=false; // счетчик для полусекунд Password password = Password("0012"); void loop() { for (int i = 0; i <= 15000; i++) { lcd.setCursor(0, 1); lcd.clear(); lcd.setCursor(0, 4); /* lcd.print(3600-i);*/ if (micros() - prevmicros > 80000) { prevmicros = micros(); //принимает значение каждые полсекунды counter=!counter; if (counter==false) { sek++; //переменная секунда 1 1 lcd.setCursor(2,0); lcd.print(":"); //выводим символ ":"между часами и минутами lcd.setCursor(5,0); lcd.print(":"); //выводим символ ":"между минутами и секундами lcd.setCursor(11,1); lcd.print(" "); } else { lcd.setCursor(2,0); lcd.print(" "); // мигание : lcd.setCursor(5,0); lcd.print(" "); // мигание : lcd.setCursor(11,1); lcd.print("_"); } if(sek>59)//если переменная секунда больше 59 ... { sek=0;//сбрасываем ее на 0 minu--;//пишем +1 в переменную минута } if(minu>59)//если переменная минута больше 59 ... { minu=0;//сбрасываем ее на 0 chas--;//пишем +1 в переменную час } if(chas>23)//если переменная час больше 23 ... { chas=0;//сбрасываем ее на 0 } lcd.setCursor(0,0);//выводим значение часов if (chas>=0 && chas<10) { lcd.print("0"); lcd.print(chas);}//количество часов else lcd.print(chas); lcd.setCursor(3,0);//выводим значение минут if (minu>=0 && minu<10) { lcd.print("0"); lcd.print(abs(minu));}//количество минут else lcd.print(minu); sd=59-sek; lcd.setCursor(6,0);//выводим значение секунд if (sek>=0 && sd<10) { lcd.print("0"); lcd.print(sd);}//количество секунд else lcd.print(sd); } lcd.print(" sek"); lcd.setCursor(1,1); lcd.print("ENTER CODE"); lcd.print('etalon'); lcd.setCursor(12,1); delay(80); if (irrecv.decode(&results)) { Serial.println(results.value, HEX); Serial.println("pwd is"); Serial.println('etalon',DEC); /* if (results.value == 0xFD08F7) { password.append('1'); } else if (results.value == 0xFD8877) { password.append('2'); } else if (results.value == 0xFD48B7) { password.append('3'); } else if (results.value == 0xFD28D7) { password.append('4'); } else if (results.value == 0xFDA857) { password.append('5'); } else if (results.value == 0xFD6897) { password.append('6'); } else if (results.value == 0xFD18E7) { password.append('7'); } else if (results.value == 0xFD9867) { password.append('8'); } else if (results.value == 0xFD58A7) { password.append('9'); } else if (results.value == 0xFD10EF) { password.append('#'); } else if (results.value == 0xFD50AF) { password.append('*'); } else if (results.value == 0xFD906F) { char number_ok='ok'; } else { } */ switch (results.value) { case 0xB7CEF1C7: // 1 (10) password.append('1'); case 0x3F3C26A7: // 2 password.append('2'); case 0x3021612B: // 3 password.append('3'); case 0x7EFFC747: // 4 password.append('4'); case 0xD8AD1F4B: // 5 password.append('5'); case 0x2CAD10E3: // 6 password.append('6'); case 0x1D924B67: // 7 password.append('7'); case 0xB93DEFA7: // 8 password.append('8'); case 0x12EB47AB: // 9 password.append('9'); case 0x275A9FCB: // 0 password.append('0'); } irrecv.resume(); // Receive the next value if (password.evaluate()){ Serial.println("\t You guessed the correct password!"); lcd.setCursor(1,1); lcd.print(" <<< OK ! >>> "); lcd.print(""); } else{ delay(100); } } } while(etalon < 100){ delay(10000);} }
например я задаю значение переменной
int etalon=100;
и вывожу его на LCD индикатор,
почему у меня значение
переменной etalon становится равно не 100 а 24947, с чем это может быть связано ?Хотя с этой переменной никаких действий не производилось
Вот этого я не совсем понял, теоретически это вечный while, так как если etalon меньше 100, то выйти из этого while нельзя, ведь эталон внутри while не меняется никак. А значит он меняется вне while, видимо по прерыванию и, видимо, в одной из подключенных вами библиотек.
Вот этого я не совсем понял, теоретически это вечный while, так как если etalon меньше 100, то выйти из этого while нельзя, ведь эталон внутри while не меняется никак. А значит он меняется вне while, видимо по прерыванию и, видимо, в одной из подключенных вами библиотек.
Вами приведенный фрагмент - это временная цикл-заглушка типа 10 goto 10
максимально упростил программу
значение переменной не 55 а 30053
что делаю не так ?
А если почистить экран перед тем, как выводить на него, или попробовать выдать значение в обычный сериал ?
при выдаче в обычный последовательный порт командой
то же самое
А если без DEC ?
к сожалению тоже самое
Убрать вообще все из кода, все библиотеки, просто распечатать в сериал константу через print ?
сейчас попробую
Вот это... вообще "не пойми что". Что будет после выполенения этой строки, какие "догдаки" построил компилятор по поводу "что вы хотели сказать" - неведомо.
То что это не вывод переменной - это однозначно.
Похоже на вывод строки.... но строка это двойные кавычки. Одинарные - это "символ".
Вообщем вы сказали "выведи СИМВОЛ", и пиханули "несколько символов". Возможно оно восприняло это как char*, дальше попробовало его выводить... а нулевого терминального символа - нет (так как компилятор не думал что это строка...).
Вообщем имеем "непредсказуемое поведения", и глюки совершенного любого свойства и в любом месте.
Кстати, а вот то что вы в сообщении №3, сообразили "локализировать проблемму", выделить ее из общей простыни кода - это хорошо. Верный подход.
И шансы что "кто-то пробегая мимо" сможет заметить проблему - гораздо больше. И самому найти шансы - гораздо выше.
спасибо за ответ:)
буду разбираться )
при выдаче в обычный последовательный порт командой
то же самое
Не вводите общественность в заблуждение.
Явно вы выводили не такой коммандой, а Serial.println('myvalue',DEC);
Выводит:
В любом случае благодарю, что нашли мой косяк