Go Down

Topic: error: expected unqualified-id before 'if' (Read 922 times) previous topic - next topic

Johnyz

Hello everybody, I'm trying to make a clock that also measures humidity and temperature using SparkFun DHT22 temp. and humidity sensor, DS3231 clock IC and a 16x2 LCD. I threw these three programs together (still a little new to programming). Now, the clock IC program is working with 1 second delay, the DHT22 is using 3 second delay. I honestly don't know millis() and I don't think it would be much reliable too. "This number will overflow (go back to zero), after approximately 50 days." I set up a little if() that executes the DHT22 part if count is 3 (and sets count to zero), else it adds one to count and does not execute the DHT22 part. I keep on getting this error right at the if(count == 3) part. Here is the code:

Code: [Select]
#include <Wire.h>

#define DS3231_I2C_ADDRESS 104
#define DHT11_PIN 0      // ADC0

byte seconds, minutes, hours, day, date, month, year;
int count;
char weekDay[4];

// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
 // set up the LCD's number of columns and rows:
 lcd.begin(16, 2);
 lcd.clear();
 Wire.begin();
}

void loop() {
 // set the cursor to column 0, line 1
 // (note: line 1 is the second row, since counting begins with 0):
 get3231Date();
 watchConsole();
 lcd.setCursor(0, 4);
 lcd.print(hours, DEC);
 lcd.print(":");
 lcd.print(minutes, DEC);
 lcd.print(":");
 lcd.print(seconds, DEC);
}

// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val)
{
 return ( (val/10*16) + (val%10) );
}

void watchConsole()
{
 if (Serial.available()) {      // Look for char in serial queue and process if found
   if (Serial.read() == 84) {      //If command = "T" Set Date
     set3231Date();
     get3231Date();
     Serial.println(" ");
   }
 }
}

void set3231Date()
{
 //T(sec)(min)(hour)(dayOfWeek)(dayOfMonth)(month)(year)
 //T(00-59)(00-59)(00-23)(1-7)(01-31)(01-12)(00-99)
 //Example: 02-Feb-09 @ 19:57:11 for the 3rd day of the week -> T1157193020209

 seconds = (byte) ((Serial.read() - 48) * 10 + (Serial.read() - 48)); // Use of (byte) type casting and ascii math to achieve result.  
 minutes = (byte) ((Serial.read() - 48) *10 +  (Serial.read() - 48));
 hours   = (byte) ((Serial.read() - 48) *10 +  (Serial.read() - 48));
 day     = (byte) (Serial.read() - 48);
 date    = (byte) ((Serial.read() - 48) *10 +  (Serial.read() - 48));
 month   = (byte) ((Serial.read() - 48) *10 +  (Serial.read() - 48));
 year    = (byte) ((Serial.read() - 48) *10 +  (Serial.read() - 48));
 Wire.beginTransmission(DS3231_I2C_ADDRESS);
 Wire.send(0x00);
 Wire.send(decToBcd(seconds));
 Wire.send(decToBcd(minutes));
 Wire.send(decToBcd(hours));
 Wire.send(decToBcd(day));
 Wire.send(decToBcd(date));
 Wire.send(decToBcd(month));
 Wire.send(decToBcd(year));
 Wire.endTransmission();
}


void get3231Date()
{
 // send request to receive data starting at register 0
 Wire.beginTransmission(DS3231_I2C_ADDRESS); // 104 is DS3231 device address
 Wire.send(0x00); // start at register 0
 Wire.endTransmission();
 Wire.requestFrom(DS3231_I2C_ADDRESS, 7); // request seven bytes

 if(Wire.available()) {
   seconds = Wire.receive(); // get seconds
   minutes = Wire.receive(); // get minutes
   hours   = Wire.receive();   // get hours
   day     = Wire.receive();
   date    = Wire.receive();
   month   = Wire.receive(); //temp month
   year    = Wire.receive();

   seconds = (((seconds & B11110000)>>4)*10 + (seconds & B00001111)); // convert BCD to decimal
   minutes = (((minutes & B11110000)>>4)*10 + (minutes & B00001111)); // convert BCD to decimal
   hours   = (((hours & B00110000)>>4)*10 + (hours & B00001111)); // convert BCD to decimal (assume 24 hour mode)
   day     = (day & B00000111); // 1-7
   date    = (((date & B00110000)>>4)*10 + (date & B00001111)); // 1-31
   month   = (((month & B00010000)>>4)*10 + (month & B00001111)); //msb7 is century overflow
   year    = (((year & B11110000)>>4)*10 + (year & B00001111));
 }
 else {
   //oh noes, no data!
 }

 switch (day) {
 case 1:
   strcpy(weekDay, "Sun");
   break;
 case 2:
   strcpy(weekDay, "Mon");
   break;
 case 3:
   strcpy(weekDay, "Tue");
   break;
 case 4:
   strcpy(weekDay, "Wed");
   break;
 case 5:
   strcpy(weekDay, "Thu");
   break;
 case 6:
   strcpy(weekDay, "Fri");
   break;
 case 7:
   strcpy(weekDay, "Sat");
   break;
 }
}

[glow]if (count == 3) {[/glow]

 count = 0;

 byte read_dht11_dat()
 {
   byte i = 0;
   byte result=0;
   for(i=0; i< 8; i++){

     while(!(PINC & _BV(DHT11_PIN)));  // wait 50us finish
     delayMicroseconds(30);
     if(PINC & _BV(DHT11_PIN))
       result |=(1<<(7-i));
     while((PINC & _BV(DHT11_PIN)));  // wait '1' finish

   }
   return result;
 }

 //Serial.println("A");
 byte dht11_dat[5];
 byte dht11_in;
 byte i;
 // start condition
 // 1. pull-down i/o pin from 18ms
 PORTC &= ~_BV(DHT11_PIN);
 //delay(18);  //DHT11 must >=18ms
 delay(5);  //DHT22 must 1~10ms
 PORTC |= _BV(DHT11_PIN);  // pull-up 20-40us
 delayMicroseconds(40);

 DDRC &= ~_BV(DHT11_PIN);
 delayMicroseconds(40);

 dht11_in = PINC & _BV(DHT11_PIN);
 //Serial.println("B"); //miss first 2 bits on DHT22
 if(dht11_in){
   Serial.println("dht11 start condition 1 not met");
   return;
 }
 delayMicroseconds(80);
 dht11_in = PINC & _BV(DHT11_PIN);

 if(!dht11_in){
   Serial.println("dht11 start condition 2 not met");
   return;
 }
 delayMicroseconds(80);

 // now ready for data reception
 for (i=0; i<5; i++)
   dht11_dat[i] = read_dht11_dat();

 DDRC |= _BV(DHT11_PIN);
 PORTC |= _BV(DHT11_PIN);

 byte dht11_check_sum = dht11_dat[0]+dht11_dat[1]+dht11_dat[2]+dht11_dat[3];

 // check check_sum
 if(dht11_dat[4] != dht11_check_sum)
   Serial.println("DHT11 checksum error");

 //debug
 for (i=0; i<5; i++) {
   Serial.print(dht11_dat[i], HEX);
   Serial.print(' ');
 }
 Serial.print("check_sum=");
 Serial.print(dht11_check_sum, HEX);
 Serial.println(' ');
 //end of debug

 int HighByte, LowByte, TReading, SignBit, Whole, Fract;   //DHT22
 HighByte = dht11_dat[0];   //DHT22
 LowByte = dht11_dat[1];   //DHT22
 TReading = (HighByte << 8) + LowByte;   //DHT22
 Whole = TReading / 10;   //DHT22
 Fract = TReading % 10;   //DHT22

 lcd.setCursor(1,3);
 //      Serial.print(dht11_dat[0], DEC);  //DHT11
 //      Serial.print(".");  //DHT11
 //      Serial.print(dht11_dat[1], DEC);  //DHT11
 lcd.print(Whole);  //DHT22
 lcd.print("%  ");   //DHT22

 HighByte = dht11_dat[2];
 LowByte = dht11_dat[3];
 TReading = (HighByte << 8) + LowByte;
 SignBit = TReading & 0x8000;  // test most sig bit
 if (SignBit) // negative
   TReading = (TReading ^ 0xffff) + 1;
 Whole = TReading / 10;
 Fract = TReading % 10;

 lcd.setCursor(1,10);
 //      Serial.print(dht11_dat[2], DEC);  //DHT11
 //      Serial.print(".");  //DHT11
 //      Serial.print(dht11_dat[3], DEC);  //DHT11

 if (SignBit) // If its negative
   lcd.print("-");
 lcd.print(Whole);  //DHT22
 Serial.println("C");  //DHT22

 //delay(2000);  //DHT11
 delay(3000);  //DHT22

 delayMicroseconds(810);
}

else{
 count++;
 delay(1);
}
delay(999);


