Skip to content

Instantly share code, notes, and snippets.

@2N2222A
Created October 17, 2012 05:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save 2N2222A/3903853 to your computer and use it in GitHub Desktop.
Save 2N2222A/3903853 to your computer and use it in GitHub Desktop.
Arduino temperature, humidity, and pressure monitor interfaced with a PICAXE OLED display.
//This code is for Arduino 0023 or less only.
/* The library to run the OLED display comes from here:
https://www.adafruit.com/products/823
The library was made for Arduino 1.0 but it had to be modified to work with Arduino 0023 or less.
*/
// Read temperature/humidity/pressure from sensors and display on 16x2 Character LCD screen
#include <Adafruit_CharacterOLED.h>
#include <Sensirion.h>
#include <Wire.h>
#define sensorDataPin 3 //SHT15 Data pin
#define sensorClockPin 4 //SHT SCK pin
#define BMP085_ADDRESS 0x77
const unsigned char OSS = 1; // Oversampling Setting (default in this code is 0)
Adafruit_CharacterOLED lcd(6, 7, 8, 9, 10, 11, 12);
float temperature;
float humidity;
float dewpoint;
Sensirion tempSensor = Sensirion(sensorDataPin, sensorClockPin);
// Calibration values for BMP085
int ac1;
int ac2;
int ac3;
unsigned int ac4;
unsigned int ac5;
unsigned int ac6;
int b1;
int b2;
int mb;
int mc;
int md;
// b5 is calculated in bmp085GetTemperature(...), this variable is also used in bmp085GetPressure(...)
// so ...Temperature(...) must be called before ...Pressure(...).
long b5;
void setup() {
pinMode(2, OUTPUT);
pinMode(13, OUTPUT);
Wire.begin();
lcd.begin(16,2);
bmp085Calibration();
lcd.setCursor(0,0);
lcd.print("Temp/RH/Press");
lcd.setCursor(0,1);
lcd.print("Monitor Rev 2.2b");
delay(5000);
lcd.clear();
}
void loop() {
// get the temp/humidity
tempSensor.measure(&temperature, &humidity, &dewpoint);
lcd.setCursor(0,0);
lcd.print("T1");
lcd.setCursor(3,0);
lcd.print(convertToFahrenheit(temperature), 1);
lcd.setCursor(8,0);
lcd.print("RH");
lcd.setCursor(11,0);
lcd.print(humidity,2);
if(humidity>=50.0){
digitalWrite(2, HIGH);
}else if(humidity<=48.0){
digitalWrite(2, LOW);
}
float temperature1 = bmp085GetTemperature(bmp085ReadUT()); //MUST be called first
float pressure = bmp085GetPressure(bmp085ReadUP());
//float atm = pressure / 101325; // "standard atmosphere"
//float altitude = calcAltitude(pressure); //Uncompensated caculation - in Meters
//Altitude measurement is not utilized.
lcd.setCursor(0,1);
lcd.print("T2");
lcd.setCursor(3,1);
float fahrenheit;
fahrenheit=(((9.0 / 5.0) * temperature1) + 32.0);
lcd.print(fahrenheit, 1); //display 2 decimal places
lcd.setCursor(8,1);
lcd.print("PS");
float inpress;
inpress=(pressure*0.000295299830714); //Converting Pa to inHg
lcd.setCursor(11,1);
lcd.print(inpress, 2); //whole number only (if displaying in Pa).
//lcd.print("Pa"); ***In this case value is to 2 decimal places***
float voltage=(analogRead(0)*0.004882812);
if(voltage>=3.77){
digitalWrite(13, LOW);
}else if(voltage<=3.75){
digitalWrite(13, HIGH);
}
delay(6500); //Delay must be high as SHT15 needs to stabilize readings
//(Humidity needs to be temperature compensated)
//Sensor cannot be active than more than 10% of the time
}
// Convert celsius to fahrenheit
float convertToFahrenheit(float c) {
return ((9.0 / 5.0) * c) + 32.0;
}
void bmp085Calibration()
{
ac1 = bmp085ReadInt(0xAA);
ac2 = bmp085ReadInt(0xAC);
ac3 = bmp085ReadInt(0xAE);
ac4 = bmp085ReadInt(0xB0);
ac5 = bmp085ReadInt(0xB2);
ac6 = bmp085ReadInt(0xB4);
b1 = bmp085ReadInt(0xB6);
b2 = bmp085ReadInt(0xB8);
mb = bmp085ReadInt(0xBA);
mc = bmp085ReadInt(0xBC);
md = bmp085ReadInt(0xBE);
}
// Calculate temperature in deg C
float bmp085GetTemperature(unsigned int ut){
long x1, x2;
x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15;
x2 = ((long)mc << 11)/(x1 + md);
b5 = x1 + x2;
float temp = ((b5 + 8)>>4);
temp = temp /10;
return temp;
}
// Calculate pressure given up
// calibration values must be known
// b5 is also required so bmp085GetTemperature(...) must be called first.
// Value returned will be pressure in units of Pa.
long bmp085GetPressure(unsigned long up){
long x1, x2, x3, b3, b6, p;
unsigned long b4, b7;
b6 = b5 - 4000;
// Calculate B3
x1 = (b2 * (b6 * b6)>>12)>>11;
x2 = (ac2 * b6)>>11;
x3 = x1 + x2;
b3 = (((((long)ac1)*4 + x3)<<OSS) + 2)>>2;
// Calculate B4
x1 = (ac3 * b6)>>13;
x2 = (b1 * ((b6 * b6)>>12))>>16;
x3 = ((x1 + x2) + 2)>>2;
b4 = (ac4 * (unsigned long)(x3 + 32768))>>15;
b7 = ((unsigned long)(up - b3) * (50000>>OSS));
if (b7 < 0x80000000)
p = (b7<<1)/b4;
else
p = (b7/b4)<<1;
x1 = (p>>8) * (p>>8);
x1 = (x1 * 3038)>>16;
x2 = (-7357 * p)>>16;
p += (x1 + x2 + 3791)>>4;
long temp = p;
return temp;
}
// Read 1 byte from the BMP085 at 'address'
char bmp085Read(unsigned char address)
{
unsigned char data;
Wire.beginTransmission(BMP085_ADDRESS);
Wire.send(address);
Wire.endTransmission();
Wire.requestFrom(BMP085_ADDRESS, 1);
while(!Wire.available())
;
return Wire.receive();
}
// Read 2 bytes from the BMP085
// First byte will be from 'address'
// Second byte will be from 'address'+1
int bmp085ReadInt(unsigned char address)
{
unsigned char msb, lsb;
Wire.beginTransmission(BMP085_ADDRESS);
Wire.send(address);
Wire.endTransmission();
Wire.requestFrom(BMP085_ADDRESS, 2);
while(Wire.available()<2)
;
msb = Wire.receive();
lsb = Wire.receive();
return (int) msb<<8 | lsb;
}
// Read the uncompensated temperature value
unsigned int bmp085ReadUT(){
unsigned int ut;
// Write 0x2E into Register 0xF4
// This requests a temperature reading
Wire.beginTransmission(BMP085_ADDRESS);
Wire.send(0xF4);
Wire.send(0x2E);
Wire.endTransmission();
// Wait at least 4.5ms
delay(5);
// Read two bytes from registers 0xF6 and 0xF7
ut = bmp085ReadInt(0xF6);
return ut;
}
// Read the uncompensated pressure value
unsigned long bmp085ReadUP(){
unsigned char msb, lsb, xlsb;
unsigned long up = 0;
// Write 0x34+(OSS<<6) into register 0xF4
// Request a pressure reading w/ oversampling setting
Wire.beginTransmission(BMP085_ADDRESS);
Wire.send(0xF4);
Wire.send(0x34 + (OSS<<6));
Wire.endTransmission();
// Wait for conversion, delay time dependent on OSS
delay(2 + (3<<OSS));
// Read register 0xF6 (MSB), 0xF7 (LSB), and 0xF8 (XLSB)
msb = bmp085Read(0xF6);
lsb = bmp085Read(0xF7);
xlsb = bmp085Read(0xF8);
up = (((unsigned long) msb << 16) | ((unsigned long) lsb << 8) | (unsigned long) xlsb) >> (8-OSS);
return up;
}
void writeRegister(int deviceAddress, byte address, byte val) {
Wire.beginTransmission(deviceAddress); // start transmission to device
Wire.send(address); // send register address
Wire.send(val); // send value to write
Wire.endTransmission(); // end transmission
}
int readRegister(int deviceAddress, byte address){
int v;
Wire.beginTransmission(deviceAddress);
Wire.send(address); // register to read
Wire.endTransmission();
Wire.requestFrom(deviceAddress, 1); // read a byte
while(!Wire.available()) {
// waiting
}
v = Wire.receive();
return v;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment