1,105,295 Community Members

Weird variable behaviour - Arduino Uno rev 3

Member Avatar
a_lan
Newbie Poster
5 posts since Feb 2011
Reputation Points: 0 [?]
Q&As Helped to Solve: 1 [?]
Skill Endorsements: 0 [?]
 
0
 

I have got very weird problem with a int variable. There is a code:

#include <EEPROM.h>
#define dht_dpin 14

byte bGlobalErr;
byte dht_dat[4];

int a;

void setup(){
    pinMode(13, OUTPUT);
    a = 0;
    InitDHT();
    Serial.begin(9600);
    delay(300);
    Serial.println("Humidity and temperature\n\n");
    delay(700);
} //end "setup()"

void loop()
{
    digitalWrite(13, HIGH);
    delay(300);
    digitalWrite(13, LOW);
    Serial.println(a);

    ReadDHT();

    switch (bGlobalErr) 
        {
            case 0:
                Serial.print("humdity = ");
                Serial.print(dht_dat[0], DEC);
                Serial.print(".");
                Serial.print(dht_dat[1], DEC);
                Serial.print("%  ");
                Serial.print("temperature = ");
                Serial.print(dht_dat[2], DEC);
                Serial.print(".");
                Serial.print(dht_dat[3], DEC);
                Serial.println("C  ");
                EEPROM.write(a, dht_dat[0]);
                EEPROM.write(a + 1, dht_dat[2]);

                break;
            case 1:
                Serial.println("Error 1: DHT start condition 1 not met.");
                break;
            case 2:
                Serial.println("Error 2: DHT start condition 2 not met.");
                break;
            case 3:
                Serial.println("Error 3: DHT checksum error.");
                break;
            default:
                Serial.println("Error: Unrecognized code encountered.");
                break;


    } //end "switch"

        a = a + 2;
        delay(10000);

} // end loop()

void InitDHT(){
    pinMode(dht_dpin,OUTPUT);
    digitalWrite(dht_dpin,HIGH);
} //end InitDHT

void ReadDHT(){
    bGlobalErr=0;
    byte dht_in;
    byte i;
    digitalWrite(dht_dpin,LOW);
    delay(18);
    delayMicroseconds(600);
    digitalWrite(dht_dpin,HIGH); 
    delayMicroseconds(40);
    pinMode(dht_dpin,INPUT);
    delayMicroseconds(40);

    dht_in=digitalRead(dht_dpin);

    if(dht_in) {
        bGlobalErr=1;
        return;
    } //end "if..."
    delayMicroseconds(80);

    dht_in=digitalRead(dht_dpin); //Was: dht_in = PINC & _BV(dht_PIN);

    if(!dht_in) {
        bGlobalErr=2;
        return;
    } //end "if..."

    delayMicroseconds(70);
    for (i=0; i<5; i++)
        dht_dat[i] = read_dht_dat();

    pinMode(dht_dpin,OUTPUT); //Was: DDRC |= _BV(dht_PIN);
    digitalWrite(dht_dpin,HIGH); //Was: PORTC |= _BV(dht_PIN);
    byte dht_check_sum =
            dht_dat[0]+dht_dat[1]+dht_dat[2]+dht_dat[3];
    if(dht_dat[4]!= dht_check_sum)
    {bGlobalErr=3; }
}; //end ReadDHT()

byte read_dht_dat(){
    byte i = 0;
    byte result=0;
    for(i=0; i< 8; i++) {
        while(digitalRead(dht_dpin)==LOW) ;
        delayMicroseconds(30);
        if (digitalRead(dht_dpin)==HIGH)
            result |=(1<<(7-i));
        while (digitalRead(dht_dpin)==HIGH) ;
    } //end of "for.."
    return result;
} //end of "read_dht_dat()"

Output is:

Humidity and temperature

0
humdity = 49.0%  temperature = 22.0C  
73
humdity = 49.0%  temperature = 22.0C  
73
humdity = 49.0%  temperature = 22.0C  
73
humdity = 49.0%  temperature = 22.0C

Variable "a" is set to "0" at the beginning and then somehow it has value of 71 inside the switch section, sometimes but very rare 70 or 72 which is even more weird. I have done different combinations with places where a is set to 0 and incremented.
I added variable "b" next to "a" and "b" was behaving as it should. Then I changed variable "a" in two "EEPROM.write..." commands on variable "b" and program was running well.
When I deleted variable "a", variable "b" started behaving exactly the same as variable "a".

Any ideas guys?

Thanks

Member Avatar
a_lan
Newbie Poster
5 posts since Feb 2011
Reputation Points: 0 [?]
Q&As Helped to Solve: 1 [?]
Skill Endorsements: 0 [?]
 
0
 

Answerd somewhere else.
Buffer overflow problem.
I did not even look at the code below (read from DHT sensor) as it was taken from some blog post. In function ReadDHT() checksum is written to dht_dat[4]. So I just extended to byte dht_dat[5] and now everything works perfectly.

Question Self-Answered as of 1 Year Ago
You
This question has already been solved: Start a new discussion instead
Post:
Start New Discussion
View similar articles that have also been tagged: