Relay blinking

I have a working sketch. I have a 8 channel sainsmart 5v relay board connected to my Mega. I am able to push a button and turn off 2 relays for a set amount of time and have them come back on. I am trying now to implement if a temperature gets too high, to turn off a relay (heater) and turn on an led until the heat comes down. So far the LED comes on until temp falls back down, however the set relay blinks instead of completely going off. Heres my code: its towards the bottom

//Libraries Included
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <EEPROM.h>

// Other Pins Used
int pushButton = 22;
int ledPin = 13;
int ledTemp = 12;
#define RELAY1 53
#define RELAY2 52
#define RELAY3 51
#define RELAY4 50
#define RELAY5 49
#define RELAY6 48
#define RELAY7 47
#define RELAY8 46

// ----------------------------For Temp Sensor information----------------------------

#define ONE_WIRE_BUS_W 9 //Water Temp sensor
// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWireW(ONE_WIRE_BUS_W);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensorW(&oneWireW); //water sensor
// arrays to hold device addresses
DeviceAddress insideThermometer, outsideThermometer;

// function that will be called when an alarm condition exists during DallasTemperatures::processAlarms();
void newAlarmHandler(uint8_t* deviceAddress)
{
Serial.println("Alarm Handler Start");
printAlarmInfo(deviceAddress);
printTemp(deviceAddress);
Serial.println();
Serial.println("Alarm Handler Finish");
}

void printCurrentTemp(DeviceAddress deviceAddress)
{
printAddress(deviceAddress);
printTemp(deviceAddress);
Serial.println();
}

