Странные значения переменных
- Войдите на сайт для отправки комментариев
Чт, 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){ delay(10000);}Вот этого я не совсем понял, теоретически это вечный while, так как если etalon меньше 100, то выйти из этого while нельзя, ведь эталон внутри while не меняется никак. А значит он меняется вне while, видимо по прерыванию и, видимо, в одной из подключенных вами библиотек.
while(etalon < 100){ delay(10000);}Вот этого я не совсем понял, теоретически это вечный while, так как если etalon меньше 100, то выйти из этого while нельзя, ведь эталон внутри while не меняется никак. А значит он меняется вне while, видимо по прерыванию и, видимо, в одной из подключенных вами библиотек.
Вами приведенный фрагмент - это временная цикл-заглушка типа 10 goto 10
максимально упростил программу
#include <LiquidCrystal.h> //Подключаем библиотеку для работы с LCD LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2); // инициализируем LCD, указывая управляющие контакты void setup() { lcd.begin(16, 2);// задаем размерность дисплея } void loop () { int myvalue=55; lcd.setCursor(2,1); lcd.print('myvalue'); }значение переменной не 55 а 30053
что делаю не так ?
А если почистить экран перед тем, как выводить на него, или попробовать выдать значение в обычный сериал ?
при выдаче в обычный последовательный порт командой
Serial.println(myvalue, DEC);то же самое
А если без DEC ?
к сожалению тоже самое
Убрать вообще все из кода, все библиотеки, просто распечатать в сериал константу через print ?
сейчас попробую
lcd.print('myvalue');Вот это... вообще "не пойми что". Что будет после выполенения этой строки, какие "догдаки" построил компилятор по поводу "что вы хотели сказать" - неведомо.
То что это не вывод переменной - это однозначно.
Похоже на вывод строки.... но строка это двойные кавычки. Одинарные - это "символ".
Вообщем вы сказали "выведи СИМВОЛ", и пиханули "несколько символов". Возможно оно восприняло это как char*, дальше попробовало его выводить... а нулевого терминального символа - нет (так как компилятор не думал что это строка...).
Вообщем имеем "непредсказуемое поведения", и глюки совершенного любого свойства и в любом месте.
Кстати, а вот то что вы в сообщении №3, сообразили "локализировать проблемму", выделить ее из общей простыни кода - это хорошо. Верный подход.
И шансы что "кто-то пробегая мимо" сможет заметить проблему - гораздо больше. И самому найти шансы - гораздо выше.
спасибо за ответ:)
буду разбираться )
при выдаче в обычный последовательный порт командой
Serial.println(myvalue, DEC);то же самое
Не вводите общественность в заблуждение.
Явно вы выводили не такой коммандой, а Serial.println('myvalue',DEC);
void setup() { Serial.begin(57600); int myvalue=55; Serial.println('myvalue'); Serial.println(myvalue); } void loop (){}Выводит:
В любом случае благодарю, что нашли мой косяк