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 Brandon Crofts

Sensor.cpp

Committer:
bjcrofts
Date:
2015-03-24
Revision:
8:6b4a6bcd7694
Parent:
1:8614e190908b
Child:
10:02e2f8400e87

File content as of revision 8:6b4a6bcd7694:

#pragma once
#include "mbed.h"
#include "math.h"
#include "MBed_Adafruit_GPS.h"
#include "SDFileSystem.h"
#include "QAM.h"
#include "param.h"
#include "GSMLibrary.h"
#include "stdlib.h"

DigitalOut led_red(LED_RED);
Serial pc(USBTX, USBRX);
Timer t;
Timer z;
bool run = 0;
Serial gsm(D1,D0);

char message[5000];
char num[10];

/**************************************************
 **          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);
    gsm.baud(115200);
    pc.printf("hello\r\n");
    
    //GSM INITIALIZATION ///////////////////////////////
    gsm_initialize();
    
    // GPS INITIALIZATION //////////////////////////////
    gps_Serial = new Serial(PTC4,PTC3); ////Serial gsm(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;
    
    void gsm_initialize();
    
    sample_tick.attach(&tick, 0.0001);
    
    t.start();
    z.start();
    
    int buffer = 0;
    
    while(1){
        
        if(takeSample  && z.read_ms()>1000){
            
            dac0 = sinWave[sinIndex];
            
            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;
            
            takeSample = false;
            
            sinIndex++;
            if((sinIndex+1) > sinRes){
                sinIndex = 0;
            }
            
            
            sampleIndex++;
            if(sampleIndex+1 > SAMPLE_LENGTH){
                sampleIndex--;
            }
            
        
        }
        
        

        if(t.read_ms()>1000){//sampleIndex+2 > SAMPLE_LENGTH){ //0.50 seconds
            
            run = 1;
            z.reset();
            sampleIndex = 0;
            
            gsm_tick();
            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(run){
            led_red = !led_red;
            run = 0;
            
            
            pc.printf("%f, ", filteredLong);
            pc.printf("%f, ", filteredLongRef);
            pc.printf("%f, ", filteredShort);
            pc.printf("%f\r\n", filteredShortRef);
            pc.printf("%f, ", filteredLong/filteredLongRef);
            pc.printf("%f\r\n", filteredShort/filteredShortRef);
            pc.printf("%d:%d:%d \r\n", myGPS.hour-6, myGPS.minute, myGPS.seconds);
            
            if (myGPS.fix) pc.printf("%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, "%f, ", filteredLong);
                fprintf(fp, "%f, ", filteredLongRef);
                fprintf(fp, "%f, ", filteredShort);
                fprintf(fp, "%f\r\n", filteredShortRef);
                fprintf(fp, "%d:%d:%d\r\n", myGPS.hour, myGPS.minute, myGPS.seconds);
                if (myGPS.fix) fprintf(fp, "%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);    
            }
            
            snprintf(num,10,"%f, ",filteredLong);
            strcat(message, num);
            snprintf(num,10,"%f, ",filteredLongRef);
            strcat(message, num);
            snprintf(num,10,"%f, ",filteredShort);
            strcat(message, num);
            snprintf(num,10,"%f = ",filteredShortRef);
            strcat(message, num);
            
            snprintf(num,10,"%d:%d:%d = ", myGPS.hour, myGPS.minute, myGPS.seconds);
            strcat(message, num);
            if (myGPS.fix){ 
                snprintf(num,10,"%5.2f%c, %5.2f%c. ", myGPS.latitude, myGPS.lat, myGPS.longitude, myGPS.lon);
                strcat(message, num);
            }
            else strcat(message, "NO_GPS_FIX. ");
            
            //pc.printf("%s\r\n", message);
            
            if(gsm_ready()){
                gsm_send_sms(message); 
                memset(message, 0, 5000);
                buffer = 0; 
            }else{
                buffer++;
                if(buffer > 12){
                    buffer = 0;
                    memset(message, 0, 5000);    
                }
            }
            
            t.reset();
        }
        
    }
}