void printAddress(DeviceAddress deviceAddress)
{
Serial.print("Address: ");
for (uint8_t i = 0; i < 8; i++)
{
if (deviceAddress < 16) Serial.print("0");
_ Serial.print(deviceAddress*, HEX);_
_
}_
_
Serial.print(" ");_
_
}_
void printTemp(DeviceAddress deviceAddress)
_
{_
_
float tempC = sensorW.getTempC(deviceAddress);_
if (tempC != DEVICE_DISCONNECTED)
_
{_
_
Serial.print("Current Temp C: ");_
_
Serial.print(tempC);_
_
}_
_
else Serial.print("DEVICE DISCONNECTED");_
_
Serial.print(" ");_
_
}_
void printAlarmInfo(DeviceAddress deviceAddress)
_
{_
_
char temp;_
_
printAddress(deviceAddress);_
_
temp = sensorW.getHighAlarmTemp(deviceAddress);_
_
Serial.print("High Alarm: ");_
_
Serial.print(temp, DEC);_
_
Serial.print("C");_
_
Serial.print(" Low Alarm: ");_
_
temp = sensorW.getLowAlarmTemp(deviceAddress);_
_
Serial.print(temp, DEC);_
_
Serial.print("C");_
_
Serial.print(" ");_
_
}_
_
//---------------------------END-------------------------------------------_
void setup() //----------------------------------SETUP--------------------------
_
{ _
_
// Start Serial*_
* Serial.begin(9600);*
// For Relays, led, and push button
* pinMode(RELAY1, OUTPUT); *
* pinMode(RELAY2, OUTPUT);*
* pinMode(RELAY3, OUTPUT);*
* pinMode(RELAY4, OUTPUT);*
* pinMode(RELAY5, OUTPUT); *
* pinMode(RELAY6, OUTPUT);*
* pinMode(RELAY7, OUTPUT);*
* pinMode(RELAY8, OUTPUT);*
* pinMode(pushButton, INPUT);*
* pinMode(ledPin, OUTPUT);*
* pinMode(ledTemp, OUTPUT);*
* // ------------------------------For temp sensor------------------------*
* sensorW.begin(); //start up temperature library*
* // locate devices on the bus*
* Serial.print("Found ");*
* Serial.print(sensorW.getDeviceCount(), DEC);*
* Serial.println(" devices.");*
* // search for devices on the bus and assign based on an index*
* if (!sensorW.getAddress(insideThermometer, 0)) Serial.println("Unable to find address for Device 0");*
* if (!sensorW.getAddress(outsideThermometer, 1)) Serial.println("Unable to find address for Device 1");*
* Serial.print("Device insideThermometer ");*
* printAlarmInfo(insideThermometer);*
* Serial.println();*

* Serial.print("Device outsideThermometer ");*
* printAlarmInfo(outsideThermometer);*
* Serial.println();*

* // set alarm ranges*
* Serial.println("Setting alarm temps...");*
* sensorW.setHighAlarmTemp(insideThermometer, 26);*
* sensorW.setLowAlarmTemp(insideThermometer, 22);*

* Serial.print("New insideThermometer ");*
* printAlarmInfo(insideThermometer);*
* Serial.println();*

* Serial.print("New outsideThermometer ");*
* printAlarmInfo(outsideThermometer);*
* Serial.println();*
* // attach alarm handler*
* sensorW.setAlarmHandler(&newAlarmHandler);*
}
void loop() //--------------------------------LOOP--------------------------------------
{
* //RELAY FUNCTIONS FOR FEEDING*
* digitalWrite(RELAY1,LOW); // Turns ON Relays 1*
* digitalWrite(RELAY2,LOW); // Turns ON Relays 2*
* digitalWrite(RELAY3,LOW); // Turns ON Relays 3*
* digitalWrite(RELAY4,LOW); // Turns ON Relays 4 Heater*
* digitalWrite(RELAY5,LOW); // Turns ON Relays 5 RETURN PUMP*
* digitalWrite(RELAY6,LOW); // Turns ON Relays 6 SKIMMER*
* digitalWrite(RELAY7,LOW); // Turns ON Relays 7*
* digitalWrite(RELAY8,LOW); // Turns ON Relays 8 *
* {*
* if (digitalRead(pushButton) == HIGH) {*
* digitalWrite(ledPin, HIGH);*
* digitalWrite(RELAY5, HIGH);*
* digitalWrite(RELAY6, HIGH);*
* delay(5000);*
* Serial.println("Feed Mode");*
* }*
* else {*
* digitalWrite(ledPin, LOW);*
* digitalWrite(RELAY5,LOW);*
* digitalWrite(RELAY6,LOW);*
* }*

//-------------------------------------Temp Sensor-----------------------------------
// ask the devices to measure the temperature
* sensorW.requestTemperatures();*

* // if an alarm condition exists as a result of the most recent*
* // requestTemperatures() request, it exists until the next time*
* // requestTemperatures() is called AND there isn't an alarm condition*
* // on the device*
* if (sensorW.hasAlarm())*
* {*
* digitalWrite(ledTemp, HIGH);*
* digitalWrite(RELAY4, HIGH);*
* Serial.println("Temp High.");*
* }*
* // call alarm handler function defined by sensors.setAlarmHandler*
* // for ea :Pch device reporting an alarm*
* sensorW.processAlarms();*
* if (!sensorW.hasAlarm())*
* {*
* digitalWrite(ledTemp, LOW);*
* digitalWrite(RELAY4, LOW);*
* // just print out the current temperature*
* printCurrentTemp(insideThermometer);*
* }*
* }*
}

Pleas use the Code tag

its the button with a # on it

Otherwise its unreadable

Yes, I agree with roger.

Definitely use the # button above the smileys in the forum post edit window just to see it make code tags.
Or Quote this post and see what they look like below.

   if (digitalRead(pushButton) == HIGH) {
   digitalWrite(ledPin, HIGH);
   digitalWrite(RELAY5, HIGH);
   digitalWrite(RELAY6, HIGH);
   delay(5000);
   Serial.println("Feed Mode");
   }

When the pushButton pin goes HIGH,

  1. the led lights
  2. the pump relay is given current
  3. the skimmer relay is given current
  4. for 5 complete seconds NOTHING IS DONE. No sensor or button is read, nothing can react to any change.
  5. serial prints "Feed Mode"
  6. the rest of the program now gets a chance to execute

Where do you think the hangup could be?

Here is why that's a problem and how to get around that explained in clear, simple terms:

//Libraries Included
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <EEPROM.h>


