Странные значения переменных

Yantrix
Offline
Зарегистрирован: 07.08.2014

Добрый день

Непонятно,  почему  такие  значения  переменных.

делаю таймер  обратного отсчёт на 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, с чем  это может быть связано ?Хотя с этой  переменной никаких  действий  не производилось

 

Leshiy
Offline
Зарегистрирован: 19.07.2014

 

while(etalon < 100){
	  delay(10000);} 

Вот этого я не совсем понял, теоретически это вечный while, так  как если etalon меньше 100, то выйти из этого while нельзя, ведь эталон внутри while не меняется никак. А значит он меняется вне while, видимо по прерыванию и, видимо, в одной из подключенных вами библиотек.

 

Yantrix
Offline
Зарегистрирован: 07.08.2014

Leshiy пишет:

 

while(etalon < 100){
	  delay(10000);} 

Вот этого я не совсем понял, теоретически это вечный while, так  как если etalon меньше 100, то выйти из этого while нельзя, ведь эталон внутри while не меняется никак. А значит он меняется вне while, видимо по прерыванию и, видимо, в одной из подключенных вами библиотек.

 

 

Вами приведенный фрагмент - это временная цикл-заглушка типа 10 goto 10

Yantrix
Offline
Зарегистрирован: 07.08.2014

максимально упростил программу


#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

что делаю  не так ?

 

toly
Offline
Зарегистрирован: 17.05.2014

А если почистить экран перед тем, как выводить на него, или попробовать выдать значение в обычный сериал ?

Yantrix
Offline
Зарегистрирован: 07.08.2014

при выдаче в обычный последовательный порт командой    

    Serial.println(myvalue, DEC);

то же самое

toly
Offline
Зарегистрирован: 17.05.2014

А если без DEC ?

Yantrix
Offline
Зарегистрирован: 07.08.2014

к сожалению тоже самое

toly
Offline
Зарегистрирован: 17.05.2014

Убрать вообще все из кода, все библиотеки, просто распечатать в сериал константу через print ?

Yantrix
Offline
Зарегистрирован: 07.08.2014

сейчас попробую

 

leshak
Offline
Зарегистрирован: 29.09.2011
lcd.print('myvalue');

Вот это... вообще "не пойми что". Что будет после выполенения этой строки, какие "догдаки" построил компилятор по поводу "что вы хотели сказать" - неведомо.
То что это не вывод переменной - это однозначно.
Похоже на вывод строки.... но строка это двойные кавычки. Одинарные - это "символ".
Вообщем вы сказали "выведи СИМВОЛ", и пиханули "несколько символов". Возможно оно восприняло это как char*, дальше попробовало его выводить... а нулевого терминального символа - нет (так как компилятор не думал что это строка...).
Вообщем имеем "непредсказуемое поведения", и глюки совершенного любого свойства и в любом месте.
 

leshak
Offline
Зарегистрирован: 29.09.2011

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

Yantrix
Offline
Зарегистрирован: 07.08.2014

спасибо за ответ:)

буду разбираться )

leshak
Offline
Зарегистрирован: 29.09.2011

Yantrix пишет:

при выдаче в обычный последовательный порт командой    

    Serial.println(myvalue, DEC);

то же самое

Не вводите общественность в заблуждение.

Явно вы выводили не такой коммандой, а Serial.println('myvalue',DEC);


void setup() {

 Serial.begin(57600);
 int myvalue=55;
 Serial.println('myvalue');
 Serial.println(myvalue);
}

void loop (){}

Выводит:

30053
55

 

Yantrix
Offline
Зарегистрирован: 07.08.2014

В любом случае благодарю, что нашли мой косяк