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 Daniel David

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?

UserRevisionLine numberNew 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 }