// Other Pins Used
int pushButton = 22;
int ledPin = 13;
int ledTemp = 12;
#define RELAY1  53                        
#define RELAY2  52                        
#define RELAY3  51                        
#define RELAY4  50
#define RELAY5  49                        
#define RELAY6  48                        
#define RELAY7  47                        
#define RELAY8  46


// ----------------------------For Temp Sensor information----------------------------

#define ONE_WIRE_BUS_W 9 //Water Temp sensor
// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWireW(ONE_WIRE_BUS_W);
// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensorW(&oneWireW);      //water sensor
// arrays to hold device addresses
DeviceAddress insideThermometer, outsideThermometer;

// function that will be called when an alarm condition exists during DallasTemperatures::processAlarms();
void newAlarmHandler(uint8_t* deviceAddress)
{
  Serial.println("Alarm Handler Start");
  printAlarmInfo(deviceAddress);
  printTemp(deviceAddress);
  Serial.println();
  Serial.println("Alarm Handler Finish");
}

void printCurrentTemp(DeviceAddress deviceAddress)
{
  printAddress(deviceAddress);
  printTemp(deviceAddress);
  Serial.println();
}

void printAddress(DeviceAddress deviceAddress)
{
  Serial.print("Address: ");
  for (uint8_t i = 0; i < 8; i++)
  {
    if (deviceAddress[i] < 16) Serial.print("0");
    Serial.print(deviceAddress[i], HEX);
  }
  Serial.print(" ");
}

void printTemp(DeviceAddress deviceAddress)
{
  float tempC = sensorW.getTempC(deviceAddress);
  if (tempC != DEVICE_DISCONNECTED)
  {
    Serial.print("Current Temp C: ");
    Serial.print(tempC);
  }
  else Serial.print("DEVICE DISCONNECTED");
  Serial.print(" ");
}

void printAlarmInfo(DeviceAddress deviceAddress)
{
  char temp;
  printAddress(deviceAddress);
  temp = sensorW.getHighAlarmTemp(deviceAddress);
  Serial.print("High Alarm: ");
  Serial.print(temp, DEC);
  Serial.print("C");
  Serial.print(" Low Alarm: ");
  temp = sensorW.getLowAlarmTemp(deviceAddress);
  Serial.print(temp, DEC);
  Serial.print("C");
  Serial.print(" ");
}


//---------------------------END-------------------------------------------



