Implementaion of a weather station using the BMP180 sensor, nokia N5110 lcd screen and the mbed NXP CPC1768 microcontroller

Dependencies:   BMP180 N5110 PowerControl mbed

Fork of DocTest by Craig Evans

main.cpp

Committer:
FFLopes
Date:
2015-05-11
Revision:
3:f7036017b319
Parent:
2:afdc5d6ca47f

File content as of revision 3:f7036017b319:

/**
@file main.cpp

@brief Program implementation of the weather station

*/

#include "main.h"

int main()
{
    lcd.init();
    isOn=true;
    powerSaving();
    sensor.init();
    
    iO.attach(&ioUpdate, 0.7);   
    readUpdates.attach(&getMeasurements, 1.0 );
    serial.attach(&getTimeUpdate);
    enableChange.rise(&enableThresChange);
    unitsButton.rise(&unitsChanger);

  

}

///Functiion to update the IO
void ioUpdate()
{
        formatData();
        if(LCDState && !isOn) {
            lcd.init();
            isOn=true;
        } else if ( !LCDState && isOn) {
            lcd.turnOff();
            isOn=false;
        }

        ///If the button was pressed to the units be changed the temperature is going to be changed to farenheight and the pressure to atm
        if(changeUnits == true) {
            lcd.clear();
            float temp;
            temp = ( measurement.temperature*9.0/5.0) + 32.0;
            sprintf(buffer, "%4.2f F", temp);
            lcd.printString(buffer,0,0);
            sprintf(buffer, "Ra %4.1f-%4.1f F", ( maxTemp*9.0/5.0) + 32.0,( minTemp*9.0/5.0) + 32.0);
            lcd.printString(buffer,0,1);
            temp=measurement.pressure * 0.000986923267;
            sprintf(buffer, "%4.2f atm",temp);
            lcd.printString(buffer,0,2);
            sprintf(buffer,date);
            lcd.printString(buffer,0,3);
        }

        else {
            lcd.clear();
            float temp = measurement.temperature;
            sprintf(buffer, "%4.2f C", temp);
            lcd.printString(buffer,0,0);
            sprintf(buffer, "Ra %4.1f-%4.1f C", maxTemp,minTemp);
            lcd.printString(buffer,0,1);
            temp=measurement.pressure;
            sprintf(buffer, "%4.2f mbar",temp);
            lcd.printString(buffer,0,2);
            sprintf(buffer,date);
            lcd.printString(buffer,0,3);
        }

///Here the prediction will be shown to the user
      switch(chanceOfWeather)
      {
        case highGood:
         sprintf(buffer,"high of good");
         break;
         
         case mediumGood:
         sprintf(buffer,"medium of good");
         break;
         
         case mediumBad:
         sprintf(buffer,"medium of bad");
         break;
         
         case highBad:
         sprintf(buffer,"high of bad");
         break;
         
         case notDefined:
         sprintf(buffer,"not decided");
         break;
         
         default:
         break;
         
         
    }    
          
lcd.printString(buffer,0,4);

        if(logging) {
            writeOnFile();
        }

        checkValues();
        changeThreshold(option);

}
///On this function the ethernet port will be shutdown so we can save energy
void powerSaving()
{
    PHY_PowerDown();

}

///This function will see if the value for temperature is larger them the threshold values assign, if it is a action will take place
void checkValues()
{
    if(measurement.temperature>maxTemp) {
        highTempAction();
    }

    else if (measurement.temperature<minTemp) {
        lowTempAction();
    }

    else {
        normalTempAction();
    }


}
///With this function we will get the values from the sensor and store in the memory
void getMeasurements()
{

    measurement = sensor.readValues();
}

///Sets the threshold led to high, even though this is a simple action I used a function to makes easier in to scale the code
void highTempAction()
{
    maxTempAlert=1;
    buzzer=0.01;
}

///Sets the threshold led to high, even though this is a simple action I used a function to makes easier in to scale the code
void lowTempAction()
{
    minTempAlert=1;
    buzzer=0.01;
}

///what it should be done with the temperature is with the boundiaries considered normal
void normalTempAction()
{
    maxTempAlert=0;
    minTempAlert=0;
    buzzer=0;
}

