Program for the water play project for the course Software Testing Practical 2016 given at the VU University
Dependencies: mbed DRV88255 TextLCD Ping mbed-rtos
Diff: PIDController.cpp
- Revision:
- 35:c9261391a995
- Parent:
- 32:1e4919a44196
- Child:
- 36:8aeb014bd651
--- a/PIDController.cpp Tue Jun 14 11:17:06 2016 +0000 +++ b/PIDController.cpp Tue Jun 14 15:31:30 2016 +0000 @@ -1,5 +1,7 @@ #include "PIDController.h" -#include "SalinityController.h" +#include "testing.h" + +DigitalOut heater(p18); DRV8825 mtr_fresh(p21, p27, p28, p29, p22, p23); DRV8825 mtr_salt(p24, p27, p28, p29, p25, p26); @@ -7,28 +9,31 @@ // This is called in the main loop on every iteration void PIDController::update() { - // You can use the variables temp, salt and proximity like this: + + // Control the heater + // This could be done in the pumping function as well, if needed + this->set_heating(temp->getValue() < 32.0f); + float s = this->salt->getValue(); float sInGrams = this->getSaltInGrams(); if(s <= 6.0) { float ml = this->getMlSaltyWater(sInGrams, this->proximity->getValue()); + int ml_int = static_cast<int>(ml); - printf("PIDCONTROLLER: need to pump %.3f ml of salty water\r\n", ml); + printf("PIDCONTROLLER: need to pump %d (%.3f) ml of salty water\r\n", ml_int, ml); - // MAYBE DO SOME ROUNDING HERE - - // CALL this->pump_salt_water + //this->pump_salt_water(ml_int); } else if(s >= 9.0) { float ml = this->getMlFreshWater(s, this->proximity->getValue()); - printf("PIDCONTROLLER: need to pump %.3f ml of fresh water\r\n", ml); + int ml_int = static_cast<int>(ml); - // MAYBE DO SOME ROUNDING HERE - - // CALL this->pump_fresh_water + printf("PIDCONTROLLER: need to pump %d (%.3f) ml of fresh water\r\n", ml_int, ml); + + //this->pump_fresh_water(ml_int); } } @@ -43,7 +48,7 @@ float currentppt = this->salt->getValue(); //in ppt float currentvol = this->proximity->getValue(); //in ml - return currentppt * (currentvol /1000); + return currentppt * (currentvol / 1000); } @@ -57,6 +62,7 @@ } void PIDController::pump_water(DRV8825 *mtr, int ml) { + int j = 5010 * (ml - 1); for (int i = 500; i < MAX_SPEED; i += 5) { @@ -84,8 +90,8 @@ for (int i = 8000; i > 500; i -= 5) { mtr->settings(1 / MICROSTEPS_PER_STEP, RIGHT, i); } - wait(3); + wait(3); } @@ -103,8 +109,30 @@ float outputml = (x1 / x2 * solvolume); return outputml; // amount in ml to get 7 ppt. +} + +bool PIDController::is_heating() { + return this->heating; +} + +void PIDController::set_heating(bool enabled) { + if(enabled == this->heating) return; + + this->heating = enabled; + if(enabled) { + #ifdef RUN_TESTS + printf("Should set heater to 1\r\n"); + #else + heater = 1; + #endif + } else { + #ifdef RUN_TESTS + printf("Should set heater to 0\r\n"); + #else + heater = 0; + #endif } - +} float PIDController::getMlFreshWater(float ppt, float volume) { return (volume * (ppt / 7.0)) - volume;