void setup()  //----------------------------------SETUP--------------------------
{    
// Start Serial
  Serial.begin(9600);
// For Relays, led, and push button
  pinMode(RELAY1, OUTPUT);       
  pinMode(RELAY2, OUTPUT);
  pinMode(RELAY3, OUTPUT);
  pinMode(RELAY4, OUTPUT);
  pinMode(RELAY5, OUTPUT);       
  pinMode(RELAY6, OUTPUT);
  pinMode(RELAY7, OUTPUT);
  pinMode(RELAY8, OUTPUT);
  pinMode(pushButton, INPUT);
  pinMode(ledPin, OUTPUT);
  pinMode(ledTemp, OUTPUT);
  // ------------------------------For temp sensor------------------------
  sensorW.begin(); //start up temperature library
  // locate devices on the bus
  Serial.print("Found ");
  Serial.print(sensorW.getDeviceCount(), DEC);
  Serial.println(" devices.");

  // search for devices on the bus and assign based on an index
  if (!sensorW.getAddress(insideThermometer, 0)) Serial.println("Unable to find address for Device 0");
  if (!sensorW.getAddress(outsideThermometer, 1)) Serial.println("Unable to find address for Device 1");

  Serial.print("Device insideThermometer ");
  printAlarmInfo(insideThermometer);
  Serial.println();
  
  Serial.print("Device outsideThermometer ");
  printAlarmInfo(outsideThermometer);
  Serial.println();
  
  // set alarm ranges
  Serial.println("Setting alarm temps...");
  sensorW.setHighAlarmTemp(insideThermometer, 26);
  sensorW.setLowAlarmTemp(insideThermometer, 22);
  sensorW.setHighAlarmTemp(outsideThermometer, 25);
  sensorW.setLowAlarmTemp(outsideThermometer, 21);
  
  Serial.print("New insideThermometer ");
  printAlarmInfo(insideThermometer);
  Serial.println();
  
  Serial.print("New outsideThermometer ");
  printAlarmInfo(outsideThermometer);
  Serial.println();

  // attach alarm handler
  sensorW.setAlarmHandler(&newAlarmHandler);

}
 void loop() //--------------------------------LOOP--------------------------------------
{
  //RELAY FUNCTIONS FOR FEEDING
   digitalWrite(RELAY1,LOW);           // Turns ON Relays 1
   digitalWrite(RELAY2,LOW);           // Turns ON Relays 2
   digitalWrite(RELAY3,LOW);           // Turns ON Relays 3
   digitalWrite(RELAY4,LOW);           // Turns ON Relays 4 Heater
   digitalWrite(RELAY5,LOW);           // Turns ON Relays 5 RETURN PUMP
   digitalWrite(RELAY6,LOW);           // Turns ON Relays 6 SKIMMER
   digitalWrite(RELAY7,LOW);           // Turns ON Relays 7
   digitalWrite(RELAY8,LOW);           // Turns ON Relays 8  
   {
   if (digitalRead(pushButton) == HIGH) {
   digitalWrite(ledPin, HIGH);
   digitalWrite(RELAY5, HIGH);
   digitalWrite(RELAY6, HIGH);
   delay(5000);
   Serial.println("Feed Mode");
   }
   else {
     digitalWrite(ledPin, LOW);
     digitalWrite(RELAY5,LOW);
     digitalWrite(RELAY6,LOW);
   }
 }
//-------------------------------------Temp Sensor-----------------------------------
 // ask the devices to measure the temperature
  sensorW.requestTemperatures();
  
  // if an alarm condition exists as a result of the most recent
  // requestTemperatures() request, it exists until the next time
  // requestTemperatures() is called AND there isn't an alarm condition
  // on the device
  if (sensorW.hasAlarm())
  {
    digitalWrite(ledTemp, HIGH);
    digitalWrite(RELAY4, HIGH);
    Serial.println("HIGH TEMP");
  }
   else {
     digitalWrite(ledTemp, LOW);
     digitalWrite(RELAY4,LOW);
     
     
  // call alarm handler function defined by sensors.setAlarmHandler
  // for each device reporting an alarm
  sensorW.processAlarms();

  if (sensorW.hasAlarm())
  {
    digitalWrite(ledTemp, HIGH);
    digitalWrite(RELAY4, HIGH);
    Serial.println("HIGH TEMP");
  }
   else {
     digitalWrite(ledTemp, LOW);
     digitalWrite(RELAY4,LOW);
    // just print out the current temperature
    printCurrentTemp(insideThermometer);
    printCurrentTemp(outsideThermometer);
  }
  
  delay(1000);
}
}

Its not when the button is pressed its just normal operation. I usually clear the EEPROM and reload sketch and start squeezing the probe. But I will surely check out the link. Thanks

@Goforsmoke. I tried to implement that code from that site to handle the delay function but its as clear as mud for me. Thank you though. However, I still cant figure out why the other relay which I am trying to turn off by temperature is blinking vs going completely off until temp goes back down. If you can point me in the right direction (an example based on my sketch) for the other issue that would be much appreciated.
Thank yal

It looks like your loop() takes about 6 seconds to complete, so after 6 seconds the relays are set to on, whatever state they were set to previously. Is that what you really want?

I put your code in the IDE, ran Autoformat (in the Tools menu up top) and then added comments to show what should help. The "tell" variable is what most call "state", just different words for the same working.

I also moved some braces to be able to check indent levels and what is inside of what more quickly and easily.

//Libraries Included
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <EEPROM.h>


// Other Pins Used
int pushButton = 22;
int ledPin = 13;
int ledTemp = 12;

#define RELAY1  53                        
#define RELAY2  52                        
#define RELAY3  51                        
#define RELAY4  50
#define RELAY5  49                        
#define RELAY6  48                        
#define RELAY7  47                        
#define RELAY8  46


// ----------------------------For Temp Sensor information----------------------------