///Will write both the temperature and the pressure on a csv file
void writeOnFile()
{
    FILE *file = fopen("/file/log.csv", "a");
    fprintf(file," %s , %f , %f \r\n ",date,measurement.temperature,measurement.pressure); //in C use \r\n instead of only \n to jump lines
    fclose(file);

}

///here we will set the new values of the temperature threshold, that can change from maximun temperature to 0.
void changeThreshold(int op)
{
    if(op==changeMaxTemp) {
        maxTemp = pot.read() * maxThresTemp;
    }
    if(op==changeMinTemp) {
        minTemp = pot.read() * maxThresTemp;
    }

}

///this function will get the data being transmited in then serial and store in a array, then weill call the setTime function
void getTimeUpdate()
{
    serial.gets(rxString,14);
    setTime();
}

///this function is responsible for getting the information stored in the rxstring array by the getTimeUpdate method.
///Transform in a integer value and store it in the microcontroller
void setTime()
{
    int time = atoi(rxString);
    set_time(time);
    formatData();
    serial.printf("the time was updated to %s \n",date);
}

///This function uses the time sent over the usb an change from UNIX time to a more human readable format, HH:MM:SS DD/MM/YY
void formatData()
{

    time_t seconds = time(NULL);
    strftime(date,14, "%e/%m %H:%M:%S", localtime(&seconds) );
}

///Function to be called with the button is pressed and units should be changed
void unitsChanger()
{
    changeUnits = !changeUnits;
}

///This function will be called when the button is pressed and will chose which temperature threshold is going to be changed
void enableThresChange()
{
    if( option == dontChangeTemp) {
        option = changeMaxTemp;
    } 
    else if (option == changeMaxTemp) {
        option = changeMinTemp;
    }

    else {
        option = dontChangeTemp;
    }

}

///On this function the measurement is going to be stored on the vectors, the values are going to be stored for 4 hours so we can see better how the values are changing
///moreover 4 is divisor of 24
void storeMeasurement()
{
    float tempAverage=0;
    float pressureAverage=0;


    if(minuteCounter<60) {
        measurementMinute[minuteCounter] = measurement;
        minuteCounter++;
    } else if(hourCounter<60) {

        int i;
        for(i=0; i<minuteCounter; i++) {
            tempAverage += measurementMinute[i].temperature;
            pressureAverage += measurementMinute[i].pressure;
        }
        tempAverage = tempAverage / minuteCounter;
        pressureAverage = pressureAverage / minuteCounter;
        Measurement temp;
        temp.pressure = pressureAverage;
        temp.temperature = tempAverage;

        measurementHour[hourCounter] = temp;
        hourCounter++;
        minuteCounter=0;
    } else if (hoursCounter<4) {

        int i;
        for(i=0; i<hourCounter; i++) {
            tempAverage += measurementHour[i].temperature;
            pressureAverage += measurementHour[i].pressure;
        }

        tempAverage = tempAverage / hourCounter;
        pressureAverage = pressureAverage / hourCounter;

        Measurement temp;
        temp.pressure = pressureAverage;
        temp.temperature = tempAverage;

        measurementHours[hoursCounter]=temp;
        hoursCounter++;
        hourCounter=0;

    } else {
        makePrediction();
        hoursCounter = 0;
    }
}

///Function to make the prediction on how the weather is going to be
void makePrediction()
{
    bool pressureIncreased = measurementHours[0].pressure<measurementHours[1].pressure && measurementHours[1].pressure<measurementHours[2].pressure &&
                             measurementHours[2].pressure<measurementHours[3].pressure;

    bool tempIncreased = measurementHours[0].temperature<measurementHours[1].temperature && measurementHours[1].temperature<measurementHours[2].temperature &&
                         measurementHours[2].temperature<measurementHours[3].temperature;

    if ( pressureIncreased && tempIncreased ) {
        chanceOfWeather = highGood;
    }

    else if ( pressureIncreased || !tempIncreased) {
        chanceOfWeather = mediumGood;
    }

    else if ( !pressureIncreased || tempIncreased) {
        chanceOfWeather = mediumBad;
    }

    else {
        chanceOfWeather = highBad;
    }
}