Code for my project

Hello, i’m in need a code for my project.

This is a weather station that is capable of displaying on a 20x4 lcd the;
Temperature
Humidity
Pressure
Altitude

Using a DHT11 and the BMP180 sensor

i have included a schematic drawing too if that will assist you.

many thanks :slight_smile:

We can help you with the code you have.

.

Ok thanks.

So far i’ve gotten this far with my code.

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT11.h>

int pin=2;
DHT11 dht11(pin);
LiquidCrystal_I2C lcd(0x27,20,4); 

void setup()
{
  lcd.init();
  lcd.init();
  
  lcd.backlight();
  lcd.setCursor(0,0);
  lcd.print("Temperature:");
  lcd.setCursor(0,2);
  lcd.print("Pressure:");
  lcd.setCursor(0,1);
  lcd.print("Humidity:");
  lcd.setCursor(0,3);
  lcd.print("Altitude:");   
}

void loop()
{
  int err;
  float temp, humi;
  if((err=dht11.read(humi, temp))=0)
{
  lcd.clear();
  delay(500);
  lcd.setCursor(0,0);
  lcd.print("Temperature:");
  lcd.setCursor(0,1);
  lcd.print("Humidity:");
  lcd.setCursor(0,2);
  lcd.print("Pressure:");
  lcd.setCursor(0,3);
  lcd.print("Altitude:");
  lcd.print(temp);
  lcd.print(" C");
  lcd.setCursor(9,0);
  lcd.print(humi);
  lcd.print(" %");
  delay(10000);
}
}

This is what i’ve written at the moment.
i cant seem to get the temp and altitude to display on lcd
thanks

Can you get the LCD to work with a simple sketch?

Google for examples.
Here is one that comes up.
http://arduino-info.wikispaces.com/LCD-Blue-I2C

.

Check your usage of 'if'
if((err=dht11.read(humi, temp))=0)

Thank you that did help me get there in the end.

My most up to date code is

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT11.h>

int pin=2;
DHT11 dht11(pin);
LiquidCrystal_I2C lcd(0x27,20,4); 

void setup()
{
  lcd.init();
  lcd.init();
  
  lcd.backlight();
  lcd.setCursor(0,0);
  lcd.print("Temp:");
  lcd.setCursor(0,2);
  lcd.print("Pressure:");
  lcd.setCursor(0,1);
  lcd.print("Humidity:");
  lcd.setCursor(0,3);
  lcd.print("Altitude:");   
}

void loop()
{
  int err;
  float temp, humi;
  if((err=dht11.read(humi, temp))=0)
  dht11.read (humi, temp);
{
  lcd.clear();
  delay(500);
  lcd.setCursor(0,0);
  lcd.print("Humidity:");
  lcd.setCursor(0,1);
  lcd.print("Altitude:");
  lcd.setCursor(0,2);
  lcd.print("Pressure:");
  lcd.setCursor(0,3);
  lcd.print("Temperature:");
  lcd.print(temp);
  lcd.print(" C");
  lcd.setCursor(9,0);
  lcd.print(humi);
  lcd.print(" %");
  delay(10000);
}
}

This has finally got me to do exactly what i wanted though it does mix the temperature and humidity with the other ones that isn’t yet plugged in but so far so good.

Thanks will keep updating this thread in case of any other errors! :slight_smile: :slight_smile:

BTW
If you are going to do more of this kind of thing, a hand drawn schematic is much better than the best fritzing drawing.

.

larryd:
BTW
If you are going to do more of this kind of thing, a hand drawn schematic is much better than the best fritzing drawing.

.

Thank you for letting me know, i wasn't sure which is better!

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT11.h>
#include <SFE_BMP180.h>

int pin=2;
DHT11 dht11(pin);
LiquidCrystal_I2C lcd(0x27,20,4); 
SFE_BMP180 Pressure;

#define Altitude 72.0 // Altitude of Central Sussex College

