This program is for mbed-Geiger counter system. It use OLED module, GPS module (with RTC), TextLCD, SD FileSystem and some Interrupt pin.
Diff: main.cpp
- Revision:
- 0:97f8ed953c0d
diff -r 000000000000 -r 97f8ed953c0d main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sat Jul 02 22:05:27 2011 +0000 @@ -0,0 +1,399 @@ +// MARMEX OLED and GPS test program +// Author : Yuji Notsu +// Date : 14-Jun-2011 +// Revision : 0.0 + +/** A sample app of MARMEX_OB OLED screen drawing library + * + * @author Tedd + * @version 0.51 + * @date 08-Apr-2011 + * + * Released under the MIT License: http://mbed.org/license/mit + * + * MARMEX_OB_oled OLED screen drawing library for mbed + * This code has been written based on sample code and advises + * from Ochiai-san (Marutsu-Elec). Thank you! + * + * To build this code, "NokiaLCD" and "mbed" libraries are needed to be imported in a project. + * NokiaLCD library : http://mbed.org/users/simon/libraries/NokiaLCD/ + */ + + +#include "mbed.h" +#include "MARMEX_OB_oled.h" +#include "imagedata.h" +#include "gpsrtc.h" +#include "TextLCD.h" +#include "SDFileSystem.h" +#include "PowerControl/EthernetPowerControl.h" + +// oled1 is for MARMEX_OB_oled board on MAPLE slot 1 +MARMEX_OB_oled oled1( p5, p7, p8, p30, p11 ); // mosi, sclk, cs, rst, power_control + +TextLCD lcd(p25,p24,p12,p13,p14,p23); //rs,e,d0-d3 + +SDFileSystem sd(p5, p6, p7, p20, "sd"); // the pinout on the mbed Cool Components workshop board +Serial pc(USBTX, USBRX); // tx, rx + +InterruptIn sendpcmode(p16); +InterruptIn oledmode(p17); + +//AnalogIn ain(p19); +InterruptIn ain(p18); +DigitalOut led(LED3); + +float sdata; +char pcmodevalue; +char oledmodevalue; +char graphnum=0; +float graph[16]; +int c1,c2,c3,c4,c5,c6; +char c1en,c2en,c3en,c4en,c5en,c6en; +float maxdata; + +void oled_image2(const unsigned int *ptr2); + +void changepcmode() +{ + pcmodevalue=!pcmodevalue; +} + +void changeoledmode() +{ + oledmodevalue=!oledmodevalue; +} + +void count_geiger() +{ + led=1; + if(c1en==1) c1++; + if(c2en==1) c2++; + if(c3en==1) c3++; + if(c4en==1) c4++; + if(c5en==1) c5++; + if(c6en==1) c6++; + led=0; + } + +void setup_pinmode() +{ + //p25 lowlevel = write mode? + sendpcmode.mode(PullUp); + sendpcmode.rise(&changepcmode); +} + +void setup_pinmode2() +{ + oledmode.mode(PullUp); + oledmode.rise(&changeoledmode); + for(int i=0;i<=15;i++) + { + graph[i]=0.0; + } +} + +void setup_pinmode3() +{ + ain.mode(PullNone); + ain.rise(&count_geiger); +} + + +int main() { + + // Initialize RTC + // + // Init_RTC(1, 11, 05, 31, TUE, 00, 55, 00); // with adjustment + //wait(1.0); + // Init_RTC(0, 00, 00, 00, 000, 00, 00, 00); // without adjustment + // + + PHY_PowerDown(); + + pcmodevalue=0x00; + oledmodevalue=0x00; + graphnum=0; + lcd.cls(); + lcd.locate(0,0); + lcd.printf("Startup"); + pc.printf("Startup\n"); + sdata=0.0; + + //Start up window (texe base) + oled1.background( 0x000000 ); + oled1.cls(); + oled1.locate(0,1); + oled1.printf("Takoruka OS"); + oled1.locate(0,2); + oled1.printf("starting."); + wait(1.0); + oled1.printf("."); + wait(1.0); + oled1.printf("."); + wait(1.0); + oled1.printf("."); + wait(1.0); + oled1.locate(0,3); + oled1.printf("done!"); + + c1=0; + c2=0; + c3=0; + c4=0; + c5=0; + c6=0; + //setup_pinmode(); + //setup_pinmode2(); + //setup_pinmode3(); + + //display Imade data of imagedata.h + wait(1.0); + oled1.cls(); + oled1.locate(0,0); + oled_image2(Header1); + + wait(1.0); + oled1.cls(); + + lcd.cls(); + lcd.locate(0,0); + lcd.printf("GPS Data reading"); + pc.printf("GPS data reading\n"); + sGPSRTC sGPSRTC_Data; + sGPSRTC *psGPSRTC_Data; + + int count = 0; + c1en=1; + c2en=0; + c3en=0; + c4en=0; + c5en=0; + c6en=0; + setup_pinmode(); + setup_pinmode2(); + setup_pinmode3(); + + while(1) + { + //Get GPSRTC data and display + Get_GPGGA_Data(&sGPSRTC_Data); + Get_RTC_Data(&sGPSRTC_Data); + psGPSRTC_Data = &sGPSRTC_Data; + //Get sensor value + //sdata = ain.read(); + + //oled1.cls(); + + if(oledmodevalue==0x01) + { + oled1.cls(); + oled1.locate(0,1); + oled1.foreground(0xff00ff); + oled1.printf("RTC"); + oled1.locate(0,2); + oled1.foreground(0x00ffff); + oled1.printf("%02d/%02d/%02d(%s)", + psGPSRTC_Data->bRTC_year, psGPSRTC_Data->bRTC_mon, psGPSRTC_Data->bRTC_day, + Get_Week_String(psGPSRTC_Data->bRTC_week)); + oled1.locate(0,3); + oled1.printf("%02d:%02d:%02d", + psGPSRTC_Data->bRTC_hour, psGPSRTC_Data->bRTC_min, psGPSRTC_Data->bRTC_sec); + oled1.locate(0,4); + oled1.foreground(0xff0000);//Red + oled1.printf("----------"); + oled1.foreground(0x00ffff); //Cyan + oled1.foreground(0xff00ff); + oled1.locate(0,5); + oled1.printf("GPS"); + oled1.foreground(0xffff00); //Yellow + oled1.locate(0,6); + oled1.printf("UTC ="); + oled1.printf("%02d:%02d:%02d", + psGPSRTC_Data->bGPS_UTC_hour, psGPSRTC_Data->bGPS_UTC_min, psGPSRTC_Data->bGPS_UTC_sec); + oled1.locate(0,7); + //oled1.foreground(0x00ffff); //Cyan + oled1.printf("LAT ="); + oled1.printf("%c %02d:%02d:%02d", psGPSRTC_Data->cGPS_LAT, + psGPSRTC_Data->bGPS_LAT_deg, psGPSRTC_Data->bGPS_LAT_min, psGPSRTC_Data->bGPS_LAT_sec); + oled1.foreground(0xffff00); //Yellow + oled1.locate(0,8); + oled1.printf("LNG ="); + oled1.printf("%c%03d:%02d:%02d", psGPSRTC_Data->cGPS_LNG, + psGPSRTC_Data->bGPS_LNG_deg, psGPSRTC_Data->bGPS_LNG_min, psGPSRTC_Data->bGPS_LNG_sec); + oled1.locate(0,9); + oled1.printf("Qual="); + oled1.printf("%c ", psGPSRTC_Data->cGPS_Quality); + oled1.locate(0,10); + oled1.foreground(0x00ffff); //Cyan + oled1.printf("Sat ="); + oled1.printf("%3d ", psGPSRTC_Data->bGPS_Sat); + oled1.locate(0,11); + oled1.printf("HDOP="); + oled1.printf("%1d.%1d ", psGPSRTC_Data-> bGPS_HDOP_I, psGPSRTC_Data->bGPS_HDOP_D); + oled1.locate(0,12); + oled1.printf("ASL ="); + oled1.printf("%4dm", psGPSRTC_Data->wGPS_ASL_m); + oled1.locate(0,13); + oled1.printf("GEO ="); + oled1.printf("%4dm", psGPSRTC_Data->wGPS_GEO_m); + } + else //display sensor value (update 10sec) + { + + switch(count) + { + case 0: + c1en=0; + sdata=c1; + c1=0; + c1en=1; + break; + case 10: + c2en=0; + sdata=c2; + c2=0; + c2en=1; + break; + case 20: + c3en=0; + sdata=c3; + c3=0; + c3en=1; + break; + case 30: + c4en=0; + sdata=c4; + c4=0; + c4en=1; + break; + case 40: + c5en=0; + sdata=c5; + c5=0; + c5en=1; + break; + case 50: + c6en=0; + sdata=c6; + c6=0; + c6en=1; + break; + default: + sdata=sdata; + break; + } + if(sdata>maxdata) maxdata=sdata; + if((count%10)==1) + { + oled1.cls(); + float mSvh = float(sdata)/633.0; + graphnum++; + if(graphnum==16) graphnum=0; + graph[graphnum]=sdata; + + for(int i=0;i<=15;i++) + { + int width = int(graph[i]/10); + if(i!=graphnum) + oled1.fill(i*8,28+(100-width),7,width,0xffff00); + else + oled1.fill(i*8,28+(100-width),7,width,0xff00ff); + } + oled1.locate(0,1); + oled1.foreground(0xff00ff); //Magenta + oled1.printf("Sensor value"); + oled1.locate(0,2); + oled1.foreground(0x00ffff); //Cyan + oled1.printf("%4.1f max:%4.1f",sdata,maxdata); + oled1.locate(0,3); + oled1.printf("%7.4f [uSv/h]",mSvh); + } + } + + count ++; + + if((count%10)==1) + { + FILE *fp=fopen("/sd/datalog.csv","a"); + if(fp==NULL) + { + error("Could not open file for write\n"); + } + fprintf(fp,"UTC ,"); + fprintf(fp,"%02d:%02d:%02d ,", + psGPSRTC_Data->bRTC_hour, psGPSRTC_Data->bRTC_min, psGPSRTC_Data->bRTC_sec); + fprintf(fp,"LAT ,"); + fprintf(fp,"%c,%02d:%02d:%02d ,", psGPSRTC_Data->cGPS_LAT, + psGPSRTC_Data->bGPS_LAT_deg, psGPSRTC_Data->bGPS_LAT_min, psGPSRTC_Data->bGPS_LAT_sec); + fprintf(fp,"LNG ,"); + fprintf(fp,"%c, %03d:%02d:%02d ,", psGPSRTC_Data->cGPS_LNG, + psGPSRTC_Data->bGPS_LNG_deg, psGPSRTC_Data->bGPS_LNG_min, psGPSRTC_Data->bGPS_LNG_sec); + fprintf(fp,"Count,%4.2f \n",sdata); + fclose(fp); + } + //Serial PC communication + if(pcmodevalue==0x00) + { + pc.printf("UTC,"); + pc.printf("%02d:%02d:%02d ,", + psGPSRTC_Data->bRTC_hour, psGPSRTC_Data->bRTC_min, psGPSRTC_Data->bRTC_sec); + pc.printf("LAT,"); + pc.printf("%c,%02d:%02d:%02d ,", psGPSRTC_Data->cGPS_LAT, + psGPSRTC_Data->bGPS_LAT_deg, psGPSRTC_Data->bGPS_LAT_min, psGPSRTC_Data->bGPS_LAT_sec); + pc.printf("LNG,"); + pc.printf("%c, %03d:%02d:%02d ,", psGPSRTC_Data->cGPS_LNG, + psGPSRTC_Data->bGPS_LNG_deg, psGPSRTC_Data->bGPS_LNG_min, psGPSRTC_Data->bGPS_LNG_sec); + } + if(count==60) count=0; + + wait(0.3); + + if((psGPSRTC_Data->bGPS_Sat)<=3) + { + lcd.cls(); + lcd.locate(0,0); + lcd.printf("Can't read GPS"); + } + else + { + lcd.cls(); + lcd.locate(0,0); + lcd.printf("GPS data reading"); + } + + lcd.locate(0,1); + lcd.printf("Count=%4.1f",sdata); + if(pcmodevalue==0x00) + pc.printf("Count=%4.1f\n",sdata); + + } + + +} + +void oled_image2(const unsigned int *ptr2) +{ + short height,width; + int colour; + height = *ptr2; + ptr2++; + width = *ptr2; + ptr2++; + oled1.locate(0,0); + for(int i=1;i<=width;i++) + { + for(int j=1;j<=height;j++) + { + colour = (((*ptr2&0xF800)<<8) | ((*ptr2&0x07E0)<<5) | ((*ptr2&0x001F)<<3)); + oled1.pixel(j,i,colour); + ptr2++; + } + } +} + +/* + * history: + * 0.5 (2011-Apr-07) : initial published version + * 0.51 (2011-Apr-08) : minor modification to make the source more consistent (use " MARMEX_OB_oled::HEIGHT" instead of 128) + */