Locator mobile version

Dependencies:   BLE_API mbed nRF51822

Fork of WeatherStation by Weather man

main.cpp

Committer:
PostaL
Date:
2015-11-14
Revision:
4:fddb2d7c7c61
Parent:
3:b6d2c5195055
Child:
5:fe4888cc60cc

File content as of revision 4:fddb2d7c7c61:

#define I2C_SDA p3
#define I2C_SCL p4

#include "mbed.h"
#include "BLE.h"
#include "battery.h"
#include "WeatherService.h"
#include "BatteryService.h"
#include "BMP180.h"
#include "DHT.h"


float temperature;
float pressure;
float humidity;

BLE ble;

DigitalOut okLED(LED1);
DigitalOut errLED(LED2);
DigitalOut instrumentsPower(p30);

BMP180 bmp180;
DHT dht(p5,DHT11);

const static char DEVICE_NAME[] = "Weather Station";

static const uint16_t serviceList[] = {
    GattService::UUID_ENVIRONMENTAL_SERVICE, 
    GattService::UUID_BATTERY_SERVICE
};

static volatile bool  triggerSensorPolling = false;

void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
{
    /* Restart Advertising on disconnection*/
    ble.gap().startAdvertising();
}

void blink(void)
{
//    statusLED = !statusLED;
    triggerSensorPolling = true;
}

void updateFromBMP180() {
    uint8_t c = bmp180.readByte(BMP180_ADDRESS, BMP180_WHO_AM_I);   
    
    printf("BMP-180 is 0x%x\n\r", c);
    printf("BMP-180 should be 0x55\n");
    
    if(c == 0x55) {
        printf("BMP-180 online\n");
       
        printf("Calibrating BMP-180...");
        bmp180.BMP180Calibration();
        printf("done\n");
    }
    else 
    {
        printf("BMP-180 unreachable\n");
        return;
    }    
    
    temperature = (float)bmp180.BMP180GetTemperature()/10.0f;
    pressure = (float)bmp180.BMP180GetPressure();
}

void updateFromDHT() {
    wait(3);
    int err = dht.readData();
    if (err == 0) {
        humidity = dht.ReadHumidity();
        printf("Dew point is %4.2f \n",dht.CalcdewPoint(dht.ReadTemperature(CELCIUS), humidity));
        printf("Dew point (fast) is %4.2f \n",dht.CalcdewPointFast(dht.ReadTemperature(CELCIUS), humidity));
    }
    else {
        printf("Error reading DHT: %d \n", err);
    }
}

int main(void)
{
    printf("Start\n");
    
    okLED = 1;
    errLED = 1;

    Ticker ticker;
    ticker.attach(blink, 5);

    ble.init();
    ble.gap().onDisconnection(disconnectionCallback);

    /* Setup weather service. */
    WeatherService weatherService(ble);
    BatteryService batteryService(ble, 0);
    Battery battery(BATTERY_PIN);

    /* setup advertising */
    ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
    ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)serviceList, sizeof(serviceList));
    ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::UNKNOWN);
    ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
    ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
    ble.gap().setAdvertisingInterval(1000); /* 1000ms */
    ble.gap().startAdvertising();

    while (true) {
        if (triggerSensorPolling && ble.getGapState().connected) {
            okLED = 1;
            triggerSensorPolling = false;

            instrumentsPower = 1;
            wait(1);
            updateFromBMP180();
            updateFromDHT();
            instrumentsPower = 0;
            
            printf("Temp: %.1f C \n", temperature);
            printf("Pressure: %.3f Pa \n", pressure);
            printf("Humidity: %.1f % \n", humidity);
            printf("---\n");

            weatherService.updateTemperature(temperature);
            weatherService.updatePressure(pressure);
            weatherService.updateHumidity(humidity);
                        
            
            batteryService.updateBatteryLevel(battery.read());
        } else {
            ble.waitForEvent();
        }
    }
}