void setup()
{

  (Pressure.begin());
  lcd.init();
  
  lcd.backlight();
  lcd.setCursor(0,0);
  lcd.print("Temp:");
  lcd.setCursor(0,2);
  lcd.print("Pressure:");
  lcd.setCursor(0,1);
  lcd.print("Humidity:");
  lcd.setCursor(0,3);
  lcd.print("Altitude:");   
}

void loop()
{
  int err;
  float temp, humi;
  if((err=dht11.read(humi, temp))=0)
  dht11.read (humi, temp);
  char status;
  double T,P,p0,a;
  
{
  lcd.clear();
  delay(500);
  lcd.setCursor(0,0);
  lcd.print("Humidity:");
  lcd.setCursor(0,1);
  lcd.print("Temperature:");
  lcd.print(temp);
  lcd.print(" C");
  lcd.setCursor(9,0);
  lcd.print(humi);
  lcd.print(" %");

  lcd.println();
  lcd.setCursor(0,2);
  lcd.print("Altitude:");
  lcd.print(Altitude);
  lcd.print(" ft");

  status = Pressure.getPressure(P,T);
  
  lcd.setCursor(0,3);
  lcd.print("Pressure:");
  lcd.print(P,2);
  lcd.print(" mb");
  

  delay(10000);
}
}

This is the code i have worked upon and came to an end. It works although i would like to change it so that i don’t tell it what the altitude is but instead it telling me what the value is…

If anyone can give me a hand in this i would really appreciate it as ive been playing around with to no avail.
thanks

Started a mini project not too long ago and yesterday i have started the coding process so with the aid of other forum user and guides and some googling i have got to this code.
I’m doing this for school project so i would love it to work correctly but i’m not sure as too why it isnt displaying the values i wanted.

I would like to use the Barometric pressure to find altitude and not myself inputting the altitude myself but i can’t seem to find the correct code.
Any help and criticism is welcome as it will help me learn

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT11.h>
#include <SFE_BMP180.h>

int pin = 2;
DHT11 dht11(pin);
LiquidCrystal_I2C lcd(0x27, 20, 4);
SFE_BMP180 Pressure;

#define Altitude 72.0 // Altitude of Central Sussex College

void setup()
{

  (Pressure.begin());
  lcd.init();

  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("Temp:");
  lcd.setCursor(0, 2);
  lcd.print("Pressure:");
  lcd.setCursor(0, 1);
  lcd.print("Humidity:");
  lcd.setCursor(0, 3);
  lcd.print("Altitude:");
}

void loop()
{
  int err;
  float temp, humi;
  if ((err = dht11.read(humi, temp)) = 0)
    dht11.read (humi, temp);
  char status;
  double T, P, p0, a;

  {
    lcd.clear();
    delay(50);
    lcd.setCursor(0, 0);
    lcd.print("Humidity:");
    lcd.setCursor(1, 1);
    lcd.print("Temperature:");
    lcd.print(temp);
    lcd.print(" C");
    lcd.setCursor(9, 0);
    lcd.print(humi);
    lcd.print(" %");
  }
  {
    char status;
    double T, P, p0, a;

  status = Pressure.startTemperature();
  }
  {
    status = Pressure.getTemperature(T);

    status = Pressure.startPressure(3);
  }
  {
    status = Pressure.getPressure(P,T);
    p0 = Pressure.sealevel(P,Altitude);

    lcd.setCursor(0,2);
    lcd.print("Pressure:");
    lcd.print(p0,2);
    lcd.print(" mb");
    
  }
  {

    status = Pressure.getTemperature(T);
    status = Pressure.getPressure(P, T);
    p0 = Pressure.sealevel(P, Altitude);

    a = Pressure.altitude(P, p0);

    lcd.println();
    lcd.setCursor(0, 3);
    lcd.print("Altitude:");
    lcd.print(a * 3.28084, 0);
    lcd.print(" ft");
    // This is because im telling it what the altitude is at my location

    status = Pressure.startPressure(3);

    status = Pressure.getTemperature(T);
    status = Pressure.getPressure(P, T);

    p0 = Pressure.sealevel(P, Altitude);

    delay(5000);
  }
}
  if ((err = dht11.read(humi, temp)) = 0)