Yes I already read all the topics about this and similar errors, I couldn't find anything useful. Either I'm blind or this is caused by something else. Does anyone see anything incorrect in the code? I might edit the code to omit functions like weekday etc. because I'm not going to be using them. Only hours, minutes, seconds and temperature + humidity will be used.

kevinsa5

I've never been able to read code effectively in the forum code boxes, but is that if statement in a method? seems like it's just chilling out there.

Johnyz

#2
Jan 03, 2011, 05:42 pm Last Edit: Jan 03, 2011, 05:42 pm by Johnyz Reason: 1
Bingo. And I nearly broke my keyboard with my head. I also moved other bytes and voids out of the void loop. And it compiled. Thanks. A lot.
Code: [Select]
#include <Wire.h>

#define DS3231_I2C_ADDRESS 104
#define DHT11_PIN 0      // ADC0

byte seconds, minutes, hours, day, date, month, year;
int count;
char weekDay[4];

// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
 // set up the LCD's number of columns and rows:
 lcd.begin(16, 2);
 lcd.clear();
 Wire.begin();
}

void loop() {
 // set the cursor to column 0, line 1
 // (note: line 1 is the second row, since counting begins with 0):
 get3231Date();
 watchConsole();
 lcd.setCursor(0, 4);
 lcd.print(hours, DEC);
 lcd.print(":");
 lcd.print(minutes, DEC);
 lcd.print(":");
 lcd.print(seconds, DEC);

 if (count == 3) {

   count = 0;



   //Serial.println("A");
   byte dht11_dat[5];
   byte dht11_in;
   byte i;
   // start condition
   // 1. pull-down i/o pin from 18ms
   PORTC &= ~_BV(DHT11_PIN);
   //delay(18);  //DHT11 must >=18ms
   delay(5);  //DHT22 must 1~10ms
   PORTC |= _BV(DHT11_PIN);  // pull-up 20-40us
   delayMicroseconds(40);

   DDRC &= ~_BV(DHT11_PIN);
   delayMicroseconds(40);

   dht11_in = PINC & _BV(DHT11_PIN);
   //Serial.println("B"); //miss first 2 bits on DHT22
   if(dht11_in){
     Serial.println("dht11 start condition 1 not met");
     return;
   }
   delayMicroseconds(80);
   dht11_in = PINC & _BV(DHT11_PIN);

   if(!dht11_in){
     Serial.println("dht11 start condition 2 not met");
     return;
   }
   delayMicroseconds(80);

   // now ready for data reception
   for (i=0; i<5; i++)
     dht11_dat[i] = read_dht11_dat();

   DDRC |= _BV(DHT11_PIN);
   PORTC |= _BV(DHT11_PIN);

   byte dht11_check_sum = dht11_dat[0]+dht11_dat[1]+dht11_dat[2]+dht11_dat[3];

   // check check_sum
   if(dht11_dat[4] != dht11_check_sum)
     Serial.println("DHT11 checksum error");

   //debug
   for (i=0; i<5; i++) {
     Serial.print(dht11_dat[i], HEX);
     Serial.print(' ');
   }
   Serial.print("check_sum=");
   Serial.print(dht11_check_sum, HEX);
   Serial.println(' ');
   //end of debug

   int HighByte, LowByte, TReading, SignBit, Whole, Fract;   //DHT22
   HighByte = dht11_dat[0];   //DHT22
   LowByte = dht11_dat[1];   //DHT22
   TReading = (HighByte << 8) + LowByte;   //DHT22
   Whole = TReading / 10;   //DHT22
   Fract = TReading % 10;   //DHT22

   lcd.setCursor(1,3);
   //      Serial.print(dht11_dat[0], DEC);  //DHT11
   //      Serial.print(".");  //DHT11
   //      Serial.print(dht11_dat[1], DEC);  //DHT11
   lcd.print(Whole);  //DHT22
   lcd.print("%  ");   //DHT22

   HighByte = dht11_dat[2];
   LowByte = dht11_dat[3];
   TReading = (HighByte << 8) + LowByte;
   SignBit = TReading & 0x8000;  // test most sig bit
   if (SignBit) // negative
     TReading = (TReading ^ 0xffff) + 1;
   Whole = TReading / 10;
   Fract = TReading % 10;

   lcd.setCursor(1,10);
   //      Serial.print(dht11_dat[2], DEC);  //DHT11
   //      Serial.print(".");  //DHT11
   //      Serial.print(dht11_dat[3], DEC);  //DHT11

   if (SignBit) // If its negative
     lcd.print("-");
   lcd.print(Whole);  //DHT22
   Serial.println("C");  //DHT22

   //delay(2000);  //DHT11
   delay(3000);  //DHT22

   delayMicroseconds(810);
 }

 else{
   count++;
   delay(1);
 }
 delay(999);
}

// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val)
{
 return ( (val/10*16) + (val%10) );
}

void watchConsole()
{
 if (Serial.available()) {      // Look for char in serial queue and process if found
   if (Serial.read() == 84) {      //If command = "T" Set Date
     set3231Date();
     get3231Date();
     Serial.println(" ");
   }
 }
}

void set3231Date()
{
 //T(sec)(min)(hour)(dayOfWeek)(dayOfMonth)(month)(year)
 //T(00-59)(00-59)(00-23)(1-7)(01-31)(01-12)(00-99)
 //Example: 02-Feb-09 @ 19:57:11 for the 3rd day of the week -> T1157193020209

 seconds = (byte) ((Serial.read() - 48) * 10 + (Serial.read() - 48)); // Use of (byte) type casting and ascii math to achieve result.  
 minutes = (byte) ((Serial.read() - 48) *10 +  (Serial.read() - 48));
 hours   = (byte) ((Serial.read() - 48) *10 +  (Serial.read() - 48));
 day     = (byte) (Serial.read() - 48);
 date    = (byte) ((Serial.read() - 48) *10 +  (Serial.read() - 48));
 month   = (byte) ((Serial.read() - 48) *10 +  (Serial.read() - 48));
 year    = (byte) ((Serial.read() - 48) *10 +  (Serial.read() - 48));
 Wire.beginTransmission(DS3231_I2C_ADDRESS);
 Wire.send(0x00);
 Wire.send(decToBcd(seconds));
 Wire.send(decToBcd(minutes));
 Wire.send(decToBcd(hours));
 Wire.send(decToBcd(day));
 Wire.send(decToBcd(date));
 Wire.send(decToBcd(month));
 Wire.send(decToBcd(year));
 Wire.endTransmission();
}

void get3231Date()
{
 // send request to receive data starting at register 0
 Wire.beginTransmission(DS3231_I2C_ADDRESS); // 104 is DS3231 device address
 Wire.send(0x00); // start at register 0
 Wire.endTransmission();
 Wire.requestFrom(DS3231_I2C_ADDRESS, 7); // request seven bytes

 if(Wire.available()) {
   seconds = Wire.receive(); // get seconds
   minutes = Wire.receive(); // get minutes
   hours   = Wire.receive();   // get hours
   day     = Wire.receive();
   date    = Wire.receive();
   month   = Wire.receive(); //temp month
   year    = Wire.receive();

   seconds = (((seconds & B11110000)>>4)*10 + (seconds & B00001111)); // convert BCD to decimal
   minutes = (((minutes & B11110000)>>4)*10 + (minutes & B00001111)); // convert BCD to decimal
   hours   = (((hours & B00110000)>>4)*10 + (hours & B00001111)); // convert BCD to decimal (assume 24 hour mode)
   day     = (day & B00000111); // 1-7
   date    = (((date & B00110000)>>4)*10 + (date & B00001111)); // 1-31
   month   = (((month & B00010000)>>4)*10 + (month & B00001111)); //msb7 is century overflow
   year    = (((year & B11110000)>>4)*10 + (year & B00001111));
 }
 else {
   //oh noes, no data!
 }

 switch (day) {
 case 1:
   strcpy(weekDay, "Sun");
   break;
 case 2:
   strcpy(weekDay, "Mon");
   break;
 case 3:
   strcpy(weekDay, "Tue");
   break;
 case 4:
   strcpy(weekDay, "Wed");
   break;
 case 5:
   strcpy(weekDay, "Thu");
   break;
 case 6:
   strcpy(weekDay, "Fri");
   break;
 case 7:
   strcpy(weekDay, "Sat");
   break;
 }
}

byte read_dht11_dat()
{
 byte i = 0;
 byte result=0;
 for(i=0; i< 8; i++){

   while(!(PINC & _BV(DHT11_PIN)));  // wait 50us finish
   delayMicroseconds(30);
   if(PINC & _BV(DHT11_PIN))
     result |=(1<<(7-i));
   while((PINC & _BV(DHT11_PIN)));  // wait '1' finish

 }
 return result;
}


Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy