Temperature and Pressure Logger
Dependencies: BMP180 N5110 PowerControl mbed
main.cpp@0:ab353447a5d6, 2015-05-11 (annotated)
- Committer:
- Chakweza
- Date:
- Mon May 11 20:36:26 2015 +0000
- Revision:
- 0:ab353447a5d6
Rev1
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Chakweza | 0:ab353447a5d6 | 1 | /** |
Chakweza | 0:ab353447a5d6 | 2 | @file main.cpp |
Chakweza | 0:ab353447a5d6 | 3 | |
Chakweza | 0:ab353447a5d6 | 4 | @brief Program Implementation |
Chakweza | 0:ab353447a5d6 | 5 | |
Chakweza | 0:ab353447a5d6 | 6 | */ |
Chakweza | 0:ab353447a5d6 | 7 | #include "mbed.h" |
Chakweza | 0:ab353447a5d6 | 8 | #include "N5110.h" |
Chakweza | 0:ab353447a5d6 | 9 | #include "BMP180.h" |
Chakweza | 0:ab353447a5d6 | 10 | #include "PowerControl/PowerControl.h" |
Chakweza | 0:ab353447a5d6 | 11 | #include "PowerControl/EthernetPowerControl.h" |
Chakweza | 0:ab353447a5d6 | 12 | |
Chakweza | 0:ab353447a5d6 | 13 | ///NOKIA SCREEN |
Chakweza | 0:ab353447a5d6 | 14 | /// VCC,SCE,RST,D/C,MOSI,SCLK,LED |
Chakweza | 0:ab353447a5d6 | 15 | N5110 lcd(p7,p8,p9,p10,p11,p13,p26); |
Chakweza | 0:ab353447a5d6 | 16 | |
Chakweza | 0:ab353447a5d6 | 17 | char timeBuffer[14]; /// buffer used to store time string |
Chakweza | 0:ab353447a5d6 | 18 | |
Chakweza | 0:ab353447a5d6 | 19 | void Sleep();///Put to sleep |
Chakweza | 0:ab353447a5d6 | 20 | |
Chakweza | 0:ab353447a5d6 | 21 | void turnOff();///Turn off |
Chakweza | 0:ab353447a5d6 | 22 | |
Chakweza | 0:ab353447a5d6 | 23 | |
Chakweza | 0:ab353447a5d6 | 24 | void startscreen()///Display start screen |
Chakweza | 0:ab353447a5d6 | 25 | |
Chakweza | 0:ab353447a5d6 | 26 | { |
Chakweza | 0:ab353447a5d6 | 27 | lcd.printString("Welcome",15,1); ///Print on screen |
Chakweza | 0:ab353447a5d6 | 28 | lcd.printString("To",20,2); |
Chakweza | 0:ab353447a5d6 | 29 | lcd.printString("My",6,3); |
Chakweza | 0:ab353447a5d6 | 30 | lcd.printString("T & P logger",0,5); |
Chakweza | 0:ab353447a5d6 | 31 | } |
Chakweza | 0:ab353447a5d6 | 32 | |
Chakweza | 0:ab353447a5d6 | 33 | ///TEMPERATURE & PRESSURE SENSOR |
Chakweza | 0:ab353447a5d6 | 34 | BMP180 bmp180(p28,p27); /// SDA, SCL |
Chakweza | 0:ab353447a5d6 | 35 | |
Chakweza | 0:ab353447a5d6 | 36 | char buffer[14];///Character length |
Chakweza | 0:ab353447a5d6 | 37 | |
Chakweza | 0:ab353447a5d6 | 38 | ///BUZZER |
Chakweza | 0:ab353447a5d6 | 39 | PwmOut buzzer (p21); |
Chakweza | 0:ab353447a5d6 | 40 | |
Chakweza | 0:ab353447a5d6 | 41 | ///LEDS |
Chakweza | 0:ab353447a5d6 | 42 | DigitalOut greenled(p24); |
Chakweza | 0:ab353447a5d6 | 43 | DigitalOut redled(p23); |
Chakweza | 0:ab353447a5d6 | 44 | |
Chakweza | 0:ab353447a5d6 | 45 | ///POTENTIOMETER FOR BACKLIGHT CONTROL |
Chakweza | 0:ab353447a5d6 | 46 | AnalogIn pot(p18); |
Chakweza | 0:ab353447a5d6 | 47 | PwmOut backlight(p26); |
Chakweza | 0:ab353447a5d6 | 48 | |
Chakweza | 0:ab353447a5d6 | 49 | ///INTERRUPT |
Chakweza | 0:ab353447a5d6 | 50 | InterruptIn button(p17); ///Sleep button |
Chakweza | 0:ab353447a5d6 | 51 | int buttonFlag = 0;///Button Flag |
Chakweza | 0:ab353447a5d6 | 52 | ///Interrupt Service Routine |
Chakweza | 0:ab353447a5d6 | 53 | void buttonPressed() |
Chakweza | 0:ab353447a5d6 | 54 | { |
Chakweza | 0:ab353447a5d6 | 55 | buttonFlag = 1; ///set flag |
Chakweza | 0:ab353447a5d6 | 56 | } |
Chakweza | 0:ab353447a5d6 | 57 | |
Chakweza | 0:ab353447a5d6 | 58 | |
Chakweza | 0:ab353447a5d6 | 59 | int main() |
Chakweza | 0:ab353447a5d6 | 60 | { |
Chakweza | 0:ab353447a5d6 | 61 | ///set_time(1430942878); /// initialise time to 1st January 1970 |
Chakweza | 0:ab353447a5d6 | 62 | button.rise(&buttonPressed); ///event generated on rising edge |
Chakweza | 0:ab353447a5d6 | 63 | |
Chakweza | 0:ab353447a5d6 | 64 | int result(); |
Chakweza | 0:ab353447a5d6 | 65 | PHY_PowerDown(); /// Power down Ethernet interface |
Chakweza | 0:ab353447a5d6 | 66 | |
Chakweza | 0:ab353447a5d6 | 67 | |
Chakweza | 0:ab353447a5d6 | 68 | /// Normal mbed power level for this setup is around 690mW |
Chakweza | 0:ab353447a5d6 | 69 | ///assuming 5V used on Vin pin |
Chakweza | 0:ab353447a5d6 | 70 | /// If you don't need networking... |
Chakweza | 0:ab353447a5d6 | 71 | /// Power down Ethernet interface - saves around 175mW |
Chakweza | 0:ab353447a5d6 | 72 | /// Also need to unplug network cable - just a cable sucks power |
Chakweza | 0:ab353447a5d6 | 73 | |
Chakweza | 0:ab353447a5d6 | 74 | |
Chakweza | 0:ab353447a5d6 | 75 | lcd.init(); /// initialise display |
Chakweza | 0:ab353447a5d6 | 76 | wait(2); /// 2 second delay |
Chakweza | 0:ab353447a5d6 | 77 | lcd.clear();/// Clears display |
Chakweza | 0:ab353447a5d6 | 78 | startscreen(); |
Chakweza | 0:ab353447a5d6 | 79 | wait(5); ///5 second delay |
Chakweza | 0:ab353447a5d6 | 80 | lcd.clear(); |
Chakweza | 0:ab353447a5d6 | 81 | |
Chakweza | 0:ab353447a5d6 | 82 | |
Chakweza | 0:ab353447a5d6 | 83 | /// initiliase barometer |
Chakweza | 0:ab353447a5d6 | 84 | bmp180.init(); |
Chakweza | 0:ab353447a5d6 | 85 | |
Chakweza | 0:ab353447a5d6 | 86 | int temperature = 27; |
Chakweza | 0:ab353447a5d6 | 87 | int length = sprintf(buffer,"T = %2d C",temperature); /// print formatted data to buffer |
Chakweza | 0:ab353447a5d6 | 88 | ///it is important the format specifier ensures the length will fit in the buffer |
Chakweza | 0:ab353447a5d6 | 89 | if (length <= 14) /// if string will fit on display |
Chakweza | 0:ab353447a5d6 | 90 | |
Chakweza | 0:ab353447a5d6 | 91 | lcd.printString(buffer,0,1); /// display on screen |
Chakweza | 0:ab353447a5d6 | 92 | |
Chakweza | 0:ab353447a5d6 | 93 | |
Chakweza | 0:ab353447a5d6 | 94 | |
Chakweza | 0:ab353447a5d6 | 95 | Measurement measurement; /// measurement structure declared in BMP180 class |
Chakweza | 0:ab353447a5d6 | 96 | |
Chakweza | 0:ab353447a5d6 | 97 | buzzer.period(1.0/50.0); ///50Hz period // higher frequency drains power |
Chakweza | 0:ab353447a5d6 | 98 | |
Chakweza | 0:ab353447a5d6 | 99 | while(1) { |
Chakweza | 0:ab353447a5d6 | 100 | |
Chakweza | 0:ab353447a5d6 | 101 | time_t seconds = time(NULL); /// get current time |
Chakweza | 0:ab353447a5d6 | 102 | /// format time into a string (time) |
Chakweza | 0:ab353447a5d6 | 103 | strftime(timeBuffer, 14 , "%X", localtime(&seconds)); |
Chakweza | 0:ab353447a5d6 | 104 | |
Chakweza | 0:ab353447a5d6 | 105 | |
Chakweza | 0:ab353447a5d6 | 106 | |
Chakweza | 0:ab353447a5d6 | 107 | lcd.printString("Weather Today",0,0);///print at 0,0) |
Chakweza | 0:ab353447a5d6 | 108 | |
Chakweza | 0:ab353447a5d6 | 109 | char buffer[14]; /// each character is 6 pixels wide, screen is 84 pixels (84/6 = 14) |
Chakweza | 0:ab353447a5d6 | 110 | /// so can display a string of a maximum 14 characters in length |
Chakweza | 0:ab353447a5d6 | 111 | /// or create formatted strings - ensure they aren't more than 14 characters long |
Chakweza | 0:ab353447a5d6 | 112 | int temperature = measurement.temperature; |
Chakweza | 0:ab353447a5d6 | 113 | |
Chakweza | 0:ab353447a5d6 | 114 | backlight = 1.0 - pot; |
Chakweza | 0:ab353447a5d6 | 115 | |
Chakweza | 0:ab353447a5d6 | 116 | ///LEDS & BUZZER THRESHOLDS/// |
Chakweza | 0:ab353447a5d6 | 117 | |
Chakweza | 0:ab353447a5d6 | 118 | if (measurement.temperature > 27) { ///if temperature is greater than 28deg |
Chakweza | 0:ab353447a5d6 | 119 | redled = 1;///led on |
Chakweza | 0:ab353447a5d6 | 120 | greenled = 0;///led off |
Chakweza | 0:ab353447a5d6 | 121 | buzzer = 0.5;/// high temp alarm using PWM |
Chakweza | 0:ab353447a5d6 | 122 | } |
Chakweza | 0:ab353447a5d6 | 123 | |
Chakweza | 0:ab353447a5d6 | 124 | else if (measurement.temperature < 27) { ///if temperature is less than 28deg |
Chakweza | 0:ab353447a5d6 | 125 | redled = 0;///led off |
Chakweza | 0:ab353447a5d6 | 126 | greenled = 1;///led on |
Chakweza | 0:ab353447a5d6 | 127 | buzzer = 0.0;///buzzer off |
Chakweza | 0:ab353447a5d6 | 128 | } |
Chakweza | 0:ab353447a5d6 | 129 | |
Chakweza | 0:ab353447a5d6 | 130 | |
Chakweza | 0:ab353447a5d6 | 131 | |
Chakweza | 0:ab353447a5d6 | 132 | |
Chakweza | 0:ab353447a5d6 | 133 | int length = sprintf(buffer,"T = %2d C",temperature); /// print formatted data to buffer |
Chakweza | 0:ab353447a5d6 | 134 | /// it is important the format specifier ensures the length will fit in the buffer |
Chakweza | 0:ab353447a5d6 | 135 | if (length <= 14) /// if string will fit on display |
Chakweza | 0:ab353447a5d6 | 136 | lcd.printString(buffer,0,1); /// display on screen |
Chakweza | 0:ab353447a5d6 | 137 | |
Chakweza | 0:ab353447a5d6 | 138 | float pressure = measurement.pressure; /// same idea with floats |
Chakweza | 0:ab353447a5d6 | 139 | length = sprintf(buffer,"P = %.2f mb",pressure);///print formatted data to buffer |
Chakweza | 0:ab353447a5d6 | 140 | |
Chakweza | 0:ab353447a5d6 | 141 | |
Chakweza | 0:ab353447a5d6 | 142 | if (length <= 14) |
Chakweza | 0:ab353447a5d6 | 143 | lcd.printString(buffer,0,2);///print |
Chakweza | 0:ab353447a5d6 | 144 | lcd.printString(timeBuffer,0,3);///print |
Chakweza | 0:ab353447a5d6 | 145 | |
Chakweza | 0:ab353447a5d6 | 146 | |
Chakweza | 0:ab353447a5d6 | 147 | /// read values (T in Celsius and P in mb) and print over serial port |
Chakweza | 0:ab353447a5d6 | 148 | measurement = bmp180.readValues(); |
Chakweza | 0:ab353447a5d6 | 149 | |
Chakweza | 0:ab353447a5d6 | 150 | wait(1.0); /// 1 second until next reading |
Chakweza | 0:ab353447a5d6 | 151 | |
Chakweza | 0:ab353447a5d6 | 152 | lcd.printString("Press But1",0,4); ///print |
Chakweza | 0:ab353447a5d6 | 153 | lcd.printString("to sleep/wake",0,5);///print |
Chakweza | 0:ab353447a5d6 | 154 | |
Chakweza | 0:ab353447a5d6 | 155 | /// BUTTON INTERRUPT/// |
Chakweza | 0:ab353447a5d6 | 156 | if (buttonFlag) { ///if flag is set |
Chakweza | 0:ab353447a5d6 | 157 | buttonFlag = 0; /// reset flag |
Chakweza | 0:ab353447a5d6 | 158 | greenled = 0; /// turn off greenled |
Chakweza | 0:ab353447a5d6 | 159 | redled = 0; /// turn off redled |
Chakweza | 0:ab353447a5d6 | 160 | buzzer = 0.0; /// turn off buzzer |
Chakweza | 0:ab353447a5d6 | 161 | lcd.turnOff(); /// turn off lcd |
Chakweza | 0:ab353447a5d6 | 162 | |
Chakweza | 0:ab353447a5d6 | 163 | while (1) { |
Chakweza | 0:ab353447a5d6 | 164 | if (buttonFlag) { ///if flag is set |
Chakweza | 0:ab353447a5d6 | 165 | buttonFlag = 0; /// reset flag |
Chakweza | 0:ab353447a5d6 | 166 | lcd.init(); ///Initialise display |
Chakweza | 0:ab353447a5d6 | 167 | break; |
Chakweza | 0:ab353447a5d6 | 168 | } |
Chakweza | 0:ab353447a5d6 | 169 | Sleep(); // put to sleep until next interrupt |
Chakweza | 0:ab353447a5d6 | 170 | } |
Chakweza | 0:ab353447a5d6 | 171 | |
Chakweza | 0:ab353447a5d6 | 172 | } |
Chakweza | 0:ab353447a5d6 | 173 | |
Chakweza | 0:ab353447a5d6 | 174 | } |
Chakweza | 0:ab353447a5d6 | 175 | |
Chakweza | 0:ab353447a5d6 | 176 | |
Chakweza | 0:ab353447a5d6 | 177 | } |