Volckens Group Sensors / Mbed 2 deprecated CEAMS_Sun_Tracker

Dependencies:   ADS1115 BME280 LSM9DS1 CAM_M8 DRV8834 SunPosition mbed

Committer:
eawendtjr
Date:
Fri Jan 05 20:28:39 2018 +0000
Revision:
3:ace08723f2c5
Parent:
2:c7c09a91f1bf
Child:
4:d9f77ff43ca1
Added in solar calculations

Who changed what in which revision?

UserRevisionLine numberNew contents of line
eawendtjr 2:c7c09a91f1bf 1 //----------------------------------------------------------------------------//
eawendtjr 0:404f32e080f9 2 // SOLAR TRACKER FIRMWARE
eawendtjr 0:404f32e080f9 3 //----------------------------------------------------------------------------//
eawendtjr 0:404f32e080f9 4 #include "mbed.h"
eawendtjr 0:404f32e080f9 5 #include "Adafruit_ADS1015.h"
eawendtjr 0:404f32e080f9 6 #include "LSM9DS1.h"
eawendtjr 0:404f32e080f9 7 #include "BME280.h"
eawendtjr 1:ed3bb7921b0e 8 #include "SunPosition.h"
eawendtjr 1:ed3bb7921b0e 9 #include "CAM_M8.h"
eawendtjr 0:404f32e080f9 10
eawendtjr 0:404f32e080f9 11 #define PI 3.1415926535897932384626433832795028841971
eawendtjr 0:404f32e080f9 12
eawendtjr 0:404f32e080f9 13 /////////////////////////////////////////////
eawendtjr 0:404f32e080f9 14 //Serial and I2C objects
eawendtjr 0:404f32e080f9 15 /////////////////////////////////////////////
eawendtjr 0:404f32e080f9 16 I2C i2c(PB_9, PB_8);//(D14, D15); SDA,SCL
eawendtjr 0:404f32e080f9 17 Serial pc(USBTX, USBRX);
eawendtjr 0:404f32e080f9 18
eawendtjr 0:404f32e080f9 19 /////////////////////////////////////////////
eawendtjr 0:404f32e080f9 20 //Accelerometer
eawendtjr 0:404f32e080f9 21 /////////////////////////////////////////////
eawendtjr 0:404f32e080f9 22 // Object
eawendtjr 0:404f32e080f9 23 LSM9DS1 lol(PB_9, PB_8, 0xD6, 0x3C);
eawendtjr 0:404f32e080f9 24
eawendtjr 0:404f32e080f9 25 // Variables
eawendtjr 0:404f32e080f9 26 float roll;
eawendtjr 0:404f32e080f9 27 float pitch;
eawendtjr 0:404f32e080f9 28 float heading;
eawendtjr 0:404f32e080f9 29
eawendtjr 0:404f32e080f9 30 /////////////////////////////////////////////
eawendtjr 0:404f32e080f9 31 //Temperature and Pressure
eawendtjr 0:404f32e080f9 32 /////////////////////////////////////////////
eawendtjr 0:404f32e080f9 33 // Object
eawendtjr 0:404f32e080f9 34 BME280 bme(PB_9, PB_8, 0xEE);
eawendtjr 0:404f32e080f9 35
eawendtjr 0:404f32e080f9 36 //Variables
eawendtjr 0:404f32e080f9 37 float bme_press;
eawendtjr 0:404f32e080f9 38 float bme_temp;
eawendtjr 0:404f32e080f9 39 float bme_rh;
eawendtjr 0:404f32e080f9 40
eawendtjr 0:404f32e080f9 41 /////////////////////////////////////////////
eawendtjr 0:404f32e080f9 42 //Quad Sensor
eawendtjr 0:404f32e080f9 43 /////////////////////////////////////////////
eawendtjr 0:404f32e080f9 44 // Object
eawendtjr 0:404f32e080f9 45 Adafruit_ADS1115 ads_quad(&i2c, ADS1015_ADDRESS_GND);
eawendtjr 0:404f32e080f9 46
eawendtjr 0:404f32e080f9 47 // Variables
eawendtjr 0:404f32e080f9 48 const float quad_c = 0.125;
eawendtjr 0:404f32e080f9 49 float vph1;
eawendtjr 0:404f32e080f9 50 float vph1_raw;
eawendtjr 0:404f32e080f9 51 float vph2;
eawendtjr 0:404f32e080f9 52 float vph2_raw;
eawendtjr 0:404f32e080f9 53 float vph3;
eawendtjr 0:404f32e080f9 54 float vph3_raw;
eawendtjr 0:404f32e080f9 55 float vph4;
eawendtjr 0:404f32e080f9 56 float vph4_raw;
eawendtjr 0:404f32e080f9 57 float x1, x2, y1, y2;
eawendtjr 0:404f32e080f9 58 float fy, fx;
eawendtjr 0:404f32e080f9 59 float quad_x, quad_y;
eawendtjr 0:404f32e080f9 60
eawendtjr 0:404f32e080f9 61 /////////////////////////////////////////////
eawendtjr 1:ed3bb7921b0e 62 //GPS
eawendtjr 0:404f32e080f9 63 /////////////////////////////////////////////
eawendtjr 1:ed3bb7921b0e 64 // Object
eawendtjr 1:ed3bb7921b0e 65 CAM_M8 gps(PB_9, PB_8,(0x84));
eawendtjr 1:ed3bb7921b0e 66
eawendtjr 1:ed3bb7921b0e 67 // Variables
eawendtjr 1:ed3bb7921b0e 68 bool gpsReady = 0;
eawendtjr 1:ed3bb7921b0e 69 uint8_t gpsquality = 0;
eawendtjr 1:ed3bb7921b0e 70 uint8_t gpssatellites = 0;
eawendtjr 1:ed3bb7921b0e 71 double gpsspeed = 0.0;
eawendtjr 1:ed3bb7921b0e 72 //double gpscourse = 0.0;
eawendtjr 1:ed3bb7921b0e 73 double gpslatitude = 0.0;
eawendtjr 1:ed3bb7921b0e 74 double gpslongitude = 0.0;
eawendtjr 1:ed3bb7921b0e 75 float gpsaltitude = 0.0;
eawendtjr 1:ed3bb7921b0e 76 long gpsTime;
eawendtjr 1:ed3bb7921b0e 77 long gpsDate;
eawendtjr 1:ed3bb7921b0e 78 int gps_year;
eawendtjr 1:ed3bb7921b0e 79 int gps_month;
eawendtjr 1:ed3bb7921b0e 80 int gps_day;
eawendtjr 1:ed3bb7921b0e 81 int gps_hour;
eawendtjr 1:ed3bb7921b0e 82 int gps_minute;
eawendtjr 1:ed3bb7921b0e 83 double gps_second;
eawendtjr 1:ed3bb7921b0e 84
eawendtjr 1:ed3bb7921b0e 85 /////////////////////////////////////////////
eawendtjr 1:ed3bb7921b0e 86 //Sun Position
eawendtjr 1:ed3bb7921b0e 87 /////////////////////////////////////////////
eawendtjr 1:ed3bb7921b0e 88 // Object
eawendtjr 1:ed3bb7921b0e 89 SunPosition sun;
eawendtjr 1:ed3bb7921b0e 90
eawendtjr 1:ed3bb7921b0e 91 //Variables
eawendtjr 1:ed3bb7921b0e 92 double zenith;
eawendtjr 1:ed3bb7921b0e 93 double azimuth;
eawendtjr 1:ed3bb7921b0e 94 double radius;
eawendtjr 1:ed3bb7921b0e 95 double r;
eawendtjr 1:ed3bb7921b0e 96 const double time_zone = 0; //GPS gets Greenwich time
eawendtjr 1:ed3bb7921b0e 97 const double delta_t = 68; //This parameter will be roughly constant this year
eawendtjr 1:ed3bb7921b0e 98 const double slope = 30;
eawendtjr 1:ed3bb7921b0e 99 const double azm_rotation = 10;
eawendtjr 0:404f32e080f9 100
eawendtjr 0:404f32e080f9 101 //----------------------------------------------------------------------------//
eawendtjr 0:404f32e080f9 102 // MAIN FUNCTION
eawendtjr 0:404f32e080f9 103 //----------------------------------------------------------------------------//
eawendtjr 0:404f32e080f9 104
eawendtjr 0:404f32e080f9 105
eawendtjr 0:404f32e080f9 106 int main()
eawendtjr 0:404f32e080f9 107 {
eawendtjr 0:404f32e080f9 108 // Set baud for UPAS to PC
eawendtjr 0:404f32e080f9 109 pc.baud(115200);
eawendtjr 0:404f32e080f9 110
eawendtjr 0:404f32e080f9 111 // Check the accelerometer
eawendtjr 0:404f32e080f9 112 lol.begin();
eawendtjr 0:404f32e080f9 113 if (!lol.begin()) {
eawendtjr 0:404f32e080f9 114 pc.printf("Failed to communicate with LSM9DS1.\n");
eawendtjr 0:404f32e080f9 115 }
eawendtjr 0:404f32e080f9 116
eawendtjr 0:404f32e080f9 117 while(1)
eawendtjr 0:404f32e080f9 118 {
eawendtjr 0:404f32e080f9 119 lol.readTemp();
eawendtjr 0:404f32e080f9 120 lol.readMag();
eawendtjr 0:404f32e080f9 121 lol.readGyro();
eawendtjr 0:404f32e080f9 122
eawendtjr 0:404f32e080f9 123 lol.getAngles();
eawendtjr 0:404f32e080f9 124 roll = lol.roll;
eawendtjr 0:404f32e080f9 125 pitch = lol.pitch;
eawendtjr 0:404f32e080f9 126 heading = lol.heading;
eawendtjr 0:404f32e080f9 127
eawendtjr 0:404f32e080f9 128 // Check the pressure and temperature sensor
eawendtjr 0:404f32e080f9 129 bme_temp = bme.getTemperature();
eawendtjr 0:404f32e080f9 130 bme_press = bme.getPressure(bme_temp);
eawendtjr 0:404f32e080f9 131 bme_rh = bme.getHumidity();
eawendtjr 0:404f32e080f9 132
eawendtjr 0:404f32e080f9 133 // Chech the quad sensor
eawendtjr 0:404f32e080f9 134 vph4_raw = (double)ads_quad.readADC_SingleEnded(A3_GAIN_ONE); //Channel A3 | 1x gain | +/-4.096V | 1 bit = 2mV | 0.125mV
eawendtjr 0:404f32e080f9 135 vph4 = (vph4_raw*0.125)/(1000); //Converts to a voltage
eawendtjr 0:404f32e080f9 136
eawendtjr 0:404f32e080f9 137 vph2_raw = (double)ads_quad.readADC_SingleEnded(A2_GAIN_ONE); //Channel A2 | 1x gain | +/-4.096V | 1 bit = 2mV | 0.125mV
eawendtjr 0:404f32e080f9 138 vph2 = (vph2_raw*0.125)/(1000); //Converts to a voltage
eawendtjr 0:404f32e080f9 139
eawendtjr 0:404f32e080f9 140 vph3_raw = (double)ads_quad.readADC_SingleEnded(A1_GAIN_ONE); //Channel A1 | 1x gain | +/-4.096V | 1 bit = 2mV | 0.125mV
eawendtjr 0:404f32e080f9 141 vph3 = (vph3_raw*0.125)/(1000); //Converts to a voltage
eawendtjr 0:404f32e080f9 142
eawendtjr 0:404f32e080f9 143 vph1_raw = (double)ads_quad.readADC_SingleEnded(A0_GAIN_ONE); //Channel A1 | 1x gain | +/-4.096V | 1 bit = 2mV | 0.125mV
eawendtjr 0:404f32e080f9 144 vph1 = (vph1_raw*0.125)/(1000); //Converts to a voltage
eawendtjr 0:404f32e080f9 145
eawendtjr 0:404f32e080f9 146 x1 = vph3 + vph4;
eawendtjr 0:404f32e080f9 147 x2 = vph1 + vph2;
eawendtjr 0:404f32e080f9 148 y1 = vph1 + vph4;
eawendtjr 0:404f32e080f9 149 y2 = vph2 + vph3;
eawendtjr 0:404f32e080f9 150 fx = (x2 - x1)/(x2 + x1);
eawendtjr 0:404f32e080f9 151 fy = (y2 - y1)/(y2 + y1);
eawendtjr 0:404f32e080f9 152 quad_x = atan(quad_c*fx)*180/PI;
eawendtjr 0:404f32e080f9 153 quad_y = atan(quad_c*fy)*180/PI;
eawendtjr 0:404f32e080f9 154
eawendtjr 1:ed3bb7921b0e 155 gps.read_gps();
eawendtjr 1:ed3bb7921b0e 156 gpsquality = gps.quality;
eawendtjr 1:ed3bb7921b0e 157 if(gpsquality!=0)
eawendtjr 1:ed3bb7921b0e 158 {
eawendtjr 1:ed3bb7921b0e 159 gpslatitude = gps.lat;
eawendtjr 1:ed3bb7921b0e 160 gpslongitude = gps.lon;
eawendtjr 1:ed3bb7921b0e 161 gpsaltitude = gps.altitude;
eawendtjr 1:ed3bb7921b0e 162 }
eawendtjr 1:ed3bb7921b0e 163 gpsTime = (long)gps.utc;
eawendtjr 1:ed3bb7921b0e 164 gpsDate = (long)gps.date;
eawendtjr 1:ed3bb7921b0e 165
eawendtjr 1:ed3bb7921b0e 166 gps_minute = (int)(floor((float)(gpsTime - (uint8_t)(floor((float)gpsTime/10000))*10000)/100)); // 0-59
eawendtjr 1:ed3bb7921b0e 167 gps_second = (double)(floor(((float)gpsTime - 100*(floor((float)gpsTime/100)))));//0; //(uint8_t)(floor(((float)gpsTime - 100*(floor((float)gpsTime/100))))); // 0-59
eawendtjr 1:ed3bb7921b0e 168 gps_hour = (int)(floor((float)gpsTime/10000)); // 0-23
eawendtjr 1:ed3bb7921b0e 169 gps_day = (int)(floor((float)gpsDate/10000)); // 1-31
eawendtjr 1:ed3bb7921b0e 170 gps_month = (uint8_t)(floor((float)(gpsDate - gps_day*10000)/100)); // 0-11
eawendtjr 1:ed3bb7921b0e 171 gps_year = 1900 + (uint8_t)(100+floor(((float)gpsDate - 100*(floor((float)gpsDate/100))))); // year since 1900 (116 = 2016)//100+16
eawendtjr 1:ed3bb7921b0e 172
eawendtjr 3:ace08723f2c5 173 sun.setValues(gps_year, gps_month, gps_day, gps_hour, gps_minute, gps_second, time_zone, delta_t, gpslatitude, gpslongitude, gpsaltitude, bme_temp, bme_press, slope, azm_rotation);
eawendtjr 3:ace08723f2c5 174 sun.findSun();
eawendtjr 3:ace08723f2c5 175 r = sun.getRadius();
eawendtjr 3:ace08723f2c5 176 zenith = sun.getZenith();
eawendtjr 3:ace08723f2c5 177 azimuth = sun.getAzimuth();
eawendtjr 3:ace08723f2c5 178
eawendtjr 0:404f32e080f9 179 pc.printf("Roll = %f, Pitch = %f, Heading = %f \r\n", roll, pitch, heading);
eawendtjr 0:404f32e080f9 180 pc.printf("Temperature = %f, Pressure = %f, RH = %f \r\n", bme_temp, bme_press, bme_rh);
eawendtjr 0:404f32e080f9 181 pc.printf("V1 = %f, V2 = %f, V3 = %f, V4 = %f \r\n", vph1, vph2, vph3, vph4);
eawendtjr 1:ed3bb7921b0e 182 pc.printf("Angle X = %f, Angle Y = %f \r\n", quad_x, quad_y);
eawendtjr 1:ed3bb7921b0e 183 pc.printf("Date = %d, Time = %d \r\n", gpsDate, gpsTime);
eawendtjr 2:c7c09a91f1bf 184 pc.printf("Latitude = %f, Longitude = %f, Altitude = %f \r\n", gpslatitude, gpslongitude, gpsaltitude);
eawendtjr 3:ace08723f2c5 185 pc.printf("R = %f, zenith = %f, azimuth = %f \r\n", r, zenith, azimuth);
eawendtjr 0:404f32e080f9 186 pc.printf("\r\n");
eawendtjr 0:404f32e080f9 187 wait(1);
eawendtjr 0:404f32e080f9 188 }
eawendtjr 0:404f32e080f9 189 }