
Ok
Dependencies: mbed_rtos_types Mutex mbed_rtos_storage mbed Semaphore
main.cpp@1:c9ef27da97b5, 2019-11-27 (annotated)
- Committer:
- daniwestside
- Date:
- Wed Nov 27 11:16:17 2019 +0000
- Branch:
- Sinthreads
- Revision:
- 1:c9ef27da97b5
- Parent:
- 0:85df64b421a8
Ok
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
daniwestside | 0:85df64b421a8 | 1 | #include "mbed.h" |
daniwestside | 0:85df64b421a8 | 2 | #include "rtos.h" |
daniwestside | 0:85df64b421a8 | 3 | #include "TCS34725.h" |
daniwestside | 0:85df64b421a8 | 4 | #include "MBed_Adafruit_GPS.h" |
daniwestside | 0:85df64b421a8 | 5 | #include "Datas.h" |
daniwestside | 0:85df64b421a8 | 6 | |
daniwestside | 0:85df64b421a8 | 7 | |
daniwestside | 0:85df64b421a8 | 8 | Serial pc(USBTX, USBRX, 115200); //115200 bauds |
daniwestside | 0:85df64b421a8 | 9 | DigitalOut ledR(PH_0);// //RGB led - red light |
daniwestside | 0:85df64b421a8 | 10 | DigitalOut ledG(PH_1); //RGB led - green light |
daniwestside | 0:85df64b421a8 | 11 | DigitalOut ledB(PB_13); //RGB led - blue light |
daniwestside | 0:85df64b421a8 | 12 | Serial gps(PA_9,PA_10);// |
daniwestside | 0:85df64b421a8 | 13 | extern AnalogIn soil_moist; //Analog soil moisture sensor |
daniwestside | 0:85df64b421a8 | 14 | extern AnalogIn light_sensor; //Analog light sensor |
daniwestside | 0:85df64b421a8 | 15 | extern I2C RGB; // RGB sensor |
daniwestside | 0:85df64b421a8 | 16 | extern DigitalOut ledColour;//Colour sensor led |
daniwestside | 0:85df64b421a8 | 17 | |
daniwestside | 0:85df64b421a8 | 18 | |
daniwestside | 0:85df64b421a8 | 19 | InterruptIn button(PB_2); // Interruption button |
daniwestside | 0:85df64b421a8 | 20 | DigitalOut myled1(LED1, PullDown); |
daniwestside | 0:85df64b421a8 | 21 | DigitalOut myled2(LED2, PullDown); |
daniwestside | 0:85df64b421a8 | 22 | DigitalOut myled3(LED3, PullDown); |
daniwestside | 0:85df64b421a8 | 23 | DigitalOut myled4(LED4, PullDown); |
daniwestside | 0:85df64b421a8 | 24 | |
daniwestside | 0:85df64b421a8 | 25 | |
daniwestside | 0:85df64b421a8 | 26 | |
daniwestside | 0:85df64b421a8 | 27 | |
daniwestside | 0:85df64b421a8 | 28 | Thread ThreadI2c(osPriorityNormal, 512); //I2c thread |
daniwestside | 0:85df64b421a8 | 29 | Thread ThreadAnalog(osPriorityNormal, 512); //Analog readings thread |
daniwestside | 0:85df64b421a8 | 30 | |
daniwestside | 0:85df64b421a8 | 31 | |
daniwestside | 0:85df64b421a8 | 32 | |
daniwestside | 0:85df64b421a8 | 33 | Ticker t;// This ticker calls the printing methods in the main thread |
daniwestside | 0:85df64b421a8 | 34 | bool normal=false; //True while in normal mode |
daniwestside | 0:85df64b421a8 | 35 | int iteration=0;// Number of iteration (from 0 to 500 in TEST mode; from 0 to 119 in NORMAL mode) |
daniwestside | 0:85df64b421a8 | 36 | int analog_timer=2000; // Timer of the analog thread (Starts in 2s: TEST mode) |
daniwestside | 0:85df64b421a8 | 37 | int I2c_timer=2000; // Timer of the I2c thread |
daniwestside | 0:85df64b421a8 | 38 | bool readData = false; // set to true when ticker t |
daniwestside | 0:85df64b421a8 | 39 | bool hour_past = false; // set to true when normal==1 & iteration==120 (an hour has past) |
daniwestside | 0:85df64b421a8 | 40 | extern uint8_t dominant_color[]; //Array that keeps count of how many times each color was dominant in the reading |
daniwestside | 0:85df64b421a8 | 41 | |
daniwestside | 0:85df64b421a8 | 42 | void read_data(void) // Ticker method |
daniwestside | 0:85df64b421a8 | 43 | { |
daniwestside | 0:85df64b421a8 | 44 | readData = true; |
daniwestside | 0:85df64b421a8 | 45 | if(iteration == 4){ |
daniwestside | 0:85df64b421a8 | 46 | if(normal==true){ |
daniwestside | 0:85df64b421a8 | 47 | hour_past = true; //An hour has past |
daniwestside | 0:85df64b421a8 | 48 | } |
daniwestside | 0:85df64b421a8 | 49 | } |
daniwestside | 0:85df64b421a8 | 50 | } |
daniwestside | 0:85df64b421a8 | 51 | //Interrupt method. Changes between TEST & NORMAL modes |
daniwestside | 0:85df64b421a8 | 52 | void switch_mode(){ |
daniwestside | 0:85df64b421a8 | 53 | if(normal==true){ |
daniwestside | 0:85df64b421a8 | 54 | t.attach(&read_data, 2.0); |
daniwestside | 0:85df64b421a8 | 55 | analog_timer=2000; |
daniwestside | 0:85df64b421a8 | 56 | I2c_timer=2000; |
daniwestside | 0:85df64b421a8 | 57 | //Cleans the array so there are no old readings from previous NORMAL mode sessions |
daniwestside | 0:85df64b421a8 | 58 | dominant_color[0]=0; |
daniwestside | 0:85df64b421a8 | 59 | dominant_color[1]=0; |
daniwestside | 0:85df64b421a8 | 60 | dominant_color[2]=0; |
daniwestside | 0:85df64b421a8 | 61 | } |
daniwestside | 0:85df64b421a8 | 62 | else{ |
daniwestside | 0:85df64b421a8 | 63 | //Changes the timing of operations |
daniwestside | 0:85df64b421a8 | 64 | t.attach(&read_data,2); |
daniwestside | 0:85df64b421a8 | 65 | analog_timer=2000; |
daniwestside | 0:85df64b421a8 | 66 | I2c_timer=2000; |
daniwestside | 0:85df64b421a8 | 67 | ledR=1; |
daniwestside | 0:85df64b421a8 | 68 | ledB=1; |
daniwestside | 0:85df64b421a8 | 69 | ledG=1; |
daniwestside | 0:85df64b421a8 | 70 | } |
daniwestside | 0:85df64b421a8 | 71 | iteration=0; //resets iteration |
daniwestside | 0:85df64b421a8 | 72 | myled1=!myled1; |
daniwestside | 0:85df64b421a8 | 73 | myled2=!myled2; |
daniwestside | 0:85df64b421a8 | 74 | normal = !normal; |
daniwestside | 0:85df64b421a8 | 75 | } |
daniwestside | 0:85df64b421a8 | 76 | |
daniwestside | 0:85df64b421a8 | 77 | |
daniwestside | 0:85df64b421a8 | 78 | extern int clear_value, green_value, red_value, blue_value; //Colour sensor values |
daniwestside | 0:85df64b421a8 | 79 | extern float temp_value, hum_value; //AnalogIn values in % |
daniwestside | 0:85df64b421a8 | 80 | extern float x,y,z;//Accelerometer values (X, Y and Z) |
daniwestside | 0:85df64b421a8 | 81 | |
daniwestside | 0:85df64b421a8 | 82 | extern float soil;//Soil moisture |
daniwestside | 0:85df64b421a8 | 83 | extern float light;//Light intensity |
daniwestside | 0:85df64b421a8 | 84 | extern char getMax(int r, int g, int b);//Method to get the colour of most intensity |
daniwestside | 0:85df64b421a8 | 85 | char c;//Latest GPS character received |
daniwestside | 0:85df64b421a8 | 86 | char colour_max; //Colour of most intensity |
daniwestside | 0:85df64b421a8 | 87 | |
daniwestside | 0:85df64b421a8 | 88 | extern void analogThread();//Method of the analog thread |
daniwestside | 0:85df64b421a8 | 89 | extern void I2cThread();//Method of the I2c thread |
daniwestside | 0:85df64b421a8 | 90 | extern void gpsParse();//Parse and print the GPS values |
daniwestside | 0:85df64b421a8 | 91 | extern void accMinMax(float a,float b, float c);//Keeps track of the minimum and maximum values of each axis of the accelerometer |
daniwestside | 0:85df64b421a8 | 92 | extern void printAccMinMax();//Prints accelerometer maximum and minumim of each axis |
daniwestside | 0:85df64b421a8 | 93 | extern void setLedColour();//Sets the colour of the RGB led to the dominant color of the latest reading |
daniwestside | 0:85df64b421a8 | 94 | extern void addDominantColor();//Keeps track of how many times every colour is dominant |
daniwestside | 0:85df64b421a8 | 95 | extern void dominantColor();//Checks the dominant (or dominants, in case of a tie) colour and prints it |
daniwestside | 0:85df64b421a8 | 96 | extern void thresshold();//Checks if the received values exceed any thresshold and sets the corresponding RGB led colour light. |
daniwestside | 0:85df64b421a8 | 97 | |
daniwestside | 0:85df64b421a8 | 98 | |
daniwestside | 0:85df64b421a8 | 99 | //Prints analog reading values |
daniwestside | 0:85df64b421a8 | 100 | void printAnalog(){ |
daniwestside | 0:85df64b421a8 | 101 | pc.printf("Soil Moisture: %.0f %% \n\rLight: %f %%\n\r", soil, light ); |
daniwestside | 0:85df64b421a8 | 102 | } |
daniwestside | 0:85df64b421a8 | 103 | //Prints RGB sensor values |
daniwestside | 0:85df64b421a8 | 104 | void printRGB(){ |
daniwestside | 0:85df64b421a8 | 105 | // Print RGB sensor readings |
daniwestside | 0:85df64b421a8 | 106 | pc.printf("Clear (%d), Red (%d), Green (%d), Blue (%d)\n\r", clear_value, red_value, green_value, blue_value); |
daniwestside | 0:85df64b421a8 | 107 | } |
daniwestside | 0:85df64b421a8 | 108 | //Prints temperature and humidity values |
daniwestside | 0:85df64b421a8 | 109 | void printTempHum(){ |
daniwestside | 0:85df64b421a8 | 110 | //print TemHum readings |
daniwestside | 0:85df64b421a8 | 111 | pc.printf("Temperature: %.0f C \n\rHumidity: %.0f %%\n\r", temp_value, hum_value); |
daniwestside | 0:85df64b421a8 | 112 | } |
daniwestside | 0:85df64b421a8 | 113 | //Prints accelerometer values |
daniwestside | 0:85df64b421a8 | 114 | void printAcc(){ |
daniwestside | 0:85df64b421a8 | 115 | pc.printf("AccX = %f AccY = %f AccZ = %f\n\r", x, y, z); |
daniwestside | 0:85df64b421a8 | 116 | } |
daniwestside | 0:85df64b421a8 | 117 | |
daniwestside | 0:85df64b421a8 | 118 | int main() |
daniwestside | 0:85df64b421a8 | 119 | { |
daniwestside | 0:85df64b421a8 | 120 | button.rise(switch_mode); |
daniwestside | 0:85df64b421a8 | 121 | //Objects of Data Class |
daniwestside | 0:85df64b421a8 | 122 | Datas hum ("Humidity"); |
daniwestside | 0:85df64b421a8 | 123 | Datas temp ("Temperature"); |
daniwestside | 0:85df64b421a8 | 124 | Datas light_v("Light"); |
daniwestside | 0:85df64b421a8 | 125 | Datas soil_m ("Soil Moisture"); |
daniwestside | 0:85df64b421a8 | 126 | //Starts in TEST mode; Turn on LED1; Timer = 2s |
daniwestside | 0:85df64b421a8 | 127 | myled1=1; |
daniwestside | 0:85df64b421a8 | 128 | myled2=0; |
daniwestside | 0:85df64b421a8 | 129 | myled3=0; |
daniwestside | 0:85df64b421a8 | 130 | myled4=0; |
daniwestside | 0:85df64b421a8 | 131 | |
daniwestside | 0:85df64b421a8 | 132 | t.attach(&read_data, 2); |
daniwestside | 0:85df64b421a8 | 133 | ThreadI2c.start(I2cThread); |
daniwestside | 0:85df64b421a8 | 134 | ThreadAnalog.start(analogThread); |
daniwestside | 0:85df64b421a8 | 135 | |
daniwestside | 0:85df64b421a8 | 136 | //Sets up the GPS |
daniwestside | 0:85df64b421a8 | 137 | Adafruit_GPS myGPS(&gps); |
daniwestside | 0:85df64b421a8 | 138 | myGPS.begin(9600); |
daniwestside | 0:85df64b421a8 | 139 | |
daniwestside | 0:85df64b421a8 | 140 | myGPS.sendCommand("$PMTK314,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0*28\r\n"); // GGCA and RMC messages ONLY |
daniwestside | 0:85df64b421a8 | 141 | wait(0.2); |
daniwestside | 0:85df64b421a8 | 142 | myGPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); //Set update rate |
daniwestside | 0:85df64b421a8 | 143 | wait(0.2); |
daniwestside | 0:85df64b421a8 | 144 | //myGPS.sendCommand(PMKT_SET_BAUD_115200); |
daniwestside | 0:85df64b421a8 | 145 | wait(0.2); |
daniwestside | 0:85df64b421a8 | 146 | myGPS.sendCommand(PGCMD_NOANTENNA); //Toggle GTOP antenna messages |
daniwestside | 0:85df64b421a8 | 147 | |
daniwestside | 0:85df64b421a8 | 148 | |
daniwestside | 0:85df64b421a8 | 149 | // Initialize color sensor |
daniwestside | 0:85df64b421a8 | 150 | |
daniwestside | 0:85df64b421a8 | 151 | // Timing register address 0x01 (0000 0001). We set 1st bit to 1 -> 1000 0001 |
daniwestside | 0:85df64b421a8 | 152 | char timing_register[2] = {0x81,0x50}; //0x50 ~ 400ms |
daniwestside | 0:85df64b421a8 | 153 | RGB.write(RGB_ADDR,timing_register,2,false); |
daniwestside | 0:85df64b421a8 | 154 | |
daniwestside | 0:85df64b421a8 | 155 | // Control register address 0x0F (0000 1111). We set 1st bit to 1 -> 1000 1111 |
daniwestside | 0:85df64b421a8 | 156 | char control_register[2] = {0x8F,0}; //{0x8F, 0x00}, {1000 1111, 0000 0000} -> 1x gain |
daniwestside | 0:85df64b421a8 | 157 | RGB.write(RGB_ADDR,control_register,2,false); |
daniwestside | 0:85df64b421a8 | 158 | |
daniwestside | 0:85df64b421a8 | 159 | // Enable register address 0x00 (0000 0000). We set 1st bit to 1 -> 1000 0000 |
daniwestside | 0:85df64b421a8 | 160 | char enable_register[2] = {0x80,0x03}; //{0x80, 0x03}, {1000 0000, 0000 0011} -> AEN = PON = 1 |
daniwestside | 0:85df64b421a8 | 161 | RGB.write(RGB_ADDR,enable_register,2,false); |
daniwestside | 0:85df64b421a8 | 162 | |
daniwestside | 0:85df64b421a8 | 163 | while(1){ |
daniwestside | 0:85df64b421a8 | 164 | if (hour_past){ //An hour has past. Corresponding values are sent to the PC |
daniwestside | 0:85df64b421a8 | 165 | hour_past=false; |
daniwestside | 0:85df64b421a8 | 166 | hum.normalizeMinMaxAvg(iteration); |
daniwestside | 0:85df64b421a8 | 167 | temp.normalizeMinMaxAvg(iteration); |
daniwestside | 0:85df64b421a8 | 168 | soil_m.normalizeMinMaxAvg(iteration); |
daniwestside | 0:85df64b421a8 | 169 | light_v.normalizeMinMaxAvg(iteration); |
daniwestside | 0:85df64b421a8 | 170 | dominantColor(); |
daniwestside | 0:85df64b421a8 | 171 | printAccMinMax(); |
daniwestside | 0:85df64b421a8 | 172 | pc.printf("\n\r\n\rHOURLY SUMMARY\n\r\n\r"); |
daniwestside | 0:85df64b421a8 | 173 | iteration=0; |
daniwestside | 0:85df64b421a8 | 174 | |
daniwestside | 0:85df64b421a8 | 175 | } |
daniwestside | 0:85df64b421a8 | 176 | |
daniwestside | 0:85df64b421a8 | 177 | |
daniwestside | 0:85df64b421a8 | 178 | |
daniwestside | 0:85df64b421a8 | 179 | |
daniwestside | 0:85df64b421a8 | 180 | if (readData){ |
daniwestside | 0:85df64b421a8 | 181 | |
daniwestside | 0:85df64b421a8 | 182 | //Obtains which one is the greatest - red, green or blue |
daniwestside | 0:85df64b421a8 | 183 | colour_max = getMax(red_value, green_value, blue_value); |
daniwestside | 0:85df64b421a8 | 184 | pc.printf("Measure # %i\n\r", iteration); |
daniwestside | 0:85df64b421a8 | 185 | |
daniwestside | 0:85df64b421a8 | 186 | //NORMAL MODE |
daniwestside | 0:85df64b421a8 | 187 | if(normal){ |
daniwestside | 0:85df64b421a8 | 188 | pc.printf("NORMAL MODE\n\r"); |
daniwestside | 0:85df64b421a8 | 189 | temp.data_set[iteration]=temp_value; |
daniwestside | 0:85df64b421a8 | 190 | hum.data_set[iteration]=hum_value; |
daniwestside | 0:85df64b421a8 | 191 | soil_m.data_set[iteration]=soil; |
daniwestside | 0:85df64b421a8 | 192 | light_v.data_set[iteration]=light; |
daniwestside | 0:85df64b421a8 | 193 | accMinMax(x,y,z); |
daniwestside | 0:85df64b421a8 | 194 | addDominantColor(); |
daniwestside | 0:85df64b421a8 | 195 | thresshold(); |
daniwestside | 0:85df64b421a8 | 196 | |
daniwestside | 0:85df64b421a8 | 197 | //TEST MODE |
daniwestside | 0:85df64b421a8 | 198 | } |
daniwestside | 0:85df64b421a8 | 199 | else{ |
daniwestside | 0:85df64b421a8 | 200 | if (iteration==500){ |
daniwestside | 0:85df64b421a8 | 201 | iteration=0; |
daniwestside | 0:85df64b421a8 | 202 | } |
daniwestside | 0:85df64b421a8 | 203 | pc.printf("TEST MODE\n\r"); |
daniwestside | 0:85df64b421a8 | 204 | |
daniwestside | 0:85df64b421a8 | 205 | setLedColour(); |
daniwestside | 0:85df64b421a8 | 206 | |
daniwestside | 0:85df64b421a8 | 207 | |
daniwestside | 0:85df64b421a8 | 208 | } |
daniwestside | 0:85df64b421a8 | 209 | |
daniwestside | 0:85df64b421a8 | 210 | |
daniwestside | 0:85df64b421a8 | 211 | |
daniwestside | 0:85df64b421a8 | 212 | |
daniwestside | 0:85df64b421a8 | 213 | |
daniwestside | 0:85df64b421a8 | 214 | //Prints RGB values |
daniwestside | 0:85df64b421a8 | 215 | printRGB(); |
daniwestside | 0:85df64b421a8 | 216 | |
daniwestside | 0:85df64b421a8 | 217 | //Prints Temp & RH values |
daniwestside | 0:85df64b421a8 | 218 | printTempHum(); |
daniwestside | 0:85df64b421a8 | 219 | |
daniwestside | 0:85df64b421a8 | 220 | //Prints Acc values |
daniwestside | 0:85df64b421a8 | 221 | printAcc(); |
daniwestside | 0:85df64b421a8 | 222 | |
daniwestside | 0:85df64b421a8 | 223 | //Prints Analog In values |
daniwestside | 0:85df64b421a8 | 224 | printAnalog(); |
daniwestside | 0:85df64b421a8 | 225 | |
daniwestside | 0:85df64b421a8 | 226 | |
daniwestside | 0:85df64b421a8 | 227 | //check if we recieved a new message from GPS, if so, attempt to parse it, |
daniwestside | 0:85df64b421a8 | 228 | if ( myGPS.newNMEAreceived() ) { |
daniwestside | 0:85df64b421a8 | 229 | if ( myGPS.parse(myGPS.lastNMEA()) ) { |
daniwestside | 0:85df64b421a8 | 230 | //Prints the time in Madrid and other location values if FIX==1 |
daniwestside | 0:85df64b421a8 | 231 | pc.printf("Time: %d:%d:%d.%u\n\r", myGPS.hour, myGPS.minute, myGPS.seconds, myGPS.milliseconds); |
daniwestside | 0:85df64b421a8 | 232 | pc.printf("Fix: %d\n\r", (int) myGPS.fix); |
daniwestside | 0:85df64b421a8 | 233 | pc.printf("Quality: %d\n\r", (int) myGPS.fixquality); |
daniwestside | 0:85df64b421a8 | 234 | |
daniwestside | 0:85df64b421a8 | 235 | if (myGPS.fix) { |
daniwestside | 0:85df64b421a8 | 236 | pc.printf("Location: %5.2f%c, %5.2f%c\n\r", myGPS.latitude, myGPS.lat, myGPS.longitude, myGPS.lon); |
daniwestside | 0:85df64b421a8 | 237 | pc.printf("Altitude: %5.2f\n\r", myGPS.altitude); |
daniwestside | 0:85df64b421a8 | 238 | pc.printf("Satellites: %d\n\r", myGPS.satellites); |
daniwestside | 0:85df64b421a8 | 239 | } |
daniwestside | 0:85df64b421a8 | 240 | } |
daniwestside | 0:85df64b421a8 | 241 | } |
daniwestside | 0:85df64b421a8 | 242 | |
daniwestside | 0:85df64b421a8 | 243 | |
daniwestside | 0:85df64b421a8 | 244 | |
daniwestside | 0:85df64b421a8 | 245 | pc.printf("\n\r\n\r"); |
daniwestside | 0:85df64b421a8 | 246 | readData= false; //resets readData until next "tick" |
daniwestside | 0:85df64b421a8 | 247 | iteration++; //increases iteratios |
daniwestside | 0:85df64b421a8 | 248 | } |
daniwestside | 0:85df64b421a8 | 249 | c = myGPS.read(); //queries the GPS |
daniwestside | 0:85df64b421a8 | 250 | |
daniwestside | 0:85df64b421a8 | 251 | |
daniwestside | 0:85df64b421a8 | 252 | |
daniwestside | 0:85df64b421a8 | 253 | |
daniwestside | 0:85df64b421a8 | 254 | |
daniwestside | 0:85df64b421a8 | 255 | |
daniwestside | 0:85df64b421a8 | 256 | |
daniwestside | 0:85df64b421a8 | 257 | } |
daniwestside | 0:85df64b421a8 | 258 | |
daniwestside | 0:85df64b421a8 | 259 | } |
daniwestside | 0:85df64b421a8 | 260 | |
daniwestside | 0:85df64b421a8 | 261 |