![](/media/cache/profiles/de713869d1db126cff30a1fc0e990962.50x50_q85.jpg)
Wireless Gas Meter Reading System Data Logger
Diff: main.cpp
- Revision:
- 0:a67cda7c126f
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Tue Apr 17 15:54:02 2012 +0000 @@ -0,0 +1,317 @@ +#include "mbed.h" +#include "Serial.h" + + +//File Handling +#define FSNAME "msc" +#include "MSCFileSystem.h" +MSCFileSystem msc(FSNAME); + +//Gas Consumption Variable +unsigned GasCounter = 0; + +//Time Handling +struct tm TIME; +Timer TimeIn_Filter; + + +//PC Serial for DEBUG Messages +Serial pc(USBTX, USBRX); + + +//Time Update +InterruptIn TimeIn(p21);//Push Button input for Time Reset (minimum > 2V) + +//XBee Range Check +InterruptIn RangeIn(p22);//Push Button input for XBee Range Check + +//XBEE Connection +Serial xbee(p9, p10);//XBEE Dout (xbee p2) <--> mbed rx p10, XBEE Din (xbee p3) <--> mbed tx p9 +DigitalOut xbee_reset(p8);//XBEE Reset (xbee p5) <--> mbed digital out p8 +DigitalIn xbee_power(p11);//XBEE Power Indicator (xbee p13) Digital In +DigitalIn xbee_associate(p12);//XBEE Association (xbee p15) Digital In +DigitalIn xbee_CTS(p13);//XBEE pin 12 CTS High = Signal to stop data transfer over UART +DigitalOut xbee_sleep(p14);//XBEE SLEEP_RQ (p9) +//unsigned xbeeon_off = 0;//Default OFF + +//Indicators + +DigitalOut XBeePower(LED1);//User can now power off +DigitalOut XBeeAssoc(LED2);//XBee Associate +DigitalOut XBeeRange(LED2);//XBee Range Check Indication +DigitalOut CounterLog(LED3);//Counter Log Activity +DigitalOut PushButton(LED3);//Bush Button Indication +DigitalOut Time(LED4);//Time Based Activity + +//Functions + + +unsigned ClockSet();//Called at sensor input + +void TimeInterrupt();//Called at p21 high -> Clock Update Interrupt +void TimeInterrupt() {//Called at p21 high -> Clock Update Interrupt + pc.printf("/nTimeInterrupt Called\n");///////..............DEBUG + + /* if ((TimeIn_Filter.read()) == 0) { + + TimeIn_Filter.start(); + pc.printf("/nTimeInterrupt Timer Started\n");///////..............DEBUG + + PushButton = 1; + } + + while (1) { + if ((TimeIn_Filter.read() >= 2)) {//All readings within 2 sec from first call ignored as noise + + pc.printf("/nTimeInterrupt Timer >=2 \n");///////..............DEBUG + */ + while ( (ClockSet() != 1) );//Till TIME.txt is not found + + /*TimeIn_Filter.stop(); + TimeIn_Filter.reset(); + pc.printf("/nTimeInterrupt Timer Stoped\n");///////..............DEBUG + PushButton = 0; + }*/ +//} +} + + +unsigned ClockSet() { + pc.printf("\nClockSet Called\n");///////////..........DEBUG + FILE *TimeUpdate; + TimeUpdate = fopen( "/" FSNAME "/TIME.txt", "r"); + + if (TimeUpdate == NULL) {//File Not Found + pc.printf("\nERROR: TIME.txt not found\n");//////......DEBUG + + + //LED4 File not Found Indication + Time = 1; + wait(0.2); + Time = 0; + wait(0.2); + Time = 1; + wait(0.2); + Time = 0; + Time = 1; + wait(0.2); + Time = 0; + + return 0; + } else { + + //01:34->T + //01/34/67->Y + char T[10], Y[20]; + fscanf(TimeUpdate,"%s%s",T,Y); + + + char h[3] = {T[0], T[1], '\0'};//01:34->T + char mi[3] = {T[3], T[4], '\0'}; + char d[3] = {Y[0], Y[1], '\0'};//01/34/67->Y + char mo[3] = {Y[3], Y[4], '\0'}; + char y[5] = {Y[6], Y[7], Y[8], Y[9], '\0'}; + + //Converting String to int and stroing in tm structure + TIME.tm_hour = atoi(h); + TIME.tm_min = atoi(mi); + TIME.tm_mday = atoi(d); + TIME.tm_mon = atoi(mo); + TIME.tm_year = atoi(y) ; + + // Adjust for tm structure required values + TIME.tm_year = TIME.tm_year - 1900;//Number of years since 1900 (windows) + TIME.tm_mon = TIME.tm_mon - 1;//Jan + + //mbed time update + set_time(mktime(&TIME));//broket time converted to simple time and passed to set_time (sets system time) + + //LED4 Time Update Indication + Time = 1; + wait(2); + Time = 0; + + // display the time + /* + char HourMin[10], Calandar[12]; + while (1) { + time_t seconds = time(NULL);//CURRENT TIME + TIME = *localtime(&seconds);//TO BROKEN TIME + strftime(HourMin, sizeof(HourMin), "%T", &TIME);//FORMATTED OUTPUT + strftime(Calandar, sizeof(Calandar), "%d/%m/%Y", &TIME); + pc.printf("\n%s %s", HourMin, Calandar); + wait(1); + } + + */ + } + fclose(TimeUpdate);//Close File Handler + return 1;//Time Updated Successfully + +} + +void XBeeRangeCheck_Indication(unsigned status); +void XBeeRangeCheck_Indication(unsigned status) {//LED4 is Flashed (Indicating previous shut down was not safe) + if (status == 1) { + for (unsigned i=0; i<=5 ; i++) { + XBeeRange = 1; + wait(0.2); + XBeeRange = 0; + wait(0.2); + XBeeRange = 1; + wait(0.2); + XBeeRange = 0; + } + + } else { + XBeeRange = 0; + wait(4); + } +} + + + + + +unsigned Xbee_RangeCheck();//XBEE Range Check (Check for END DEVICE) +unsigned Xbee_RangeCheck() { + + char response[5]; + wait(10);//Allow Time For Communication + for (int i=1 ; i<=3 ; i++) {//Enter XBEE in AT Command Mode + xbee.putc('+'); + wait(0.05); + } + xbee.scanf("%s",response);//Get Xbee Response + //pc.printf("\n%s\n",response);//////////////...........DEBUG + + //XBEE IS IN COMMAND MODE AND OK RESPONSE IS READ + xbee.printf("ATDNREADER");//AT(AT Command Mode) DN(Destination Node Command) LOGGER(Node Identifier "NI" for END DEVICE) + xbee.putc('\r');//Carriage Return + xbee.scanf("%s",response);//Get Response + //pc.printf("\n%s\n",response);/////////////.............DEBUG + xbee.printf("ATCN"); + xbee.putc('\r'); + if (response[0] == 'E') {//Could Not Find End Device ("ERROR"\r returned) + pc.printf("\nCound not find END DEVICE\n");/////////.............DEBUG + //EndDevice_Indication(); + return 0;//Return No End Device + + } else {//End Device is Active ("OK"\r returned) + pc.printf("\nEnd Device Responded\n");/////////.............DEBUG + return 1;//Return End Device is ON + } +} + + +void RangeIn_Handler(); +void RangeIn_Handler() { + if (Xbee_RangeCheck())//Meter Reader is ON + XBeeRangeCheck_Indication(1) ;//Flash LED 2 + else//Meter Reader is OFF + XBeeRangeCheck_Indication(0);//LED2 off for 4 sec +} +void Xbee_Reset();//Reset xbee +void Xbee_Reset() { + pc.printf("\nXBee_Reset called");//////////..........DEBUG + xbee_reset = 0;//RESET + wait_ms(1); + xbee_reset = 1;//Back To Operation + wait_ms(1); +} + + +unsigned RTS(); +unsigned RTS() {//returns 1 when mbed is Clear To Send + if (xbee_CTS == 0) return 1;//mbed is Clear To Send + else return 0; +} + + + +void nocsv_indication(); +void nocsv_indication() {//Flash LED2 => NO END DEVICE + for (unsigned i=0; i<=5 ; i++) { + CounterLog = 1; + wait(0.2); + CounterLog = 0; + wait(0.2); + CounterLog = 1; + wait(0.2); + CounterLog = 0; + } +} + + +unsigned Reading_Handler();//Manage "GasCounter" Log File "GAS.csv" +unsigned Reading_Handler() { + pc.printf("\nReading_Handler called\n");///...........DEBUG + + FILE *csv; + csv = fopen( "/" FSNAME "/GAS.csv", "rb+"); + + if (csv == NULL) {//File Not Found + pc.printf("\nERROR: GAS.csv not found\n"); + + + return 0;//File not found + } + + fseek(csv,0,SEEK_END);//Move File Pointer at End of File + + char HourMin[10], Calandar[12]; + time_t seconds = time(NULL);//GET CURRENT TIME + TIME = *localtime(&seconds);//CURRENT TIME TO BROKEN TIME + + //EXCEL SUPPORTED FORMATTED OUTPUT + strftime(HourMin, sizeof(HourMin), "%T", &TIME); + strftime(Calandar, sizeof(Calandar), "%d/%m/%Y", &TIME); + + //Printing To GAS.csv + fprintf(csv,"%u,%s,%s\n",GasCounter, HourMin, Calandar); + + + fclose(csv); + return 1;//GAS.csv UPDATED +} + + +int main() { + + TimeIn.rise(&TimeInterrupt);//p21 Push Buttor (Update mbed clock) + RangeIn.rise(&RangeIn_Handler);//p22 Push Buttor (Flash LED2 if found else LED2 off for 4 s) + + ClockSet(); + // pc.printf("\nReached Here\n");//////..............DEBUG + Xbee_Reset(); + + while (1) { + //pc.printf("Entered While"); + XBeePower = xbee_power; + XBeeAssoc = xbee_associate; + if (xbee.readable()) { + if (xbee.getc() == '*') {//Next is counter value + xbee.scanf("%u", &GasCounter); + //wait(0.2); + //xbee.putc('R');//Reading Received + //xbee.putc('\r'); + //wait(0.2); + pc.printf("\n%u", GasCounter);//////////........DEBUG + if ( Reading_Handler() != 1) {//GAS.csv not updated + //ERROR INDICATION + nocsv_indication(); + } else { + //READING SUCCESSFUL LOG INDICATION + CounterLog = 1; + wait(2);//LED3 ON for 2 sec + CounterLog = 0; + + } + + // TO VIEW COMPLETE WIRELESS DATA + //pc.putc(xbee.getc()); + } + } + } + +} \ No newline at end of file