Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <SD.h>
- #include <Wire.h>
- #include "DHT.h"
- #include "VirtualWire.h"
- #define DHTPIN 2
- #define DHTTYPE DHT11 // DHT 11
- DHT dht(DHTPIN, DHTTYPE);
- #define BMP085_ADDRESS 0x77 // I2C address of BMP085
- const unsigned char OSS = 0; // Oversampling Setting
- File myFile;
- char RFMessage[50];
- // Calibration values for the 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;
- long b5;
- short temperature;
- long pressure;
- // Use these for altitude conversions
- const float p0 = 101700; // Pressure at sea level (Pa)
- float altitude;
- #define DS1307_I2C_ADDRESS 0x68 // This is the I2C address
- // Arduino version compatibility Pre-Compiler Directives
- #if defined(ARDUINO) && ARDUINO >= 100 // Arduino v1.0 and newer
- #define I2C_WRITE Wire.send
- #define I2C_READ Wire.receive
- #else // Arduino Prior to v1.0
- #define I2C_WRITE Wire.send
- #define I2C_READ Wire.receive
- #endif
- // Global Variables
- int command = 0; // This is the command char, in ascii form, sent from the serial port
- int i;
- long previousMillis = 0; // will store last time Temp was updated
- byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
- byte test;
- byte zero;
- char *Day[] = {
- "","Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
- char *Mon[] = {
- "","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
- // Convert normal decimal numbers to binary coded decimal
- byte decToBcd(byte val)
- {
- return ( (val/10*16) + (val%10) );
- }
- // Convert binary coded decimal to normal decimal numbers
- byte bcdToDec(byte val)
- {
- return ( (val/16*10) + (val%16) );
- }
- // Gets the date and time from the ds1307 and prints result
- void getDateDs1307()
- {
- // Reset the register pointer
- Wire.beginTransmission(DS1307_I2C_ADDRESS);
- I2C_WRITE(zero);
- Wire.endTransmission();
- Wire.requestFrom(DS1307_I2C_ADDRESS, 7);
- // A few of these need masks because certain bits are control bits
- second = bcdToDec(I2C_READ() & 0x7f);
- minute = bcdToDec(I2C_READ());
- hour = bcdToDec(I2C_READ() & 0x3f); // Need to change this if 12 hour am/pm
- dayOfWeek = bcdToDec(I2C_READ());
- dayOfMonth = bcdToDec(I2C_READ());
- month = bcdToDec(I2C_READ());
- year = bcdToDec(I2C_READ());
- if (hour < 10)
- myFile.print("0");
- myFile.print(hour, DEC);
- myFile.print(":");
- if (minute < 10)
- myFile.print("0");
- myFile.print(minute, DEC);
- myFile.print(":");
- if (second < 10)
- myFile.print("0");
- myFile.print(second, DEC);
- if (hour < 10)
- Serial.print("0");
- Serial.print(hour, DEC);
- Serial.print(":");
- if (minute < 10)
- Serial.print("0");
- Serial.print(minute, DEC);
- Serial.print(":");
- if (second < 10)
- Serial.print("0");
- Serial.print(second, DEC);
- }
- float t;
- float h;
- void setup()
- {
- vw_set_ptt_inverted(true); // Required for DR3100
- vw_set_tx_pin(5);
- vw_setup(2000); // Bits per sec
- pinMode(10, OUTPUT);
- Serial.begin(9600);
- Wire.begin();
- bmp085Calibration();
- zero=0x00;
- dht.begin();
- if (!SD.begin(4)) {
- Serial.println("initialization failed!");
- }
- else{
- Serial.println("initialization done.");
- myFile = SD.open("balloon.txt", FILE_WRITE);
- myFile.println("Bootup!");
- }
- }
- unsigned int loopcounter = 0;
- void loop(){
- loopcounter ++;
- static unsigned long PreviousMillis;
- int TimeElapsed;
- TimeElapsed = millis()-PreviousMillis;
- if(TimeElapsed < 100) Serial.print("0");
- Serial.print(TimeElapsed);
- Serial.print(" ");
- PreviousMillis = millis();
- getDateDs1307();
- myFile.print(" ");
- Serial.print(" ");
- temperature = bmp085GetTemperature(bmp085ReadUT());
- pressure = bmp085GetPressure(bmp085ReadUP());
- altitude = (float)44330 * (1 - pow(((float) pressure/p0), 0.190295));
- myFile.print(temperature, DEC);
- myFile.print(" ");
- myFile.print(pressure, DEC);
- myFile.print(" ");
- myFile.print(altitude, 2);
- myFile.print(" ");
- Serial.print(temperature, DEC);
- Serial.print(" ");
- Serial.print(pressure, DEC);
- Serial.print(" ");
- Serial.print(altitude, 2);
- Serial.print(" ");
- sprintf(RFMessage, "%d: Altitude = %d.%02d",loopcounter, (int)altitude, (int)(100*(altitude-(int)altitude)));
- vw_send((uint8_t *)RFMessage, strlen(RFMessage));
- vw_wait_tx(); // Wait until the whole message is gone
- static int DHTCountdown;
- if(DHTCountdown == 0){
- h = dht.readHumidity();
- t = dht.readTemperature();
- DHTCountdown = 16;
- }
- // check if returns are valid, if they are NaN (not a number) then something went wrong!
- if (isnan(t) || isnan(h)) {
- myFile.print("FAIL");
- myFile.print(" ");
- myFile.print("FAIL");
- Serial.print("FAIL");
- Serial.print(" ");
- Serial.print("FAIL");
- }
- else {
- myFile.print(t);
- myFile.print(" ");
- myFile.print(h);
- Serial.print(t);
- Serial.print(" ");
- Serial.print(h);
- }
- DHTCountdown = DHTCountdown - 1;
- myFile.println(" ");
- Serial.println(" ");
- myFile.flush();
- }
- // Stores all of the bmp085's calibration values into global variables
- // Calibration values are required to calculate temp and pressure
- // This function should be called at the beginning of the program
- 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 given ut.
- // Value returned will be in units of 0.1 deg C
- short bmp085GetTemperature(unsigned int ut)
- {
- long x1, x2;
- x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15;
- x2 = ((long)mc << 11)/(x1 + md);
- b5 = x1 + x2;
- return ((b5 + 8)>>4);
- }
- // 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;
- return p;
- }
- // 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)
- Wire.beginTransmission(BMP085_ADDRESS);
- Wire.send(0xF6);
- Wire.endTransmission();
- Wire.requestFrom(BMP085_ADDRESS, 3);
- // Wait for data to become available
- while(Wire.available() < 3)
- ;
- msb = Wire.receive();
- lsb = Wire.receive();
- xlsb = Wire.receive();
- up = (((unsigned long) msb << 16) | ((unsigned long) lsb << 8) | (unsigned long) xlsb) >> (8-OSS);
- return up;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement