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@3:ace08723f2c5, 2018-01-05 (annotated)
- 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?
| 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 | 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 | } |