Problem with relay and if statement

Hi all,

I'm trying to build a setup for some lab test; I'm very new to arduino.

The Idea is to have 3 IR pairs run and log passes, and at the same time have 3 magnets cylcing trough a setup every 8 hours. (for testing purpose its coded 20 sec cycles.

I hooked up the leds, relay and a DS1307 for logging. All went fine untill I added the relay code.

The relay does not seem to work when being instructed by an IF statement. Its a 5v relay powered by arduino. It works fine if I code it with delays, but this will mess up my sensor readings. What I want is the relay to act on a certain time given by the DS1307.

I can see the leds blinking but I cant hear the clicks. Sometimes a click comes up but it won't do anything. Also sometimes the leds blink.

Any help of were to look will be appreciated!

#include <DS1307RTC.h>
#include <Time.h>
#include <TimeLib.h>
#include <Wire.h>

int pd=2;                     
int pd2=3;
int pd3=4;
int RELAY1 = 5;                 
int RELAY2 = 6;                
int RELAY3 = 7;
int timePower=8;
int relayPower= 13;                 
 int senRead=A0;                
 int senRead2=A1;
 int senRead3=A2;
 int limit=600;                 
   int Left=1;                   
   int Center=1;
   int Right=1;


 void setup()    
 {  
  pinMode(pd,OUTPUT);  
  pinMode(pd2,OUTPUT);  
  pinMode(pd3,OUTPUT);
  pinMode(relayPower,OUTPUT);
  pinMode(timePower,OUTPUT);
    digitalWrite(timePower,HIGH);
    digitalWrite(pd,HIGH);     
    digitalWrite(pd2,HIGH);       
    digitalWrite(pd3,HIGH);
    digitalWrite(relayPower,HIGH);   
         pinMode(RELAY1,OUTPUT);       
         pinMode(RELAY2,OUTPUT);
         pinMode(RELAY3,OUTPUT);

Serial.begin(9600);         
while (!Serial); 

} 
 
 void loop()  

{
tmElements_t tm; 

if (RTC.read(tm)){

 
if (tm.Second >= 0 && tm.Second <20) {         

 

digitalWrite (RELAY1,HIGH);         
digitalWrite (RELAY2,LOW); 
digitalWrite (RELAY3,LOW);      
}

else if (tm.Second >=20 && tm.Second < 40) {       
                        
digitalWrite (RELAY1,LOW); 
digitalWrite (RELAY2,HIGH);
digitalWrite (RELAY3,LOW);          
         
}  

else if (tm.Second >= 40 && tm.Second <59) {       
                   
digitalWrite (RELAY1,LOW); 
digitalWrite (RELAY2,LOW);
digitalWrite (RELAY3,HIGH); }      

 {  
  int val=analogRead(senRead); 
  int val2=analogRead(senRead2);  
  int val3=analogRead(senRead3);  


  if (val > limit) {

      Serial.print("Left: ");          
      Serial.print(Left++);
      Serial.print(" passes");
      Serial.print("\t Center: ");
      Serial.print(Center);
      Serial.print(" passes");
      Serial.print("\t Right: ");
      Serial.print(Right);
      Serial.print(" passes \t");
Serial.print(tm.Hour);
Serial.print(":");
Serial.print(tm.Minute);
Serial.print(":");
Serial.println(tm.Second);
delay(25);
  }


    if (val2 > limit) {  
    
      Serial.print("Left: ");          
      Serial.print(Left);
      Serial.print(" Passes");
      Serial.print("\t Center: ");
      Serial.print(Center++);
      Serial.print(" passes");
      Serial.print("\t Right: ");
      Serial.print(Right);
      Serial.print(" passes\t");
      Serial.print(tm.Hour);
Serial.print(":");
Serial.print(tm.Minute);
Serial.print(":");
Serial.println(tm.Second);
delay(25);
  }

    if (val3 > limit) {

      Serial.print("Left: ");            
      Serial.print(Left);
      Serial.print(" passes");
      Serial.print("\t Center: ");
      Serial.print(Center);
      Serial.print(" passes");
      Serial.print("\t Right: ");
      Serial.print(Right++);
      Serial.println(" passes\t");
      Serial.print(tm.Hour);
Serial.print(":");
Serial.print(tm.Minute);
Serial.print(":");
 Serial.println(tm.Second);
delay(25);
    }}
  
  }

   else {
    if (RTC.chipPresent()) {
      Serial.println("Klok geeft geen tijd");
      Serial.println("er lijk nog wel leven in te zitten");
      Serial.println();
    } else {
      Serial.println("DS1307 error, check circuit.");
      Serial.println();
    }
    
  }}

Stripped version of the code:

#include <DS1307RTC.h>
#include <Time.h>
#include <TimeLib.h>
#include <Wire.h>


int RELAY1 = 5;                 
int RELAY2 = 6;                
int RELAY3 = 7;
int timePower=8;
int relayPower= 13;                 



 void setup()    
 {  

  pinMode(relayPower,OUTPUT);
  pinMode(timePower,OUTPUT);
    digitalWrite(timePower,HIGH);

    digitalWrite(relayPower,HIGH);   
         pinMode(RELAY1,OUTPUT);       
         pinMode(RELAY2,OUTPUT);
         pinMode(RELAY3,OUTPUT);

Serial.begin(9600);         
while (!Serial); 

} 
 
 void loop()  

{
tmElements_t tm; 

if (RTC.read(tm)){

 
if (tm.Second >= 0 && tm.Second <20) {         

 

digitalWrite (RELAY1,HIGH);         
digitalWrite (RELAY2,LOW); 
digitalWrite (RELAY3,LOW);      
}

else if (tm.Second >=20 && tm.Second < 40) {       
                        
digitalWrite (RELAY1,LOW); 
digitalWrite (RELAY2,HIGH);
digitalWrite (RELAY3,LOW);          
         
}  

else if (tm.Second >= 40 && tm.Second <59) {       
                   
digitalWrite (RELAY1,LOW); 
digitalWrite (RELAY2,LOW);
digitalWrite (RELAY3,HIGH); }      

}
Serial.println(tm.Second);}

There is not much point putting while (!Serial); after Serial.begin(9600);

You seem to have code to activate relays in several places. Which part does not work?

You DO NOT seem to have any Serial.print() messages in your code that would allow you to monitor what is happening.

And please use the AutoFormat feature to indent your code consistently as that makes it very much easier to read.

...R

Thank you for the advice.

Basicly all the relays digitalWrite are not working properly. Starting from " if (tm.Second >= 0 && tm.Second < 20) " It does something on the given time, but not correctly. No click, just a led change, and not a consitent one.

#include <DS1307RTC.h>
#include <Time.h>
#include <TimeLib.h>
#include <Wire.h>


int RELAY1 = 5;
int RELAY2 = 6;
int RELAY3 = 7;
int timePower = 8;
int relayPower = 13;



void setup()
{

  pinMode(relayPower, OUTPUT);
  pinMode(timePower, OUTPUT);
  digitalWrite(timePower, HIGH);

  digitalWrite(relayPower, HIGH);
  pinMode(RELAY1, OUTPUT);
  pinMode(RELAY2, OUTPUT);
  pinMode(RELAY3, OUTPUT);

  Serial.begin(9600);


}

void loop()

{
  tmElements_t tm;

  if (RTC.read(tm)) {


 if (tm.Second >= 0 && tm.Second < 20) {                     



      digitalWrite (RELAY1, HIGH);
      digitalWrite (RELAY2, LOW);
      digitalWrite (RELAY3, LOW);

    }

    else if (tm.Second >= 20 && tm.Second < 40) {

      digitalWrite (RELAY1, LOW);
      digitalWrite (RELAY2, HIGH);
      digitalWrite (RELAY3, LOW);


    }

    else if (tm.Second >= 40 && tm.Second < 59) {

      digitalWrite (RELAY1, LOW);
      digitalWrite (RELAY2, LOW);
      digitalWrite (RELAY3, HIGH);
    }

  }
  Serial.println(tm.Second);
}

Tested the relay with:

#define RELAY1  5

#define RELAY2  6

#define RELAY3  7

int RPW = 13;


void setup()

{

  // Initialise the Arduino data pins for OUTPUT

  pinMode(RELAY1, OUTPUT);

  pinMode(RELAY2, OUTPUT);

  pinMode(RELAY3, OUTPUT);
  pinMode(RPW, OUTPUT);

  digitalWrite(RPW, HIGH);

}



void loop()

{

  digitalWrite(RELAY1, LOW);          // Turns ON Relays 1

  delay(2000);                                      // Wait 2 seconds

  digitalWrite(RELAY1, HIGH);         // Turns Relay Off



  digitalWrite(RELAY2, LOW);          // Turns ON Relays 2

  delay(2000);                                      // Wait 2 seconds

  digitalWrite(RELAY2, HIGH);         // Turns Relay Off



  digitalWrite(RELAY3, LOW);          // Turns ON Relays 3

  delay(2000);                                      // Wait 2 seconds

  digitalWrite(RELAY3, HIGH);         // Turns Relay Off

}

Wich gives me no troubles.

Are you are powering the three relays directly from pin 13?

If so, I would think you can't provide enough current to keep two on at a time. You tested with only one on at a time.

Thats it! Thanks!

Hi,

Can you please post a copy of your circuit, in CAD or a picture of a hand drawn circuit in jpg, png?

Thanks.. Tom.. :slight_smile:

japerapaper:
Thats it! Thanks!

Don't power ANY relay coils from an Arduino I/O pin. You risk damaging your Arduino by drawing too much current from the pin. About 20mA is all that is safe.

...R

TomGeorge:
Hi,

Can you please post a copy of your circuit, in CAD or a picture of a hand drawn circuit in jpg, png?

Thanks.. Tom.. :slight_smile:

Sure:

#include <DS1307RTC.h>
#include <Time.h>
#include <TimeLib.h>
#include <Wire.h>

int pd = 2;
int pd2 = 3;
int pd3 = 4;
int pd4 = 5;
int RELAY1 = 10;
int RELAY2 = 11;
int RELAY3 = 12;
int led1 = 6;
int led2 = 7;
int led3 = 8;

int relayPower = 9;
int senRead = A0;
int senRead2 = A1;
int senRead3 = A2;
int senRead4 = A3;
int limit = 900;             // treshold
int Left = 0;
int Center = 0;
int Right = 0;
int Top = 0;


void setup()
{
  pinMode(pd, OUTPUT);
  pinMode(pd2, OUTPUT);
  pinMode(pd3, OUTPUT);
  pinMode(pd4, OUTPUT);
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(relayPower, OUTPUT);


  digitalWrite(pd, HIGH);
  digitalWrite(pd2, HIGH);
  digitalWrite(pd3, HIGH);
  digitalWrite(pd4, HIGH);
  digitalWrite(relayPower, HIGH);
  pinMode(RELAY1, OUTPUT);
  pinMode(RELAY2, OUTPUT);
  pinMode(RELAY3, OUTPUT);

  Serial.begin(9600);

}

void loop()

{
  tmElements_t tm;

  if (RTC.read(tm)) {


    if (tm.Second >= 0 && tm.Second < 20) {                      // Timing magneet 1

      digitalWrite (RELAY2, HIGH);
      digitalWrite (RELAY3, HIGH);
      digitalWrite (RELAY1, LOW);
      digitalWrite  (led3, LOW);
      digitalWrite  (led1, HIGH);
    }

    else if (tm.Second >= 20 && tm.Second < 40) {                // Timing magneet 2

      digitalWrite (RELAY1, HIGH);
      digitalWrite (RELAY3, HIGH);
      digitalWrite (RELAY2, LOW);
      digitalWrite  (led1, LOW);
      digitalWrite  (led2, HIGH);

    }

    else if (tm.Second >= 40 && tm.Second < 59) {                  // Timing magneet 3

      digitalWrite (RELAY1, HIGH);
      digitalWrite (RELAY2, HIGH);
      digitalWrite (RELAY3, LOW);
      digitalWrite  (led2, LOW);
      digitalWrite  (led3, HIGH);
    }

    {
      int val = analogRead(senRead);
      int val2 = analogRead(senRead2);
      int val3 = analogRead(senRead3);
      int val4 = analogRead(senRead4);


      if (val > limit) {

        Serial.print("Left: ");
        Serial.print(++Left);
        Serial.print(" passes");
        Serial.print("\t Center: ");
        Serial.print(Center);
        Serial.print(" passes");
        Serial.print("\t Right: ");
        Serial.print(Right);
        Serial.print(" passes");
        Serial.print("\t top:");
        Serial.print(Top);
        Serial.print("\t  ");
        Serial.print(" Relay state: ");
        Serial.print(digitalRead(10));
        Serial.print(digitalRead(11));
        Serial.print(digitalRead(12));
        Serial.print("\t    ");
        print2digits(tm.Hour);
        Serial.print(":");
        print2digits(tm.Minute);
        Serial.print(":");
        print2digits(tm.Second);
        Serial.println("");

        delay(500);
      }


      else if (val2 > limit) {

        Serial.print("Left: ");
        Serial.print(Left);
        Serial.print(" passes");
        Serial.print("\t Center: ");
        Serial.print(++Center);
        Serial.print(" passes");
        Serial.print("\t Right: ");
        Serial.print(Right);
        Serial.print(" passes");
        Serial.print("\t top:");
        Serial.print(Top);
        Serial.print("\t  ");
        Serial.print(" Relay state: ");
        Serial.print(digitalRead(10));
        Serial.print(digitalRead(11));
        Serial.print(digitalRead(12));
        Serial.print("\t    ");
        print2digits(tm.Hour);
        Serial.print(":");
        print2digits(tm.Minute);
        Serial.print(":");
        print2digits(tm.Second);
        Serial.println("");
        delay(500);
      }

      else if (val3 > limit) {

        Serial.print("Left: ");
        Serial.print(Left);
        Serial.print(" passes");
        Serial.print("\t Center: ");
        Serial.print(Center);
        Serial.print(" passes");
        Serial.print("\t Right: ");
        Serial.print(++Right);
        Serial.print(" passes");
        Serial.print("\t top:");
        Serial.print(Top);
        Serial.print("\t  ");
        Serial.print(" Relay state: ");
        Serial.print(digitalRead(10));
        Serial.print(digitalRead(11));
        Serial.print(digitalRead(12));
        Serial.print("\t    ");
        print2digits(tm.Hour);
        Serial.print(":");
        print2digits(tm.Minute);
        Serial.print(":");
        print2digits(tm.Second);
        Serial.println("");
        delay(500);
      }

      else if (val4 > limit) {

        Serial.print("Left: ");
        Serial.print(Left);
        Serial.print(" passes");
        Serial.print("\t Center: ");
        Serial.print(Center);
        Serial.print(" passes");
        Serial.print("\t Right: ");
        Serial.print(Right);
        Serial.print(" passes");
        Serial.print("\t top:");
        Serial.print(++Top);
        Serial.print("\t  ");
        Serial.print(" Relay state: ");
        Serial.print(digitalRead(10));
        Serial.print(digitalRead(11));
        Serial.print(digitalRead(12));
        Serial.print("\t    ");
        print2digits(tm.Hour);
        Serial.print(":");
        print2digits(tm.Minute);
        Serial.print(":");
        print2digits(tm.Second);
        Serial.println("");
        delay(500);
      }

    }

  }  else {
    if (RTC.chipPresent()) {
      Serial.println("Klok geeft geen tijd");
      Serial.println("er lijk nog wel leven in te zitten");
      Serial.println();

    } else {
      Serial.println("DS1307 error, check circuit.");
      Serial.println();
    }

  }
}


void print2digits(int number) {
  if (number >= 0 && number < 10) {
    Serial.write('0');
  }
  Serial.print(number);
}

Ah I see I changed the circuit a little bit. In the code P9 is the relay Vcc and 10 to 12 are the in's.

Post a link to the datasheet for the relay module.

...R