#define ONE_WIRE_BUS_W 9 //Water Temp sensor
// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWireW(ONE_WIRE_BUS_W);
// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensorW(&oneWireW);      //water sensor
// arrays to hold device addresses
DeviceAddress insideThermometer, outsideThermometer;

// function that will be called when an alarm condition exists during DallasTemperatures::processAlarms();
void newAlarmHandler(uint8_t* deviceAddress)
{
  Serial.println("Alarm Handler Start");
  printAlarmInfo(deviceAddress);
  printTemp(deviceAddress);
  Serial.println();
  Serial.println("Alarm Handler Finish");
}

void printCurrentTemp(DeviceAddress deviceAddress)
{
  printAddress(deviceAddress);
  printTemp(deviceAddress);
  Serial.println();
}

void printAddress(DeviceAddress deviceAddress)
{
  Serial.print("Address: ");
  for (uint8_t i = 0; i < 8; i++)
  {
    if (deviceAddress[i] < 16) Serial.print("0");
    Serial.print(deviceAddress[i], HEX);
  }
  Serial.print(" ");
}

void printTemp(DeviceAddress deviceAddress)
{
  float tempC = sensorW.getTempC(deviceAddress);        // GFS asks,   float? really?
  if (tempC != DEVICE_DISCONNECTED)
  {
    Serial.print("Current Temp C: ");
    Serial.print(tempC);
  }
  else Serial.print("DEVICE DISCONNECTED");
  Serial.print(" ");
}

void printAlarmInfo(DeviceAddress deviceAddress)
{
  char temp;
  printAddress(deviceAddress);
  temp = sensorW.getHighAlarmTemp(deviceAddress);
  Serial.print("High Alarm: ");
  Serial.print(temp, DEC);
  Serial.print("C");
  Serial.print(" Low Alarm: ");
  temp = sensorW.getLowAlarmTemp(deviceAddress);
  Serial.print(temp, DEC);
  Serial.print("C");
  Serial.print(" ");
}


//---------------------------END-------------------------------------------



