Could someone help me with this code of mine? Gyro + DHT22 + BMP180 sensor

My code gives me the error - Arduino: 1.8.19 (Windows Store 1.8.57.0) (Windows 10), Board: "Arduino Nano, ATmega328P (Old Bootloader)"

C:\Users\User\Desktop\minimu-9-ahrs-arduino-1.3.0\MinIMU9AHRS\MinIMU9AHRS.ino: In function 'void loop()':

MinIMU9AHRS:184:20: error: expected primary-expression before '.' token

   int chk = DHT.read22(DHT22_PIN);

                ^

MinIMU9AHRS:185:16: error: expected primary-expression before '.' token

   hum = DHT.humidity;

            ^

MinIMU9AHRS:186:17: error: expected primary-expression before '.' token

   temp = DHT.temperature;

             ^

Multiple libraries were found for "DHT.h"

Used: C:\Users\User\Documents\Arduino\libraries\DHT_sensor_library

Not used: C:\Users\User\Documents\Arduino\libraries\sketch_mar06a

exit status 1

expected primary-expression before '.' token

This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.

#include <SD.h> 
#include<SPI.h>
#include<SD.h>
#include <Wire.h>
#include <Adafruit_BMP085.h>
#include <DHT.h>
#define DHTTYPE DHT22
#define IMU_V5
int SENSOR_SIGN[9] = {1,1,1,-1,-1,-1,1,1,1}; 
#define GRAVITY 256
#define seaLevelPressure_hPa 1013.25
#define ToRad(x) ((x)*0.01745329252)  // *pi/180
#define ToDeg(x) ((x)*57.2957795131)  // *180/pi
#define Gyro_Gain_X 0.07 //X axis Gyro gain
#define Gyro_Gain_Y 0.07 //Y axis Gyro gain
#define Gyro_Gain_Z 0.07 //Z axis Gyro gain
#define Gyro_Scaled_X(x) ((x)*ToRad(Gyro_Gain_X)) //Return the scaled ADC raw data of the gyro in radians for second
#define Gyro_Scaled_Y(x) ((x)*ToRad(Gyro_Gain_Y)) //Return the scaled ADC raw data of the gyro in radians for second
#define Gyro_Scaled_Z(x) ((x)*ToRad(Gyro_Gain_Z)) //Return the scaled ADC raw data of the gyro in radians for second
#define DHT22_PIN 8 
#define M_X_MIN -1000
#define M_Y_MIN -1000
#define M_Z_MIN -1000
#define M_X_MAX +1000
#define M_Y_MAX +1000
#define M_Z_MAX +1000
#define Kp_ROLLPITCH 0.02
#define Ki_ROLLPITCH 0.00002
#define Kp_YAW 1.2
#define Ki_YAW 0.00002
#define OUTPUTMODE 1
#define PRINT_DCM 0     //Will print the whole direction cosine matrix
#define PRINT_ANALOGS 0 //Will print the analog raw data
#define PRINT_EULER 1   //Will print the Euler angles Roll, Pitch and Yaw
#define STATUS_LED 13
const int buttonPin = 2;   
int buttonState = 0; 
const int chipSelect = 4;
File myFile;
float G_Dt=0.02;    // Integration time (DCM algorithm)  We will run the integration loop at 50Hz if possible
long timer=0;   //general purpuse timer
long timer_old;
long timer24=0; //Second timer used to print values
int AN[6]; //array that stores the gyro and accelerometer data
int AN_OFFSET[6]={0,0,0,0,0,0}; //Array that stores the Offset of the sensors

int gyro_x;
int gyro_y;
int gyro_z;
int accel_x;
int accel_y;
int accel_z;
int magnetom_x;
int magnetom_y;
int magnetom_z;
float c_magnetom_x;
float c_magnetom_y;
float c_magnetom_z;
float MAG_Heading;

float Accel_Vector[3]= {0,0,0}; //Store the acceleration in a vector
float Gyro_Vector[3]= {0,0,0};//Store the gyros turn rate in a vector
float Omega_Vector[3]= {0,0,0}; //Corrected Gyro_Vector data
float Omega_P[3]= {0,0,0};//Omega Proportional correction
float Omega_I[3]= {0,0,0};//Omega Integrator
float Omega[3]= {0,0,0};

// Euler angles
float roll;
float pitch;
float yaw;
// idk
float hum;  
float temp; 
Adafruit_BMP085 bmp;

float errorRollPitch[3]= {0,0,0};
float errorYaw[3]= {0,0,0};

unsigned int counter=0;
byte gyro_sat=0;

float DCM_Matrix[3][3]= {
  {
    1,0,0  }
  ,{
    0,1,0  }
  ,{
    0,0,1  }
};
float Update_Matrix[3][3]={{0,1,2},{3,4,5},{6,7,8}}; //Gyros here


float Temporary_Matrix[3][3]={
  {
    0,0,0  }
  ,{
    0,0,0  }
  ,{
    0,0,0  }
};

