Timed Based Relay Controlled
by iamrachelle in Circuits > Electronics
2745 Views, 6 Favorites, 0 Comments
Timed Based Relay Controlled
I made this project to turn on/off a device via a relay on a specific schedule and be able to change the schedule by connecting to it. Here's the materials I used:
Hardware
See the pictures for the schematic and the hardware I used. Here's the components:
- WEMOS D1 Mini NodeMCU WiFi Board
- Any ESP8266 board can be used. i used it since it small.
- HI-Link HLK-PM01 AC-DC 220V to 5V Step-down Power Supply Module
- convert a 220V AC to 5VDC to power the Wemos, relay, RTC and LCD
- 2 Channel 5V Relay Module SPDT
- To turn on/off the load connected to the relay
- DS1307 RTC Module
- To get the time,day and weekday
- IIC Serial I2C 1602 2004 LCD Adapter Board for Arduino
- used with the LCD Display to be able to use 2 I2C Wires only
- 20×4 LCD Display I2C Black on Green
- Display text on the LCD screen
- Jumper wires with Male end
- Connect the components
Upload the Webpage and Schedule Files
Make A folder named "data" inside this Arduino project folder. Make files named sched_1.json, sched_2.json and index.html save it in your newly named "data". Here's a guide on how to upload this using spiff. Make sure your Serial monitor is closed when uploading to spiff.
I can't upload html and json files in instructables so download the following files and save it as sched_1.json, sched_2.json and index.html
Find the Address of RTC and LCD
Upload this code to find the RTC and LCD I2C address
#include <Wire.h>
void setup()
{
Wire.begin();
Serial.begin(9600);
while (!Serial); // Leonardo: wait for serial monitor
Serial.println("\nI2C Scanner");
}
void loop()
{
byte error, address;
int nDevices;
Serial.println("Scanning...");
nDevices = 0;
for(address = 1; address < 127; address++ )
{
// The i2c_scanner uses the return value of
// the Write.endTransmisstion to see if
// a device did acknowledge to the address.
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0)
{
Serial.print("I2C device found at address 0x");
if (address<16)
Serial.print("0");
Serial.print(address,HEX);
Serial.println(" !");
nDevices++;
}
else if (error==4)
{
Serial.print("Unknown error at address 0x");
if (address<16)
Serial.print("0");
Serial.println(address,HEX);
}
}
if (nDevices == 0)
Serial.println("No I2C devices found\n");
else
Serial.println("done\n");
delay(5000); // wait 5 seconds for next scan
}<br>Arduino Code
See the picture to know the outline of what the code do.
Add the following libraries to your Arduino IDE:
- WEMOS
- WebSocket https://github.com/Links2004/arduinoWebSockets
- RTC
- LCD https://github.com/marcoschwartz/LiquidCrystal_I2...
Here's the code I used with commented explanation. Copy this to your arduino IDE and upload.
//Initiakize Libraries
#include <ESP8266WiFi.h>// included when ESP8266 boards such as wemos is used
#include <ESP8266WebServer.h> //To use the ESP8266 as a Server
#include <WiFiClient.h>
#include <FS.h>//Flie system to be able to save file on Wemos's memory
#include <Arduino.h>//Arduino library
#include <WebSocketsServer.h>//Enable Websocket to enable server to client and vice cersa communication
#include <Hash.h>
ESP8266WebServer server(80); //Server connection on port 80
WebSocketsServer webSocket = WebSocketsServer(81);//Websocket connection on port 81
//LCD Library
#include <Wire.h>// Allows I2C Communication for more info:https://www.circuitbasics.com/basics-of-the-i2c-communication-protocol/
#include <LiquidCrystal_I2C.h>//To use I2C LCD functions
LiquidCrystal_I2C lcd(0x27, 20, 4); //0x27 = I2C Address, 20x4 = LCD Size
//RTC Library
#include "RTClib.h" //To use real time clock(RTC) functions
RTC_DS1307 rtc;// Initialize rtc
char daysOfTheWeek[7][12] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; //Array for printing the days of the week
//JSON Library
#include <ArduinoJson.h> //To handle JSON data for more information: <a href="https://www.w3schools.com/js/js_json.asp" rel="nofollow"> https://www.w3schools.com/js/js_json.asp
</a>
//variables to change
int duration = 5000; //time before LCD Display changes
String ssid = "Garden"; // SSID of the Wemos
String password="b11l4546"; //PASS of the Wemos
//Other variables
int screen = 1;
String date;
String time_now;
int sym = 0;
int day_of_the_week;
bool count_duration1 = true;
long start_sec1;
bool count_duration2 = true;
long start_sec2;
unsigned long prev_time = 0;
String time_1;
int mins_1;
bool days_1[7];
bool relay_1[2];
String time_2;
int mins_2;
bool days_2[7];
bool relay_2[2];
/*
Function that is called whenever Webscoket connection happens.
>if a device connected, it will print the information o the serial monitor
>If disconected, it will print "disconnected" on the serial monitor
>if a message form the client is received, with regards to "time" "relay" "sched1" or "sched2"
"time"
Adjust the date and time similar to client's device
"relay"
Turn on/off the Specific relay
"sched1" or "sched2"
save the JSON data to Wemos and set the schedule
*/
void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length) {
switch (type) {
case WStype_DISCONNECTED:
Serial.printf("[%u] Disconnected!\n", num);
break;
case WStype_CONNECTED: {
IPAddress ip = webSocket.remoteIP(num);
Serial.printf("[%u] Connected from %d.%d.%d.%d url: %s\n", num, ip[0], ip[1], ip[2], ip[3], payload);
webSocket.sendTXT(num, "Connected");
}
break;
case WStype_TEXT:
Serial.printf("[%u] Data: %s\n", num, payload);
DynamicJsonBuffer jsonBuffer;
JsonObject& root = jsonBuffer.parseObject(payload);
String _data = root["data"];
Serial.println(_data);
if (_data == "time") {
int _year = root["year"];
byte _month = root["month"];
byte _day = root["day"];
byte _hour = root["hour"];
byte _min = root["min"];
byte _secs = root["secs"];
rtc.adjust(DateTime(_year, _month, _day, _hour, _min, _secs));
Serial.println("_time adjusted");
}
else if (_data == "relay") {
int relay = root["relay"];
bool value = root["value"];
digitalWrite(relay, value);
Serial.print("relay , value");
Serial.print(relay);
Serial.println(value);
}
else if (_data == "sched_1" || _data == "sched_2") {
// var schedule = { data: "sched_"+sched, time: time, mins: mins, days: days, relay: relays }
String _name = root["data"];
File file_name = SPIFFS.open(_name + ".json", "w");
root.printTo(file_name);
file_name.close();
set_schedule(_name);
}
break;
}
}
/*
* Open the schedule files and save to global variables the days and relays are save as arrays while the
* time is a string
* mins is an integer
*/
void set_schedule(String _name) {
File file = SPIFFS.open(_name + ".json", "r");
DynamicJsonBuffer jsonBuffer;
JsonObject& root = jsonBuffer.parseObject(file);
if (_name == "sched_1") {
String _time_1 = root["time"];
int _mins_1 = root["mins"];
time_1 = _time_1;
mins_1 = _mins_1;
bool _days[7];
Serial.print("Days");
for (int i = 0; i < 7 ; i++) {
_days[i] = root["days"][i];
Serial.print(_days[i]);
days_1[i] = _days[i];
}
bool _relay[2];
Serial.print("Relay");
for (int i = 0; i < 2 ; i++) {
_relay[i] = root["relay"][i];
Serial.print(_relay[i]);
relay_1[i] = _relay[i];
}
}
else if (_name == "sched_2") {
String _time_2 = root["time"];
int _mins_2 = root["mins"];
time_2 = _time_2;
mins_2 = _mins_2;
Serial.print("Days");
bool _days[7];
for (int i = 0; i < 7 ; i++) {
_days[i] = root["days"][i];
Serial.print(_days[i]);
days_2[i] = _days[i];
}
bool _relay[2];
Serial.print("Relay");
for (int i = 0; i < 2 ; i++) {
_relay[i] = root["relay"][i];
Serial.print(_relay[i]);
relay_2[i] = _relay[i];
}
}
root.printTo(Serial);
file.close();
Serial.println("set schedule");
}
void setup() {
Serial.begin(57600); //Set the Serial monitor Baud rate to 57600. Pls lower this if problems on the clock happens
pinMode(LED_BUILTIN, OUTPUT);//set the led
pinMode(13, OUTPUT);//set the relays as output
pinMode(12, OUTPUT);//set the relays as output
SPIFFS.begin();//Initialize the file system in the Wemos
//Check RTC
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
}
if (! rtc.isrunning()) {
Serial.println("RTC is NOT running, let's set the time!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
//LOAD schedule
set_schedule("sched_1");
set_schedule("sched_2");
//LCD initalization and turn on back light
lcd.init();
lcd.backlight();
//SERVER initalization and configuration
WiFi.mode(WIFI_AP); //WIFI_AP to be able to connect to it
IPAddress apIP = WiFi.softAPIP();//Generate the IP of The device. it is always 192.168.4.1
Serial.print("AP IP address: ");
Serial.println(apIP);
WiFi.softAP(ssid,password);
//WEBSOCKET initalization and configuration
webSocket.begin();
webSocket.onEvent(webSocketEvent); //Call the function named "webSocketEvent" when Websocket events happens such as connection, disconnection and received message
Serial.println("WebSocket server started.");
//SERVE HTML named "index.html" saved/uploaded on the WEMOS Memory
server.onNotFound([]() {
File file = SPIFFS.open("/index.html", "r"); //Opens the index.html file
size_t sent = server.streamFile(file, "text/html"); //Send it to the client(clinet = connected deivce)
file.close();//Close the file
});
//SERVE FILES
server.begin(); //Start the esp8266 as a Server
Serial.println("HTTP server started");
}
//do not use delays here. Websocket.loop and server.handle cient may not work properly.
void loop() {
server.handleClient(); //Allow sthe WEMOS to run as a server continuosly
webSocket.loop();//Check for Websockets connection
unsigned long curr_time = millis();
if (curr_time - prev_time >= duration) { //Every duration(whcih is 5) the code within happens
prev_time = millis();
String time_now = get_time(); //Gets time and print it on the Serial monitor
schedule_checker(1, time_now, days_1, time_1, relay_1, mins_1); //Check the schedule 1 and turn on/off the relay based on schedule
String date_time = schedule_checker(2, time_now, days_2, time_2, relay_2, mins_2); //Check the schedule 1 and turn on/off the relay based on schedule and return the date and time
set_lcd(date_time);//Set LCD Displays
}
}
/*
* Function to check the schedule and curent time and day:
* 1. Determine is the schedule to check: 1 or 2
* 2. Get the duration since the schedule was met(Ex. time the relays are turned on)
* 3.Get the Day of the week
* 4.If the day of the week is on the scheduled days
* if the current time and scheduled time is the same, turn on/off the relays
* 5.Turn the relays off after the scheduled duration
* 6.Returns the date and time
*/
String schedule_checker(int sched, String time_now, bool _days[7], String _time, bool relay[2], int mins) {
bool count_duration;
long start_sec;
if (sched == 1) {
count_duration = count_duration1 ;
start_sec = start_sec1;
}
else if (sched == 2) {
count_duration = count_duration2;
start_sec = start_sec2;
}
DateTime now = rtc.now();
day_of_the_week = now.dayOfTheWeek();
if (_days[day_of_the_week]) {
if (time_now == _time) {
if (count_duration) {
start_sec = now.secondstime();
count_duration = false;
}
digitalWrite(13, relay[1]);
digitalWrite(12, relay[0]);
}
if (!count_duration) {
if ( long( now.secondstime() - start_sec) >= long(mins * 60)) {
digitalWrite(12, LOW);
digitalWrite(13, LOW);
count_duration = true;
}
}
}
if (sched == 1) {
count_duration1 = count_duration;
start_sec1 = start_sec;
}
else if (sched == 2) {
count_duration2 = count_duration ;
start_sec2 = start_sec;
}
String date_time = String(daysOfTheWeek[day_of_the_week]) + " " + time_now ;
return date_time;
}
//Get time
String get_time() {
DateTime now = rtc.now();
day_of_the_week = now.dayOfTheWeek();
String curr_hour = String(now.hour());
String curr_min = String(now.minute());
if (now.hour() < 10) {
curr_hour = "0" + String(now.hour());
}
if (now.minute() < 10) {
curr_min = "0" + String(now.minute());
}
date = String(daysOfTheWeek[now.dayOfTheWeek()]) + " " + String(now.month()) + "/" + String(now.day()) + "/" + String( now.year());
time_now = curr_hour + ":" + curr_min;
Serial.print("Current date: "); Serial.print(date);
Serial.print("Current time: "); Serial.println("time_now");
return time_now;
}
/*
* Set LCD Displays. There are 3 Displays
* 1. Shows the time, day and Connection instructions
* 2. Shows the time Schedule 1
* 3. Shows the time Schedule 2
*/
void set_lcd(String time_now) {
lcd.clear();
lcd.setCursor(5, 0);
lcd.print(time_now);
if (screen == 1) {
lcd.setCursor(1, 1);
lcd.print("Connect to 'Garden'");
lcd.setCursor(5, 2);
lcd.print("and go to");
lcd.setCursor(4, 3);
lcd.print("192.168.4.1");
screen = 2;
return;
}
String _days = "SMTWTFS";
String _rel = "12";
String _time_;
String _mins_;
String schedule;
String _days_chosen;
String _relay_chosen;
if (screen == 3) {
_time_ = time_2;
_mins_ = String(mins_2);
screen = 1;
schedule = "Schedule 2";
for (int i = 0; i < 7; i++) {
if (days_2[i]) {
_days_chosen += _days[i];
}
}
for (int i = 0; i < 2; i++) {
if (relay_2[i]) {
_relay_chosen += _rel[i];
}
}
}
else if (screen == 2) {
_time_ = time_1;
_mins_ = String(mins_1);
screen = 3;
schedule = "Schedule 1";
for (int i = 0; i < 7; i++) {
if (days_1[i]) {
_days_chosen += _days[i];
}
}
for (int i = 0; i < 2; i++) {
if (relay_1[i]) {
_relay_chosen += _rel[i];
}
}
}
String sched_time = "Time:" + _time_;
String sched_min = "min:" + _mins_;
String sched_day = "Days:" + _days_chosen;
String sched_rel = "Rel:" + _relay_chosen;
lcd.setCursor(5, 1);
lcd.print(schedule);
lcd.setCursor(0, 2);
lcd.print(sched_time);
lcd.setCursor(13, 2);
lcd.print(sched_min);
lcd.setCursor(0, 3);
lcd.print(sched_day);
lcd.setCursor(13, 3);
lcd.print(sched_rel);
}For active low relay modules, try this code. I dont have a active low relay module at the moment but I've made code modifications. Try it out and please tell me if theres a problem. thank you!
//Initiakize Libraries
#include <ESP8266WiFi.h>// included when ESP8266 boards such as wemos is used
#include <ESP8266WebServer.h> //To use the ESP8266 as a Server
#include <WiFiClient.h>
#include <FS.h>//Flie system to be able to save file on Wemos's memory
#include <Arduino.h>//Arduino library
#include <WebSocketsServer.h>//Enable Websocket to enable server to client and vice cersa communication
#include <Hash.h>
ESP8266WebServer server(80); //Server connection on port 80
WebSocketsServer webSocket = WebSocketsServer(81);//Websocket connection on port 81
//LCD Library
#include <Wire.h>// Allows I2C Communication for more info:https://www.circuitbasics.com/basics-of-the-i2c-communication-protocol/
#include <LiquidCrystal_I2C.h>//To use I2C LCD functions
LiquidCrystal_I2C lcd(0x27, 20, 4); //0x27 = I2C Address, 20x4 = LCD Size
//RTC Library
#include "RTClib.h" //To use real time clock(RTC) functions
RTC_DS1307 rtc;// Initialize rtc
char daysOfTheWeek[7][12] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; //Array for printing the days of the week
//JSON Library
#include <ArduinoJson.h> //To handle JSON data for more information: <a href="https://www.w3schools.com/js/js_json.asp" rel="nofollow"> https://www.w3schools.com/js/js_json.asp
</a>
//variables to change
int duration = 5000; //time before LCD Display changes
String ssid = "WifiName"; // SSID of the Wemos
String password="password"; //PASS of the Wemos
//Other variables
int screen = 1;
String date;
String time_now;
int sym = 0;
int day_of_the_week;
bool count_duration1 = true;
long start_sec1;
bool count_duration2 = true;
long start_sec2;
unsigned long prev_time = 0;
String time_1;
int mins_1;
bool days_1[7];
bool relay_1[2];
String time_2;
int mins_2;
bool days_2[7];
bool relay_2[2];
/*
Function that is called whenever Webscoket connection happens.
>if a device connected, it will print the information o the serial monitor
>If disconected, it will print "disconnected" on the serial monitor
>if a message form the client is received, with regards to "time" "relay" "sched1" or "sched2"
"time"
Adjust the date and time similar to client's device
"relay"
Turn on/off the Specific relay
"sched1" or "sched2"
save the JSON data to Wemos and set the schedule
*/
void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length) {
switch (type) {
case WStype_DISCONNECTED:
Serial.printf("[%u] Disconnected!\n", num);
break;
case WStype_CONNECTED: {
IPAddress ip = webSocket.remoteIP(num);
Serial.printf("[%u] Connected from %d.%d.%d.%d url: %s\n", num, ip[0], ip[1], ip[2], ip[3], payload);
webSocket.sendTXT(num, "Connected");
}
break;
case WStype_TEXT:
Serial.printf("[%u] Data: %s\n", num, payload);
DynamicJsonBuffer jsonBuffer;
JsonObject& root = jsonBuffer.parseObject(payload);
String _data = root["data"];
Serial.println(_data);
if (_data == "time") {
int _year = root["year"];
byte _month = root["month"];
byte _day = root["day"];
byte _hour = root["hour"];
byte _min = root["min"];
byte _secs = root["secs"];
rtc.adjust(DateTime(_year, _month, _day, _hour, _min, _secs));
Serial.println("_time adjusted");
}
else if (_data == "relay") {
int relay = root["relay"];
bool value = root["value"];
digitalWrite(relay, value);
Serial.print("relay , value");
Serial.print(relay);
Serial.println(value);
}
else if (_data == "sched_1" || _data == "sched_2") {
// var schedule = { data: "sched_"+sched, time: time, mins: mins, days: days, relay: relays }
String _name = root["data"];
File file_name = SPIFFS.open(_name + ".json", "w");
root.printTo(file_name);
file_name.close();
set_schedule(_name);
}
break;
}
}
/*
* Open the schedule files and save to global variables the days and relays are save as arrays while the
* time is a string
* mins is an integer
*/
void set_schedule(String _name) {
File file = SPIFFS.open(_name + ".json", "r");
DynamicJsonBuffer jsonBuffer;
JsonObject& root = jsonBuffer.parseObject(file);
if (_name == "sched_1") {
String _time_1 = root["time"];
int _mins_1 = root["mins"];
time_1 = _time_1;
mins_1 = _mins_1;
bool _days[7];
Serial.print("Days");
for (int i = 0; i < 7 ; i++) {
_days[i] = root["days"][i];
Serial.print(_days[i]);
days_1[i] = _days[i];
}
bool _relay[2];
Serial.print("Relay");
for (int i = 0; i < 2 ; i++) {
_relay[i] = root["relay"][i];
Serial.print(_relay[i]);
relay_1[i] = _relay[i];
}
}
else if (_name == "sched_2") {
String _time_2 = root["time"];
int _mins_2 = root["mins"];
time_2 = _time_2;
mins_2 = _mins_2;
Serial.print("Days");
bool _days[7];
for (int i = 0; i < 7 ; i++) {
_days[i] = root["days"][i];
Serial.print(_days[i]);
days_2[i] = _days[i];
}
bool _relay[2];
Serial.print("Relay");
for (int i = 0; i < 2 ; i++) {
_relay[i] = root["relay"][i];
Serial.print(_relay[i]);
relay_2[i] = _relay[i];
}
}
root.printTo(Serial);
file.close();
Serial.println("set schedule");
}
void setup() {
Serial.begin(57600); //Set the Serial monitor Baud rate to 57600. Pls lower this if problems on the clock happens
pinMode(LED_BUILTIN, OUTPUT);//set the led
pinMode(13, OUTPUT);//set the relays as output
pinMode(12, OUTPUT);//set the relays as output
pinMode(13, HIGH);//set the relays as output
pinMode(12, HIGH);//set the relays as output
SPIFFS.begin();//Initialize the file system in the Wemos
//Check RTC
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
}
if (! rtc.isrunning()) {
Serial.println("RTC is NOT running, let's set the time!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
//LOAD schedule
set_schedule("sched_1");
set_schedule("sched_2");
//LCD initalization and turn on back light
lcd.init();
lcd.backlight();
//SERVER initalization and configuration
WiFi.mode(WIFI_AP); //WIFI_AP to be able to connect to it
IPAddress apIP = WiFi.softAPIP();//Generate the IP of The device. it is always 192.168.4.1
Serial.print("AP IP address: ");
Serial.println(apIP);
WiFi.softAP(ssid,password);
//WEBSOCKET initalization and configuration
webSocket.begin();
webSocket.onEvent(webSocketEvent); //Call the function named "webSocketEvent" when Websocket events happens such as connection, disconnection and received message
Serial.println("WebSocket server started.");
//SERVE HTML named "index.html" saved/uploaded on the WEMOS Memory
server.onNotFound([]() {
File file = SPIFFS.open("/index.html", "r"); //Opens the index.html file
size_t sent = server.streamFile(file, "text/html"); //Send it to the client(clinet = connected deivce)
file.close();//Close the file
});
//SERVE FILES
server.begin(); //Start the esp8266 as a Server
Serial.println("HTTP server started");
}
//do not use delays here. Websocket.loop and server.handle cient may not work properly.
void loop() {
server.handleClient(); //Allow sthe WEMOS to run as a server continuosly
webSocket.loop();//Check for Websockets connection
unsigned long curr_time = millis();
if (curr_time - prev_time >= duration) { //Every duration(whcih is 5) the code within happens
prev_time = millis();
String time_now = get_time(); //Gets time and print it on the Serial monitor
schedule_checker(1, time_now, days_1, time_1, relay_1, mins_1); //Check the schedule 1 and turn on/off the relay based on schedule
String date_time = schedule_checker(2, time_now, days_2, time_2, relay_2, mins_2); //Check the schedule 1 and turn on/off the relay based on schedule and return the date and time
set_lcd(date_time);//Set LCD Displays
}
}
/*
* Function to check the schedule and curent time and day:
* 1. Determine is the schedule to check: 1 or 2
* 2. Get the duration since the schedule was met(Ex. time the relays are turned on)
* 3.Get the Day of the week
* 4.If the day of the week is on the scheduled days
* if the current time and scheduled time is the same, turn on/off the relays
* 5.Turn the relays off after the scheduled duration
* 6.Returns the date and time
*/
String schedule_checker(int sched, String time_now, bool _days[7], String _time, bool relay[2], int mins) {
bool count_duration;
long start_sec;
if (sched == 1) {
count_duration = count_duration1 ;
start_sec = start_sec1;
}
else if (sched == 2) {
count_duration = count_duration2;
start_sec = start_sec2;
}
DateTime now = rtc.now();
day_of_the_week = now.dayOfTheWeek();
if (_days[day_of_the_week]) {
if (time_now == _time) {
if (count_duration) {
start_sec = now.secondstime();
count_duration = false;
}
digitalWrite(13, !relay[1]);
digitalWrite(12, !relay[0]);
}
if (!count_duration) {
if ( long( now.secondstime() - start_sec) >= long(mins * 60)) {
digitalWrite(12, HIGH);
digitalWrite(13, HIGH);
count_duration = true;
}
}
}
if (sched == 1) {
count_duration1 = count_duration;
start_sec1 = start_sec;
}
else if (sched == 2) {
count_duration2 = count_duration ;
start_sec2 = start_sec;
}
String date_time = String(daysOfTheWeek[day_of_the_week]) + " " + time_now ;
return date_time;
}
//Get time
String get_time() {
DateTime now = rtc.now();
day_of_the_week = now.dayOfTheWeek();
String curr_hour = String(now.hour());
String curr_min = String(now.minute());
if (now.hour() < 10) {
curr_hour = "0" + String(now.hour());
}
if (now.minute() < 10) {
curr_min = "0" + String(now.minute());
}
date = String(daysOfTheWeek[now.dayOfTheWeek()]) + " " + String(now.month()) + "/" + String(now.day()) + "/" + String( now.year());
time_now = curr_hour + ":" + curr_min;
Serial.print("Current date: "); Serial.print(date);
Serial.print("Current time: "); Serial.println("time_now");
return time_now;
}
/*
* Set LCD Displays. There are 3 Displays
* 1. Shows the time, day and Connection instructions
* 2. Shows the time Schedule 1
* 3. Shows the time Schedule 2
*/
void set_lcd(String time_now) {
lcd.clear();
lcd.setCursor(5, 0);
lcd.print(time_now);
if (screen == 1) {
lcd.setCursor(1, 1);
lcd.print("Connect to 'Garden'");
lcd.setCursor(5, 2);
lcd.print("and go to");
lcd.setCursor(4, 3);
lcd.print("192.168.4.1");
screen = 2;
return;
}
String _days = "SMTWTFS";
String _rel = "12";
String _time_;
String _mins_;
String schedule;
String _days_chosen;
String _relay_chosen;
if (screen == 3) {
_time_ = time_2;
_mins_ = String(mins_2);
screen = 1;
schedule = "Schedule 2";
for (int i = 0; i < 7; i++) {
if (days_2[i]) {
_days_chosen += _days[i];
}
}
for (int i = 0; i < 2; i++) {
if (relay_2[i]) {
_relay_chosen += _rel[i];
}
}
}
else if (screen == 2) {
_time_ = time_1;
_mins_ = String(mins_1);
screen = 3;
schedule = "Schedule 1";
for (int i = 0; i < 7; i++) {
if (days_1[i]) {
_days_chosen += _days[i];
}
}
for (int i = 0; i < 2; i++) {
if (relay_1[i]) {
_relay_chosen += _rel[i];
}
}
}
String sched_time = "Time:" + _time_;
String sched_min = "min:" + _mins_;
String sched_day = "Days:" + _days_chosen;
String sched_rel = "Rel:" + _relay_chosen;
lcd.setCursor(5, 1);
lcd.print(schedule);
lcd.setCursor(0, 2);
lcd.print(sched_time);
lcd.setCursor(13, 2);
lcd.print(sched_min);
lcd.setCursor(0, 3);
lcd.print(sched_day);
lcd.setCursor(13, 3);
lcd.print(sched_rel);
}
See It Work!
I connected the relay to a 12V Solenoid lock that I have to test it. Here's the video and pictures of the screen! Had a lot of fun doing this, I hope you do too :)