/*
* 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 the 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 Oct 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 any time pressing this switch
-When the timer is runing, if potentiometer is rotated, it will not affect the remaining time
-When SW1 is pressed during the run time, the timer is resetted 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 download 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 .
*/
// start of settings for LCD1602 with I2C
#include
#include
// 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 rest 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 = 720;// maximum timer time in seconds
const int minTime = 10; // miniimum 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.init();
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("UV-Belichter");
lcd.setCursor(0,1);
lcd.print("Augenschutz! ");
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 Relay1.1");
lcd.setCursor(0,1);
lcd.print("Type:H 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();// clearn 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("Belichtungszeit:");
Serial.print(duration);
Serial.print (" s ");
if(relayState ==1){
lcdDisplay(0, "Belichtungszeit ", duration, " s ");
lcdDisplay(1, "Rest: ", getRtime(), " s ");
Serial.print(" remain: ");
Serial.print(getRtime());//
Serial.print(" s");
}else{
lcdDisplay(0, "Sollzeit: ", durationCalc, " s ");
lcdDisplay(1, "UV-Licht AUS ", 0, " ");
}
Serial.println();
delay(10); // 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 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 integet second
*/
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 specific row and character
* @param tc=text character number, trc=text row nubmer,
* @return the remaining time as integet 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 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