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 potentiometers164-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
-
ExternalattachInterrupt()arduino.cc
-
External
Files📁
No files available.