ANOTHER thread with this same crappy code? Why?

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT11.h>
#include <SFE_BMP180.h>

int pin = 2;
DHT11 dht11(pin);
LiquidCrystal_I2C lcd(0x27, 20, 4);
SFE_BMP180 Pressure;

#define Altitude 72.0 // Altitude of Central Sussex College

void setup()
{

  (Pressure.begin());
  lcd.init();

  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("Temp:");
  lcd.setCursor(0, 2);
  lcd.print("Pressure:");
  lcd.setCursor(0, 1);
  lcd.print("Humidity:");
  lcd.setCursor(0, 3);
  lcd.print("Altitude:");
}

void loop()
{
  int err;
  float temp, humi;
    dht11.read (humi, temp);
  char status;
  double T, P, p0, a;

  {
    lcd.clear();
    delay(50);
    lcd.setCursor(0, 0);
    lcd.print("Humidity:");
    lcd.setCursor(1, 1);
    lcd.print("Temperature:");
    lcd.print(temp);
    lcd.print(" C");
    lcd.setCursor(9, 0);
    lcd.print(humi);
    lcd.print(" %");
  }
  {
    char status;
    double T, P, p0, a;

  status = Pressure.startTemperature();
  }
  {
    status = Pressure.getTemperature(T);

    status = Pressure.startPressure(3);
  }
  {
    status = Pressure.getPressure(P,T);
    p0 = Pressure.sealevel(P,Altitude);

    lcd.setCursor(0,2);
    lcd.print("Pressure:");
    lcd.print(p0,2);
    lcd.print(" mb");
    
  }
  {

    status = Pressure.getTemperature(T);
    status = Pressure.getPressure(P, T);
    p0 = Pressure.sealevel(P, Altitude);

    a = Pressure.altitude(P, p0);

    lcd.println();
    lcd.setCursor(0, 3);
    lcd.print("Altitude:");
    lcd.print(a * 3.28084, 0);
    lcd.print(" ft");
    // This is because im telling it what the altitude is at my location

    status = Pressure.startPressure(3);

    status = Pressure.getTemperature(T);
    status = Pressure.getPressure(P, T);

    p0 = Pressure.sealevel(P, Altitude);

    delay(5000);
  }
}

I wasn’t sure if it did anything but clearly it didn’t.
I’ve removed it and it does the same thing i’m in learning process still
Thank you

why are you wrapping this block in braces:

#include <Wire.h>

  {
    lcd.clear();
    delay(50);
    lcd.setCursor(0, 0);
    lcd.print("Humidity:");
    lcd.setCursor(1, 1);
    lcd.print("Temperature:");
    lcd.print(temp);
    lcd.print(" C");
    lcd.setCursor(9, 0);
    lcd.print(humi);
    lcd.print(" %");
  }

why do you create these variables twice (they are of different scope, too):

char status;
double T, P, p0, a;

I’d toss this whole thing and start with either the BMT or DHT sensor examples…

Where did you get the DHT11 library you are using?

{ Why } { is } (your) (code) { loaded } {with useless braces and brackets} ?

Like I already reported to the mods (but appearently they are still asleep :stuck_out_tongue: ) it's a triple cross post.

And

I use these {} brackets because it helps understand what i’ve written
I placed them there as a way of getting back to them later if needed.
I’m using the DHT11 library as an example and just re-writing them to my written code
I’m trying to do the same with the BMP180, it works but the serial monitor is displaying one value and the actual project lcd displays another?

tangopear:
I use these {} brackets because it helps understand what i’ve written

I placed them there as a way of getting back to them later if needed.

