diff --git a/PumpStateMachine.ino b/PumpStateMachine.ino new file mode 100644 index 0000000..6e5b507 --- /dev/null +++ b/PumpStateMachine.ino @@ -0,0 +1,83 @@ +#include + +const int lowTriggerPin = 2; +const int highTriggerPin = 3; +const int ledPin = 13; // the number of the LED pin +const int relay = 7; + +StateMachine machine = StateMachine(); + +State* S0 = machine.addState(&state0); // Waiting for trigger +State* S1 = machine.addState(&state1); // Pump +State* S2 = machine.addState(&state2); // Stop Pump + +void setup() { + Serial.begin(115200); + // initialize the LED pin as an output: + pinMode(ledPin, OUTPUT); + // initialize the waterlevel sensors pin as an input: + pinMode(lowTriggerPin, INPUT); + pinMode(highTriggerPin, INPUT); + // initialize the relay pin: + pinMode(relay, OUTPUT); + + S0->addTransition(&transitionS0S1,S1); // S0 transition to S1 + S1->addTransition(&transitionS1S2,S2); // S1 transition to S2 + S2->addTransition(&transitionS2S0,S0); // S2 transition to S0 + S2->addTransition(&transitionS2S1,S1); // S2 transition to S1 +} + +void loop() { + machine.run(); +} + +void state0(){ + Serial.println("State 0"); + Serial.println("waiting for trigger"); +} + +bool transitionS0S1(){ + if(digitalRead(lowTriggerPin) == HIGH && digitalRead(highTriggerPin) == HIGH){ + return true; + } + // Should never happen... + if(digitalRead(lowTriggerPin) == LOW && digitalRead(highTriggerPin) == HIGH){ + return true; + } + return false; +} + +void state1(){ + Serial.println("State 1"); + Serial.println("Start pumping..."); + digitalWrite(ledPin, HIGH); + digitalWrite(relay, HIGH); +} + +bool transitionS1S2(){ + if(digitalRead(lowTriggerPin) == LOW && digitalRead(highTriggerPin) == LOW){ + return true; + } + return false; +} + +void state2(){ + Serial.println("State 1"); + Serial.println("Stop pumping..."); + digitalWrite(ledPin, LOW); + digitalWrite(relay, LOW); +} + +bool transitionS2S0(){ + if(digitalRead(lowTriggerPin) == LOW && digitalRead(highTriggerPin) == LOW){ + return true; + } + return false; +} + +bool transitionS2S1(){ + if(digitalRead(lowTriggerPin) == HIGH && digitalRead(highTriggerPin) == LOW){ + return true; + } + return false; +} diff --git a/README.md b/README.md index bdd7227..4c9e3a8 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,15 @@ # PumpStateMachine +# DehumidifierPumpController +This is a little program written for an arduino to control a pump with two induction switches. + +Used components: +- 2x [Induction Switch](https://www.aliexpress.com/item/32965219918.html?spm=a2g0o.order_list.order_list_main.5.21ef586aXBF9dz) or 1x [Float Switch](https://s.click.aliexpress.com/e/_DCIed4F) +- 1x [Water Pump](https://www.aliexpress.com/item/32859594599.html?spm=a2g0s.9042311.0.0.27424c4dypXzoO) +- 1x [5V Relay](https://www.aliexpress.com/item/32358134833.html?spm=a2g0s.9042311.0.0.27424c4dyynnLY) +- 1x [Arduino Uno R3](https://www.aliexpress.com/item/32831857482.html?spm=a2g0o.productlist.0.0.19f16140AZZgOJ&aem_p4p_detail=202107131539031573662234321060028453385) +- 1x [12v Powersupply](https://s.click.aliexpress.com/e/_AWcEVU) +- 1x [Female DC Jack](https://www.aliexpress.com/item/32815757637.html?spm=a2g0s.9042311.0.0.27424c4dMtkAO7) +- 1x [Box (example)](https://s.click.aliexpress.com/e/_A2Mksa) +- 1x [12v to 5v for the Arduino](https://s.click.aliexpress.com/e/_AtmkyE) +- 1x [Outside connector to connect pump and float switch](https://s.click.aliexpress.com/e/_AVMj3k) \ No newline at end of file