Arduino bärbara Weather Monitor, höjdmätare, temperatur, fuktighet, med DHT11 och BMP85 med LCD med endast 3 nåla fast (3 / 5 steg)
Steg 3: Ladda upp koden till Arduino
/ * Bygger till stor del på koden av Jim Lindblom
Få tryck, höjden och temperaturen från BMP085.
Serial.Print den ut på 9600 baud serial monitor.
*/
#include < dht11.h >
#include < Wire.h >
#include < LiquidCrystal_I2C.h >
LiquidCrystal_I2C lcd(0x27,16,2);
dht11 DHT11;
#define DHT11PIN 2
#define BMP085_ADDRESS 0x77 / / I2C adress BMP085
CONST unsigned char OSS = 0; Översampling inställning
Kalibreringsvärden
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 är beräknad i bmp085GetTemperature(...), denna variabel används också i bmp085GetPressure(...)
så... Temperature(...) måste anropas innan... Pressure(...).
långa b5;
void setup() {
Serial.BEGIN(9600);
Wire.BEGIN();
LCD.init(); initiera lcd
LCD.backlight();
bmp085Calibration();
}
void loop()
{
flyta temperatur = bmp085GetTemperature(bmp085ReadUT()); MÅSTE anropas först
flyta tryck = bmp085GetPressure(bmp085ReadUP());
flyta atm = tryck / 101325; "standard atmosfär"
flyta höjd = calcAltitude(pressure); Okompenserad caculation - i meter
Serial.println("\n");
int chk = DHT11.read(DHT11PIN);
Serial.Print ("Läs sensor:");
Switch (chk)
{
fall 0: Serial.println("OK"); bryta;
i mål -1: Serial.println ("Checksum error"); bryta;
i mål -2: Serial.println ("Time out fel"); bryta;
standard: Serial.println ("okänt fel"); bryta;
}
Serial.Print ("luftfuktighet (%):");
Serial.println ((float) DHT11.humidity, 2);
Serial.Print ("temperatur (oC):");
Serial.println ((float) DHT11.temperature, 2);
LCD.Print("Hum(%):");
LCD.Print ((float) DHT11.humidity, 2);
lcd.setCursor(0,1);
LCD.Print("Temp(C):");
LCD.Print ((float) DHT11.temperature, 2);
Delay(2000);
LCD.Clear();
Serial.Print ("temperatur (av):");
Serial.println(Fahrenheit(DHT11.temperature), 2);
Serial.Print ("temperatur (K):");
Serial.println(Kelvin(DHT11.temperature), 2);
LCD.Print("Temp(F):");
LCD.Print(Fahrenheit(DHT11.temperature), 2);
lcd.setCursor(0,1);
LCD.Print("Temp(K):");
LCD.Print(Kelvin(DHT11.temperature), 2);
Delay(3000);
LCD.Clear();
Serial.Print ("daggpunkt (oC):");
Serial.println (daggpunkten (DHT11.temperature, DHT11.humidity));
Serial.Print ("dagg PointFast (oC):");
Serial.println (dewPointFast (DHT11.temperature, DHT11.humidity));
LCD.Print("DewP(C):");
LCD.Print (daggpunkten (DHT11.temperature, DHT11.humidity));
lcd.setCursor(0,1);
LCD.Print("DewPF(C):");
LCD.Print (dewPointFast (DHT11.temperature, DHT11.humidity));
Delay(3000);
LCD.Clear();
Serial.Print ("Temperature2:");
Serial.Print (temperatur, 2); Visa 2 decimaler
Serial.println ("deg C");
Serial.Print ("tryck:");
Serial.Print (pressa, 0); hela numret bara.
Serial.println ("Pa");
LCD.Print ("Temp2:");
LCD.Print (temperatur, 2); Visa 2 decimaler
LCD.Print ("C").
lcd.setCursor(0,1);
LCD.Print ("Pres:");
LCD.Print (pressa, 0);
LCD.Print ("PA");
Delay(3000);
LCD.Clear();
Serial.Print ("Standard atmosfär:");
Serial.println (atm, 4); Visa 4 decimaler
Serial.Print ("höjd:");
Serial.Print (höjd, 2); Visa 2 decimaler
Serial.println ("M").
LCD.Print ("Std Atm:");
LCD.Print (atm, 4); Visa 2 decimaler
lcd.setCursor(0,1);
LCD.Print ("Alt:");
LCD.Print (höjd, 2);
LCD.Print ("M").
Delay(3000);
LCD.Clear();
Serial.println (); //line paus
Delay(100); vänta en sekund och få värden igen.
}
/ *---(Förklara användaren skrivna funktioner)---* /
//
Celsius till Fahrenheit konvertering
dubbel Fahrenheit (dubbel celsius)
{
returnera 1,8 * celsius + 32.
}
Celsius till Kelvin konvertering
Dubbelrum Kelvin(double celsius)
{
returnera celsius + 273.15;
}
Daggpunkten funktion NOAA
Referens: http://wahiduddin.net/calc/density_algorithms.htm
dubbel daggpunkten (dubbel celsius, dubbel luftfuktighet)
{
dubbel A0 = 373.15 / (273.15 + celsius);
dubbla summan =-7.90298 * (A0-1).
SUMMA += 5.02808 * log10(A0);
Summa +=-1.3816e-7 * (pow (10, (11.344*(1-1/A0)))-1);
SUMMA += 8.1328e-3 * (pow(10,(-3.49149*(A0-1)))-1);
SUMMA += log10(1013.246);
dubbla VP = pow (10, SUM-3) * luftfuktighet;
dubbel T = log(VP/0.61078); Temp var
Return (241.88 * T) / 17.558-T,
}
delta max = 0.6544 wrt dewPoint()
5 x snabbare än dewPoint()
Referens: http://en.wikipedia.org/wiki/Dew_point
dubbel dewPointFast (dubbel celsius, dubbel luftfuktighet)
{
dubbel en = 17.271;
dubbel b = 237.7;
dubbel temp = (en * celsius) / (b + c) + log(humidity/100);
dubbel Td = (b * temp) / (a - temp);
returnera Td;
}
All den bmp085 kalibreringsvärden lagras i globala variabler
Kalibreringsvärden krävs för att beräkna temp och tryck
Den här funktionen ska anropas i början av programmet
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);
}
Beräkna temperatur i grader C
flyta bmp085GetTemperature (unsigned int ut) {
lång x1, x2;
x1 = (((långa) ut - (long)ac6)*(long)ac5) >> 15.
x2 = ((långa) mc << 11) / (x 1 + md);
B5 = x1 + x2;
float temp = ((b5 + 8) >> 4);
Temp = temp /10;
returnera härda;
}
Beräkna trycket gett upp
kalibreringsvärden måste vara känd
B5 krävs också så bmp085GetTemperature(...) måste anropas först.
Värdet som returneras kommer att trycket i enheter av Pa.
långa bmp085GetPressure (osignerade långa upp) {
lång x1, x2, x 3, b3, b6, p;
osignerade långa b4, b7;
B6 = b5 - 4000;
Beräkna B3
x1 = (b2 * (b6 * b6) >> 12) >> 11.
x2 = (ac2 * b6) >> 11.
x3 = x1 + x2;
B3 = (((långa) ac1) * 4 + x3) <> 2.
Beräkna B4
x1 = (ac3 * b6) >> 13.
x2 = (b1 * ((b6 * b6) >> 12)) >> 16;
x3 = ((x1 + x2) + 2) >> 2;
B4 = (ac4 * (osignerade långa) (x3 + 32768)) >> 15;
B7 = ((unsigned long) (upp - b3) * (50000 >> OSS));
om (b7 < 0x80000000)
p = (b7 << 1) / b4;
annat
p = (b7/b4) << 1;
x1 = (p >> 8) * (p >> 8);
x1 = (x 1 * 3038) >> 16;
x2 = (-7357 * p) >> 16;
p + = (x1 + x2 + 3791) >> 4;
länge temp = p;
returnera härda;
}
Läs 1 byte från BMP085 på "adress"
char bmp085Read (unsigned char adress)
{
unsigned char data.
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(Address);
Wire.endTransmission();
Wire.requestFrom (BMP085_ADDRESS, 1);
tag (!. Wire.available())
;
återvända Wire.read();
}
Läs 2 byte från BMP085
Första byte kommer att vara från "adress"
Andra byte kommer att vara från "adress" + 1
int bmp085ReadInt (unsigned char adress)
{
unsigned char msb, lsb;
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(Address);
Wire.endTransmission();
Wire.requestFrom (BMP085_ADDRESS, 2);
While(Wire.available() < 2)
;
MSB = Wire.read();
lsb = Wire.read();
tillbaka (int) msb << 8 | lsb;
}
Läs den okompenserade temperaturvärde
unsigned int bmp085ReadUT() {
unsigned int ut;
Skriva 0x2E i registret 0xF4
Detta kräver en temperatur läsning
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(0xF4);
Wire.write(0x2E);
Wire.endTransmission();
Vänta minst 4.5ms
Delay(5);
Läs två byte från registren 0xF6 och 0xF7
ut = bmp085ReadInt(0xF6);
återvända ut;
}
Läsa värdet Okompenserad tryck
osignerade långa bmp085ReadUP() {
unsigned char msb, lsb, xlsb;
osignerade långa upp = 0;
Skriva 0x34 + (OSS << 6) till registrera 0xF4
Begära ett tryck läsning med översampling inställning
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(0xF4);
Wire.write (0x34 + (OSS << 6));
Wire.endTransmission();
Vänta för konvertering, fördröjningstid beroende på operativsystem
fördröjning (2 + (3 <> (8-OSS);
tillbaka upp;
}
void writeRegister (int deviceAddress, byte adress, byte val) {
Wire.beginTransmission(deviceAddress); Starta överföringen till enhet
Wire.write(Address); Skicka registren adress
Wire.write(val); Skicka värde att skriva
Wire.endTransmission(); slutet överföring
}
int readRegister (int deviceAddress, byte adress) {
int v.
Wire.beginTransmission(deviceAddress);
Wire.write(Address); Registrera för att läsa
Wire.endTransmission();
Wire.requestFrom (deviceAddress, 1); Läs en byte
tag (!. Wire.available()) {
väntar på
}
v = Wire.read();
returnera v.
}
flyta calcAltitude(float pressure) {
flyta A = Tryck/101325;
float B = 1/5.25588;
float C = pow(A,B);
C = 1 - C;
C = C /0.0000225577;
returnera C;
}