Then just put that block into a function. Using those braces in that manner is a bad habit that will eventually (like your code) cause you problems with scope.

tangopear:
I’m using the DHT11 library as an example and just re-writing them to my written code
I’m trying to do the same with the BMP180, it works but the serial monitor is displaying one value and the actual project lcd displays another?

Because your code formatting is bad (sorry) it is making it harder to debug.

Oh right, sorry ill change it once i’ve finished. This is the bmp180 library im using as a reference point.

#include <SFE_BMP180.h>
#include <Wire.h>

// You will need to create an SFE_BMP180 object, here called "pressure":

SFE_BMP180 pressure;

#define ALTITUDE 1655.0 // Altitude of SparkFun's HQ in Boulder, CO. in meters

void setup()
{
  Serial.begin(9600);
  Serial.println("REBOOT");

  // Initialize the sensor (it is important to get calibration values stored on the device).

  if (pressure.begin())
    Serial.println("BMP180 init success");
  else
  {
    // Oops, something went wrong, this is usually a connection problem,
    // see the comments at the top of this sketch for the proper connections.

    Serial.println("BMP180 init fail\n\n");
    while(1); // Pause forever.
  }
}

void loop()
{
  char status;
  double T,P,p0,a;

  // Loop here getting pressure readings every 10 seconds.

  // If you want sea-level-compensated pressure, as used in weather reports,
  // you will need to know the altitude at which your measurements are taken.
  // We're using a constant called ALTITUDE in this sketch:
  
  Serial.println();
  Serial.print("provided altitude: ");
  Serial.print(ALTITUDE,0);
  Serial.print(" meters, ");
  Serial.print(ALTITUDE*3.28084,0);
  Serial.println(" feet");
  
  // If you want to measure altitude, and not pressure, you will instead need
  // to provide a known baseline pressure. This is shown at the end of the sketch.

  // You must first get a temperature measurement to perform a pressure reading.
  
  // Start a temperature measurement:
  // If request is successful, the number of ms to wait is returned.
  // If request is unsuccessful, 0 is returned.

  status = pressure.startTemperature();
  if (status != 0)
  {
    // Wait for the measurement to complete:
    delay(status);

    // Retrieve the completed temperature measurement:
    // Note that the measurement is stored in the variable T.
    // Function returns 1 if successful, 0 if failure.

    status = pressure.getTemperature(T);
    if (status != 0)
    {
      // Print out the measurement:
      Serial.print("temperature: ");
      Serial.print(T,2);
      Serial.print(" deg C, ");
      Serial.print((9.0/5.0)*T+32.0,2);
      Serial.println(" deg F");
      
      // Start a pressure measurement:
      // The parameter is the oversampling setting, from 0 to 3 (highest res, longest wait).
      // If request is successful, the number of ms to wait is returned.
      // If request is unsuccessful, 0 is returned.

      status = pressure.startPressure(3);
      if (status != 0)
      {
        // Wait for the measurement to complete:
        delay(status);

        // Retrieve the completed pressure measurement:
        // Note that the measurement is stored in the variable P.
        // Note also that the function requires the previous temperature measurement (T).
        // (If temperature is stable, you can do one temperature measurement for a number of pressure measurements.)
        // Function returns 1 if successful, 0 if failure.

        status = pressure.getPressure(P,T);
        if (status != 0)
        {
          // Print out the measurement:
          Serial.print("absolute pressure: ");
          Serial.print(P,2);
          Serial.print(" mb, ");
          Serial.print(P*0.0295333727,2);
          Serial.println(" inHg");

          // The pressure sensor returns abolute pressure, which varies with altitude.
          // To remove the effects of altitude, use the sealevel function and your current altitude.
          // This number is commonly used in weather reports.
          // Parameters: P = absolute pressure in mb, ALTITUDE = current altitude in m.
          // Result: p0 = sea-level compensated pressure in mb

          p0 = pressure.sealevel(P,ALTITUDE); // we're at 1655 meters (Boulder, CO)
          Serial.print("relative (sea-level) pressure: ");
          Serial.print(p0,2);
          Serial.print(" mb, ");
          Serial.print(p0*0.0295333727,2);
          Serial.println(" inHg");

          // On the other hand, if you want to determine your altitude from the pressure reading,
          // use the altitude function along with a baseline pressure (sea-level or other).
          // Parameters: P = absolute pressure in mb, p0 = baseline pressure in mb.
          // Result: a = altitude in m.

          a = pressure.altitude(P,p0);
          Serial.print("computed altitude: ");
          Serial.print(a,0);
          Serial.print(" meters, ");
          Serial.print(a*3.28084,0);
          Serial.println(" feet");
        }
        else Serial.println("error retrieving pressure measurement\n");
      }
      else Serial.println("error starting pressure measurement\n");
    }
    else Serial.println("error retrieving temperature measurement\n");
  }
  else Serial.println("error starting temperature measurement\n");

  delay(5000);  // Pause for 5 seconds.
}

