![](/media/cache/group/SAM_2404.JPG.50x50_q85.jpg)
The official code that runs on the FRDM board for the chlorine sensor.
Dependencies: MBed_Adafruit-GPS-Library SDFileSystem mbed GSM_Library
Fork of DCS by
Diff: Sensor.cpp
- Revision:
- 0:d7b2716c5a4f
- Child:
- 1:8614e190908b
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Sensor.cpp Fri Mar 06 22:13:58 2015 +0000 @@ -0,0 +1,219 @@ +#pragma once +#include "mbed.h" +#include "math.h" +#include "MBed_Adafruit_GPS.h" +#include "SDFileSystem.h" +#include "QAM.h" +#include "param.h" + +DigitalOut led_red(LED_RED); +Serial pc(USBTX, USBRX); +Timer t; + +/************************************************** + ** SD FILE SYSTEM ** + **************************************************/ +SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd"); +FILE *fp; + +/************************************************** + ** GPS ** + **************************************************/ +Serial * gps_Serial; + +/************************************************** + ** SENSOR INPUTS ** + **************************************************/ +AnalogIn AnLong(A0); +AnalogIn AnShort(A1); +AnalogIn AnRefLong(A2); +AnalogIn AnRefShort(A3); +Ticker sample_tick; +bool takeSample = false; +void tick(){takeSample = true;} + +/************************************************** + ** SIN OUTPUT ** + **************************************************/ +AnalogOut dac0(DAC0_OUT); +int sinRes = (int)1/(CARRIER_FREQ*TIME_CONST); +float sinWave[SIN_LENGTH] = {}; +int sinIndex = 0; + + +/************************************************** + ** QAM ** + **************************************************/ +float sLQ[SAMPLE_LENGTH] = {}; +float sLI[SAMPLE_LENGTH] = {}; +float sSQ[SAMPLE_LENGTH] = {}; +float sSI[SAMPLE_LENGTH] = {}; +float sRefLQ[SAMPLE_LENGTH] = {}; +float sRefLI[SAMPLE_LENGTH] = {}; +float sRefSQ[SAMPLE_LENGTH] = {}; +float sRefSI[SAMPLE_LENGTH] = {}; + +float Iarray[SAMPLE_LENGTH] = {}; +float Qarray[SAMPLE_LENGTH] = {}; +int sampleIndex = 0; +float I = 0; +float Q = 0; +float lon = 0; +float lonRef = 0; +float shor = 0; +float shorRef = 0; + +void buildIQ(){ + for(int i = 0; i < SAMPLE_LENGTH; i++){ + Iarray[i] = cos(2*PI*CARRIER_FREQ*i*TIME_CONST); + Qarray[i] = -sin(2*PI*CARRIER_FREQ*i*TIME_CONST); + } +} + +void create_sinWave(){ + int i = 0; + for(i = 0; i < sinRes; i++){ + sinWave[i] = 0.25 * sin(2.0*PI*i/sinRes) + 0.75; + } +} + +int main () { + + pc.baud(115200); + pc.printf("hello\r\n"); + + // GPS INITIALIZATION ////////////////////////////// + gps_Serial = new Serial(D1,D0); + Adafruit_GPS myGPS(gps_Serial); + char c; + myGPS.begin(9600); + myGPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); + myGPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); + myGPS.sendCommand(PGCMD_ANTENNA); + //////////////////////////////////////////////////// + + buildIQ(); + create_sinWave(); + + float filteredLong = 0; + float filteredShort = 0; + float filteredLongRef = 0; + float filteredShortRef = 0; + + sample_tick.attach(&tick, 0.0001); + + t.start(); + + while(1){ + + if(takeSample){ //3.46 us per loop + + takeSample = false; + dac0 = sinWave[sinIndex]; + sinIndex++; + if((sinIndex+1) > sinRes){ + sinIndex = 0; + } + + + lon = AnLong.read(); + lonRef = AnRefLong.read(); + shor = AnShort.read(); + shorRef = AnRefShort.read(); + + I = Iarray[sampleIndex]; + Q = Qarray[sampleIndex]; + sLI[sampleIndex] = lon*I; + sLQ[sampleIndex] = lon*Q; + sSI[sampleIndex] = shor*I; + sSQ[sampleIndex] = shor*Q; + sRefLI[sampleIndex] = lonRef*I; + sRefLQ[sampleIndex] = lonRef*Q; + sRefSI[sampleIndex] = shorRef*I; + sRefSQ[sampleIndex] = shorRef*Q; + + sampleIndex++; + if(sampleIndex+1 > SAMPLE_LENGTH){ + sampleIndex--; + } + } + + /* + + if(sampleIndex+2 > SAMPLE_LENGTH){ //0.50 seconds + + sampleIndex = 0; + filteredLong = QAM(sLI, sLQ, &pc); + filteredLongRef = QAM(sRefLI, sRefLQ, &pc); + filteredShort = QAM(sSI, sSQ, &pc); + filteredShortRef = QAM(sRefSI, sRefSQ, &pc); + } + + c = myGPS.read(); + if ( myGPS.newNMEAreceived() ) { + if ( !myGPS.parse(myGPS.lastNMEA()) ) { + continue; + } + } + + + if(t.read_ms()>1000){ + led_red = !led_red; + + pc.printf("Long = %f\r\n", filteredLong); + pc.printf("LongRef = %f\r\n", filteredLongRef); + pc.printf("Short = %f\r\n", filteredShort); + pc.printf("ShortRef = %f\r\n", filteredShortRef); + pc.printf("Time: %d:%d:%d \r\n", myGPS.hour, myGPS.minute, myGPS.seconds); + + + if (myGPS.fix) pc.printf("Location: %5.2f%c, %5.2f%c\r\n", myGPS.latitude, myGPS.lat, myGPS.longitude, myGPS.lon); + else pc.printf("No GPS fix\r\n"); + pc.printf("--------------------------------\r\n"); + + //fp = fopen("/sd/data.txt", "w"); + if (fp != NULL){ + + fprintf(fp, "Long = %f\r\n", filteredLong); + fprintf(fp, "LongRef = %f\r\n", filteredLongRef); + fprintf(fp, "Short = %f\r\n", filteredShort); + fprintf(fp, "ShortRef = %f\r\n", filteredShortRef); + fprintf(fp, "Time: %d:%d:%d \r\n", myGPS.hour, myGPS.minute, myGPS.seconds); + if (myGPS.fix) fprintf(fp, "Location: %5.2f%c, %5.2f%c\r\n", myGPS.latitude, myGPS.lat, myGPS.longitude, myGPS.lon); + else fprintf(fp, "No GPS fix\r\n"); + + //fclose(fp); + } + + t.reset(); + } + + + + /* + if (sampleIndex+2 > SAMPLE_LENGTH) { // 0.25 seconds + + sampleIndex = 0; + pc.printf("Time: %d:%d:%d \r\n", myGPS.hour, myGPS.minute, myGPS.seconds); + fp = fopen("/sd/data.txt", "w"); + if (fp != NULL){ + fprintf(fp,"Time: %d:%d:%d.%u \r\n", myGPS.hour, myGPS.minute, myGPS.seconds, myGPS.milliseconds); + fclose(fp); + } + + if (myGPS.fix) { + pc.printf("Location: %5.2f%c, %5.2f%c\r\n", myGPS.latitude, myGPS.lat, myGPS.longitude, myGPS.lon); + led_red = !led_red; + fp = fopen("/sd/data.txt", "w"); + if (fp != NULL){ + fprintf(fp,"Location: %5.2f%c, %5.2f%c\r\n", myGPS.latitude, myGPS.lat, myGPS.longitude, myGPS.lon); + fclose(fp); + } + }else{ + fprintf(fp,"no gps fix\r\n"); + fclose(fp); + } + } + */ + } +} \ No newline at end of file