Search Code

RoboJax Arduino Relay Timer with LCD1602-I2C V1.1

RoboJax Arduino Relay Timer with LCD1602-I2C V1.1

This code uses an Arduino as a timer to control a relay with a potentiometer and an LCD1602-I2C. You can set it from 0 to any number of seconds. There is virtually no limit. Fig. 1 Schematic diagram for Robojax Relay Timer V 1.1 with LCD1602-I2C To have finer control over the time setting, especially for times above 100 seconds, use two potentiometers with values in a 1:10 ratio (one is 10 times larger than the other). For example, for coarse control, use a 100kΩ variable resistor and for fine control, use a 10kΩ resistor, and connect them as shown in Fig. 2. Fig. 2 Wiring of fine and coarse control for two potentiometers

Images

Robojax Arduino Relay Timer with LCD1602-I2C V1.1
Robojax Arduino Relay timer with LCD1602-I2C V 1.1
Robojax Arduino Relay Timer with LCD1602-I2C V1.1
Robojax Arduino Relay timer with LCD1602-I2C V 1.1
164-RoboJax Arduino Relay Timer with LCD1602-I2C V1.1
Language: C++
++
/*
 * Arduino code for Relay timer with potentiometer and LCD1602 with I2C
 * Version 1.1 Display is added to show the set time
 * 
 * This Arduino sketch makes it possible to control a relay with a set time
 * which is set by the potentiometer.
 * Watch video instruction for this code: https://youtu.be/BhEIFzFSMuE
 * 
 * Written by Ahmad Shamshiri for Robojax.com on Sunday, October 18, 2018 
 * at 05:34 in Ajax, Ontario, Canada
 * 
 * Features of Version 1.1
 *    - Set time by rotating potentiometer (variable resistor)
      - SW1 is START switch. By pushing this button the relay will turn ON and the timer is shown on LCD
      - SW2 is RESET switch. The timer can be cancelled at any time by pressing this switch
      - When the timer is running, if the potentiometer is rotated, it will not affect the remaining time
      - When SW1 is pressed during the run time, the timer is reset and it will start over again
   Schematic is provided at robo    
 * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.
 * This code has been downloaded from Robojax.com
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
 
// start of settings for LCD1602 with I2C
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
// Set the LCD address to 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x27, 16, 2);
// end of settings for LCD1602 with I2C

#define relayPin 8 // the pin relay is connected
#define potPin  A0 // the pin potentiometer is connected
#define resetPin 3 // the pin where reset switch is connected
#define startPin 2 // the pin where start switch is connected

#define relayType 'L' // Relay trigger type. L for low and H for high
const int maxTime = 200;// maximum timer time in seconds
const int minTime = 2; // minimum timer time in seconds

// do not change anything bellow here
long duration;// holds the duration of timer
int potValue;// holds the variable resistor (potentiometer) value
long rememTime;// holds current run time
int relayState =0;// holds relay state

void setup() {
  // initialize the LCD
  lcd.begin();
  lcd.backlight();// turn the backlight ON for the LCD
    
  pinMode(relayPin, OUTPUT);// define relayPin  as output
  pinMode(resetPin, INPUT_PULLUP);// define input pin with pullup (watch video)
  pinMode(startPin, INPUT_PULLUP);// define input pin with pullup (watch video)
  attachInterrupt(digitalPinToInterrupt(resetPin), reset, LOW);// Interrupt Service Routines. "reset" is a function in this code
    
  Serial.begin(9600);// initialize serial monitor with 9600 baud
  if(relayType == 'L')
  {
    digitalWrite(relayPin, HIGH);// turn the relay OFF and keep it OFF
      lcd.print("Robojax Relay 1.1");
      lcd.setCursor(0,1);
      lcd.print("Type:LOW Trigger");     
      Serial.println("Robojax Relay 1.1"); 
      Serial.println("Type:LOW Trigger");      
  }else{
    digitalWrite(relayPin, LOW);// turn the relay OFF and keep it OFF
      lcd.print("Robojax Relay 1.1");
      lcd.setCursor(0,1);
      lcd.print("Type:HIGH Trigger");     
      Serial.println("Robojax Relay 1.1"); 
      Serial.println("Type:HIGH Trigger");  
  } 
  delay(3000);// change this line if you want not to wait
  lcd.clear();// clear previous values from screen
}

void loop() {
  // Robojax.com Relay Timer V 1.1 with LCD1602 I2C display
    potValue = analogRead(potPin)/10;// reads the value of the potentiometer (value between 0 and 1023)

    int durationCalc = map(potValue, 0, 102, minTime, maxTime);// convert A0 value to time set at minTime and maxTime
    
    if(digitalRead(startPin) ==LOW)
    {
     duration = durationCalc;
     rememTime = millis()/1000;
     relayState = 1;
     controlRelay();// send command to turn the relay ON
           
    }
   if(  ( millis()/1000- rememTime) > duration )
   {
    relayState = 0;// change relay state to OFF
    controlRelay();// control relay with new relay state
    
   }
      Serial.print("Time set: ");
      Serial.print(duration);
      Serial.print (" S ");  
 
            
    if(relayState ==1){  

      lcdDisplay(0, "Time Set: ", duration, "S"); 
      lcdDisplay(1, "Remaining: ", getRtime(), "S");         
      Serial.print(" remain: ");
      Serial.print(getRtime());//
      Serial.print(" S");  
    }else{
      lcdDisplay(0, "Time Set: ", durationCalc, "S"); 
      lcdDisplay(1, "Relay OFF          ", 0, " ");         
    }
    Serial.println();  
          
 delay(50); // wait for 200 milliseconds       
}// loop end


/*
 * 
 * @brief Turns the relay ON or OFF 
 * @param none
 * @return no return value
 */

 void controlRelay()
 {
  // Robojax.com Relay Timer V 1.1 with LCD1602 I2C display
  if(relayType == 'L')
  {
     if(relayState == 1)
     {
    digitalWrite(relayPin, LOW);// turns Low-Trigger relay ON
      Serial.print("LT-Relay ON for ");
      Serial.print(duration);// display in seconds
      Serial.println(" Seconds");
     }else{
    digitalWrite(relayPin, HIGH); // turns Low-Trigger relay OFF
      Serial.println("====Relay is OFF");
     }
      
  }else{
    // Robojax.com Relay Timer V 1.1 with LCD1602 I2C display
     if(relayState == 1)
     {    
      digitalWrite(relayPin, HIGH);// turns High-Trigger relay ON
      Serial.print("HT-Relay ON for ");
      Serial.print(duration);// display in seconds
      Serial.println(" Seconds");  
     }else{
      digitalWrite(relayPin, LOW); // turns High-Trigger relay OFF
      Serial.println("==Relay OFF");  
     }  
  }

}//controlRelay end


