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
Diff: main.cpp
- Revision:
- 0:bfd4c95124c3
- Child:
- 1:f37cf0e5d0e8
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Wed Feb 01 21:46:00 2017 +0000 @@ -0,0 +1,426 @@ +//INTRODUCTION +/*------------------------------------------------------------------------------ +Author: Oluwole O. Oyetoke +Date: 25th November, 2016 +SUMMARY: 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 values over time on the LCD +------------------------------------------------------------------------------*/ + + + +//HEADER INCLUSION & DEFINITIONS +//------------------------------------------------------------------------------ +#include "mbed.h" //mbed header file inclusion +#include "N5110.h" //Nokia LCD Screen header file inclusion +#include <math.h> + +//Define slave address for different conditions +//ADD0 of TMP102 is connected to ground... address will be Ob1001000 = 0x48 +#define slaveAddress 0x48 +#define slaveWriteAddress 0x90 +#define slaveReadAddress 0x91 + + +/*Define needed register addresses +-------------------------------------------------------------- +| BIT FUNCTION | P7 | P6 | P5 | P4 | P3 | P2 | P1 | p0 | | +| BYTE 1 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | | +|------------------------------------------------------------| +P1 P0 REGISTER +0 0 TEMPERATURE REGISTER (Read Only) +0 1 CONFIGURATION REGISTER (Read/Write) +1 0 TLOW REGISTER (Read/Write) +1 1 THIGH REGISTER (Read/Write) +*/ +#define tempRegAddress 0x00 //0b00000000 +#define configRegAddress 0x01; //0b00000001 +#define tlowRegAddress 0x02; //0b00000010 +#define thighRegAddress 0x03; //0b00000011 +//------------------------------------------------------------------------------ + + +//PIN CONNECTION SET-UP +//------------------------------------------------------------------------------ +//Set pin connection to LCD +N5110 lcd(p7,p8,p9,p10,p11,p13,p21); + +//Set pin connection for the TMP102 +I2C tmp102(p28, p27); //p28-SDA, p27-SCL + +//Set pins for error display leds +BusOut myleds(LED1, LED2, LED3, LED4); + +//Set pins for USB connectivity +Serial pc(USBTX,USBRX); //Usually (p9,p10) for external devices + +//Set logging control pin +DigitalIn loggerSwitch(p18); +DigitalIn plotterModeButton(p16); +DigitalIn standbyButton(p17); + +//Set interrupt on pin 16 and 17 +InterruptIn plotterInterrupt(p16); +InterruptIn standbyInterrupt(p17); +//------------------------------------------------------------------------------ + + +//DEFINE NEEDED OBJECTS +//------------------------------------------------------------------------------ +Ticker tempIntervalReader, timeIntervalReader, fileWriteInterval; +//------------------------------------------------------------------------------ + + +//FUNCTION DEFINITION +//------------------------------------------------------------------------------ +void ErrorBuzzer(int code); +void initializeTMP102(); //Function used to initialize the TMP102 & configure +void readTemperature(); //Function used to read the temperature momentarily +void serialISR(); //ISR that is called when serial data is received +void setTime(); //Function to set the UNIX time +void writeDataToFile(int data); //Function for writing to file +void updateLCDTime(); //Function to update LCD Time +trigerViewChange(); //Function used to trigger view change +void plot(); +void standbyFunction(); +//------------------------------------------------------------------------------ + + + +//DEFINE GLOBAL VARIABLES +//------------------------------------------------------------------------------ +char rxString[16]; //Buffer to store received string +int setTimeFlag = 0; //Flag for ISR +int setLogFlag = 0; //Flag to control logging +int setPlotFlag = 0; //Flag to switch in and out of plot mode +int LCDStanbyFlag=0; //Flag to stanby LCD +float temperatureValue = 0; //Initial temperature value +char tempValueDispBuffer[14]; // Screen can only take 14 characters/line @ maximum +char timeValueDispBuffer[30]; // Screen can only take 14 characters/line @ maximum +char dateValueDispBuffer[30]; // Screen can only take 14 characters/line @ maximum +char datetimeValueDispBuffer[30]; // Screen can only take 14 characters/line @ maximum +LocalFileSystem local("local"); //Create Local File System +int xAxisCounter=0; +//------------------------------------------------------------------------------ + + + +//FUNCTION TO SET RTC TIME THROUGH SERIAL CONNECTION +//------------------------------------------------------------------------------ +void setTime() { + pc.printf("set_time - %s",rxString);// print time for debugging + int time = atoi(rxString); // atoi() converts a string to an integer + set_time(time); // update the time +} +//------------------------------------------------------------------------------ + +//FUNCTION TO UPDATE LCD WITH NEW TIME READING +//------------------------------------------------------------------------------ +void updateLCDTime(){ + time_t seconds = time(NULL); // Get current time + + // Format time into a string (time and date) + strftime(timeValueDispBuffer, 30 , " %X", localtime(&seconds)); +strftime(dateValueDispBuffer, 30 , " %x", localtime(&seconds)); +strftime(datetimeValueDispBuffer,30 , "%x %X", localtime(&seconds)); + + + // print time on LCD + if((setPlotFlag==0)){ + lcd.printString(dateValueDispBuffer,0,2); // Print on LCD + lcd.printString(timeValueDispBuffer,0,3); // Print on LCD + } +} +//-------------------------------------------------------------------------------- + + +//SERIAL LINK INTERRUPT SERVICE ROUTINE +//------------------------------------------------------------------------------ +void serialISR() { + // when a serial interrupt occurs, read rx string into buffer + pc.gets(rxString,16); + // set flag + setTimeFlag = 1; +} +//------------------------------------------------------------------------------ + + +// FUNCTION USED TO INITIATE LED FLASHING WHEN AN ERROR OCCURS +//------------------------------------------------------------------------------ +void ErrorBuzzer(int code) +{ + while(1) { //hang in infinite loop flashing error code + myleds = 0; //LEDs OFF + wait(0.25); //Wait for 1/4th of a second + myleds = code; //LEDs ON + wait(0.25); //Wait for 1/4th of a second + } +} +//------------------------------------------------------------------------------ + + +//FUNCTIONUSED TO SET-UP TMP102 CONFIGURATION REGISTER AS DESIRED +//------------------------------------------------------------------------------ +void initializeTMP102(){ + + //Set bus speed to 400kHz + tmp102.frequency(400000); + + int acknowledgement = 1; //Initialized to false + + /* + Configure the 16 bits register structure of the configuration register +-------------------------------------------------------------- +| BIT FUNCTION | OS | R1 | R0 | F1 | F0 | POL | TM | SD | | +| BYTE 1 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | | +|------------------------------------------------------------| +| BIT FUNCTION | CR1 | CR0 | AL | EM | 0 | 0 | 0 | 0 | | +| BYTE 2 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | | | +-------------------------------------------------------------- + BIT FUNTION EXPLANTION + OS (ONE-SHOT): 0 --> not in use + R1, R2 (RESOLUTION): 1, 1 --> Sets the temperature register to 12 bits + F1, F0 (FALUT QUE): 1,1 --> 6 consecutive faults before alert is triggered + POL (POLARITY): 0 --> Alert pin will be active low + TM (THERMOSTAT MODE): 0 --> Comparator mode activated + SD (SHUTDOWN MODE): 0 --> Continious conversion. No intermitent shutdown + CR1, CR0 (CONV. RES.): 0, 1 --> 1Hz, 1 conversion per second + AL (ALERT): 1 --> Read only + only takes the opposite vaue of POL + EM (EXTENDED MODE): 0 --> Normal Mode. Sets TREG,THIGH,TLOW reg. to 12 bts + */ + char byteOne = 0x70; //0b01111000 + char byteTwo = 0x60; //0b01100000 + + +//Initiate contact with slave, specify desired register and the data to write. +//Package contains address and the data to write + char configPackage[3]; + configPackage[0] = configRegAddress; + configPackage[1] = byteOne; + configPackage[2] = byteTwo; + acknowledgement = tmp102.write(slaveWriteAddress, configPackage, 3); + if(acknowledgement==1){ //I2C always returns 0 for successful operation + ErrorBuzzer(1); //Error Message + } + } +//------------------------------------------------------------------------------ + + + + + +//Temperature Reader Function +//------------------------------------------------------------------------------ +void readTemperature(){ + int acknowledgement=1; //Initialized to 1 + char tempRegisterData[2]; + int temperature = 0; + //Inititate contact with slave by trying to write to its temp register + //Temp register is a read only register, so it will not happen + acknowledgement = tmp102.write(slaveWriteAddress,tempRegAddress,1); + if(acknowledgement==1){ //I2C always returns 0 for successful operation + ErrorBuzzer(2); //Error Message + } + //Try to read from temperature register + acknowledgement = tmp102.read(slaveReadAddress,tempRegisterData,2); + if(acknowledgement==1){ //I2C always returns 0 for successful operation + ErrorBuzzer(3); //Error Message + } + + temperature = (tempRegisterData[0] << 4) | (tempRegisterData[1] >> 4); + temperatureValue = temperature*0.0625; + if(setPlotFlag==1){ + plot(); + } +//return temperature*0.0625; + //float tmp = (float((tempRegisterData[0]<<8)|tempRegisterData[1]) / 256.0); + } +//------------------------------------------------------------------------------ + + +//FUNCTION FOR WRITING TO FILE +//------------------------------------------------------------------------------ +void writeDataToFile() +{ + if(setLogFlag==1){ //Only record if logging is turned ON + myleds = 15; // turn on LEDs for feedback + FILE *fp = fopen("/local/templog.csv", "a"); // open 'templog.txt' for appending + // if the file doesn't exist it is created, if it exists, data is appended to the end + fprintf(fp,"%s, %.2f \n",datetimeValueDispBuffer, temperatureValue ); // print string to file + fclose(fp); // close file + myleds = 0; // turn off LEDs to signify file access has finished + } +} +//------------------------------------------------------------------------------ + + +//INTERRUPT FUNCTION FOR DETECTING PLOT vs WRITE MODE +//------------------------------------------------------------------------------ +void trigerViewChange() { + if(setPlotFlag==0){ + setPlotFlag=1; + lcd.clear(); + for(int i=0; i<=83; i++){ + lcd.setPixel(i,45); + } + + for(int i=0; i<=47; i++){ + + lcd.setPixel(2,i); + } + } + else if(setPlotFlag==1){ + setPlotFlag = 0; + lcd.clear(); + lcd.printString(" TEMP. LOGGER!",0,0); //Print Welcome Message + } + +} +//------------------------------------------------------------------------------ + + +//FUNCTION FOR PLOTTING TEMPERATURE VALUE ON LCD +//------------------------------------------------------------------------------ +void plot(){ + //Note that 0,0 of the LCD starts from thr top left hand corner + //Pixels are addressed in the range of 0 to 47 (y) and 0 to 83 (x). + int tempIntegerValue=8; + //Plot only tempertures between 0 and 47 degree celcious + tempIntegerValue = floor(temperatureValue); + //Note that 0,0 of the LCD starts from thr top left hand corner + int rightYPosition=0; + + + if (setPlotFlag==1){ + if((tempIntegerValue<47) && (xAxisCounter<=83) ){ + rightYPosition = 47-tempIntegerValue; + lcd.setPixel(xAxisCounter, rightYPosition); + lcd.refresh(); + xAxisCounter++; + sprintf(tempValueDispBuffer,"Now %.2f C",temperatureValue); + lcd.printString(tempValueDispBuffer,0,0); // Print on LCD + }else if(xAxisCounter>83){ + lcd.clear(); + lcd.refresh(); + xAxisCounter=0; + rightYPosition = 47-tempIntegerValue; + lcd.setPixel(xAxisCounter, rightYPosition); + lcd.refresh(); + } + else{ + xAxisCounter=0; + + } + } + + } +//------------------------------------------------------------------------------ + + +//STANDBY AND WAKE FUNCTION +//------------------------------------------------------------------------------ + void standbyFunction(){ + if(LCDStanbyFlag==0){ + lcd.turnOff(); + LCDStanbyFlag = 1; + } + else if (LCDStanbyFlag==1){ + lcd.turnOn(); + lcd.init(); //Initialize LCD + if((setPlotFlag==0)){ + lcd.printString(" TEMP. LOGGER!",0,0); //Print Welcome Message + }else{ + // lcd.printString(" PLT MODE,",0,0); + } + LCDStanbyFlag = 0; + } + + } +//------------------------------------------------------------------------------ + + +//MAIN FUNCTION +//------------------------------------------------------------------------------ +int main() { + + //Initialize temperature display lengths + int tempDispLength=0; + + plotterModeButton.mode(PullUp); + standbyButton.mode(PullUp); + + lcd.init(); //Initialize LCD + if((setPlotFlag==0)){ + lcd.printString(" TEMP. LOGGER!",0,0); //Print Welcome Message + } + + initializeTMP102(); //Initialize Temperature Sensor + + + // Attach serialISR function to the ISR and set serial baud rate + pc.attach(&serialISR); + pc.baud(9600); + + + //Attach readTemperature function to the ticker. + //Schedule to interrup every 60 seconds + readTemperature(); + tempIntervalReader.attach(&readTemperature, 2.0); + + //Attach write to file operation to a 60 seconds ticker + fileWriteInterval.attach(&writeDataToFile, 2.0); + + //Attach updateLCDTime function to the ticker. + //Schedule to interrupt and update LCDTime every 1 second + timeIntervalReader.attach(&updateLCDTime, 1.0); + + //Attach interrupt to button on p16 to trigger view change to and from plotter + plotterInterrupt.fall(&trigerViewChange); + + //Attach standby function to interrupt on button p17 + standbyInterrupt.fall(&standbyFunction); + + //Value '0' will initialise time to 1st January 1970 + //set_time(1480958460); //Uncomment after RTC clock value has been set + + //Continue spining this loop, however, every + // 60 seconds, the ticker will be called and the time updated ever 1s + while(1) { + if((setLogFlag==0) && (setPlotFlag==0)){ + lcd.printString(" LOGGING OFF ",0,5); + } + else if((setLogFlag==1) && (setPlotFlag==0)){ + lcd.printString(" LOGGING ON ",0, 5); + } + + //Display Current Temperature Reading + // print formatted data to buffer + tempDispLength = sprintf(tempValueDispBuffer," T = %.2f C",temperatureValue); + if ((tempDispLength <= 14) && (setPlotFlag==0)) { + lcd.printString(tempValueDispBuffer,0,4); // Print on LCD + } + + //If updated time has been sent through serial + if (setTimeFlag==1) { + setTimeFlag = 0; // clear set time flag + setTime(); // Call update time function + } + + //Check if Logging is ON + if(loggerSwitch){ + setLogFlag=1; + } + else{ + setLogFlag=0; + } + + //Switch to plotter Mode through button toggle + if(setPlotFlag==0){ + lcd.printString(" VIEW MODE",0,1); + }else{ + // lcd.printString(" PLT MODE,",0,0); + } + } +} +//------------------------------------------------------------------------------ \ No newline at end of file