void setup()
{
  Serial.begin(115200);
  pinMode (STATUS_LED,OUTPUT);  // Status LED

  I2C_Init();

  Serial.println("Pololu MinIMU-9 + Arduino AHRS");

  digitalWrite(STATUS_LED,LOW);
  delay(1500);

  Accel_Init();
  Compass_Init();
  Gyro_Init();

  delay(20);

  for(int i=0;i<32;i++)    // We take some readings...
    {
    Read_Gyro();
    Read_Accel();
    for(int y=0; y<6; y++)   // Cumulate values
      AN_OFFSET[y] += AN[y];
    delay(20);
    }

  for(int y=0; y<6; y++)
    AN_OFFSET[y] = AN_OFFSET[y]/32;

  AN_OFFSET[5]-=GRAVITY*SENSOR_SIGN[5];

  //Serial.println("Offset:");
  for(int y=0; y<6; y++)
    Serial.println(AN_OFFSET[y]);

  delay(2000);
  digitalWrite(STATUS_LED,HIGH);

  timer=millis();
  delay(20);
  counter=0;
 pinMode(buttonPin, INPUT);
Serial.println("Initializing SD card...");
  if(!SD.begin(chipSelect)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
  myFile=SD.open("DATA.txt", FILE_WRITE);
  if (myFile) {
    Serial.println("File opened ok");
    myFile.println("Output of BMP180, DHT22");
  }
  myFile.close();
  if (!bmp.begin()) {
  Serial.println("Could not find a valid BMP085 sensor, check wiring!");
  while (1) {}
  }
}

void loop() //Main Loop
{
  buttonState = digitalRead(buttonPin);
  if(buttonState == HIGH){
      Serial.print("Temperature = ");
      Serial.print(bmp.readTemperature());
      Serial.println(" *C");
      Serial.print("Pressure = ");
      Serial.print(bmp.readPressure());
      Serial.println(" Pa");
      Serial.print("Altitude = ");
      Serial.print(bmp.readAltitude());
      Serial.println(" meters");
      Serial.print("Pressure at sealevel (calculated) = ");
      Serial.print(bmp.readSealevelPressure());
      Serial.println(" Pa");
      Serial.print("Real altitude = ");
      Serial.print(bmp.readAltitude(seaLevelPressure_hPa * 100));
      Serial.println(" meters");
      Serial.println();
      int chk = DHT.read22(DHT22_PIN);
      hum = DHT.humidity;
      temp = DHT.temperature;
      Serial.print("Humidity: ");
      Serial.print(hum);
      Serial.print(" %, Temp: ");
      Serial.print(temp);
      Serial.println(" Celsius");
      myFile = SD.open("DATA.txt", FILE_WRITE);
    if (myFile) {
      Serial.println("open with success");
      myFile.print(temp);
      myFile.println(",");
      myFile.print(hum);
    }
  myFile.close();
    delay(2000); 
  } 
  else{
    Serial.println("Error!!!");
  }
  if((millis()-timer)>=20)  // Main loop runs at 50Hz
  {
    counter++;
    timer_old = timer;
    timer=millis();
    if (timer>timer_old)
    {
      G_Dt = (timer-timer_old)/1000.0;    // Real time of loop run. We use this on the DCM algorithm (gyro integration time)
      if (G_Dt > 0.2)
        G_Dt = 0; // ignore integration times over 200 ms
    }
    else
      G_Dt = 0;



    // *** DCM algorithm
    // Data adquisition
    Read_Gyro();   // This read gyro data
    Read_Accel();     // Read I2C accelerometer

    if (counter > 5)  // Read compass data at 10Hz... (5 loop runs)
    {
      counter=0;
      Read_Compass();    // Read I2C magnetometer
      Compass_Heading(); // Calculate magnetic heading
    }

    // Calculations...
    Matrix_update();
    Normalize();
    Drift_correction();
    Euler_angles();
    // ***

    printdata();
  }

}

As the pre processor says, you seem to have 2 versions of a DHT library. The one in C:\Users\User\Documents\Arduino\libraries\sketch_mar06a does not feel legit.. It feels like a sketch has been misplaced in the library folder, you should probably remove it from there.

the question is also about the other one: C:\Users\User\Documents\Arduino\libraries\DHT_sensor_library ➜ is it really the one you need to use in your sketch ?

where did you find the sketch and did they refer to that library? You do things like

    int chk = DHT.read22(DHT22_PIN);

so it means a global object called DHT should exist and if you look at the example for the library you included they create an instance

DHT dht(DHTPIN, DHTTYPE);

then call begin in the setup

  dht.begin();

and extract this information using that instance

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  float f = dht.readTemperature(true);

➜ you probably mixed code from two DHT examples not relying on the same library

as you have started with adafruit's Library, stick to it and use it as they do in their examples. (study those)

2 Likes

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.