Ok

Dependencies:   mbed_rtos_types Mutex mbed_rtos_storage mbed Semaphore

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?

UserRevisionLine numberNew 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