/*
 * 
 * @brief Resets the timer and turns OFF the relay
 * @param none
 * @return no return value
 */

void reset()
{
  // Robojax.com Relay Timer V 1.1 with LCD1602 I2C display
  duration =0;
   if(relayType == 'L')
  {
    digitalWrite(relayPin, HIGH);// turn OFF High trigger relay     
  }else{
    digitalWrite(relayPin, LOW);// turn OFF Low trigger relay
  
  } 
  Serial.println("Relay OFF"); 

}//reset()


/*
 * 
 * @brief Returns the remaining time set 
 * @param none
 * @return The remaining time as an integer (seconds)
 */
int getRtime()
{
  // Robojax.com Relay Timer V 1.1 with LCD1602 I2C display
  return duration - (millis()/1000- rememTime);
}

/*
 * lcdDisplay(int tc, int tr, String title, int vc, int vr, float int)
  for example to display
 * tc  is character number  (0)
 * tr is row in the lcd (1)
 * title is the text (Voltage:)
 * vcn character number for value 
 * vr row number for the value
 * value is the value (13.56)
 * 
 * @brief Prints text on the screen on a specific row and character
 * @param tc=text character number, trc=text row number, 
 * @return the remaining time as integer second
 * usage example for example 
 * to print "Time Set: 34s" on line 2
 * titleText = Time Set:
 * valueText = 34
 * value2Text = S. print 's" as second
 * type this:
 * lcdDisplay(0,"Time Set: ",  34,   "S");
 * 
 */
void lcdDisplay(int rowNum, String titleText, int valueText, String value2Text)
{
    clearRow(rowNum);
    String myStr;
    myStr = String(valueText);

    int titleTextLength = titleText.length();
   // Robojax.com Relay Timer V 1.1 with LCD1602 I2C display
   lcd.setCursor (0,rowNum); //
   lcd.print(titleText);
   
   lcd.setCursor (titleTextLength,rowNum); //
   lcd.print(myStr);
   
   lcd.setCursor (myStr.length()+titleTextLength,rowNum); //
   lcd.print(value2Text);   
 
}

/*
 * 
 * @brief Clears only one row of the display
 * @param r, the row number (integer)
 * @return no return value
 */
void clearRow(int r)
{
  //
  for(int i=0; i<16; i++)
  {
   lcd.setCursor (i,r); //
   lcd.print(" ");
  }
}//clearRow end

Resources & references

Files📁

No files available.