class OneShotTimer {
public:
OneShotTimer(uint8_t pin, const char* lbl):
m_pin(pin), m_label(lbl)
{
pinMode(m_pin, OUTPUT);
}
void start(float a, float b){
m_x = a;
m_y = b;
}
void pour(float ml) {
digitalWrite(m_pin, HIGH);
m_startTime = millis();
m_setTime = calcDelay(m_x, m_y, ml);
Serial.print("Start: ");
Serial.print(m_label);
Serial.print(", amount: ");
Serial.print(int(ml));
Serial.print(", duration: ");
Serial.print(m_setTime);
Serial.println(" ms.");
m_running = 1;
}
void run() {
if (millis() - m_startTime >= m_setTime && m_running) {
digitalWrite(m_pin, LOW);
Serial.print("Stop: ");
Serial.println(m_label);
m_running = 0;
}
}
uint32_t calcDelay(float a, float b, int ml) {
double val = a * (ml^2) + b * ml;
return (uint32_t) val;
}
private:
const char* m_label;
uint8_t m_pin;
uint8_t m_running;
uint32_t m_startTime;
uint32_t m_setTime;
uint8_t m_x;
uint8_t m_y;
};
#define pompa_a 7
#define pompa_b 8
#define pompa_c 9
#define pompa_d 10
OneShotTimer pumpA(pompa_a, "PUMP A");
OneShotTimer pumpB(pompa_b, "PUMP B");
OneShotTimer pumpC(pompa_c, "PUMP C");
OneShotTimer pumpD(pompa_d, "PUMP D");
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pumpA.start(-0.0568, 66.154);
pumpB.start(-0.0268, 53.651);
pumpC.start(-0.0223, 49.775);
pumpD.start(-0.0505, 64.876);
pumpA.pour(80);
}
void loop() {
pumpA.run();
pumpB.run();
pumpC.run();
pumpD.run();
}