Using Millis to Turn On/Off Relay for a set interval

yes. i see the problem. it repeatedly executes these conditionals as long as the pressure exceeds the thresholds.

it needs to recognize that the compressor has been run and not do it again unless the pressure is back with range

consider

i added a compressorFlag, compressorOn() and an else condition to clear the flag

#include <Wire.h> //allows communication over i2c devices
#include <EEPROM.h> //Electronically erasable programmable memory library

#define MyHW
#ifdef MyHW
struct LiquidCrystal_I2C  {
    LiquidCrystal_I2C (int a, int b, int c)  { };

    void clear (void)            { Serial.println (); };
    void backlight (void)  { };
    void init  (void)  { };
    void setCursor  (int a, int b)  { };

    void print  (char *s)        { Serial.print (s); };
    void print  (const char *s)  { Serial.print (s); };
    void print  (int i)          { Serial.print (i); };
};

struct Bounce {
    void attach (int pin)  { };
    void interval (int i)  { };
    void update (void)  { };
};

const int  pressureInput = A0;

const byte RedEnd      = A1;

const byte ConcRelay1  = 10;
const byte ConcRelay2  = 11;
const byte CompRelay3  = 12;
const byte ValveRelay4 = 13;

const int Start = 88;
const int Stop  = 92;

const long solenoidInterval = 5000;
const long warmInterval     = 3000;

// -------------------------------------
#else

#include <LiquidCrystal_I2C.h> //allows interfacing with LCD screens
#include <Bounce2.h> //Button debouncing library

//Inputs
int pressureInput = A7; //sets the analog input pin for the pressure transducer
int RedEnd = 10; //sets address of end loop button on Nano digital pins

//Digital Outputs
int ConcRelay1 = 2; //sets address of concentrator1 relay on digital pins found on Nano
int ConcRelay2 = 3; //sets address of concentrator2 relay on digital pins found on Nano
int CompRelay3 = 4; //sets address of compressor relay on digital pins found on Nano
int ValveRelay4 = 5; //sets address of unloader valve relay on digital pins found on Nano

//Start and stop pressure values
const int Start = 40; //concentrators and compressor start at 40 PSI
const int Stop = 85; //concentrators and compressor stop at 85 PSI

const long solenoidInterval = 30000;  // 30 sec
const long warmInterval     = 15000;  // 15 sec

#endif

LiquidCrystal_I2C lcd (0x27, 16, 2); //sets the LCD I2C communication address; format (address, columns, rows)
Bounce debouncer = Bounce (); //instantiates a bounce object

// -----------------------------------------------------------------------------

// this is the EEPROM section
int eeAddress1 = 10;                // this sets the eeAddress1 tag and sets the address to 10, eeprom
int eeAddress2 = 20;                // this sets the eeAddress2 tag and sets the address to 20, eeprom

//Debounce section
byte butState;

// -----------------------------------------------------------------------------
void setup () //setup routine, runs once when system turned on or reset
{
    //  this section assigns the inputs and outputs
 
    // inputs
    pinMode (RedEnd,INPUT_PULLUP);              // End loop button
    butState = digitalRead (RedEnd);

    // outputs
    pinMode      (ConcRelay1, OUTPUT);            // concentrator1 relay
    digitalWrite (ConcRelay1, LOW);        // initially sets output tag "ConcRelay1" low
    pinMode      (ConcRelay2, OUTPUT);          // concentrator2 relay
    digitalWrite (ConcRelay2, LOW);       // initially sets output tag "ConcRelay2" low
    pinMode      (CompRelay3, OUTPUT);            // comperssor relay
    digitalWrite (CompRelay3, LOW);         // initially sets output tag "CompRelay3" low
    pinMode      (ValveRelay4, OUTPUT);         // unloader valve relay
    digitalWrite (ValveRelay4, LOW);      // initially sets output tag "ValveRelay4" low 
  
    // Retrieves the setpoints from the arduino eeprom so the unit can start up after a power fail
    EEPROM.get (eeAddress1, Start);         // retrieves the start psi from eeprom
    EEPROM.get (eeAddress2, Stop);          // retrieves the stop psi from eeprom
  
    //  Starts up the different libraries
    Serial.begin (9600); // start the serial monitor at 9600 baud
    lcd.init ();         // start the lcd library
    lcd.backlight ();    // turn on the lcd backlight
    lcd.clear ();        // clear the cld screen
    Wire.begin ();       // start the I2C library

    //Start up messge
    lcd.setCursor (2,0); //sets cursor to column 2, row 0
    lcd.print ("Hello There!"); //prints label
    lcd.setCursor (0,1); //sets cursor to column 0, row 1
    lcd.print ("Press button to start");

    lcd.clear ();
}

// -----------------------------------------------------------------------------
int compressorFlag;

void compressorOn (
    int     sec )
{
    if (! compressorFlag)  {
        compressorFlag = 1;
        digitalWrite (ValveRelay4 , HIGH);
        delay (sec);
        digitalWrite (ValveRelay4 , LOW);
    }
}

// -----------------------------------------------------------------------------
void monitor ()
{
    // measure pressure
    int psi = analogRead (pressureInput);
    psi = map (psi, 102, 922, 0, 150);

    // report pressure change
        char s [40];
        sprintf (s, "%3d psi, %3d min, %3d max", psi, Start, Stop);

        lcd.clear     ();
        lcd.setCursor (0,0);
        lcd.print     (s);

    // check for stop condition
    if (psi >= Stop )  {
        digitalWrite (ConcRelay1 ,  LOW);
        digitalWrite (ConcRelay2 ,  LOW);
        digitalWrite (CompRelay3 ,  LOW);

        compressorOn (solenoidInterval);
    }

    else if (psi <= Start){
        digitalWrite (ConcRelay1 , HIGH);
        digitalWrite (ConcRelay2 , HIGH);

        compressorOn (warmInterval);

        digitalWrite (CompRelay3 , HIGH);
    }
    else
        compressorFlag = 0;
}

// -----------------------------------------------------------------------------
void loop ()
{
    enum { ST_IDLE, ST_RUN, ST_SHUTDOWN };
    static int state = ST_IDLE;

    switch (state)  {
    case ST_RUN:
        monitor ();
        break;

    case ST_SHUTDOWN:
        digitalWrite (ConcRelay1 ,  LOW);
        digitalWrite (ConcRelay2 ,  LOW);
        digitalWrite (CompRelay3 ,  LOW); 
        digitalWrite (ValveRelay4 , HIGH);

        lcd.clear ();
        lcd.setCursor (1,0); //sets cursor to column 1, row 0
        lcd.print ("Program Ended!"); //prints label

        state = ST_IDLE;
        break;

    case ST_IDLE:
        break;
    }

    byte but = digitalRead (RedEnd);
    if (butState != but)  {
        butState = but;
        delay (10);         // debounce

        if (LOW == but)  {  // press
            if (ST_IDLE == state)
                state = ST_RUN;
            else
                state = ST_SHUTDOWN;
        }
    }
}
1 Like