Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define RELAY_PIN 2
- #define HUMIDITY_SENSOR_VCC_C1 3
- #define HUMIDITY_SENSOR_PIN_C1 A4 // Down sensor
- #define HUMIDITY_SENSOR_VCC_C2 4
- #define HUMIDITY_SENSOR_PIN_C2 A5 // Up sensor
- #define HUMIDITY_TRESHOLD 300
- static int _g_pump_cycles = 0;
- #define MAX_PUMP_CYCLES 10
- #define LED_SCANNING LED_BUILTIN // = 13
- #define LED_PUMPING 5
- #define LED_WARNING 6
- #define LED_OK 7
- int _read_humidity_sensor(int __vcc, int __sensor) {
- int __value;
- ::digitalWrite(__vcc, HIGH); // Power up sensor
- ::digitalWrite(LED_SCANNING, HIGH); // Scanning led on to show activity
- ::delay(500); // Wait a little bit until sensor is ready
- __value = ::analogRead(__sensor);
- ::digitalWrite(__vcc, LOW); // Sensor off
- ::digitalWrite(LED_SCANNING, LOW); // Activity led off
- return 1023 - __value;// Capture range is 0..1023
- }
- // Helpers
- void _pump_on() {
- ::digitalWrite(RELAY_PIN, LOW); // Pump on
- ::digitalWrite(LED_PUMPING, HIGH);
- _g_pump_cycles++;
- }
- void _pump_off() {
- ::digitalWrite(RELAY_PIN, HIGH);// Pump off
- ::digitalWrite(LED_PUMPING, LOW);
- _g_pump_cycles = 0;
- }
- void setup() {
- // Usual pin setup
- ::pinMode(LED_SCANNING, OUTPUT);
- ::pinMode(LED_PUMPING, OUTPUT);
- ::pinMode(LED_WARNING, OUTPUT);
- ::pinMode(LED_OK, OUTPUT);
- ::pinMode(RELAY_PIN, OUTPUT);
- ::pinMode(HUMIDITY_SENSOR_VCC_C1, OUTPUT);
- ::pinMode(HUMIDITY_SENSOR_VCC_C2, OUTPUT);
- // Ensure pump is off
- _pump_off();
- ::delay(2000); // Safety delay
- }
- void loop() {
- // Read both sensors
- bool __c1 = _read_humidity_sensor(HUMIDITY_SENSOR_VCC_C1, HUMIDITY_SENSOR_PIN_C1) > HUMIDITY_TRESHOLD,
- __c2 = _read_humidity_sensor(HUMIDITY_SENSOR_VCC_C2, HUMIDITY_SENSOR_PIN_C2) > HUMIDITY_TRESHOLD;
- // Update the green led
- if(!__c1 && !__c2) {
- ::digitalWrite(LED_WARNING, LOW); // Reset warning
- ::digitalWrite(LED_OK, HIGH);
- } else {
- ::digitalWrite(LED_OK, LOW);
- }
- if(__c2 && !__c1) { // Should not happen; go safety mode
- _pump_off();
- ::digitalWrite(LED_WARNING, HIGH);
- ::delay(60*1000); // Wait 1 minute
- return;
- }
- if(__c2) { // up sensor on => Pump on
- _pump_on();
- } else {
- if(!__c1) { // down sensor off => Pump off
- _pump_off();
- } else {
- // c2 is off, c1 is on => Pump is working; do nothing except safety check in case of c1 failure
- if(_g_pump_cycles > MAX_PUMP_CYCLES) { // Pumping too much; something is wrong, wait a little bit
- _pump_off();
- ::delay(60*1000); // Wait 1 minute
- } else {
- // Nothing to do
- }
- }
- }
- ::delay(5000);// Next loop in 5 secs
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement