/********************************************************** Bosch Pressure Sensor BMP085 / BMP180 readout routine for the Arduino platform. Compiled by Leo Nutz www.ALTDuino.de **********************************************************/ #include "DHT.h" // Adafruit DHTxx lib #include // Wire lib for I2C #include #define TXPIN 12 #define BMPPIN 0x77 // Sensor address #define DHTPIN 2 // Digital pin the DHT22 is connected to #define DHTTYPE DHT22 // Sensor type (DHT11, DHT22 etc) DHT dht(DHTPIN, DHTTYPE); // Create DHT sensor object int RF_TX_PIN = 12; int16_t ac1, ac2, ac3, b1, b2, mb, mc, md; // Store sensor PROM values from BMP180 uint16_t ac4, ac5, ac6; // Store sensor PROM values from BMP180 // Ultra Low Power OSS = 0, OSD = 5ms // Standard OSS = 1, OSD = 8ms // High OSS = 2, OSD = 14ms // Ultra High Resolution OSS = 3, OSD = 26ms const uint8_t oss = 3; // Set oversampling setting const uint8_t osd = 26; // with corresponding oversampling delay float T, P; // Set global variables for temperature and pressure void setup() { Wire.begin(); // Activate I2C Serial.begin(9600); // Set up serial port init_SENSOR(); // Initialize baro sensor variables // Setup transmit pin vw_set_tx_pin(RF_TX_PIN); vw_setup(2000); // delay(100); } void loop() { int32_t b5; float h = dht.readHumidity(); // Read humidity float t = dht.readTemperature(); // Read temperatre in celcius float f = dht.readTemperature(true); // Read temperature in farenheit // Check if any reads failed and exit early (to try again). if (isnan(h) || isnan(t) || isnan(f)) { Serial.println("Failed to read from DHT sensor!"); return; } // Compute heat index in Celsius (isFahreheit = false) float hic = dht.computeHeatIndex(t, h, false); // Print everything Serial.print("Humidity: "); Serial.print(h); Serial.println("%"); b5 = temperature(); // Read and calculate temperature (T) Serial.print("Temperature: "); Serial.print(T, 2); Serial.print(" C, "); Serial.print(1.8 * T + 32.0, 2); Serial.println(" F"); P = pressure(b5); // Read and calculate pressure (P) Serial.print("Pressure: "); Serial.print(P, 2); Serial.print(" mbar, "); Serial.print(P * 0.0295299830714, 2); Serial.println(" inHg"); Serial.println(""); SendData("testing"); delay(2000); // Delay between each readout } void SendData(String Data) { //Debug Serial.println("-->"+ Data + "<-- "); //Making char Array of String const char* rawdata = Data.c_str(); digitalWrite(13, true); // Flash a light to show transmitting vw_send((uint8_t *)rawdata, strlen(rawdata)); //Send Data vw_wait_tx(); // Wait until the whole message is gone digitalWrite(13, false); Serial.println("Data sent"); } /********************************************** Initialize sensor variables **********************************************/ void init_SENSOR() { ac1 = read_2_bytes(0xAA); ac2 = read_2_bytes(0xAC); ac3 = read_2_bytes(0xAE); ac4 = read_2_bytes(0xB0); ac5 = read_2_bytes(0xB2); ac6 = read_2_bytes(0xB4); b1 = read_2_bytes(0xB6); b2 = read_2_bytes(0xB8); mb = read_2_bytes(0xBA); mc = read_2_bytes(0xBC); md = read_2_bytes(0xBE); Serial.println(""); Serial.println("Sensor calibration data:"); Serial.print(F("AC1 = ")); Serial.println(ac1); Serial.print(F("AC2 = ")); Serial.println(ac2); Serial.print(F("AC3 = ")); Serial.println(ac3); Serial.print(F("AC4 = ")); Serial.println(ac4); Serial.print(F("AC5 = ")); Serial.println(ac5); Serial.print(F("AC6 = ")); Serial.println(ac6); Serial.print(F("B1 = ")); Serial.println(b1); Serial.print(F("B2 = ")); Serial.println(b2); Serial.print(F("MB = ")); Serial.println(mb); Serial.print(F("MC = ")); Serial.println(mc); Serial.print(F("MD = ")); Serial.println(md); Serial.println(""); } /********************************************** Calcualte pressure readings **********************************************/ float pressure(int32_t b5) { int32_t x1, x2, x3, b3, b6, p, UP; uint32_t b4, b7; UP = read_pressure(); // Read raw pressure b6 = b5 - 4000; x1 = (b2 * (b6 * b6 >> 12)) >> 11; x2 = ac2 * b6 >> 11; x3 = x1 + x2; b3 = (((ac1 * 4 + x3) << oss) + 2) >> 2; x1 = ac3 * b6 >> 13; x2 = (b1 * (b6 * b6 >> 12)) >> 16; x3 = ((x1 + x2) + 2) >> 2; b4 = (ac4 * (uint32_t)(x3 + 32768)) >> 15; b7 = ((uint32_t)UP - b3) * (50000 >> oss); if(b7 < 0x80000000) { p = (b7 << 1) / b4; } else { p = (b7 / b4) << 1; } // or p = b7 < 0x80000000 ? (b7 * 2) / b4 : (b7 / b4) * 2; x1 = (p >> 8) * (p >> 8); x1 = (x1 * 3038) >> 16; x2 = (-7357 * p) >> 16; return (p + ((x1 + x2 + 3791) >> 4)) / 100.0f; // Return pressure in mbar } /********************************************** Read uncompensated temperature **********************************************/ int32_t temperature() { int32_t x1, x2, b5, UT; Wire.beginTransmission(BMPPIN); // Start transmission to device Wire.write(0xf4); // Sends register address Wire.write(0x2e); // Write data Wire.endTransmission(); // End transmission delay(5); // Datasheet suggests 4.5 ms UT = read_2_bytes(0xf6); // Read uncompensated TEMPERATURE value // Calculate true temperature x1 = (UT - (int32_t)ac6) * (int32_t)ac5 >> 15; x2 = ((int32_t)mc << 11) / (x1 + (int32_t)md); b5 = x1 + x2; T = (b5 + 8) >> 4; T = T / 10.0; // Temperature in celsius return b5; } /********************************************** Read uncompensated pressure value **********************************************/ int32_t read_pressure() { int32_t value; Wire.beginTransmission(BMPPIN); // Start transmission to device Wire.write(0xf4); // Sends register address to read from Wire.write(0x34 + (oss << 6)); // Write data Wire.endTransmission(); // SEd transmission delay(osd); // Oversampling setting delay Wire.beginTransmission(BMPPIN); Wire.write(0xf6); // Register to read Wire.endTransmission(); Wire.requestFrom(BMPPIN, 3); // Request three bytes if(Wire.available() >= 3) { value = (((int32_t)Wire.read() << 16) | ((int32_t)Wire.read() << 8) | ((int32_t)Wire.read())) >> (8 - oss); } return value; // Return value } /********************************************** Read 1 byte from the BMP sensor **********************************************/ uint8_t read_1_byte(uint8_t code) { uint8_t value; Wire.beginTransmission(BMPPIN); // Start transmission to device Wire.write(code); // Sends register address to read from Wire.endTransmission(); // End transmission Wire.requestFrom(BMPPIN, 1); // Request data for 1 byte to be read if(Wire.available() >= 1) { value = Wire.read(); // Get 1 byte of data } return value; // Return value } /********************************************** Read 2 bytes from the BMP sensor **********************************************/ uint16_t read_2_bytes(uint8_t code) { uint16_t value; Wire.beginTransmission(BMPPIN); // Start transmission to device Wire.write(code); // Sends register address to read from Wire.endTransmission(); // End transmission Wire.requestFrom(BMPPIN, 2); // Request 2 bytes from device if(Wire.available() >= 2) { value = (Wire.read() << 8) | Wire.read(); // Get 2 bytes of data } return value; // Return value }