This code is written to run on the ARMmbed LPC1768 board. It is developed to configure the board which is connected to a TMP102 to constantly measure temperature, update the display evey minute and also plot these readings on a Nokia N5110 LCD
main.cpp@0:bfd4c95124c3, 2017-02-01 (annotated)
- Committer:
- el16ooo
- Date:
- Wed Feb 01 21:46:00 2017 +0000
- Revision:
- 0:bfd4c95124c3
- Child:
- 1:f37cf0e5d0e8
This code is written to run on the ARMmbed LPC1768 board. It is developed to configure the board which is connected to a TMP102 to constantly measure temperature, update the display evey minute and also plot these readings on the Nokia N5110 LCD
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
el16ooo | 0:bfd4c95124c3 | 1 | //INTRODUCTION |
el16ooo | 0:bfd4c95124c3 | 2 | /*------------------------------------------------------------------------------ |
el16ooo | 0:bfd4c95124c3 | 3 | Author: Oluwole O. Oyetoke |
el16ooo | 0:bfd4c95124c3 | 4 | Date: 25th November, 2016 |
el16ooo | 0:bfd4c95124c3 | 5 | SUMMARY: This code is written to run on the ARMmbed LPC1768 board. |
el16ooo | 0:bfd4c95124c3 | 6 | It is developed to configure the board which is connected to a |
el16ooo | 0:bfd4c95124c3 | 7 | TMP102 to constantly measure temperature, update the display |
el16ooo | 0:bfd4c95124c3 | 8 | evey minute and also plot these values over time on the LCD |
el16ooo | 0:bfd4c95124c3 | 9 | ------------------------------------------------------------------------------*/ |
el16ooo | 0:bfd4c95124c3 | 10 | |
el16ooo | 0:bfd4c95124c3 | 11 | |
el16ooo | 0:bfd4c95124c3 | 12 | |
el16ooo | 0:bfd4c95124c3 | 13 | //HEADER INCLUSION & DEFINITIONS |
el16ooo | 0:bfd4c95124c3 | 14 | //------------------------------------------------------------------------------ |
el16ooo | 0:bfd4c95124c3 | 15 | #include "mbed.h" //mbed header file inclusion |
el16ooo | 0:bfd4c95124c3 | 16 | #include "N5110.h" //Nokia LCD Screen header file inclusion |
el16ooo | 0:bfd4c95124c3 | 17 | #include <math.h> |
el16ooo | 0:bfd4c95124c3 | 18 | |
el16ooo | 0:bfd4c95124c3 | 19 | //Define slave address for different conditions |
el16ooo | 0:bfd4c95124c3 | 20 | //ADD0 of TMP102 is connected to ground... address will be Ob1001000 = 0x48 |
el16ooo | 0:bfd4c95124c3 | 21 | #define slaveAddress 0x48 |
el16ooo | 0:bfd4c95124c3 | 22 | #define slaveWriteAddress 0x90 |
el16ooo | 0:bfd4c95124c3 | 23 | #define slaveReadAddress 0x91 |
el16ooo | 0:bfd4c95124c3 | 24 | |
el16ooo | 0:bfd4c95124c3 | 25 | |
el16ooo | 0:bfd4c95124c3 | 26 | /*Define needed register addresses |
el16ooo | 0:bfd4c95124c3 | 27 | -------------------------------------------------------------- |
el16ooo | 0:bfd4c95124c3 | 28 | | BIT FUNCTION | P7 | P6 | P5 | P4 | P3 | P2 | P1 | p0 | | |
el16ooo | 0:bfd4c95124c3 | 29 | | BYTE 1 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | | |
el16ooo | 0:bfd4c95124c3 | 30 | |------------------------------------------------------------| |
el16ooo | 0:bfd4c95124c3 | 31 | P1 P0 REGISTER |
el16ooo | 0:bfd4c95124c3 | 32 | 0 0 TEMPERATURE REGISTER (Read Only) |
el16ooo | 0:bfd4c95124c3 | 33 | 0 1 CONFIGURATION REGISTER (Read/Write) |
el16ooo | 0:bfd4c95124c3 | 34 | 1 0 TLOW REGISTER (Read/Write) |
el16ooo | 0:bfd4c95124c3 | 35 | 1 1 THIGH REGISTER (Read/Write) |
el16ooo | 0:bfd4c95124c3 | 36 | */ |
el16ooo | 0:bfd4c95124c3 | 37 | #define tempRegAddress 0x00 //0b00000000 |
el16ooo | 0:bfd4c95124c3 | 38 | #define configRegAddress 0x01; //0b00000001 |
el16ooo | 0:bfd4c95124c3 | 39 | #define tlowRegAddress 0x02; //0b00000010 |
el16ooo | 0:bfd4c95124c3 | 40 | #define thighRegAddress 0x03; //0b00000011 |
el16ooo | 0:bfd4c95124c3 | 41 | //------------------------------------------------------------------------------ |
el16ooo | 0:bfd4c95124c3 | 42 | |
el16ooo | 0:bfd4c95124c3 | 43 | |
el16ooo | 0:bfd4c95124c3 | 44 | //PIN CONNECTION SET-UP |
el16ooo | 0:bfd4c95124c3 | 45 | //------------------------------------------------------------------------------ |
el16ooo | 0:bfd4c95124c3 | 46 | //Set pin connection to LCD |
el16ooo | 0:bfd4c95124c3 | 47 | N5110 lcd(p7,p8,p9,p10,p11,p13,p21); |
el16ooo | 0:bfd4c95124c3 | 48 | |
el16ooo | 0:bfd4c95124c3 | 49 | //Set pin connection for the TMP102 |
el16ooo | 0:bfd4c95124c3 | 50 | I2C tmp102(p28, p27); //p28-SDA, p27-SCL |
el16ooo | 0:bfd4c95124c3 | 51 | |
el16ooo | 0:bfd4c95124c3 | 52 | //Set pins for error display leds |
el16ooo | 0:bfd4c95124c3 | 53 | BusOut myleds(LED1, LED2, LED3, LED4); |
el16ooo | 0:bfd4c95124c3 | 54 | |
el16ooo | 0:bfd4c95124c3 | 55 | //Set pins for USB connectivity |
el16ooo | 0:bfd4c95124c3 | 56 | Serial pc(USBTX,USBRX); //Usually (p9,p10) for external devices |
el16ooo | 0:bfd4c95124c3 | 57 | |
el16ooo | 0:bfd4c95124c3 | 58 | //Set logging control pin |
el16ooo | 0:bfd4c95124c3 | 59 | DigitalIn loggerSwitch(p18); |
el16ooo | 0:bfd4c95124c3 | 60 | DigitalIn plotterModeButton(p16); |
el16ooo | 0:bfd4c95124c3 | 61 | DigitalIn standbyButton(p17); |
el16ooo | 0:bfd4c95124c3 | 62 | |
el16ooo | 0:bfd4c95124c3 | 63 | //Set interrupt on pin 16 and 17 |
el16ooo | 0:bfd4c95124c3 | 64 | InterruptIn plotterInterrupt(p16); |
el16ooo | 0:bfd4c95124c3 | 65 | InterruptIn standbyInterrupt(p17); |
el16ooo | 0:bfd4c95124c3 | 66 | //------------------------------------------------------------------------------ |
el16ooo | 0:bfd4c95124c3 | 67 | |
el16ooo | 0:bfd4c95124c3 | 68 | |
el16ooo | 0:bfd4c95124c3 | 69 | //DEFINE NEEDED OBJECTS |
el16ooo | 0:bfd4c95124c3 | 70 | //------------------------------------------------------------------------------ |
el16ooo | 0:bfd4c95124c3 | 71 | Ticker tempIntervalReader, timeIntervalReader, fileWriteInterval; |
el16ooo | 0:bfd4c95124c3 | 72 | //------------------------------------------------------------------------------ |
el16ooo | 0:bfd4c95124c3 | 73 | |
el16ooo | 0:bfd4c95124c3 | 74 | |
el16ooo | 0:bfd4c95124c3 | 75 | //FUNCTION DEFINITION |
el16ooo | 0:bfd4c95124c3 | 76 | //------------------------------------------------------------------------------ |
el16ooo | 0:bfd4c95124c3 | 77 | void ErrorBuzzer(int code); |
el16ooo | 0:bfd4c95124c3 | 78 | void initializeTMP102(); //Function used to initialize the TMP102 & configure |
el16ooo | 0:bfd4c95124c3 | 79 | void readTemperature(); //Function used to read the temperature momentarily |
el16ooo | 0:bfd4c95124c3 | 80 | void serialISR(); //ISR that is called when serial data is received |
el16ooo | 0:bfd4c95124c3 | 81 | void setTime(); //Function to set the UNIX time |
el16ooo | 0:bfd4c95124c3 | 82 | void writeDataToFile(int data); //Function for writing to file |
el16ooo | 0:bfd4c95124c3 | 83 | void updateLCDTime(); //Function to update LCD Time |
el16ooo | 0:bfd4c95124c3 | 84 | trigerViewChange(); //Function used to trigger view change |
el16ooo | 0:bfd4c95124c3 | 85 | void plot(); |
el16ooo | 0:bfd4c95124c3 | 86 | void standbyFunction(); |
el16ooo | 0:bfd4c95124c3 | 87 | //------------------------------------------------------------------------------ |
el16ooo | 0:bfd4c95124c3 | 88 | |
el16ooo | 0:bfd4c95124c3 | 89 | |
el16ooo | 0:bfd4c95124c3 | 90 | |
el16ooo | 0:bfd4c95124c3 | 91 | //DEFINE GLOBAL VARIABLES |
el16ooo | 0:bfd4c95124c3 | 92 | //------------------------------------------------------------------------------ |
el16ooo | 0:bfd4c95124c3 | 93 | char rxString[16]; //Buffer to store received string |
el16ooo | 0:bfd4c95124c3 | 94 | int setTimeFlag = 0; //Flag for ISR |
el16ooo | 0:bfd4c95124c3 | 95 | int setLogFlag = 0; //Flag to control logging |
el16ooo | 0:bfd4c95124c3 | 96 | int setPlotFlag = 0; //Flag to switch in and out of plot mode |
el16ooo | 0:bfd4c95124c3 | 97 | int LCDStanbyFlag=0; //Flag to stanby LCD |
el16ooo | 0:bfd4c95124c3 | 98 | float temperatureValue = 0; //Initial temperature value |
el16ooo | 0:bfd4c95124c3 | 99 | char tempValueDispBuffer[14]; // Screen can only take 14 characters/line @ maximum |
el16ooo | 0:bfd4c95124c3 | 100 | char timeValueDispBuffer[30]; // Screen can only take 14 characters/line @ maximum |
el16ooo | 0:bfd4c95124c3 | 101 | char dateValueDispBuffer[30]; // Screen can only take 14 characters/line @ maximum |
el16ooo | 0:bfd4c95124c3 | 102 | char datetimeValueDispBuffer[30]; // Screen can only take 14 characters/line @ maximum |
el16ooo | 0:bfd4c95124c3 | 103 | LocalFileSystem local("local"); //Create Local File System |
el16ooo | 0:bfd4c95124c3 | 104 | int xAxisCounter=0; |
el16ooo | 0:bfd4c95124c3 | 105 | //------------------------------------------------------------------------------ |
el16ooo | 0:bfd4c95124c3 | 106 | |
el16ooo | 0:bfd4c95124c3 | 107 | |
el16ooo | 0:bfd4c95124c3 | 108 | |
el16ooo | 0:bfd4c95124c3 | 109 | //FUNCTION TO SET RTC TIME THROUGH SERIAL CONNECTION |
el16ooo | 0:bfd4c95124c3 | 110 | //------------------------------------------------------------------------------ |
el16ooo | 0:bfd4c95124c3 | 111 | void setTime() { |
el16ooo | 0:bfd4c95124c3 | 112 | pc.printf("set_time - %s",rxString);// print time for debugging |
el16ooo | 0:bfd4c95124c3 | 113 | int time = atoi(rxString); // atoi() converts a string to an integer |
el16ooo | 0:bfd4c95124c3 | 114 | set_time(time); // update the time |
el16ooo | 0:bfd4c95124c3 | 115 | } |
el16ooo | 0:bfd4c95124c3 | 116 | //------------------------------------------------------------------------------ |
el16ooo | 0:bfd4c95124c3 | 117 | |
el16ooo | 0:bfd4c95124c3 | 118 | //FUNCTION TO UPDATE LCD WITH NEW TIME READING |
el16ooo | 0:bfd4c95124c3 | 119 | //------------------------------------------------------------------------------ |
el16ooo | 0:bfd4c95124c3 | 120 | void updateLCDTime(){ |
el16ooo | 0:bfd4c95124c3 | 121 | time_t seconds = time(NULL); // Get current time |
el16ooo | 0:bfd4c95124c3 | 122 | |
el16ooo | 0:bfd4c95124c3 | 123 | // Format time into a string (time and date) |
el16ooo | 0:bfd4c95124c3 | 124 | strftime(timeValueDispBuffer, 30 , " %X", localtime(&seconds)); |
el16ooo | 0:bfd4c95124c3 | 125 | strftime(dateValueDispBuffer, 30 , " %x", localtime(&seconds)); |
el16ooo | 0:bfd4c95124c3 | 126 | strftime(datetimeValueDispBuffer,30 , "%x %X", localtime(&seconds)); |
el16ooo | 0:bfd4c95124c3 | 127 | |
el16ooo | 0:bfd4c95124c3 | 128 | |
el16ooo | 0:bfd4c95124c3 | 129 | // print time on LCD |
el16ooo | 0:bfd4c95124c3 | 130 | if((setPlotFlag==0)){ |
el16ooo | 0:bfd4c95124c3 | 131 | lcd.printString(dateValueDispBuffer,0,2); // Print on LCD |
el16ooo | 0:bfd4c95124c3 | 132 | lcd.printString(timeValueDispBuffer,0,3); // Print on LCD |
el16ooo | 0:bfd4c95124c3 | 133 | } |
el16ooo | 0:bfd4c95124c3 | 134 | } |
el16ooo | 0:bfd4c95124c3 | 135 | //-------------------------------------------------------------------------------- |
el16ooo | 0:bfd4c95124c3 | 136 | |
el16ooo | 0:bfd4c95124c3 | 137 | |
el16ooo | 0:bfd4c95124c3 | 138 | //SERIAL LINK INTERRUPT SERVICE ROUTINE |
el16ooo | 0:bfd4c95124c3 | 139 | //------------------------------------------------------------------------------ |
el16ooo | 0:bfd4c95124c3 | 140 | void serialISR() { |
el16ooo | 0:bfd4c95124c3 | 141 | // when a serial interrupt occurs, read rx string into buffer |
el16ooo | 0:bfd4c95124c3 | 142 | pc.gets(rxString,16); |
el16ooo | 0:bfd4c95124c3 | 143 | // set flag |
el16ooo | 0:bfd4c95124c3 | 144 | setTimeFlag = 1; |
el16ooo | 0:bfd4c95124c3 | 145 | } |
el16ooo | 0:bfd4c95124c3 | 146 | //------------------------------------------------------------------------------ |
el16ooo | 0:bfd4c95124c3 | 147 | |
el16ooo | 0:bfd4c95124c3 | 148 | |
el16ooo | 0:bfd4c95124c3 | 149 | // FUNCTION USED TO INITIATE LED FLASHING WHEN AN ERROR OCCURS |
el16ooo | 0:bfd4c95124c3 | 150 | //------------------------------------------------------------------------------ |
el16ooo | 0:bfd4c95124c3 | 151 | void ErrorBuzzer(int code) |
el16ooo | 0:bfd4c95124c3 | 152 | { |
el16ooo | 0:bfd4c95124c3 | 153 | while(1) { //hang in infinite loop flashing error code |
el16ooo | 0:bfd4c95124c3 | 154 | myleds = 0; //LEDs OFF |
el16ooo | 0:bfd4c95124c3 | 155 | wait(0.25); //Wait for 1/4th of a second |
el16ooo | 0:bfd4c95124c3 | 156 | myleds = code; //LEDs ON |
el16ooo | 0:bfd4c95124c3 | 157 | wait(0.25); //Wait for 1/4th of a second |
el16ooo | 0:bfd4c95124c3 | 158 | } |
el16ooo | 0:bfd4c95124c3 | 159 | } |
el16ooo | 0:bfd4c95124c3 | 160 | //------------------------------------------------------------------------------ |
el16ooo | 0:bfd4c95124c3 | 161 | |
el16ooo | 0:bfd4c95124c3 | 162 | |
el16ooo | 0:bfd4c95124c3 | 163 | //FUNCTIONUSED TO SET-UP TMP102 CONFIGURATION REGISTER AS DESIRED |
el16ooo | 0:bfd4c95124c3 | 164 | //------------------------------------------------------------------------------ |
el16ooo | 0:bfd4c95124c3 | 165 | void initializeTMP102(){ |
el16ooo | 0:bfd4c95124c3 | 166 | |
el16ooo | 0:bfd4c95124c3 | 167 | //Set bus speed to 400kHz |
el16ooo | 0:bfd4c95124c3 | 168 | tmp102.frequency(400000); |
el16ooo | 0:bfd4c95124c3 | 169 | |
el16ooo | 0:bfd4c95124c3 | 170 | int acknowledgement = 1; //Initialized to false |
el16ooo | 0:bfd4c95124c3 | 171 | |
el16ooo | 0:bfd4c95124c3 | 172 | /* |
el16ooo | 0:bfd4c95124c3 | 173 | Configure the 16 bits register structure of the configuration register |
el16ooo | 0:bfd4c95124c3 | 174 | -------------------------------------------------------------- |
el16ooo | 0:bfd4c95124c3 | 175 | | BIT FUNCTION | OS | R1 | R0 | F1 | F0 | POL | TM | SD | | |
el16ooo | 0:bfd4c95124c3 | 176 | | BYTE 1 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | | |
el16ooo | 0:bfd4c95124c3 | 177 | |------------------------------------------------------------| |
el16ooo | 0:bfd4c95124c3 | 178 | | BIT FUNCTION | CR1 | CR0 | AL | EM | 0 | 0 | 0 | 0 | | |
el16ooo | 0:bfd4c95124c3 | 179 | | BYTE 2 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | | | |
el16ooo | 0:bfd4c95124c3 | 180 | -------------------------------------------------------------- |
el16ooo | 0:bfd4c95124c3 | 181 | BIT FUNTION EXPLANTION |
el16ooo | 0:bfd4c95124c3 | 182 | OS (ONE-SHOT): 0 --> not in use |
el16ooo | 0:bfd4c95124c3 | 183 | R1, R2 (RESOLUTION): 1, 1 --> Sets the temperature register to 12 bits |
el16ooo | 0:bfd4c95124c3 | 184 | F1, F0 (FALUT QUE): 1,1 --> 6 consecutive faults before alert is triggered |
el16ooo | 0:bfd4c95124c3 | 185 | POL (POLARITY): 0 --> Alert pin will be active low |
el16ooo | 0:bfd4c95124c3 | 186 | TM (THERMOSTAT MODE): 0 --> Comparator mode activated |
el16ooo | 0:bfd4c95124c3 | 187 | SD (SHUTDOWN MODE): 0 --> Continious conversion. No intermitent shutdown |
el16ooo | 0:bfd4c95124c3 | 188 | CR1, CR0 (CONV. RES.): 0, 1 --> 1Hz, 1 conversion per second |
el16ooo | 0:bfd4c95124c3 | 189 | AL (ALERT): 1 --> Read only + only takes the opposite vaue of POL |
el16ooo | 0:bfd4c95124c3 | 190 | EM (EXTENDED MODE): 0 --> Normal Mode. Sets TREG,THIGH,TLOW reg. to 12 bts |
el16ooo | 0:bfd4c95124c3 | 191 | */ |
el16ooo | 0:bfd4c95124c3 | 192 | char byteOne = 0x70; //0b01111000 |
el16ooo | 0:bfd4c95124c3 | 193 | char byteTwo = 0x60; //0b01100000 |
el16ooo | 0:bfd4c95124c3 | 194 | |
el16ooo | 0:bfd4c95124c3 | 195 | |
el16ooo | 0:bfd4c95124c3 | 196 | //Initiate contact with slave, specify desired register and the data to write. |
el16ooo | 0:bfd4c95124c3 | 197 | //Package contains address and the data to write |
el16ooo | 0:bfd4c95124c3 | 198 | char configPackage[3]; |
el16ooo | 0:bfd4c95124c3 | 199 | configPackage[0] = configRegAddress; |
el16ooo | 0:bfd4c95124c3 | 200 | configPackage[1] = byteOne; |
el16ooo | 0:bfd4c95124c3 | 201 | configPackage[2] = byteTwo; |
el16ooo | 0:bfd4c95124c3 | 202 | acknowledgement = tmp102.write(slaveWriteAddress, configPackage, 3); |
el16ooo | 0:bfd4c95124c3 | 203 | if(acknowledgement==1){ //I2C always returns 0 for successful operation |
el16ooo | 0:bfd4c95124c3 | 204 | ErrorBuzzer(1); //Error Message |
el16ooo | 0:bfd4c95124c3 | 205 | } |
el16ooo | 0:bfd4c95124c3 | 206 | } |
el16ooo | 0:bfd4c95124c3 | 207 | //------------------------------------------------------------------------------ |
el16ooo | 0:bfd4c95124c3 | 208 | |
el16ooo | 0:bfd4c95124c3 | 209 | |
el16ooo | 0:bfd4c95124c3 | 210 | |
el16ooo | 0:bfd4c95124c3 | 211 | |
el16ooo | 0:bfd4c95124c3 | 212 | |
el16ooo | 0:bfd4c95124c3 | 213 | //Temperature Reader Function |
el16ooo | 0:bfd4c95124c3 | 214 | //------------------------------------------------------------------------------ |
el16ooo | 0:bfd4c95124c3 | 215 | void readTemperature(){ |
el16ooo | 0:bfd4c95124c3 | 216 | int acknowledgement=1; //Initialized to 1 |
el16ooo | 0:bfd4c95124c3 | 217 | char tempRegisterData[2]; |
el16ooo | 0:bfd4c95124c3 | 218 | int temperature = 0; |
el16ooo | 0:bfd4c95124c3 | 219 | //Inititate contact with slave by trying to write to its temp register |
el16ooo | 0:bfd4c95124c3 | 220 | //Temp register is a read only register, so it will not happen |
el16ooo | 0:bfd4c95124c3 | 221 | acknowledgement = tmp102.write(slaveWriteAddress,tempRegAddress,1); |
el16ooo | 0:bfd4c95124c3 | 222 | if(acknowledgement==1){ //I2C always returns 0 for successful operation |
el16ooo | 0:bfd4c95124c3 | 223 | ErrorBuzzer(2); //Error Message |
el16ooo | 0:bfd4c95124c3 | 224 | } |
el16ooo | 0:bfd4c95124c3 | 225 | //Try to read from temperature register |
el16ooo | 0:bfd4c95124c3 | 226 | acknowledgement = tmp102.read(slaveReadAddress,tempRegisterData,2); |
el16ooo | 0:bfd4c95124c3 | 227 | if(acknowledgement==1){ //I2C always returns 0 for successful operation |
el16ooo | 0:bfd4c95124c3 | 228 | ErrorBuzzer(3); //Error Message |
el16ooo | 0:bfd4c95124c3 | 229 | } |
el16ooo | 0:bfd4c95124c3 | 230 | |
el16ooo | 0:bfd4c95124c3 | 231 | temperature = (tempRegisterData[0] << 4) | (tempRegisterData[1] >> 4); |
el16ooo | 0:bfd4c95124c3 | 232 | temperatureValue = temperature*0.0625; |
el16ooo | 0:bfd4c95124c3 | 233 | if(setPlotFlag==1){ |
el16ooo | 0:bfd4c95124c3 | 234 | plot(); |
el16ooo | 0:bfd4c95124c3 | 235 | } |
el16ooo | 0:bfd4c95124c3 | 236 | //return temperature*0.0625; |
el16ooo | 0:bfd4c95124c3 | 237 | //float tmp = (float((tempRegisterData[0]<<8)|tempRegisterData[1]) / 256.0); |
el16ooo | 0:bfd4c95124c3 | 238 | } |
el16ooo | 0:bfd4c95124c3 | 239 | //------------------------------------------------------------------------------ |
el16ooo | 0:bfd4c95124c3 | 240 | |
el16ooo | 0:bfd4c95124c3 | 241 | |
el16ooo | 0:bfd4c95124c3 | 242 | //FUNCTION FOR WRITING TO FILE |
el16ooo | 0:bfd4c95124c3 | 243 | //------------------------------------------------------------------------------ |
el16ooo | 0:bfd4c95124c3 | 244 | void writeDataToFile() |
el16ooo | 0:bfd4c95124c3 | 245 | { |
el16ooo | 0:bfd4c95124c3 | 246 | if(setLogFlag==1){ //Only record if logging is turned ON |
el16ooo | 0:bfd4c95124c3 | 247 | myleds = 15; // turn on LEDs for feedback |
el16ooo | 0:bfd4c95124c3 | 248 | FILE *fp = fopen("/local/templog.csv", "a"); // open 'templog.txt' for appending |
el16ooo | 0:bfd4c95124c3 | 249 | // if the file doesn't exist it is created, if it exists, data is appended to the end |
el16ooo | 0:bfd4c95124c3 | 250 | fprintf(fp,"%s, %.2f \n",datetimeValueDispBuffer, temperatureValue ); // print string to file |
el16ooo | 0:bfd4c95124c3 | 251 | fclose(fp); // close file |
el16ooo | 0:bfd4c95124c3 | 252 | myleds = 0; // turn off LEDs to signify file access has finished |
el16ooo | 0:bfd4c95124c3 | 253 | } |
el16ooo | 0:bfd4c95124c3 | 254 | } |
el16ooo | 0:bfd4c95124c3 | 255 | //------------------------------------------------------------------------------ |
el16ooo | 0:bfd4c95124c3 | 256 | |
el16ooo | 0:bfd4c95124c3 | 257 | |
el16ooo | 0:bfd4c95124c3 | 258 | //INTERRUPT FUNCTION FOR DETECTING PLOT vs WRITE MODE |
el16ooo | 0:bfd4c95124c3 | 259 | //------------------------------------------------------------------------------ |
el16ooo | 0:bfd4c95124c3 | 260 | void trigerViewChange() { |
el16ooo | 0:bfd4c95124c3 | 261 | if(setPlotFlag==0){ |
el16ooo | 0:bfd4c95124c3 | 262 | setPlotFlag=1; |
el16ooo | 0:bfd4c95124c3 | 263 | lcd.clear(); |
el16ooo | 0:bfd4c95124c3 | 264 | for(int i=0; i<=83; i++){ |
el16ooo | 0:bfd4c95124c3 | 265 | lcd.setPixel(i,45); |
el16ooo | 0:bfd4c95124c3 | 266 | } |
el16ooo | 0:bfd4c95124c3 | 267 | |
el16ooo | 0:bfd4c95124c3 | 268 | for(int i=0; i<=47; i++){ |
el16ooo | 0:bfd4c95124c3 | 269 | |
el16ooo | 0:bfd4c95124c3 | 270 | lcd.setPixel(2,i); |
el16ooo | 0:bfd4c95124c3 | 271 | } |
el16ooo | 0:bfd4c95124c3 | 272 | } |
el16ooo | 0:bfd4c95124c3 | 273 | else if(setPlotFlag==1){ |
el16ooo | 0:bfd4c95124c3 | 274 | setPlotFlag = 0; |
el16ooo | 0:bfd4c95124c3 | 275 | lcd.clear(); |
el16ooo | 0:bfd4c95124c3 | 276 | lcd.printString(" TEMP. LOGGER!",0,0); //Print Welcome Message |
el16ooo | 0:bfd4c95124c3 | 277 | } |
el16ooo | 0:bfd4c95124c3 | 278 | |
el16ooo | 0:bfd4c95124c3 | 279 | } |
el16ooo | 0:bfd4c95124c3 | 280 | //------------------------------------------------------------------------------ |
el16ooo | 0:bfd4c95124c3 | 281 | |
el16ooo | 0:bfd4c95124c3 | 282 | |
el16ooo | 0:bfd4c95124c3 | 283 | //FUNCTION FOR PLOTTING TEMPERATURE VALUE ON LCD |
el16ooo | 0:bfd4c95124c3 | 284 | //------------------------------------------------------------------------------ |
el16ooo | 0:bfd4c95124c3 | 285 | void plot(){ |
el16ooo | 0:bfd4c95124c3 | 286 | //Note that 0,0 of the LCD starts from thr top left hand corner |
el16ooo | 0:bfd4c95124c3 | 287 | //Pixels are addressed in the range of 0 to 47 (y) and 0 to 83 (x). |
el16ooo | 0:bfd4c95124c3 | 288 | int tempIntegerValue=8; |
el16ooo | 0:bfd4c95124c3 | 289 | //Plot only tempertures between 0 and 47 degree celcious |
el16ooo | 0:bfd4c95124c3 | 290 | tempIntegerValue = floor(temperatureValue); |
el16ooo | 0:bfd4c95124c3 | 291 | //Note that 0,0 of the LCD starts from thr top left hand corner |
el16ooo | 0:bfd4c95124c3 | 292 | int rightYPosition=0; |
el16ooo | 0:bfd4c95124c3 | 293 | |
el16ooo | 0:bfd4c95124c3 | 294 | |
el16ooo | 0:bfd4c95124c3 | 295 | if (setPlotFlag==1){ |
el16ooo | 0:bfd4c95124c3 | 296 | if((tempIntegerValue<47) && (xAxisCounter<=83) ){ |
el16ooo | 0:bfd4c95124c3 | 297 | rightYPosition = 47-tempIntegerValue; |
el16ooo | 0:bfd4c95124c3 | 298 | lcd.setPixel(xAxisCounter, rightYPosition); |
el16ooo | 0:bfd4c95124c3 | 299 | lcd.refresh(); |
el16ooo | 0:bfd4c95124c3 | 300 | xAxisCounter++; |
el16ooo | 0:bfd4c95124c3 | 301 | sprintf(tempValueDispBuffer,"Now %.2f C",temperatureValue); |
el16ooo | 0:bfd4c95124c3 | 302 | lcd.printString(tempValueDispBuffer,0,0); // Print on LCD |
el16ooo | 0:bfd4c95124c3 | 303 | }else if(xAxisCounter>83){ |
el16ooo | 0:bfd4c95124c3 | 304 | lcd.clear(); |
el16ooo | 0:bfd4c95124c3 | 305 | lcd.refresh(); |
el16ooo | 0:bfd4c95124c3 | 306 | xAxisCounter=0; |
el16ooo | 0:bfd4c95124c3 | 307 | rightYPosition = 47-tempIntegerValue; |
el16ooo | 0:bfd4c95124c3 | 308 | lcd.setPixel(xAxisCounter, rightYPosition); |
el16ooo | 0:bfd4c95124c3 | 309 | lcd.refresh(); |
el16ooo | 0:bfd4c95124c3 | 310 | } |
el16ooo | 0:bfd4c95124c3 | 311 | else{ |
el16ooo | 0:bfd4c95124c3 | 312 | xAxisCounter=0; |
el16ooo | 0:bfd4c95124c3 | 313 | |
el16ooo | 0:bfd4c95124c3 | 314 | } |
el16ooo | 0:bfd4c95124c3 | 315 | } |
el16ooo | 0:bfd4c95124c3 | 316 | |
el16ooo | 0:bfd4c95124c3 | 317 | } |
el16ooo | 0:bfd4c95124c3 | 318 | //------------------------------------------------------------------------------ |
el16ooo | 0:bfd4c95124c3 | 319 | |
el16ooo | 0:bfd4c95124c3 | 320 | |
el16ooo | 0:bfd4c95124c3 | 321 | //STANDBY AND WAKE FUNCTION |
el16ooo | 0:bfd4c95124c3 | 322 | //------------------------------------------------------------------------------ |
el16ooo | 0:bfd4c95124c3 | 323 | void standbyFunction(){ |
el16ooo | 0:bfd4c95124c3 | 324 | if(LCDStanbyFlag==0){ |
el16ooo | 0:bfd4c95124c3 | 325 | lcd.turnOff(); |
el16ooo | 0:bfd4c95124c3 | 326 | LCDStanbyFlag = 1; |
el16ooo | 0:bfd4c95124c3 | 327 | } |
el16ooo | 0:bfd4c95124c3 | 328 | else if (LCDStanbyFlag==1){ |
el16ooo | 0:bfd4c95124c3 | 329 | lcd.turnOn(); |
el16ooo | 0:bfd4c95124c3 | 330 | lcd.init(); //Initialize LCD |
el16ooo | 0:bfd4c95124c3 | 331 | if((setPlotFlag==0)){ |
el16ooo | 0:bfd4c95124c3 | 332 | lcd.printString(" TEMP. LOGGER!",0,0); //Print Welcome Message |
el16ooo | 0:bfd4c95124c3 | 333 | }else{ |
el16ooo | 0:bfd4c95124c3 | 334 | // lcd.printString(" PLT MODE,",0,0); |
el16ooo | 0:bfd4c95124c3 | 335 | } |
el16ooo | 0:bfd4c95124c3 | 336 | LCDStanbyFlag = 0; |
el16ooo | 0:bfd4c95124c3 | 337 | } |
el16ooo | 0:bfd4c95124c3 | 338 | |
el16ooo | 0:bfd4c95124c3 | 339 | } |
el16ooo | 0:bfd4c95124c3 | 340 | //------------------------------------------------------------------------------ |
el16ooo | 0:bfd4c95124c3 | 341 | |
el16ooo | 0:bfd4c95124c3 | 342 | |
el16ooo | 0:bfd4c95124c3 | 343 | //MAIN FUNCTION |
el16ooo | 0:bfd4c95124c3 | 344 | //------------------------------------------------------------------------------ |
el16ooo | 0:bfd4c95124c3 | 345 | int main() { |
el16ooo | 0:bfd4c95124c3 | 346 | |
el16ooo | 0:bfd4c95124c3 | 347 | //Initialize temperature display lengths |
el16ooo | 0:bfd4c95124c3 | 348 | int tempDispLength=0; |
el16ooo | 0:bfd4c95124c3 | 349 | |
el16ooo | 0:bfd4c95124c3 | 350 | plotterModeButton.mode(PullUp); |
el16ooo | 0:bfd4c95124c3 | 351 | standbyButton.mode(PullUp); |
el16ooo | 0:bfd4c95124c3 | 352 | |
el16ooo | 0:bfd4c95124c3 | 353 | lcd.init(); //Initialize LCD |
el16ooo | 0:bfd4c95124c3 | 354 | if((setPlotFlag==0)){ |
el16ooo | 0:bfd4c95124c3 | 355 | lcd.printString(" TEMP. LOGGER!",0,0); //Print Welcome Message |
el16ooo | 0:bfd4c95124c3 | 356 | } |
el16ooo | 0:bfd4c95124c3 | 357 | |
el16ooo | 0:bfd4c95124c3 | 358 | initializeTMP102(); //Initialize Temperature Sensor |
el16ooo | 0:bfd4c95124c3 | 359 | |
el16ooo | 0:bfd4c95124c3 | 360 | |
el16ooo | 0:bfd4c95124c3 | 361 | // Attach serialISR function to the ISR and set serial baud rate |
el16ooo | 0:bfd4c95124c3 | 362 | pc.attach(&serialISR); |
el16ooo | 0:bfd4c95124c3 | 363 | pc.baud(9600); |
el16ooo | 0:bfd4c95124c3 | 364 | |
el16ooo | 0:bfd4c95124c3 | 365 | |
el16ooo | 0:bfd4c95124c3 | 366 | //Attach readTemperature function to the ticker. |
el16ooo | 0:bfd4c95124c3 | 367 | //Schedule to interrup every 60 seconds |
el16ooo | 0:bfd4c95124c3 | 368 | readTemperature(); |
el16ooo | 0:bfd4c95124c3 | 369 | tempIntervalReader.attach(&readTemperature, 2.0); |
el16ooo | 0:bfd4c95124c3 | 370 | |
el16ooo | 0:bfd4c95124c3 | 371 | //Attach write to file operation to a 60 seconds ticker |
el16ooo | 0:bfd4c95124c3 | 372 | fileWriteInterval.attach(&writeDataToFile, 2.0); |
el16ooo | 0:bfd4c95124c3 | 373 | |
el16ooo | 0:bfd4c95124c3 | 374 | //Attach updateLCDTime function to the ticker. |
el16ooo | 0:bfd4c95124c3 | 375 | //Schedule to interrupt and update LCDTime every 1 second |
el16ooo | 0:bfd4c95124c3 | 376 | timeIntervalReader.attach(&updateLCDTime, 1.0); |
el16ooo | 0:bfd4c95124c3 | 377 | |
el16ooo | 0:bfd4c95124c3 | 378 | //Attach interrupt to button on p16 to trigger view change to and from plotter |
el16ooo | 0:bfd4c95124c3 | 379 | plotterInterrupt.fall(&trigerViewChange); |
el16ooo | 0:bfd4c95124c3 | 380 | |
el16ooo | 0:bfd4c95124c3 | 381 | //Attach standby function to interrupt on button p17 |
el16ooo | 0:bfd4c95124c3 | 382 | standbyInterrupt.fall(&standbyFunction); |
el16ooo | 0:bfd4c95124c3 | 383 | |
el16ooo | 0:bfd4c95124c3 | 384 | //Value '0' will initialise time to 1st January 1970 |
el16ooo | 0:bfd4c95124c3 | 385 | //set_time(1480958460); //Uncomment after RTC clock value has been set |
el16ooo | 0:bfd4c95124c3 | 386 | |
el16ooo | 0:bfd4c95124c3 | 387 | //Continue spining this loop, however, every |
el16ooo | 0:bfd4c95124c3 | 388 | // 60 seconds, the ticker will be called and the time updated ever 1s |
el16ooo | 0:bfd4c95124c3 | 389 | while(1) { |
el16ooo | 0:bfd4c95124c3 | 390 | if((setLogFlag==0) && (setPlotFlag==0)){ |
el16ooo | 0:bfd4c95124c3 | 391 | lcd.printString(" LOGGING OFF ",0,5); |
el16ooo | 0:bfd4c95124c3 | 392 | } |
el16ooo | 0:bfd4c95124c3 | 393 | else if((setLogFlag==1) && (setPlotFlag==0)){ |
el16ooo | 0:bfd4c95124c3 | 394 | lcd.printString(" LOGGING ON ",0, 5); |
el16ooo | 0:bfd4c95124c3 | 395 | } |
el16ooo | 0:bfd4c95124c3 | 396 | |
el16ooo | 0:bfd4c95124c3 | 397 | //Display Current Temperature Reading |
el16ooo | 0:bfd4c95124c3 | 398 | // print formatted data to buffer |
el16ooo | 0:bfd4c95124c3 | 399 | tempDispLength = sprintf(tempValueDispBuffer," T = %.2f C",temperatureValue); |
el16ooo | 0:bfd4c95124c3 | 400 | if ((tempDispLength <= 14) && (setPlotFlag==0)) { |
el16ooo | 0:bfd4c95124c3 | 401 | lcd.printString(tempValueDispBuffer,0,4); // Print on LCD |
el16ooo | 0:bfd4c95124c3 | 402 | } |
el16ooo | 0:bfd4c95124c3 | 403 | |
el16ooo | 0:bfd4c95124c3 | 404 | //If updated time has been sent through serial |
el16ooo | 0:bfd4c95124c3 | 405 | if (setTimeFlag==1) { |
el16ooo | 0:bfd4c95124c3 | 406 | setTimeFlag = 0; // clear set time flag |
el16ooo | 0:bfd4c95124c3 | 407 | setTime(); // Call update time function |
el16ooo | 0:bfd4c95124c3 | 408 | } |
el16ooo | 0:bfd4c95124c3 | 409 | |
el16ooo | 0:bfd4c95124c3 | 410 | //Check if Logging is ON |
el16ooo | 0:bfd4c95124c3 | 411 | if(loggerSwitch){ |
el16ooo | 0:bfd4c95124c3 | 412 | setLogFlag=1; |
el16ooo | 0:bfd4c95124c3 | 413 | } |
el16ooo | 0:bfd4c95124c3 | 414 | else{ |
el16ooo | 0:bfd4c95124c3 | 415 | setLogFlag=0; |
el16ooo | 0:bfd4c95124c3 | 416 | } |
el16ooo | 0:bfd4c95124c3 | 417 | |
el16ooo | 0:bfd4c95124c3 | 418 | //Switch to plotter Mode through button toggle |
el16ooo | 0:bfd4c95124c3 | 419 | if(setPlotFlag==0){ |
el16ooo | 0:bfd4c95124c3 | 420 | lcd.printString(" VIEW MODE",0,1); |
el16ooo | 0:bfd4c95124c3 | 421 | }else{ |
el16ooo | 0:bfd4c95124c3 | 422 | // lcd.printString(" PLT MODE,",0,0); |
el16ooo | 0:bfd4c95124c3 | 423 | } |
el16ooo | 0:bfd4c95124c3 | 424 | } |
el16ooo | 0:bfd4c95124c3 | 425 | } |
el16ooo | 0:bfd4c95124c3 | 426 | //------------------------------------------------------------------------------ |