Volckens Group Sensors / Mbed 2 deprecated CEAMS_Sun_Tracker

Dependencies:   ADS1115 BME280 LSM9DS1 CAM_M8 DRV8834 SunPosition mbed

Committer:
eawendtjr
Date:
Wed Sep 12 19:09:12 2018 +0000
Revision:
12:f0daf093bb97
Parent:
10:6baaca879789
Back to blocking model

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 4:d9f77ff43ca1 5 #include "ADS1115.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 4:d9f77ff43ca1 10 #include "DRV8834.h"
eawendtjr 0:404f32e080f9 11
eawendtjr 0:404f32e080f9 12 #define PI 3.1415926535897932384626433832795028841971
eawendtjr 0:404f32e080f9 13
eawendtjr 0:404f32e080f9 14 /////////////////////////////////////////////
eawendtjr 0:404f32e080f9 15 //Serial and I2C objects
eawendtjr 0:404f32e080f9 16 /////////////////////////////////////////////
eawendtjr 4:d9f77ff43ca1 17 I2C i2c(PB_9, PB_8); //(D14, D15); SDA,SCL
eawendtjr 0:404f32e080f9 18 Serial pc(USBTX, USBRX);
eawendtjr 0:404f32e080f9 19
eawendtjr 0:404f32e080f9 20 /////////////////////////////////////////////
eawendtjr 0:404f32e080f9 21 //Accelerometer
eawendtjr 0:404f32e080f9 22 /////////////////////////////////////////////
eawendtjr 0:404f32e080f9 23 // Object
eawendtjr 0:404f32e080f9 24 LSM9DS1 lol(PB_9, PB_8, 0xD6, 0x3C);
eawendtjr 0:404f32e080f9 25
eawendtjr 12:f0daf093bb97 26 // Variables
eawendtjr 12:f0daf093bb97 27 float roll;
eawendtjr 12:f0daf093bb97 28 float pitch;
eawendtjr 12:f0daf093bb97 29 float pitch360;
eawendtjr 12:f0daf093bb97 30 float heading;
eawendtjr 12:f0daf093bb97 31
eawendtjr 0:404f32e080f9 32 /////////////////////////////////////////////
eawendtjr 0:404f32e080f9 33 //Temperature and Pressure
eawendtjr 0:404f32e080f9 34 /////////////////////////////////////////////
eawendtjr 0:404f32e080f9 35 // Object
eawendtjr 0:404f32e080f9 36 BME280 bme(PB_9, PB_8, 0xEE);
eawendtjr 0:404f32e080f9 37
eawendtjr 12:f0daf093bb97 38 //Variables
eawendtjr 12:f0daf093bb97 39 float bme_press;
eawendtjr 12:f0daf093bb97 40 float bme_temp;
eawendtjr 12:f0daf093bb97 41 float bme_rh;
eawendtjr 12:f0daf093bb97 42
eawendtjr 0:404f32e080f9 43 /////////////////////////////////////////////
eawendtjr 0:404f32e080f9 44 //Quad Sensor
eawendtjr 0:404f32e080f9 45 /////////////////////////////////////////////
eawendtjr 0:404f32e080f9 46 // Object
eawendtjr 4:d9f77ff43ca1 47 ADS1115 ads_quad(PB_9, PB_8, ADS1115_ADDRESS_GND);
eawendtjr 0:404f32e080f9 48
eawendtjr 12:f0daf093bb97 49 // Variables
eawendtjr 12:f0daf093bb97 50 int16_t diff13;
eawendtjr 12:f0daf093bb97 51 int16_t diff13_offset = 9600;
eawendtjr 12:f0daf093bb97 52 float diff13_volt;
eawendtjr 12:f0daf093bb97 53 int16_t diff24;
eawendtjr 12:f0daf093bb97 54 int16_t diff24_offset = 11000;
eawendtjr 12:f0daf093bb97 55 float diff24_volt;
eawendtjr 12:f0daf093bb97 56 //const float quad_c = 0.125; // For 5 degree FOV
eawendtjr 12:f0daf093bb97 57 float vph1;
eawendtjr 12:f0daf093bb97 58 int16_t vph1_raw;
eawendtjr 12:f0daf093bb97 59 float vph2;
eawendtjr 12:f0daf093bb97 60 int16_t vph2_raw;
eawendtjr 12:f0daf093bb97 61 float vph3;
eawendtjr 12:f0daf093bb97 62 int16_t vph3_raw;
eawendtjr 12:f0daf093bb97 63 float vph4;
eawendtjr 12:f0daf093bb97 64 int16_t vph4_raw;
eawendtjr 12:f0daf093bb97 65 float x1, x2, y1, y2;
eawendtjr 12:f0daf093bb97 66 float fy, fx;
eawendtjr 12:f0daf093bb97 67 float quad_x, quad_y;
eawendtjr 12:f0daf093bb97 68 const int quad_thresh = 20000; // Threshold value for sun detection
eawendtjr 12:f0daf093bb97 69
eawendtjr 0:404f32e080f9 70 /////////////////////////////////////////////
eawendtjr 1:ed3bb7921b0e 71 //GPS
eawendtjr 0:404f32e080f9 72 /////////////////////////////////////////////
eawendtjr 1:ed3bb7921b0e 73 // Object
eawendtjr 1:ed3bb7921b0e 74 CAM_M8 gps(PB_9, PB_8,(0x84));
eawendtjr 1:ed3bb7921b0e 75
eawendtjr 12:f0daf093bb97 76 // Variables
eawendtjr 12:f0daf093bb97 77 bool gpsReady = 0;
eawendtjr 12:f0daf093bb97 78 uint8_t gpsquality = 0;
eawendtjr 12:f0daf093bb97 79 uint8_t gpssatellites = 0;
eawendtjr 12:f0daf093bb97 80 double gpsspeed = 0.0;
eawendtjr 12:f0daf093bb97 81 //double gpscourse = 0.0;
eawendtjr 12:f0daf093bb97 82 double gpslatitude = 0.0;
eawendtjr 12:f0daf093bb97 83 double gpslongitude = 0.0;
eawendtjr 12:f0daf093bb97 84 float gpsaltitude = 0.0;
eawendtjr 12:f0daf093bb97 85 long gpsTime;
eawendtjr 12:f0daf093bb97 86 long gpsDate;
eawendtjr 12:f0daf093bb97 87 int gps_year;
eawendtjr 12:f0daf093bb97 88 int gps_month;
eawendtjr 12:f0daf093bb97 89 int gps_day;
eawendtjr 12:f0daf093bb97 90 int gps_hour;
eawendtjr 12:f0daf093bb97 91 int gps_minute;
eawendtjr 12:f0daf093bb97 92 double gps_second;
eawendtjr 12:f0daf093bb97 93
eawendtjr 1:ed3bb7921b0e 94 /////////////////////////////////////////////
eawendtjr 1:ed3bb7921b0e 95 //Sun Position
eawendtjr 1:ed3bb7921b0e 96 /////////////////////////////////////////////
eawendtjr 1:ed3bb7921b0e 97 // Object
eawendtjr 1:ed3bb7921b0e 98 SunPosition sun;
eawendtjr 1:ed3bb7921b0e 99
eawendtjr 12:f0daf093bb97 100 //Variables
eawendtjr 12:f0daf093bb97 101 double zenith;
eawendtjr 12:f0daf093bb97 102 double azimuth;
eawendtjr 12:f0daf093bb97 103 double radius;
eawendtjr 12:f0daf093bb97 104 double r;
eawendtjr 12:f0daf093bb97 105 const double time_zone = 0; //GPS gets Greenwich time
eawendtjr 12:f0daf093bb97 106 const double delta_t = 68; //This parameter will be roughly constant this year
eawendtjr 12:f0daf093bb97 107 const double slope = 30;
eawendtjr 12:f0daf093bb97 108 const double azm_rotation = 10;
eawendtjr 12:f0daf093bb97 109
eawendtjr 4:d9f77ff43ca1 110 /////////////////////////////////////////////
eawendtjr 4:d9f77ff43ca1 111 //Stepper Motor Driver
eawendtjr 4:d9f77ff43ca1 112 /////////////////////////////////////////////
eawendtjr 4:d9f77ff43ca1 113 // Objects
eawendtjr 4:d9f77ff43ca1 114 DRV8834 az_motor(D2, D6, D7, D3, D4);
eawendtjr 4:d9f77ff43ca1 115 DRV8834 zen_motor(D8, D12, D13, D9, D10);
eawendtjr 4:d9f77ff43ca1 116 int steps_az = 0; // Net steps of the azimith motor
eawendtjr 4:d9f77ff43ca1 117 int steps_zen = 0; // Net steps of the zenith motor
eawendtjr 4:d9f77ff43ca1 118
eawendtjr 4:d9f77ff43ca1 119 /////////////////////////////////////////////
eawendtjr 4:d9f77ff43ca1 120 //Timer
eawendtjr 4:d9f77ff43ca1 121 /////////////////////////////////////////////
eawendtjr 4:d9f77ff43ca1 122 Timer t;
eawendtjr 4:d9f77ff43ca1 123
eawendtjr 4:d9f77ff43ca1 124 /////////////////////////////////////////////
eawendtjr 4:d9f77ff43ca1 125 //Function prototypes
eawendtjr 4:d9f77ff43ca1 126 /////////////////////////////////////////////
eawendtjr 4:d9f77ff43ca1 127 bool check_thresh();
eawendtjr 4:d9f77ff43ca1 128 void az_step(bool direction, int pulsewidth);
eawendtjr 4:d9f77ff43ca1 129 void zen_step(bool direction, int pulsewidth);
eawendtjr 4:d9f77ff43ca1 130 void gps_and_sun();
eawendtjr 4:d9f77ff43ca1 131
eawendtjr 0:404f32e080f9 132 //----------------------------------------------------------------------------//
eawendtjr 0:404f32e080f9 133 // MAIN FUNCTION
eawendtjr 0:404f32e080f9 134 //----------------------------------------------------------------------------//
eawendtjr 0:404f32e080f9 135 int main()
eawendtjr 0:404f32e080f9 136 {
eawendtjr 0:404f32e080f9 137 // Set baud for UPAS to PC
eawendtjr 0:404f32e080f9 138 pc.baud(115200);
eawendtjr 0:404f32e080f9 139
eawendtjr 0:404f32e080f9 140 // Check the accelerometer
eawendtjr 0:404f32e080f9 141 lol.begin();
eawendtjr 4:d9f77ff43ca1 142 if (!lol.begin())
eawendtjr 4:d9f77ff43ca1 143 {
eawendtjr 0:404f32e080f9 144 pc.printf("Failed to communicate with LSM9DS1.\n");
eawendtjr 0:404f32e080f9 145 }
eawendtjr 0:404f32e080f9 146
eawendtjr 4:d9f77ff43ca1 147 az_motor.setMicrostepping(32);
eawendtjr 4:d9f77ff43ca1 148 zen_motor.setMicrostepping(32);
eawendtjr 0:404f32e080f9 149
eawendtjr 12:f0daf093bb97 150 // Get initial time and position
eawendtjr 12:f0daf093bb97 151 gps_and_sun();
eawendtjr 12:f0daf093bb97 152
eawendtjr 4:d9f77ff43ca1 153 while(1)
eawendtjr 4:d9f77ff43ca1 154 {
eawendtjr 12:f0daf093bb97 155 // Check sun once per loop
eawendtjr 12:f0daf093bb97 156 gps_and_sun();
eawendtjr 4:d9f77ff43ca1 157
eawendtjr 12:f0daf093bb97 158 // If sensor out of field of view, enter initial honing algorithm
eawendtjr 12:f0daf093bb97 159 // Zenith honing
eawendtjr 12:f0daf093bb97 160 //pc.printf("err = %f \r\n", (360 - pitch360 - zenith));
eawendtjr 12:f0daf093bb97 161 if(!check_thresh() && (abs(360 - pitch360 - zenith) >= 3.0))
eawendtjr 12:f0daf093bb97 162 {
eawendtjr 12:f0daf093bb97 163 if(((pitch360 - zenith)) <= 180)
eawendtjr 12:f0daf093bb97 164 {
eawendtjr 12:f0daf093bb97 165 zen_motor.stepAngle(-(360 - zenith - pitch360), 5); // Move CCW
eawendtjr 12:f0daf093bb97 166 }
eawendtjr 12:f0daf093bb97 167 else
eawendtjr 12:f0daf093bb97 168 {
eawendtjr 12:f0daf093bb97 169 zen_motor.stepAngle((360 - zenith - pitch360), 5); // Move CW
eawendtjr 12:f0daf093bb97 170 }
eawendtjr 12:f0daf093bb97 171 }
eawendtjr 12:f0daf093bb97 172
eawendtjr 12:f0daf093bb97 173 // Azimuth CCW search
eawendtjr 12:f0daf093bb97 174 while(!check_thresh() && (steps_az <= 1600)) // Scan 90 degrees
eawendtjr 12:f0daf093bb97 175 {
eawendtjr 12:f0daf093bb97 176 // Rotate the azimuth stepper 1 step CCW
eawendtjr 12:f0daf093bb97 177 az_step(0, 100);
eawendtjr 12:f0daf093bb97 178 //pc.printf("%d \r\n", steps_az);
eawendtjr 12:f0daf093bb97 179 }
eawendtjr 0:404f32e080f9 180
eawendtjr 12:f0daf093bb97 181 // Azimuth CW search
eawendtjr 12:f0daf093bb97 182 while(!check_thresh() && (steps_az >= -1600))
eawendtjr 12:f0daf093bb97 183 {
eawendtjr 12:f0daf093bb97 184 // Rotate the azimuth stepper 1 step CW
eawendtjr 12:f0daf093bb97 185 az_step(1, 100);
eawendtjr 12:f0daf093bb97 186 //pc.printf("%d \r\n", steps_az);
eawendtjr 12:f0daf093bb97 187 }
eawendtjr 0:404f32e080f9 188
eawendtjr 12:f0daf093bb97 189 // If sensor in field of view, enter active tracking algorithm
eawendtjr 12:f0daf093bb97 190 while(check_thresh())
eawendtjr 12:f0daf093bb97 191 {
eawendtjr 12:f0daf093bb97 192 diff13 = ads_quad.readADC(ADS1115_DIFF_A0A1_GAIN_ONE); //Differential mode
eawendtjr 12:f0daf093bb97 193 diff24 = ads_quad.readADC(ADS1115_DIFF_A2A3_GAIN_ONE); //Differential mode
eawendtjr 12:f0daf093bb97 194
eawendtjr 12:f0daf093bb97 195 if(abs(diff24 + diff24_offset) > (500))
eawendtjr 12:f0daf093bb97 196 {
eawendtjr 12:f0daf093bb97 197 if(diff24 + diff24_offset < 0) // Pointed right of target
eawendtjr 12:f0daf093bb97 198 {
eawendtjr 12:f0daf093bb97 199 az_step(0, 100); // Turn CCW
eawendtjr 12:f0daf093bb97 200 }
eawendtjr 12:f0daf093bb97 201 else if(diff24 + diff24_offset > 0) // Pointed left of target
eawendtjr 12:f0daf093bb97 202 {
eawendtjr 12:f0daf093bb97 203 az_step(1, 100); // Turn CW
eawendtjr 12:f0daf093bb97 204 }
eawendtjr 12:f0daf093bb97 205 }
eawendtjr 12:f0daf093bb97 206 if(abs(diff13 + diff13_offset) > (500))
eawendtjr 12:f0daf093bb97 207 {
eawendtjr 12:f0daf093bb97 208 if(diff13 + diff13_offset < 0) // Pointed above target
eawendtjr 12:f0daf093bb97 209 {
eawendtjr 12:f0daf093bb97 210 zen_step(0, 100); // Turn CCW
eawendtjr 12:f0daf093bb97 211 }
eawendtjr 12:f0daf093bb97 212 else if(diff13 + diff13_offset > 0) // Pointed below target
eawendtjr 12:f0daf093bb97 213 {
eawendtjr 12:f0daf093bb97 214 zen_step(1, 100); // Turn CW
eawendtjr 12:f0daf093bb97 215 }
eawendtjr 12:f0daf093bb97 216 }
eawendtjr 12:f0daf093bb97 217 }
eawendtjr 12:f0daf093bb97 218 }
eawendtjr 12:f0daf093bb97 219 }
eawendtjr 4:d9f77ff43ca1 220
eawendtjr 4:d9f77ff43ca1 221 bool check_thresh()
eawendtjr 4:d9f77ff43ca1 222 {
eawendtjr 7:a4c61fdcd347 223 vph4_raw = ads_quad.readADC(ADS1115_SE_A3_GAIN_ONE); //Raw ADC Value
eawendtjr 7:a4c61fdcd347 224 vph2_raw = ads_quad.readADC(ADS1115_SE_A2_GAIN_ONE); //Raw ADC Value
eawendtjr 7:a4c61fdcd347 225 vph3_raw = ads_quad.readADC(ADS1115_SE_A1_GAIN_ONE); //Raw ADC Value
eawendtjr 7:a4c61fdcd347 226 vph1_raw = ads_quad.readADC(ADS1115_SE_A0_GAIN_ONE); //Raw ADC Value
eawendtjr 4:d9f77ff43ca1 227
eawendtjr 7:a4c61fdcd347 228 if ((vph1_raw + vph2_raw + vph3_raw + vph4_raw) > quad_thresh)
eawendtjr 4:d9f77ff43ca1 229 {
eawendtjr 4:d9f77ff43ca1 230 return true;
eawendtjr 4:d9f77ff43ca1 231 }
eawendtjr 4:d9f77ff43ca1 232 else
eawendtjr 4:d9f77ff43ca1 233 {
eawendtjr 4:d9f77ff43ca1 234 return false;
eawendtjr 4:d9f77ff43ca1 235 }
eawendtjr 4:d9f77ff43ca1 236 }
eawendtjr 4:d9f77ff43ca1 237
eawendtjr 4:d9f77ff43ca1 238 void az_step(bool direction, int pulsewidth)
eawendtjr 4:d9f77ff43ca1 239 {
eawendtjr 7:a4c61fdcd347 240 if (!direction)
eawendtjr 4:d9f77ff43ca1 241 {
eawendtjr 4:d9f77ff43ca1 242 steps_az++;
eawendtjr 4:d9f77ff43ca1 243 }
eawendtjr 4:d9f77ff43ca1 244 else
eawendtjr 4:d9f77ff43ca1 245 {
eawendtjr 4:d9f77ff43ca1 246 steps_az--;
eawendtjr 4:d9f77ff43ca1 247 }
eawendtjr 4:d9f77ff43ca1 248
eawendtjr 4:d9f77ff43ca1 249 az_motor.step(direction, pulsewidth);
eawendtjr 4:d9f77ff43ca1 250 }
eawendtjr 4:d9f77ff43ca1 251
eawendtjr 4:d9f77ff43ca1 252 void zen_step(bool direction, int pulsewidth)
eawendtjr 4:d9f77ff43ca1 253 {
eawendtjr 7:a4c61fdcd347 254 if (!direction)
eawendtjr 4:d9f77ff43ca1 255 {
eawendtjr 4:d9f77ff43ca1 256 steps_zen++;
eawendtjr 4:d9f77ff43ca1 257 }
eawendtjr 4:d9f77ff43ca1 258 else
eawendtjr 4:d9f77ff43ca1 259 {
eawendtjr 4:d9f77ff43ca1 260 steps_zen--;
eawendtjr 4:d9f77ff43ca1 261 }
eawendtjr 4:d9f77ff43ca1 262
eawendtjr 4:d9f77ff43ca1 263 zen_motor.step(direction, pulsewidth);
eawendtjr 4:d9f77ff43ca1 264 }
eawendtjr 4:d9f77ff43ca1 265
eawendtjr 4:d9f77ff43ca1 266 void gps_and_sun()
eawendtjr 4:d9f77ff43ca1 267 {
eawendtjr 4:d9f77ff43ca1 268 // Get pitch from accelerometer
eawendtjr 4:d9f77ff43ca1 269 lol.getAngles();
eawendtjr 4:d9f77ff43ca1 270 pitch = lol.pitch;
eawendtjr 7:a4c61fdcd347 271 pitch360 = lol.pitch360;
eawendtjr 4:d9f77ff43ca1 272
eawendtjr 4:d9f77ff43ca1 273 // Find the Sun
eawendtjr 4:d9f77ff43ca1 274 gps.read_gps();
eawendtjr 4:d9f77ff43ca1 275 gpsquality = gps.quality;
eawendtjr 4:d9f77ff43ca1 276 if(gpsquality!=0)
eawendtjr 4:d9f77ff43ca1 277 {
eawendtjr 4:d9f77ff43ca1 278 gpslatitude = gps.lat;
eawendtjr 4:d9f77ff43ca1 279 gpslongitude = gps.lon;
eawendtjr 4:d9f77ff43ca1 280 gpsaltitude = gps.altitude;
eawendtjr 4:d9f77ff43ca1 281 }
eawendtjr 4:d9f77ff43ca1 282 gpsTime = (long)gps.utc;
eawendtjr 4:d9f77ff43ca1 283 gpsDate = (long)gps.date;
eawendtjr 1:ed3bb7921b0e 284
eawendtjr 4:d9f77ff43ca1 285 gps_minute = (int)(floor((float)(gpsTime - (uint8_t)(floor((float)gpsTime/10000))*10000)/100)); // 0-59
eawendtjr 4:d9f77ff43ca1 286 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 4:d9f77ff43ca1 287 gps_hour = (int)(floor((float)gpsTime/10000)); // 0-23
eawendtjr 4:d9f77ff43ca1 288 gps_day = (int)(floor((float)gpsDate/10000)); // 1-31
eawendtjr 4:d9f77ff43ca1 289 gps_month = (int)(floor((float)(gpsDate - gps_day*10000)/100)); // 0-11
eawendtjr 4:d9f77ff43ca1 290 gps_year = 1900 + (int)(100+floor(((float)gpsDate - 100*(floor((float)gpsDate/100))))); // year since 1900 (116 = 2016)//100+16
eawendtjr 4:d9f77ff43ca1 291
eawendtjr 4:d9f77ff43ca1 292 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 4:d9f77ff43ca1 293 sun.findSun();
eawendtjr 4:d9f77ff43ca1 294 zenith = sun.getZenith();
eawendtjr 4:d9f77ff43ca1 295 }
eawendtjr 4:d9f77ff43ca1 296
eawendtjr 4:d9f77ff43ca1 297 /*
eawendtjr 4:d9f77ff43ca1 298 lol.readTemp();
eawendtjr 4:d9f77ff43ca1 299 lol.readMag();
eawendtjr 4:d9f77ff43ca1 300 lol.readGyro();
eawendtjr 4:d9f77ff43ca1 301
eawendtjr 4:d9f77ff43ca1 302 lol.getAngles();
eawendtjr 4:d9f77ff43ca1 303 roll = lol.roll;
eawendtjr 4:d9f77ff43ca1 304 pitch = lol.pitch;
eawendtjr 4:d9f77ff43ca1 305 heading = lol.heading;
eawendtjr 4:d9f77ff43ca1 306
eawendtjr 4:d9f77ff43ca1 307 // Check the pressure and temperature sensor
eawendtjr 4:d9f77ff43ca1 308 bme_temp = bme.getTemperature();
eawendtjr 4:d9f77ff43ca1 309 bme_press = bme.getPressure(bme_temp);
eawendtjr 4:d9f77ff43ca1 310 bme_rh = bme.getHumidity();
eawendtjr 4:d9f77ff43ca1 311
eawendtjr 4:d9f77ff43ca1 312 // Read differential on the quad sensor
eawendtjr 4:d9f77ff43ca1 313 diff13 = ads_quad.readADC(ADS1115_DIFF_A0A1_GAIN_TWO); //Differential mode
eawendtjr 4:d9f77ff43ca1 314 diff13_volt = ads_quad.readVolt(ADS1115_DIFF_A0A1_GAIN_TWO);
eawendtjr 4:d9f77ff43ca1 315
eawendtjr 4:d9f77ff43ca1 316 diff24 = ads_quad.readADC(ADS1115_DIFF_A2A3_GAIN_TWO); //Differential mode
eawendtjr 4:d9f77ff43ca1 317 diff24_volt = ads_quad.readVolt(ADS1115_DIFF_A2A3_GAIN_TWO);
eawendtjr 4:d9f77ff43ca1 318
eawendtjr 4:d9f77ff43ca1 319 // Check the quad sensor
eawendtjr 4:d9f77ff43ca1 320 vph4_raw = ads_quad.readADC(ADS1115_SE_A3_GAIN_TWO); //Single-ended mode
eawendtjr 4:d9f77ff43ca1 321 vph4 = ads_quad.readVolt(ADS1115_SE_A3_GAIN_TWO); //Converts to a voltage
eawendtjr 4:d9f77ff43ca1 322
eawendtjr 4:d9f77ff43ca1 323 vph2_raw = ads_quad.readADC(ADS1115_SE_A2_GAIN_TWO); //Single-ended mode
eawendtjr 4:d9f77ff43ca1 324 vph2 = ads_quad.readVolt(ADS1115_SE_A2_GAIN_TWO); //Converts to a voltage
eawendtjr 4:d9f77ff43ca1 325
eawendtjr 4:d9f77ff43ca1 326 vph3_raw = ads_quad.readADC(ADS1115_SE_A1_GAIN_TWO); //Single-ended mode
eawendtjr 4:d9f77ff43ca1 327 vph3 = ads_quad.readVolt(ADS1115_SE_A1_GAIN_TWO); //Converts to a voltage
eawendtjr 4:d9f77ff43ca1 328
eawendtjr 4:d9f77ff43ca1 329 vph1_raw = ads_quad.readADC(ADS1115_SE_A0_GAIN_TWO); //Single-ended mode
eawendtjr 4:d9f77ff43ca1 330 vph1 = ads_quad.readVolt(ADS1115_SE_A0_GAIN_TWO); //Converts to a voltage
eawendtjr 1:ed3bb7921b0e 331
eawendtjr 4:d9f77ff43ca1 332 x1 = vph3 + vph4;
eawendtjr 4:d9f77ff43ca1 333 x2 = vph1 + vph2;
eawendtjr 4:d9f77ff43ca1 334 y1 = vph1 + vph4;
eawendtjr 4:d9f77ff43ca1 335 y2 = vph2 + vph3;
eawendtjr 4:d9f77ff43ca1 336 fx = (x2 - x1)/(x2 + x1);
eawendtjr 4:d9f77ff43ca1 337 fy = (y2 - y1)/(y2 + y1);
eawendtjr 4:d9f77ff43ca1 338 quad_x = atan(quad_c*fx)*180/PI;
eawendtjr 4:d9f77ff43ca1 339 quad_y = atan(quad_c*fy)*180/PI;
eawendtjr 3:ace08723f2c5 340
eawendtjr 4:d9f77ff43ca1 341 gps.read_gps();
eawendtjr 4:d9f77ff43ca1 342 gpsquality = gps.quality;
eawendtjr 4:d9f77ff43ca1 343 if(gpsquality!=0)
eawendtjr 4:d9f77ff43ca1 344 {
eawendtjr 4:d9f77ff43ca1 345 gpslatitude = gps.lat;
eawendtjr 4:d9f77ff43ca1 346 gpslongitude = gps.lon;
eawendtjr 4:d9f77ff43ca1 347 gpsaltitude = gps.altitude;
eawendtjr 4:d9f77ff43ca1 348 }
eawendtjr 4:d9f77ff43ca1 349 gpsTime = (long)gps.utc;
eawendtjr 4:d9f77ff43ca1 350 gpsDate = (long)gps.date;
eawendtjr 4:d9f77ff43ca1 351
eawendtjr 4:d9f77ff43ca1 352 gps_minute = (int)(floor((float)(gpsTime - (uint8_t)(floor((float)gpsTime/10000))*10000)/100)); // 0-59
eawendtjr 4:d9f77ff43ca1 353 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 4:d9f77ff43ca1 354 gps_hour = (int)(floor((float)gpsTime/10000)); // 0-23
eawendtjr 4:d9f77ff43ca1 355 gps_day = (int)(floor((float)gpsDate/10000)); // 1-31
eawendtjr 4:d9f77ff43ca1 356 gps_month = (uint8_t)(floor((float)(gpsDate - gps_day*10000)/100)); // 0-11
eawendtjr 4:d9f77ff43ca1 357 gps_year = 1900 + (uint8_t)(100+floor(((float)gpsDate - 100*(floor((float)gpsDate/100))))); // year since 1900 (116 = 2016)//100+16
eawendtjr 4:d9f77ff43ca1 358
eawendtjr 4:d9f77ff43ca1 359 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 4:d9f77ff43ca1 360 sun.findSun();
eawendtjr 4:d9f77ff43ca1 361 r = sun.getRadius();
eawendtjr 4:d9f77ff43ca1 362 zenith = sun.getZenith();
eawendtjr 4:d9f77ff43ca1 363 azimuth = sun.getAzimuth();
eawendtjr 4:d9f77ff43ca1 364
eawendtjr 4:d9f77ff43ca1 365 pc.printf("*************************************************************\r\n");
eawendtjr 4:d9f77ff43ca1 366 pc.printf("Roll = %f, Pitch = %f, Heading = %f \r\n", roll, pitch, heading);
eawendtjr 4:d9f77ff43ca1 367 pc.printf("Temperature = %f, Pressure = %f, RH = %f \r\n", bme_temp, bme_press, bme_rh);
eawendtjr 4:d9f77ff43ca1 368 pc.printf("Raw Diff 1-3 = %d, Raw Diff 2-4 = %d \r\n", diff13, diff24);
eawendtjr 4:d9f77ff43ca1 369 pc.printf("Volt Diff 1-3 = %f, Volt Diff 2-4 = %f \r\n", diff13_volt, diff24_volt);
eawendtjr 4:d9f77ff43ca1 370 pc.printf("V1 = %f, V2 = %f, V3 = %f, V4 = %f \r\n", vph1, vph2, vph3, vph4);
eawendtjr 4:d9f77ff43ca1 371 pc.printf("Angle X = %f, Angle Y = %f \r\n", quad_x, quad_y);
eawendtjr 4:d9f77ff43ca1 372 pc.printf("Date = %d, Time = %d \r\n", gpsDate, gpsTime);
eawendtjr 4:d9f77ff43ca1 373 pc.printf("Latitude = %f, Longitude = %f, Altitude = %f \r\n", gpslatitude, gpslongitude, gpsaltitude);
eawendtjr 4:d9f77ff43ca1 374 pc.printf("R = %f, zenith = %f, azimuth = %f \r\n", r, zenith, azimuth);
eawendtjr 4:d9f77ff43ca1 375 pc.printf("*************************************************************\r\n");
eawendtjr 4:d9f77ff43ca1 376 pc.printf("\r\n");
eawendtjr 4:d9f77ff43ca1 377 wait(1);
eawendtjr 4:d9f77ff43ca1 378 */