void setup()  //----------------------------------SETUP--------------------------
{    
  // Start Serial
  Serial.begin(9600);
  // For Relays, led, and push button
  pinMode(RELAY1, OUTPUT);       
  pinMode(RELAY2, OUTPUT);
  pinMode(RELAY3, OUTPUT);
  pinMode(RELAY4, OUTPUT);
  pinMode(RELAY5, OUTPUT);       
  pinMode(RELAY6, OUTPUT);
  pinMode(RELAY7, OUTPUT);
  pinMode(RELAY8, OUTPUT);
  pinMode(pushButton, INPUT);
  pinMode(ledPin, OUTPUT);
  pinMode(ledTemp, OUTPUT);
  // ------------------------------For temp sensor------------------------
  sensorW.begin(); //start up temperature library
  // locate devices on the bus
  Serial.print("Found ");
  Serial.print(sensorW.getDeviceCount(), DEC);
  Serial.println(" devices.");

  // search for devices on the bus and assign based on an index
  if (!sensorW.getAddress(insideThermometer, 0)) Serial.println("Unable to find address for Device 0");
  if (!sensorW.getAddress(outsideThermometer, 1)) Serial.println("Unable to find address for Device 1");

  Serial.print("Device insideThermometer ");
  printAlarmInfo(insideThermometer);
  Serial.println();

  Serial.print("Device outsideThermometer ");
  printAlarmInfo(outsideThermometer);
  Serial.println();

  // set alarm ranges
  Serial.println("Setting alarm temps...");
  sensorW.setHighAlarmTemp(insideThermometer, 26);
  sensorW.setLowAlarmTemp(insideThermometer, 22);
  sensorW.setHighAlarmTemp(outsideThermometer, 25);
  sensorW.setLowAlarmTemp(outsideThermometer, 21);

  Serial.print("New insideThermometer ");
  printAlarmInfo(insideThermometer);
  Serial.println();

  Serial.print("New outsideThermometer ");
  printAlarmInfo(outsideThermometer);
  Serial.println();

  // attach alarm handler
  sensorW.setAlarmHandler(&newAlarmHandler);

}
void loop() //--------------------------------LOOP--------------------------------------
{
// ===============================================================================  
// ===============================================================================  

// As Henry pointed these out, they probably do not belong here.
// pinMode( #, OUPUT ) makes the pin LOW by default

  //RELAY FUNCTIONS FOR FEEDING
  digitalWrite(RELAY1,LOW);           // Turns ON Relays 1
  digitalWrite(RELAY2,LOW);           // Turns ON Relays 2
  digitalWrite(RELAY3,LOW);           // Turns ON Relays 3
  digitalWrite(RELAY4,LOW);           // Turns ON Relays 4 Heater
  digitalWrite(RELAY5,LOW);           // Turns ON Relays 5 RETURN PUMP
  digitalWrite(RELAY6,LOW);           // Turns ON Relays 6 SKIMMER
  digitalWrite(RELAY7,LOW);           // Turns ON Relays 7
  digitalWrite(RELAY8,LOW);           // Turns ON Relays 8 
 
 
// ===============================================================================  
// ===============================================================================  

// You want button push to make led and relays go HIGH, wait 5 secs, then go LOW
// But you also do not want everything else to be stuck doing what it is during the time

// Loop() must run over and over to let each piece of code have a chance to read and do.

// To this end, I suggest that you break this into 3 parts, but I start with the last
// 3) wait 5 seconds then turn the led and relays off, but only when told to wait
//    at the end also to turn off the signal that tells this part to run.
// 2) turn the led and relays on, set up the time check for (3) and tell (3) to run.
// 1) check the button IF neither part (2) or (3) is running
//    I do not see any button debounce, this is a very good button?

// If there is a variable that says which part to run "now", that will do the "telling".
// So normally the variable is saying run part 1 to watch the button.
// Then part 1 gets the press and immediately changes the "tell" variable to run part 2.
//    Part 1 will not run until (2) and (3) are done. 
//    If you want different, that is more code. In time you might.
// Part 2 sets the led and relays and then the time check for (millis - start >= wait)
//    So the start is set to current millis() and the wait is always 5000, a constant.
//    And then part 2 changes the "tell" variable to run part 3.
// Part 3 is the time check and when time is up, switch off and 
//    change the "tell" to run part 1 again. Next loop() it is back to button watching.

  {
    if (digitalRead(pushButton) == HIGH) 
    {
      digitalWrite(ledPin, HIGH);
      digitalWrite(RELAY5, HIGH);
      digitalWrite(RELAY6, HIGH);
      delay(5000);
      Serial.println("Feed Mode");
    }
    else 
    {
      digitalWrite(ledPin, LOW);
      digitalWrite(RELAY5,LOW);
      digitalWrite(RELAY6,LOW);
    }
  }


// ===============================================================================  
// ===============================================================================  

//  This section also needs breaking to parts and its own "tell" variable.

  //-------------------------------------Temp Sensor-----------------------------------
  // ask the devices to measure the temperature
  sensorW.requestTemperatures();

  // if an alarm condition exists as a result of the most recent
  // requestTemperatures() request, it exists until the next time
  // requestTemperatures() is called AND there isn't an alarm condition
  // on the device
  if (sensorW.hasAlarm())
  {
    digitalWrite(ledTemp, HIGH);
    digitalWrite(RELAY4, HIGH);
    Serial.println("HIGH TEMP");
  }
  else 
  {
    digitalWrite(ledTemp, LOW);
    digitalWrite(RELAY4,LOW);


    // call alarm handler function defined by sensors.setAlarmHandler
    // for each device reporting an alarm
    sensorW.processAlarms();

    if (sensorW.hasAlarm())
    {
      digitalWrite(ledTemp, HIGH);
      digitalWrite(RELAY4, HIGH);
      Serial.println("HIGH TEMP");
    }
    else 
    {
      digitalWrite(ledTemp, LOW);
      digitalWrite(RELAY4,LOW);
      // just print out the current temperature
      printCurrentTemp(insideThermometer);
      printCurrentTemp(outsideThermometer);
    }

    delay(1000);
  }

// ===============================================================================  
// ===============================================================================  

}