I’ve read it and re read it over and over again but not sure
this is what ive got so far.

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT11.h>
#include <SFE_BMP180.h>

int pin = 2;
DHT11 dht11(pin);
LiquidCrystal_I2C lcd(0x27, 20, 4);
SFE_BMP180 Pressure;

#define Altitude 72.0 // Altitude of Central Sussex College

void setup()
{

  (Pressure.begin());
  lcd.init();

  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("Temp:");
  lcd.setCursor(0, 2);
  lcd.print("Pressure:");
  lcd.setCursor(0, 1);
  lcd.print("Humidity:");
  lcd.setCursor(0, 3);
  lcd.print("Altitude:");
}

void loop()
{
  int err;
  float temp, humi;
  dht11.read (humi, temp);
  char status;
  double T, P, p0, a;

  {
    lcd.clear();
    delay(50);
    lcd.setCursor(0, 0);
    lcd.print("Humidity:");
    lcd.setCursor(1, 1);
    lcd.print("Temperature:");
    lcd.print(temp);
    lcd.print(" C");
    lcd.setCursor(9, 0);
    lcd.print(humi);
    lcd.print(" %");
  }
  {

    status = Pressure.startTemperature();
  }
  {
    status = Pressure.getTemperature(T);

    status = Pressure.startPressure(3);
  }
  {
    status = Pressure.getPressure(P, T);
    p0 = Pressure.sealevel(P, Altitude);

    lcd.setCursor(0, 2);
    lcd.print("Pressure:");
    lcd.print(p0, 2);
    lcd.print(" mb");
    
  }
  {

    status = Pressure.getTemperature(T);
    status = Pressure.getPressure(P, T);
    p0 = Pressure.sealevel(P, Altitude);

    a = Pressure.altitude(P, p0);

    lcd.println();
    lcd.setCursor(0, 3);
    lcd.print("Altitude:");
    lcd.print(a * 3.28084, 0);
    lcd.print(" ft");
    // This is because im telling it what the altitude is at my location

    status = Pressure.startPressure(3);

    status = Pressure.getTemperature(T);
    status = Pressure.getPressure(P, T);

    p0 = Pressure.sealevel(P, Altitude);

    delay(5000);
  }
}

I urge you to get rid of those damn silly superfluous curly braces; they are not helping you, it is a bad habit to start so take the opportunity to stop now.

  {

    status = Pressure.startTemperature();
  }
  {
    status = Pressure.getTemperature(T);

    status = Pressure.startPressure(3);
  }
  {
    status = Pressure.getPressure(P, T);
    p0 = Pressure.sealevel(P, Altitude);

what is status, how many things can it be?

Ok I shall get rid of the brackets thank you for the advice. :slight_smile:
That’s what I don’t understand from the sparkfun bmp180 code I’ve been using as an example.