Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: ADS1115 BME280 LSM9DS1 CAM_M8 DRV8834 SunPosition mbed
main.cpp@12:f0daf093bb97, 2018-09-12 (annotated)
- 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?
| User | Revision | Line number | New 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 | */ |