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;
}

Se Steg
Relaterade Ämnen

En kompakt, Arduino höjdmätare för RC plan

Vänligen rösta för detta Instructable om du tror att den förtjänar det! Tack!Ultimate höjdmätare är en superkompakt, Arduino kontrollerade höjdmätare kan mäta höjden med en noggrannhet av 0.3 meter, och spara de högsta och lägsta värden som det har u...

Fristående Arduino höjdmätare

Här är en fristående höjdmätare arbetar med Arduino som du kan använda i RC projekt, vandring, bilar... där du vill att :)Det visar på första skärmen altittude, temperatur & lufttrycket, och i andra, den lägsta / högsta höjd uppnåtts.Delar som behövs...

Enkla Weather Monitor med Arduino + Ubuntu

Jo, för ett år sedan jag började fundera på hur att övervaka vädret. Med den enkla vägen, exakt som som jag behöver och går att komma åt från var som helst med internet. Den föreslagna är mät temperaturen (celsius), luftfuktighet (%) och atmosfäriskt...

Gränsyta höjdmätare MS5067 med Linkit-ett

MS50XX serien är serien av höjdmätare multilaterala miljöavtalen-Specs, använder luft mätning för att uppskatta höjden. Här kommer jag att använda MS5607 enhetDatablad: http://www.meas-spec.com/downloads/MS5607-02BA03.pdfSteg 1: anslutningarMS5607: L...

DIY bärbar Mini Monitor

I detta projekt ska jag visa dig hur jag använde en 1280 x 800 drivs LCD-Kit för att bygga ett batteri bärbara mini monitor som är användbara för din DSLR kamera, din Raspberry Pi eller förlänga fältet visning av din dator. Låt oss komma igång!Steg 1...

Arduino ATTiny85 spänning Monitor RGB LED

Denna lilla enhet när konstruerade ritar om 2,5 mA från batteriet är ansluten över så för båtar, bilar, etc. Det kan lämnas på hela tiden.Det ger batteriets spänning som en färg i en RGB-LED.Mycket låg spänning-blinkande röda Under 11.5VLåg spänning-...

Arduino-wtv020-Sd - 16P / talande avståndsmätare

Hej mina vänner,Jag vill presentera min arduino projekt för alla er :)Först av allt, vill jag att du ska veta att projektet inte är komplicerat som du tror.Det material som jag använde för detta projekt1) Arduino Uno / Arduino Nano eller Micro (rekom...

Arduino bärbara temperatur display

I detta projekt kommer jag visa dig hur du skapar en bärbar Arduino temperatur indikator. Poängen med detta projekt är att lära dig grundläggande färdigheter för Arduino och hur man skriver relativt komplex kod i Arduino IDE språket.Så vad är en Ardu...

Weather Monitor

detta Instructable visar dig hur man bygger en mikro-controller baserat väder kontrollanordning. Byggd på Arduino Uno styrelsen det kan lätt utökas och ändras om du har ytterligare sensorer till hands.Huvudsakliga krav:-Mäta temperatur (noggrannhet +...

Real Time temperatur loggning med Arduino, NodeJS och Plotly!

Motivationen för det här projektet grodde efter behandlingen om Mark Zuckerberg önskan att skapa ett Smart hem för en av hans 2016 projekt. Att vara nyfiken på mig själv, jag ville försöka genomföra en mycket grundläggande temperatur loggning program...

ThermoClock: En OpenSource Arduino UNO OLED klocka som mäter även temperatur

Hej, alla!Idag ska jag visa dig hur man gör An OpenSource Arduino UNO OLED klocka att också åtgärder temperatur. Detta projekt är en OpenSource och det är öppet för alla. Det kräver inte någon särskild ingenjör färdigheter, och tar dig mindre än någr...

Sensor de Temperatura y Humedad DHT11 y Arduino

En este tutorial aprenderas en utilizar el sensor de temperatura y humedad DHT11. Es uno de los sensores mas utilizados con Arduino y lo puedes encontrar en electrocrea.com.Materiales:Sensor de temperatura y humedad DHT11Byglarna hembra-machoArduinoe...

Arduino-DHT11 och seriell Plotter V2.0

Hej killar,För att visualisera data, kommer den senaste versionen av Arduino IDE 1.6.6 förinstallerade med en plotter som kallas seriell plottern, där du kan visa dina data beteende i realtid än att bara se siffror på serial monitorn.Arduino seriell...

Ladda ner låtar från Last.fm och Pandora gratis!

Detta instructable lär dig hur du automatiskt ladda ner låtar från Last.fm och Pandora gratis! En fri och opensource projekt kallat iRadio fånga 2.0 används för att göra detta. Intresserad av? Låt oss komma igång!Steg 1: Uppgradera Google Chrome Del...

VÄXTHUSGASER, servrar RACK, akvarium och andra apparater temperatur handledare med SMS larmsystem genom att använda Arduino, itbrainpower.net 3G / GSM sköldar och 1WIRE temperaturgivare

Om projektetBygga själv din egen temperatur-övervakning system med högsta och lägsta temperatur trösklar, hålla vid liv massage och (oldies men goldies som) SMS personsökning och ARM/DISARM fjärrsystemet. Du kan övervaka en eller flera 1WIRE temperat...

Hur du tar en bild med en DSLR

En guide till nybörjare fotografering.Steg 1: ämneDet första steget i att producera en bra bild är att hitta ett ämne att faktiskt ta en bild av. Utan ämnet är en bild ingenting.Steg 2: ISOvet din kamera. Oavsett sammansättning, att veta ditt rediger...

Arduino - DHT11 och OLED v3.0

Hej killar,Med hänvisning till min senaste tutorial [Arduino - DHT11 och seriell Plotter v2.0], beslöt jag att göra liknande projekt men som är portabel och kan vara batteridriven. I denna tutorial beslutade jag att använda en OLED-display för att vi...

DHT11 och Arduino UNO; Den enklaste INSTRUCTABLE

Hej beslutsfattare,I denna tutorial kommer vi att ansluta Arduino till DHT11.För mer intressant projekt besök: www.miymakers.comFacebook: www.facebook.com/miymakersSteg 1: Hur fungerar det?DHT11 är en grundläggande, ultra låg kostnad digital temperat...

Arduino rfid läsa och skriva på lcd

Jag kommer att visa dig hur man gör arduino rfid läsa och skriva på lcdSteg 1:Hej du!Idag kommer jag visa dig hur man gör arduino rfid läsa och skriva på lcd. Ladda ner koden och ladda det på arduino det ingen spelar roll häxa en men jag föredrar uno...