Paso 3: Añadir el código para el Arduino
/ * Basado en gran parte en código por presión, la altitud y la temperatura de la BMP085 Jim Lindblom Get. Serial.Print al 9600 baud serial monitor. * / #include < dht11.h > < Wire.h > del #include #include < LiquidCrystal_I2C.h > LiquidCrystal_I2C lcd(0x27,16,2); dht11 DHT11; #define DHT11PIN 2 #define BMP085_ADDRESS 0x77 / / dirección de I2C del BMP085 const unsigned char OSS = 0; Oversampling ajuste / / int ac1; los valores de calibración int ac2; int ac3; unsigned int ac4; unsigned int ac5; unsigned int ac6; int b1; int b2; int mb; int mc; int md; B5 se calcula en bmp085GetTemperature(...), esta variable también se utiliza en bmp085GetPressure(...) / / así que... Temperature(...) debe ser llamado antes de... Pressure(...). largo b5; void setup() {Serial.begin(9600); Wire.Begin(); LCD.init(); inicializar el lcd lcd.backlight(); bmp085Calibration(); } void loop() {float temperatura = bmp085GetTemperature(bmp085ReadUT()); //MUST se llama primera flotador de presión = bmp085GetPressure(bmp085ReadUP()); float atm = presión / 101325; / / "atmósfera estándar" flotador altura = calcAltitude(pressure); //Uncompensated caculation - en metros Serial.println("\n"); int chk = DHT11.read(DHT11PIN); Serial.Print ("sensor de lectura:"); interruptor (chk) {caso 0: Serial.println("OK"); break; caso -1: Serial.println ("error de suma de comprobación"); break; caso -2: Serial.println ("error de tiempo de espera"); break; default: Serial.println ("error desconocido"); break;} Serial.Print ("humedad (%):"); Serial.println ((float) DHT11.humidity, 2); Serial.Print ("temperatura (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 ("temperatura (de):"); Serial.println(Fahrenheit(DHT11.Temperature), 2); Serial.Print ("temperatura (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 ("punto de rocío (oC):"); Serial.println (punto de rocío (DHT11.temperature, DHT11.humidity)); Serial.Print ("Rocío PointFast (oC):"); Serial.println (dewPointFast (DHT11.temperature, DHT11.humidity)); LCD.Print("DewP(C):"); LCD.Print (punto de rocío (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 (temperatura, 2); Mostrar 2 decimales Serial.println ("grado C"); Serial.Print ("presión:"); Serial.Print (presión, 0); sólo con el número entero. Serial.println ("Pa"); LCD.Print ("Temp2:"); LCD.Print (temperatura, 2); Mostrar 2 decimales lcd.print ("C"); lcd.setCursor(0,1); LCD.Print ("Pres:"); LCD.Print (presión, 0); LCD.Print («PA»); Delay(3000); LCD.Clear(); Serial.Print ("atmósfera estándar:"); Serial.println (atm, 4); Mostrar 4 decimales Serial.print ("altura:"); Serial.Print (altitud, 2); Mostrar 2 decimales Serial.println ("M"); LCD.Print ("Std Atm:"); LCD.Print (atm, 4); Mostrar 2 decimales lcd.setCursor(0,1); LCD.Print ("Alt:"); LCD.Print (altitud, 2); LCD.Print ("M"); Delay(3000); LCD.Clear(); Serial.println (); //line break delay(100); Espere a un segundo y volver a los valores
. } / *---(Declarar funciones escritas por el usuario)---* / / / //Celsius Fahrenheit conversión doble f (doble c) {volver 1.8 * celsius + 32;} doble de //Celsius a la conversión de Kelvin Kelvin (doble c) {vuelta celsius + 273.15;} / / función de punto de rocío NOAA / referencia: http://wahiduddin.net/calc/density_algorithms.htm doble punto de rocío (doble celsius, doble humedad) {doble A0 = 373.15 / (273.15 + celsius); doble suma =-7.90298 * (A0-1); SUMA += 5.02808 * log10(A0); SUMA +=-1.3816e-7 * (pow (10, (11.344*(1-1/A0)))-1); SUMA += 8.1328e-3 * (pow(10,(-3.49149*(A0-1)))-1); SUMA += log10(1013.246); doble VP = pow (10, SUM-3) * humedad; doble T = log(VP/0.61078); var Temp retorno (241.88 * T) / (17,558-T); } / / delta max = 0.6544 wrt dewPoint() / / 5 x más rápido que dewPoint() / Referencia: dewPointFast doble http://en.wikipedia.org/wiki/Dew_point (doble celsius, doble humedad) {doble un = 17.271; doble b = 237.7; doble temp = (un * celsius) / (b + c) + log(humidity/100); doble Td = (b * temp) / (a - temp); volver Td;} / / almacena todos los valores de calibración de bmp085 en variables globales / valores de calibración son necesarios para calcular la temperatura y la presión / / esta función debe ser llamada al principio del programa 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); } / / Calcular temperatura en grados C flotador bmp085GetTemperature (unsigned int ut) {x1 largo, x 2, x1 = ((ut (tiempo) - (long)ac6)*(long)ac5) >> 15; x2 = (mc (largo) << 11) / (x 1 + md); b5 = x1 + x2; float temp = ((b5 + 8) >> 4); temp = temp 10; devolver temp;} / / calcular presión dada para arriba / / valores de calibración deben ser conocidos / b5 también se requiere para bmp085GetTemperature(...) debe ser llamada primero. Valor devuelto será la presión en unidades de Pensilvania bmp085GetPressure largo (largo hasta sin firmar) {x1 largo, x2, x 3, b3, b6, p; sin firmar largo b4, b7; b6 = b5 - 4000; / / calcular B3 x1 = (b2 * (b6 * b6) >> 12) >> 11; x2 = (ac2 * b6) >> 11; x3 = x1 + x2; b3 = (((largo) ac1) * 4 + x3) <> 2; / / B4 calcular x1 = (ac3 * b6) >> 13; x2 = (b1 * ((b6 * b6) >> 12)) >> 16; x3 = ((x1 + x2) + 2) > > 2; B4 = (ac4 * (sin firmar largo) (x3 + 32768)) >> 15; B7 = ((unsigned long) (a - b3) * (50000 >> OSS)); Si (b7 < 0x80000000) p = (b7 << 1) / b4; Else p = (b7/b4) << 1; x1 = (p >> 8) * (p >> 8); x1 = (x 1 * 3038) >> 16; x2 = (-7357 * p) >> 16; p += (x1 + x2 + 3791) >> 4; larga temp = p; devolver a temp; } / / Lee 1 byte de BMP085 en 'dirección' char bmp085Read (dirección char unsigned) {unsigned datos char; Wire.beginTransmission(BMP085_ADDRESS); Wire.Write(Address); Wire.endTransmission(); Wire.requestFrom (BMP085_ADDRESS, 1); mientras (!. Wire.Available()); volver Wire.read(); } / / Leer 2 bytes de la BMP085 / / primer byte va a ser de 'address' / / segundo byte va a ser de 'address' + 1 int bmp085ReadInt (dirección char unsigned) {char unsigned 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(); devolver (int) msb << 8 | LSB; } / / Lee el valor de temperatura compensada unsigned int bmp085ReadUT() {unsigned int ut; / / escribir 0x2E en registro 0xF4 / / pide una temperatura Wire.beginTransmission(BMP085_ADDRESS); Wire.Write(0xF4); Wire.Write(0x2E); Wire.endTransmission(); Espere por lo menos 4.5ms delay(5); Leer dos bytes de registros 0xF6 y 0xF7 ut = bmp085ReadInt(0xF6); volver ut; } / / Leer el valor de presión compensada sin firmar largo bmp085ReadUP() {unsigned char msb, lsb, xlsb; unsigned largo arriba = 0; / / escribir 0x34 + (OSS << 6) en registrar 0xF4 / / solicitar una lectura con oversampling ajuste Wire.beginTransmission(BMP085_ADDRESS); de la presión Wire.Write(0xF4); Wire.Write (0x34 + (OSS << 6)); Wire.endTransmission(); Espere para la conversión, retardo depende de la demora de la OSS (2 + (<> 3 (8-OSS); vuelta arriba;} void writeRegister (int deviceAddress, dirección de byte, byte val) {Wire.beginTransmission(deviceAddress); / / iniciar transmisión a dispositivo Wire.write(address); / / enviar registro dirección Wire.write(val); / enviar valor a escribir Wire.endTransmission(); / / fin transmisión} int readRegister (int deviceAddress, dirección bytes) {int v; Wire.beginTransmission(deviceAddress); Wire.Write(Address); registrarse para leer Wire.endTransmission(); Wire.requestFrom (deviceAddress, 1); leer un byte mientras (! Wire.Available()) {/ / espera} v = Wire.read(); devolver v; } float calcAltitude (float presión) {float A = presión/101325; float B = 1/5.25588; float C = pow(A,B); C = 1 - C; C = C /0.0000225577; volver C; }