Weather station project updated display and sensors
Dependencies: BH1750 BMP280 DS1820 HMC5983 Helios MAX17043 MPU6050 SHTx SSD1306_I2C A4988_stepper mbed
Fork of weather_station_proj by
main.cpp@2:bc1c1f395e9a, 2018-07-04 (annotated)
- Committer:
- daniel_davvid
- Date:
- Wed Jul 04 06:41:14 2018 +0000
- Revision:
- 2:bc1c1f395e9a
- Parent:
- 1:f20e1ea0302e
Updates
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
daniel_davvid | 0:e42837021e1a | 1 | #include "mbed.h" |
daniel_davvid | 0:e42837021e1a | 2 | |
daniel_davvid | 1:f20e1ea0302e | 3 | #define DONT_MOVE 1 |
daniel_davvid | 1:f20e1ea0302e | 4 | #define UPDATE_RTC_TIME 0 |
daniel_davvid | 1:f20e1ea0302e | 5 | #define RTC_TIME 1530462446 |
daniel_davvid | 1:f20e1ea0302e | 6 | |
daniel_davvid | 0:e42837021e1a | 7 | #ifndef M_PI |
daniel_davvid | 0:e42837021e1a | 8 | #define M_PI 3.1415926535897932384626433832795028841971693993751058209749445923078164 |
daniel_davvid | 0:e42837021e1a | 9 | #endif |
daniel_davvid | 0:e42837021e1a | 10 | // DS1820 temp sens pin |
daniel_davvid | 0:e42837021e1a | 11 | #define MAX_PROBES 16 |
daniel_davvid | 1:f20e1ea0302e | 12 | #define DATA_PIN A1 |
daniel_davvid | 0:e42837021e1a | 13 | //#define MULTIPLE_PROBES |
daniel_davvid | 0:e42837021e1a | 14 | |
daniel_davvid | 0:e42837021e1a | 15 | #include "BH1750.h" //Light sensor lib |
daniel_davvid | 0:e42837021e1a | 16 | #include "BMP280.h" //Pressure sensor lib |
daniel_davvid | 0:e42837021e1a | 17 | #include "DS1820.h" //Temp sensor lib (One wire) |
daniel_davvid | 0:e42837021e1a | 18 | #include "Helios.h" //Sun tracking algorithm |
daniel_davvid | 0:e42837021e1a | 19 | #include "HMC5983.h" //Compass lib |
daniel_davvid | 0:e42837021e1a | 20 | #include "MAX17043.h" //Fuel gauge sens lib |
daniel_davvid | 0:e42837021e1a | 21 | #include "MPU6050.h" //Accelerometer sensor lib |
daniel_davvid | 0:e42837021e1a | 22 | #include "SHTx/sht15.hpp" //Humidity sens lib |
daniel_davvid | 0:e42837021e1a | 23 | #include "SSD1306.h" //Display lib |
daniel_davvid | 0:e42837021e1a | 24 | #include "stepper.h" //Stepping motor lib. |
daniel_davvid | 0:e42837021e1a | 25 | |
daniel_davvid | 0:e42837021e1a | 26 | Serial pc(USBTX, USBRX); |
daniel_davvid | 0:e42837021e1a | 27 | //Digital pins |
daniel_davvid | 1:f20e1ea0302e | 28 | DigitalIn maxAnglLimit(PC_8); |
daniel_davvid | 1:f20e1ea0302e | 29 | DigitalIn minAnglLimit(PC_6); |
daniel_davvid | 1:f20e1ea0302e | 30 | DigitalOut swPi(PC_5); |
daniel_davvid | 1:f20e1ea0302e | 31 | DigitalIn pir(PB_12); |
daniel_davvid | 0:e42837021e1a | 32 | //Analog pins |
daniel_davvid | 1:f20e1ea0302e | 33 | AnalogIn waterLevel(A2); |
daniel_davvid | 1:f20e1ea0302e | 34 | AnalogIn crtConsumption(A3); |
daniel_davvid | 0:e42837021e1a | 35 | |
daniel_davvid | 0:e42837021e1a | 36 | // Stepper motor setup |
daniel_davvid | 0:e42837021e1a | 37 | stepper stpCirc(PA_12, NC, NC, NC, PB_1, PB_2); |
daniel_davvid | 0:e42837021e1a | 38 | stepper stpAngl(PA_11, NC, NC, NC, PB_14, PB_15); |
daniel_davvid | 0:e42837021e1a | 39 | |
daniel_davvid | 0:e42837021e1a | 40 | //DS1820 setup |
daniel_davvid | 0:e42837021e1a | 41 | DS1820* probe[MAX_PROBES]; |
daniel_davvid | 0:e42837021e1a | 42 | |
daniel_davvid | 0:e42837021e1a | 43 | //Helios algorithm |
daniel_davvid | 0:e42837021e1a | 44 | Helios sun; |
daniel_davvid | 0:e42837021e1a | 45 | |
daniel_davvid | 0:e42837021e1a | 46 | // I2C communication setup |
daniel_davvid | 0:e42837021e1a | 47 | I2C i2c1(D14, D15); |
daniel_davvid | 0:e42837021e1a | 48 | I2C i2c2(D3, D6); |
daniel_davvid | 1:f20e1ea0302e | 49 | //I2C i2c3(D5, D7); |
daniel_davvid | 0:e42837021e1a | 50 | |
daniel_davvid | 0:e42837021e1a | 51 | // Maybe change the format |
daniel_davvid | 0:e42837021e1a | 52 | SHTx::SHT15 sensor(D5, D7); |
daniel_davvid | 0:e42837021e1a | 53 | |
daniel_davvid | 0:e42837021e1a | 54 | //I2C 1 sensors |
daniel_davvid | 0:e42837021e1a | 55 | BH1750 bh(i2c1); |
daniel_davvid | 0:e42837021e1a | 56 | BMP280 bmp(i2c1); |
daniel_davvid | 0:e42837021e1a | 57 | HMC5983 compass(i2c1); |
daniel_davvid | 0:e42837021e1a | 58 | MAX17043 fuelGauge(i2c1); |
daniel_davvid | 0:e42837021e1a | 59 | SSD1306 lcd1(&i2c1, 0x78); |
daniel_davvid | 0:e42837021e1a | 60 | |
daniel_davvid | 0:e42837021e1a | 61 | //I2C 2 sensors |
daniel_davvid | 0:e42837021e1a | 62 | SSD1306 lcd2(&i2c2, 0x78); |
daniel_davvid | 0:e42837021e1a | 63 | MPU6050 mpu(i2c2); |
daniel_davvid | 0:e42837021e1a | 64 | |
daniel_davvid | 0:e42837021e1a | 65 | // Timers |
daniel_davvid | 0:e42837021e1a | 66 | Timer displayTimer; |
daniel_davvid | 0:e42837021e1a | 67 | Timer stepperRelaxTimer; |
daniel_davvid | 0:e42837021e1a | 68 | Timer compassPollTimer; |
daniel_davvid | 1:f20e1ea0302e | 69 | Timer pirPollTimer; |
daniel_davvid | 0:e42837021e1a | 70 | |
daniel_davvid | 0:e42837021e1a | 71 | //Accel |
daniel_davvid | 0:e42837021e1a | 72 | //not needed? |
daniel_davvid | 0:e42837021e1a | 73 | Vector rawGyro, normGyro; |
daniel_davvid | 0:e42837021e1a | 74 | Vector rawAccel, normAccel; |
daniel_davvid | 0:e42837021e1a | 75 | // |
daniel_davvid | 0:e42837021e1a | 76 | Vector scaledAccel; |
daniel_davvid | 0:e42837021e1a | 77 | float vertG; |
daniel_davvid | 0:e42837021e1a | 78 | //Compass |
daniel_davvid | 0:e42837021e1a | 79 | |
daniel_davvid | 0:e42837021e1a | 80 | double desiredAngle, actualAngle; |
daniel_davvid | 1:f20e1ea0302e | 81 | int crtFrame = 0; |
daniel_davvid | 1:f20e1ea0302e | 82 | bool pirDetectionOccured = false; |
daniel_davvid | 1:f20e1ea0302e | 83 | int pirUpdateInterval = 60; |
daniel_davvid | 0:e42837021e1a | 84 | |
daniel_davvid | 0:e42837021e1a | 85 | //Functions |
daniel_davvid | 0:e42837021e1a | 86 | double angleDiff(double a, double b); |
daniel_davvid | 1:f20e1ea0302e | 87 | int getWaterLevel(); |
daniel_davvid | 1:f20e1ea0302e | 88 | void updatePirState(); |
daniel_davvid | 1:f20e1ea0302e | 89 | float getCrtConsumption(); |
daniel_davvid | 0:e42837021e1a | 90 | |
daniel_davvid | 0:e42837021e1a | 91 | int main() |
daniel_davvid | 0:e42837021e1a | 92 | { |
daniel_davvid | 1:f20e1ea0302e | 93 | maxAnglLimit.mode(PullUp); |
daniel_davvid | 1:f20e1ea0302e | 94 | minAnglLimit.mode(PullUp); |
daniel_davvid | 0:e42837021e1a | 95 | //Helios algorithm setup |
daniel_davvid | 0:e42837021e1a | 96 | time_t seconds; |
daniel_davvid | 0:e42837021e1a | 97 | char buffer[32]; |
daniel_davvid | 1:f20e1ea0302e | 98 | |
daniel_davvid | 1:f20e1ea0302e | 99 | if (UPDATE_RTC_TIME) { |
daniel_davvid | 1:f20e1ea0302e | 100 | set_time(RTC_TIME); |
daniel_davvid | 1:f20e1ea0302e | 101 | } |
daniel_davvid | 1:f20e1ea0302e | 102 | |
daniel_davvid | 1:f20e1ea0302e | 103 | // Stepper drivers setup |
daniel_davvid | 1:f20e1ea0302e | 104 | if (DONT_MOVE) { |
daniel_davvid | 1:f20e1ea0302e | 105 | stpAngl.disable(); |
daniel_davvid | 1:f20e1ea0302e | 106 | stpCirc.disable(); |
daniel_davvid | 1:f20e1ea0302e | 107 | } |
daniel_davvid | 1:f20e1ea0302e | 108 | else { |
daniel_davvid | 1:f20e1ea0302e | 109 | stpAngl.enable(); |
daniel_davvid | 1:f20e1ea0302e | 110 | stpCirc.enable(); |
daniel_davvid | 1:f20e1ea0302e | 111 | } |
daniel_davvid | 1:f20e1ea0302e | 112 | swPi = 0; |
daniel_davvid | 0:e42837021e1a | 113 | //SHT15 setup |
daniel_davvid | 0:e42837021e1a | 114 | sensor.setOTPReload(false); |
daniel_davvid | 0:e42837021e1a | 115 | sensor.setResolution(true); |
daniel_davvid | 0:e42837021e1a | 116 | |
daniel_davvid | 0:e42837021e1a | 117 | // DS1820 setup |
daniel_davvid | 0:e42837021e1a | 118 | int num_devices = 0; |
daniel_davvid | 0:e42837021e1a | 119 | while(DS1820::unassignedProbe(DATA_PIN)) { |
daniel_davvid | 0:e42837021e1a | 120 | probe[num_devices] = new DS1820(DATA_PIN); |
daniel_davvid | 0:e42837021e1a | 121 | num_devices++; |
daniel_davvid | 0:e42837021e1a | 122 | if (num_devices == MAX_PROBES) |
daniel_davvid | 0:e42837021e1a | 123 | break; |
daniel_davvid | 1:f20e1ea0302e | 124 | } |
daniel_davvid | 0:e42837021e1a | 125 | //MPU setup |
daniel_davvid | 0:e42837021e1a | 126 | while(!mpu.begin(MPU6050_SCALE_2000DPS, MPU6050_RANGE_2G)) { |
daniel_davvid | 0:e42837021e1a | 127 | pc.printf("Could not find a valid MPU6050 sensor, check wiring!\n"); |
daniel_davvid | 0:e42837021e1a | 128 | wait(0.5); |
daniel_davvid | 0:e42837021e1a | 129 | } |
daniel_davvid | 0:e42837021e1a | 130 | mpu.calibrateGyro(); |
daniel_davvid | 0:e42837021e1a | 131 | mpu.setThreshold(3); |
daniel_davvid | 0:e42837021e1a | 132 | |
daniel_davvid | 0:e42837021e1a | 133 | //BMP setup |
daniel_davvid | 0:e42837021e1a | 134 | bmp.initialize(); |
daniel_davvid | 0:e42837021e1a | 135 | //BH setup |
daniel_davvid | 0:e42837021e1a | 136 | bh.init(); |
daniel_davvid | 0:e42837021e1a | 137 | // |
daniel_davvid | 0:e42837021e1a | 138 | compass.init(); |
daniel_davvid | 0:e42837021e1a | 139 | desiredAngle = 0.0; //** SET BY HELIOS LIB!!!!** |
daniel_davvid | 0:e42837021e1a | 140 | |
daniel_davvid | 0:e42837021e1a | 141 | //Timers Start |
daniel_davvid | 0:e42837021e1a | 142 | displayTimer.start(); |
daniel_davvid | 0:e42837021e1a | 143 | compassPollTimer.start(); |
daniel_davvid | 1:f20e1ea0302e | 144 | pirPollTimer.start(); |
daniel_davvid | 0:e42837021e1a | 145 | |
daniel_davvid | 0:e42837021e1a | 146 | |
daniel_davvid | 0:e42837021e1a | 147 | while (1) { |
daniel_davvid | 0:e42837021e1a | 148 | |
daniel_davvid | 0:e42837021e1a | 149 | //Helios |
daniel_davvid | 0:e42837021e1a | 150 | seconds = time(NULL); |
daniel_davvid | 0:e42837021e1a | 151 | sun.updatePosition(); |
daniel_davvid | 0:e42837021e1a | 152 | strftime(buffer, 32, "%H:%M:%S", localtime(&seconds)); |
daniel_davvid | 0:e42837021e1a | 153 | |
daniel_davvid | 0:e42837021e1a | 154 | //SHT15 |
daniel_davvid | 0:e42837021e1a | 155 | sensor.update(); |
daniel_davvid | 0:e42837021e1a | 156 | sensor.setScale(false); |
daniel_davvid | 0:e42837021e1a | 157 | |
daniel_davvid | 0:e42837021e1a | 158 | //MPU readings |
daniel_davvid | 0:e42837021e1a | 159 | // not needed? |
daniel_davvid | 0:e42837021e1a | 160 | rawGyro = mpu.readRawGyro(); |
daniel_davvid | 0:e42837021e1a | 161 | normGyro = mpu.readNormalizeGyro(); |
daniel_davvid | 0:e42837021e1a | 162 | rawAccel = mpu.readRawAccel(); |
daniel_davvid | 0:e42837021e1a | 163 | normAccel = mpu.readNormalizeAccel(); |
daniel_davvid | 0:e42837021e1a | 164 | // (ADD TO A new READ FUNCTION in lib???) |
daniel_davvid | 0:e42837021e1a | 165 | scaledAccel = mpu.readScaledAccel(); |
daniel_davvid | 0:e42837021e1a | 166 | vertG = scaledAccel.ZAxis; |
daniel_davvid | 0:e42837021e1a | 167 | vertG = vertG > 2.0f ? 3.9f - vertG : vertG; |
daniel_davvid | 0:e42837021e1a | 168 | vertG = vertG < 1.0f ? vertG : 1.0f; |
daniel_davvid | 0:e42837021e1a | 169 | vertG = vertG > -1.0f ? vertG : -1.0f; |
daniel_davvid | 0:e42837021e1a | 170 | |
daniel_davvid | 1:f20e1ea0302e | 171 | if (pirPollTimer.read() > pirUpdateInterval) { |
daniel_davvid | 1:f20e1ea0302e | 172 | pirPollTimer.reset(); |
daniel_davvid | 1:f20e1ea0302e | 173 | pirUpdateInterval = 1; |
daniel_davvid | 1:f20e1ea0302e | 174 | updatePirState(); |
daniel_davvid | 1:f20e1ea0302e | 175 | } |
daniel_davvid | 1:f20e1ea0302e | 176 | |
daniel_davvid | 0:e42837021e1a | 177 | if (compassPollTimer.read() > 1) { |
daniel_davvid | 0:e42837021e1a | 178 | compassPollTimer.reset(); |
daniel_davvid | 0:e42837021e1a | 179 | actualAngle = 360-compass.read(); |
daniel_davvid | 0:e42837021e1a | 180 | |
daniel_davvid | 0:e42837021e1a | 181 | //Helios |
daniel_davvid | 0:e42837021e1a | 182 | |
daniel_davvid | 0:e42837021e1a | 183 | //DS1820 sensor |
daniel_davvid | 0:e42837021e1a | 184 | probe[0]->convertTemperature(true, DS1820::all_devices); |
daniel_davvid | 0:e42837021e1a | 185 | for (int i = 0; i<num_devices; i++) |
daniel_davvid | 0:e42837021e1a | 186 | pc.printf("Device %d returns %3.1foC\r\n", i, probe[i]->temperature()); |
daniel_davvid | 0:e42837021e1a | 187 | // |
daniel_davvid | 0:e42837021e1a | 188 | |
daniel_davvid | 0:e42837021e1a | 189 | |
daniel_davvid | 0:e42837021e1a | 190 | |
daniel_davvid | 0:e42837021e1a | 191 | |
daniel_davvid | 0:e42837021e1a | 192 | if (abs(angleDiff(actualAngle, desiredAngle)) > 5) { |
daniel_davvid | 1:f20e1ea0302e | 193 | if (angleDiff(actualAngle, desiredAngle) > 0 && !DONT_MOVE) { |
daniel_davvid | 0:e42837021e1a | 194 | stpAngl.step(0, 1, 100); |
daniel_davvid | 0:e42837021e1a | 195 | } |
daniel_davvid | 1:f20e1ea0302e | 196 | } |
daniel_davvid | 1:f20e1ea0302e | 197 | else { |
daniel_davvid | 1:f20e1ea0302e | 198 | if (!DONT_MOVE) { |
daniel_davvid | 0:e42837021e1a | 199 | stpAngl.step(0, 0, 100); |
daniel_davvid | 1:f20e1ea0302e | 200 | } |
daniel_davvid | 1:f20e1ea0302e | 201 | } |
daniel_davvid | 0:e42837021e1a | 202 | |
daniel_davvid | 1:f20e1ea0302e | 203 | } |
daniel_davvid | 2:bc1c1f395e9a | 204 | if (displayTimer.read() > 0.5) { |
daniel_davvid | 1:f20e1ea0302e | 205 | displayTimer.reset(); |
daniel_davvid | 1:f20e1ea0302e | 206 | pc.printf("UTC time is: %s\n", buffer); |
daniel_davvid | 1:f20e1ea0302e | 207 | pc.printf("Sun azimuth: %.2f, elevation: %.2f\n", sun.azimuth(), sun.elevation()); |
daniel_davvid | 1:f20e1ea0302e | 208 | pc.printf("Vcell: %.2f\n", fuelGauge.getFloatVCell()); |
daniel_davvid | 1:f20e1ea0302e | 209 | pc.printf("Battery: %.2f\n", fuelGauge.getFloatSOC()); |
daniel_davvid | 1:f20e1ea0302e | 210 | pc.printf("Temperature [ %3.2f C ]\r\n", sensor.getTemperature()); |
daniel_davvid | 1:f20e1ea0302e | 211 | pc.printf("Humdity [ %3.2f %% ]\r\n\n", sensor.getHumidity()); |
daniel_davvid | 1:f20e1ea0302e | 212 | pc.printf("Compass: %2.3f\n", actualAngle); |
daniel_davvid | 1:f20e1ea0302e | 213 | pc.printf("Vertical angle: %1.3f\n", acos(vertG)/M_PI*180.0f); |
daniel_davvid | 1:f20e1ea0302e | 214 | pc.printf("Intensity: %5.2f lux\n", (bh.lux()/1.2f)); |
daniel_davvid | 1:f20e1ea0302e | 215 | pc.printf("Temp = %f\t Pres = %f\n", bmp.getTemperature(),bmp.getPressure()); |
daniel_davvid | 1:f20e1ea0302e | 216 | if (crtFrame == 0) { |
daniel_davvid | 1:f20e1ea0302e | 217 | lcd1.setPageAddress(0,0); |
daniel_davvid | 1:f20e1ea0302e | 218 | lcd1.setColumnAddress(0,127); |
daniel_davvid | 1:f20e1ea0302e | 219 | lcd1.printf("Compass: %3.0f", actualAngle); |
daniel_davvid | 1:f20e1ea0302e | 220 | //lcd.printf("Difference: %f\n", angleDiff(actualAngle, desiredAngle)); |
daniel_davvid | 1:f20e1ea0302e | 221 | |
daniel_davvid | 1:f20e1ea0302e | 222 | lcd1.setPageAddress(1,1); |
daniel_davvid | 1:f20e1ea0302e | 223 | lcd1.setColumnAddress(0,127); |
daniel_davvid | 1:f20e1ea0302e | 224 | lcd1.printf("Angle: %2.0f", acos(vertG)/M_PI*180.0f); |
daniel_davvid | 1:f20e1ea0302e | 225 | // lcd.printf("Angle: %2.3f", vertG); |
daniel_davvid | 1:f20e1ea0302e | 226 | |
daniel_davvid | 1:f20e1ea0302e | 227 | lcd1.setPageAddress(2,2); |
daniel_davvid | 1:f20e1ea0302e | 228 | lcd1.setColumnAddress(0,127); |
daniel_davvid | 1:f20e1ea0302e | 229 | lcd1.printf("LUX: %4.0f", (bh.lux()/1.2f)); |
daniel_davvid | 1:f20e1ea0302e | 230 | lcd1.setPageAddress(3,3); |
daniel_davvid | 1:f20e1ea0302e | 231 | lcd1.setColumnAddress(0,127); |
daniel_davvid | 1:f20e1ea0302e | 232 | lcd1.printf("Temp: %.1f", bmp.getTemperature()); |
daniel_davvid | 1:f20e1ea0302e | 233 | lcd1.setPageAddress(4,4); |
daniel_davvid | 1:f20e1ea0302e | 234 | lcd1.setColumnAddress(0,127); |
daniel_davvid | 1:f20e1ea0302e | 235 | lcd1.printf("Press: %4.f", bmp.getPressure()); |
daniel_davvid | 1:f20e1ea0302e | 236 | lcd1.setPageAddress(5,5); |
daniel_davvid | 1:f20e1ea0302e | 237 | lcd1.setColumnAddress(0,127); |
daniel_davvid | 1:f20e1ea0302e | 238 | lcd1.printf("Max: %d", maxAnglLimit.read()); |
daniel_davvid | 1:f20e1ea0302e | 239 | lcd1.setPageAddress(6,6); |
daniel_davvid | 1:f20e1ea0302e | 240 | lcd1.setColumnAddress(0,127); |
daniel_davvid | 1:f20e1ea0302e | 241 | lcd1.printf("Min: %d", minAnglLimit.read()); |
daniel_davvid | 1:f20e1ea0302e | 242 | lcd1.setPageAddress(7,7); |
daniel_davvid | 1:f20e1ea0302e | 243 | lcd1.setColumnAddress(0,127); |
daniel_davvid | 1:f20e1ea0302e | 244 | lcd1.printf("PIR: %s", pirDetectionOccured ? "DETECTED" : "NOTHING "); |
daniel_davvid | 1:f20e1ea0302e | 245 | |
daniel_davvid | 1:f20e1ea0302e | 246 | lcd2.setPageAddress(0,0); |
daniel_davvid | 1:f20e1ea0302e | 247 | lcd2.setColumnAddress(0,127); |
daniel_davvid | 1:f20e1ea0302e | 248 | lcd2.printf("AZMT: %.2f", sun.azimuth()); |
daniel_davvid | 1:f20e1ea0302e | 249 | lcd2.setPageAddress(1,1); |
daniel_davvid | 1:f20e1ea0302e | 250 | lcd2.setColumnAddress(0,127); |
daniel_davvid | 1:f20e1ea0302e | 251 | lcd2.printf("ELV: %.2f",sun.elevation()); |
daniel_davvid | 1:f20e1ea0302e | 252 | |
daniel_davvid | 1:f20e1ea0302e | 253 | //MAXI17043 |
daniel_davvid | 1:f20e1ea0302e | 254 | lcd2.setPageAddress(2,2); |
daniel_davvid | 1:f20e1ea0302e | 255 | lcd2.setColumnAddress(0,127); |
daniel_davvid | 1:f20e1ea0302e | 256 | lcd2.printf("Vcell: %.2f\n", fuelGauge.getFloatVCell()); |
daniel_davvid | 1:f20e1ea0302e | 257 | lcd2.setPageAddress(3,3); |
daniel_davvid | 1:f20e1ea0302e | 258 | lcd2.setColumnAddress(0,127); |
daniel_davvid | 1:f20e1ea0302e | 259 | lcd2.printf("Battery: %.2f\n", fuelGauge.getFloatSOC()); |
daniel_davvid | 1:f20e1ea0302e | 260 | |
daniel_davvid | 1:f20e1ea0302e | 261 | //SHT15 |
daniel_davvid | 1:f20e1ea0302e | 262 | lcd2.setPageAddress(4,4); |
daniel_davvid | 1:f20e1ea0302e | 263 | lcd2.setColumnAddress(0,127); |
daniel_davvid | 1:f20e1ea0302e | 264 | lcd2.printf("Temp: %3.2f C", sensor.getTemperature()); |
daniel_davvid | 1:f20e1ea0302e | 265 | lcd2.setPageAddress(5,5); |
daniel_davvid | 1:f20e1ea0302e | 266 | lcd2.setColumnAddress(0,127); |
daniel_davvid | 1:f20e1ea0302e | 267 | lcd2.printf("Hum: %3.2f%%", sensor.getHumidity()); |
daniel_davvid | 1:f20e1ea0302e | 268 | lcd2.setPageAddress(6,6); |
daniel_davvid | 1:f20e1ea0302e | 269 | lcd2.setColumnAddress(0,127); |
daniel_davvid | 1:f20e1ea0302e | 270 | lcd2.printf("Crt: %03.1fmA", getCrtConsumption()*1000); |
daniel_davvid | 1:f20e1ea0302e | 271 | lcd2.setPageAddress(7,7); |
daniel_davvid | 1:f20e1ea0302e | 272 | lcd2.setColumnAddress(0,127); |
daniel_davvid | 1:f20e1ea0302e | 273 | probe[0]->convertTemperature(true, DS1820::all_devices); |
daniel_davvid | 1:f20e1ea0302e | 274 | lcd2.printf("Temp %2.1f C",probe[0]->temperature()); |
daniel_davvid | 1:f20e1ea0302e | 275 | |
daniel_davvid | 1:f20e1ea0302e | 276 | } |
daniel_davvid | 1:f20e1ea0302e | 277 | else { |
daniel_davvid | 1:f20e1ea0302e | 278 | } |
daniel_davvid | 1:f20e1ea0302e | 279 | crtFrame = (crtFrame + 1) & 1; |
daniel_davvid | 0:e42837021e1a | 280 | } |
daniel_davvid | 0:e42837021e1a | 281 | } |
daniel_davvid | 0:e42837021e1a | 282 | } |
daniel_davvid | 0:e42837021e1a | 283 | |
daniel_davvid | 0:e42837021e1a | 284 | double angleDiff(double a, double b) |
daniel_davvid | 0:e42837021e1a | 285 | { |
daniel_davvid | 0:e42837021e1a | 286 | double diff = a - b; |
daniel_davvid | 0:e42837021e1a | 287 | |
daniel_davvid | 0:e42837021e1a | 288 | if (diff > 180) |
daniel_davvid | 0:e42837021e1a | 289 | diff -= 360; |
daniel_davvid | 0:e42837021e1a | 290 | if (diff < -180) |
daniel_davvid | 0:e42837021e1a | 291 | diff += 360; |
daniel_davvid | 0:e42837021e1a | 292 | return diff; |
daniel_davvid | 0:e42837021e1a | 293 | } |
daniel_davvid | 0:e42837021e1a | 294 | |
daniel_davvid | 1:f20e1ea0302e | 295 | int getWaterLevel(){ |
daniel_davvid | 0:e42837021e1a | 296 | float value; |
daniel_davvid | 0:e42837021e1a | 297 | value = waterLevel.read() *1000; |
daniel_davvid | 0:e42837021e1a | 298 | if (value<=150) { |
daniel_davvid | 0:e42837021e1a | 299 | value=0; |
daniel_davvid | 0:e42837021e1a | 300 | } else if (value>150 && value<=210) { |
daniel_davvid | 0:e42837021e1a | 301 | value=1/4; |
daniel_davvid | 0:e42837021e1a | 302 | } else if (value>210 && value<=250) { |
daniel_davvid | 0:e42837021e1a | 303 | value=1/2; |
daniel_davvid | 0:e42837021e1a | 304 | } else if (value>250 && value<=350) { |
daniel_davvid | 0:e42837021e1a | 305 | value=3/4;; |
daniel_davvid | 0:e42837021e1a | 306 | } else if (value>350) { |
daniel_davvid | 0:e42837021e1a | 307 | value=1; |
daniel_davvid | 0:e42837021e1a | 308 | } |
daniel_davvid | 0:e42837021e1a | 309 | value=value*100; //final data in x% |
daniel_davvid | 0:e42837021e1a | 310 | return value; |
daniel_davvid | 0:e42837021e1a | 311 | } |
daniel_davvid | 0:e42837021e1a | 312 | |
daniel_davvid | 1:f20e1ea0302e | 313 | float getCrtConsumption(){ |
daniel_davvid | 0:e42837021e1a | 314 | //VOUT=Vcc/2+i*VCC/36.7 |
daniel_davvid | 0:e42837021e1a | 315 | //i=36.7*Vout/Vcc-18.3 |
daniel_davvid | 0:e42837021e1a | 316 | |
daniel_davvid | 1:f20e1ea0302e | 317 | float result = 36.7f * crtConsumption.read() - 18.3f; |
daniel_davvid | 1:f20e1ea0302e | 318 | result = result < 0 ? 0.0f : result; |
daniel_davvid | 1:f20e1ea0302e | 319 | |
daniel_davvid | 1:f20e1ea0302e | 320 | return result; |
daniel_davvid | 1:f20e1ea0302e | 321 | } |
daniel_davvid | 1:f20e1ea0302e | 322 | |
daniel_davvid | 1:f20e1ea0302e | 323 | void updatePirState() { |
daniel_davvid | 1:f20e1ea0302e | 324 | pirDetectionOccured = pir.read() != 0; |
daniel_davvid | 0:e42837021e1a | 325 | } |