Hello, I have a big request, can someone with experience help me with the code below? I would like to use a 16x2 liquid crystal display using ic2 communication, having fewer wires than the 9 used by the display in the current code.
#include <Wire.h> // for I2C communication
#include <LiquidCrystal.h> // for LCD
#include <RTClib.h>
#include <avr/wdt.h>// for RTC
// create LCD with I2C address 0x27, 16 characters per line, 2 lines
RTC_DS3231 rtc;
#define SETpin 4
#define Up 3
#define Down 2
#define FW A0
#define BW A1
#define Feed A2
#define FCFW 13
#define FCBW 12
int timz = 0, k = 0, key = 1, err = 0, retour = 0;
int hr1 [4][6] = {
{0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0}
};
int mn1 [4][6] = {
{0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0}
};
int se1 [4][6] = {
{0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0}
};
int Dhr1 [4][6] = {
{0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0}
};
int Dmn1 [4][6] = {
{0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0}
};
int Dse1 [4][6] = {
{0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0}
};
int SET = 0 , i = 0, j = 0, SET1 = 0, SET2 = 0, SET3 = 0, hr = 0, mn = 0, se = 0, item1 = 0, item2 = 0, reg = 0, ref1 , ref2 ;
const int rs = 5, en = 10, d4 = 6, d5 = 7, d6 = 8, d7 = 9;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
// create rtc for the DS3231 RTC module, address is fixed at 0x68
/*
function to update RTC time using user input
*/
void updateRTC()
{
lcd.clear(); // clear LCD display
lcd.setCursor(0, 0);
lcd.print("Edit Mode...");
// ask user to enter new date and time
const char txt[6][15] = { "year [4-digit]", "month [1~12]", "day [1~31]",
"hours [0~23]", "minutes [0~59]", "seconds [0~59]"
};
String str = "";
long newDate[6];
while (Serial.available()) {
Serial.read(); // clear serial buffer
}
for (int i = 0; i < 6; i++) {
Serial.print("Enter ");
Serial.print(txt[i]);
Serial.print(": ");
while (!Serial.available()) {
; // wait for user input
}
str = Serial.readString(); // read user input
newDate[i] = str.toInt(); // convert user input to number and save to array
Serial.println(newDate[i]); // show user input
}
// update RTC
rtc.adjust(DateTime(newDate[0], newDate[1], newDate[2], newDate[3], newDate[4], newDate[5]));
Serial.println("RTC Updated!");
}
/*
function to update LCD text
*/
void updateLCD()
{
/*
create array to convert digit days to words:
0 = Sunday | 4 = Thursday
1 = Monday | 5 = Friday
2 = Tuesday | 6 = Saturday
3 = Wednesday |
*/
const char dayInWords[7][4] = {"SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"};
/*
create array to convert digit months to words:
0 = [no use] |
1 = January | 6 = June
2 = February | 7 = July
3 = March | 8 = August
4 = April | 9 = September
5 = May | 10 = October
6 = June | 11 = November
7 = July | 12 = December
*/
const char monthInWords[13][4] = {" ", "JAN", "FEB", "MAR", "APR", "MAY", "JUN",
"JUL", "AUG", "SEP", "OCT", "NOV", "DEC"
};
// get time and date from RTC and save in variables
DateTime rtcTime = rtc.now();
int ss = rtcTime.second();
int mm = rtcTime.minute();
int hh = rtcTime.hour();
int DD = rtcTime.dayOfTheWeek();
int dd = rtcTime.day();
int MM = rtcTime.month();
int yyyy = rtcTime.year();
// move LCD cursor to upper-left position
lcd.setCursor(0, 0);
// print date in dd-MMM-yyyy format and day of week
if (dd < 10) lcd.print("0"); // add preceeding '0' if number is less than 10
lcd.print(dd);
lcd.print("-");
lcd.print(monthInWords[MM]);
lcd.print("-");
lcd.print(yyyy);
lcd.print(" ");
lcd.print(dayInWords[DD]);
// move LCD cursor to lower-left position
lcd.setCursor(0, 1);
// print time in 12H format
if (hh < 10) lcd.print("0");
lcd.print(hh);
lcd.print(':');
if (mm < 10) lcd.print("0");
lcd.print(mm);
lcd.print(':');
if (ss < 10) lcd.print("0");
lcd.print(ss);
if (rtcTime.isPM()) lcd.print(" PM"); // print AM/PM indication
else lcd.print(" AM");
}
////////////////////////////////////////////////////////////////////
void setup()
{
Serial.begin(9600); // initialize serial
lcd.begin(16, 2); // switch-on lcd backlight
rtc.begin(); // initialize rtc
pinMode(SETpin, INPUT_PULLUP);
pinMode(Up, INPUT_PULLUP);
pinMode(Down, INPUT_PULLUP);
pinMode(FW, OUTPUT);
pinMode(BW, OUTPUT);
pinMode(A2, OUTPUT);
pinMode(A3, OUTPUT);
pinMode(Feed, OUTPUT);
//wdt_enable(WDTO_120MS);
// attachInterrupt(digitalPinToInterrupt(2), UP, FALLING);
// attachInterrupt(digitalPinToInterrupt(3), DOWN, FALLING);
}
void loop()
{
updateLCD(); // update LCD text
if (Serial.available()) {
char input = Serial.read();
if (input == 'u') updateRTC(); // update RTC time
}
for (int i = 0 ; i < 6; i++) {
DateTime rtcTime = rtc.now();
if (hr1[0][i] == rtcTime.hour() && mn1[0][i] == rtcTime.minute() && se1[0][i] == rtcTime.second()) {
digitalWrite(A0, HIGH);
}
if (hr1[1][i] == rtcTime.hour() && mn1[1][i] == rtcTime.minute() && se1[1][i] == rtcTime.second()) {
digitalWrite(A1, HIGH);
}
if (hr1[2][i] == rtcTime.hour() && mn1[2][i] == rtcTime.minute() && se1[2][i] == rtcTime.second()) {
digitalWrite(A2, HIGH);
}
if (hr1[3][i] == rtcTime.hour() && mn1[3][i] == rtcTime.minute() && se1[3][i] == rtcTime.second()) {
digitalWrite(A3, HIGH);
}
//////
if (Dhr1[0][i] == rtcTime.hour() && Dmn1[0][i] == rtcTime.minute() && Dse1[0][i] == rtcTime.second()) {
digitalWrite(A0, LOW);
}
if (Dhr1[1][i] == rtcTime.hour() && Dmn1[1][i] == rtcTime.minute() && Dse1[1][i] == rtcTime.second()) {
digitalWrite(A1, LOW);
}
if (Dhr1[2][i] == rtcTime.hour() && Dmn1[2][i] == rtcTime.minute() && Dse1[2][i] == rtcTime.second()) {
digitalWrite(A2, LOW);
}
if (hr1[3][i] == rtcTime.hour() && Dmn1[3][i] == rtcTime.minute() && Dse1[3][i] == rtcTime.second()) {
digitalWrite(A3, LOW);
}
}
if (digitalRead(SETpin) == 0) {
delay(100);
if (digitalRead(SETpin) == 0) {
lcd.clear() ; SET = 1; item1 = 0; item2 = 0;
}
}
while (SET == 1 || SET == 2) {
while (SET == 1) {
for (int j = 0; j < 2 ; j++) {
if (item1 == j && SET == 1 ) {
lcd.setCursor(4, 0);
lcd.print("TIMER");
lcd.print(" :");
lcd.setCursor(4, 1);
lcd.print("PUMP ");
lcd.print(item1 + 1);
}
}
if (digitalRead(Down) == 0) {
delay(100);
lcd.clear() ;
item1 --;
}
if (digitalRead(Up) == 0) {
delay(100);
lcd.clear() ;
item1 ++;
}
if (item1 == -1 && SET == 1 ) {
lcd.clear() ;
item1 = 3;
}
if (item1 == 4 && SET == 1 ) {
lcd.clear() ;
item1 = 0;
}
if (digitalRead(SETpin) == 0) {
delay(100);
if (digitalRead(SETpin) == 0) {
lcd.clear() ; SET++;
ref1 = item1;
item1 = 0;
delay(100);
if (SET == 3) {
SET = 0;
}
}
}
}
while (SET == 2) {
for (int i = 0; i < 2; i++) {
if (item2 == i && i < 2 && SET == 2 ) {
lcd.setCursor(0, 0);
lcd.print("T");
lcd.print(item2 + 1);
lcd.print(" :");
lcd.setCursor(7, 0);
lcd.print("h");
lcd.setCursor(11, 0);
lcd.print("m");
lcd.setCursor(15, 0);
lcd.print("s");
lcd.setCursor(0, 1);
lcd.print("D");
lcd.print(item2 + 1);
lcd.print(" :");
lcd.setCursor(7, 1);
lcd.print("h");
lcd.setCursor(11, 1);
lcd.print("m");
lcd.setCursor(15, 1);
lcd.print("s");
}
if (item2 < 2 && digitalRead(SETpin) == 0)
{
ref2 = item2;
item2 = 0;
reg++;
delay(200);
}
if (reg == 1) {
lcd.setCursor(4, 0);
lcd.print(">");
}
while (reg == 1) {
if (digitalRead(Down) == 0) {
delay(100);
hr --;
}
if (digitalRead(Up) == 0) {
delay(100);
hr ++;
}
if (hr > 24) {
hr = 0;
}
if (hr == -1) {
hr = 24;
}
if (hr < 10 ) {
lcd.setCursor(5, 0);
lcd.print("0");
lcd.print(hr);
}
if (hr >= 10 ) {
lcd.setCursor(5, 0);
lcd.print(hr);
}
if (digitalRead(SETpin) == 0) {
delay(200);
if (digitalRead(SETpin) == 0) {
reg++;
hr1[ref1][ref2] = hr;
delay(200);
}
}
}
if (reg == 2) {
lcd.setCursor(4, 0);
lcd.print(" ");
lcd.setCursor(8, 0);
lcd.print(">");
}
while (reg == 2) {
if (digitalRead(Down) == 0) {
delay(100);
mn --;
}
if (digitalRead(Up) == 0) {
delay(100);
mn ++;
}
if (mn > 59) {
mn = 0;
}
if (mn == -1) {
mn = 59;
}
if (mn < 10 ) {
lcd.setCursor(9, 0);
lcd.print("0");
lcd.print(mn);
}
if (mn >= 10 ) {
lcd.setCursor(9, 0);
lcd.print(mn);
}
if (digitalRead(SETpin) == 0) {
delay(200);
if (digitalRead(SETpin) == 0) {
reg++;
mn1[ref1][ref2] = mn;
delay(200);
}
}
}
if (reg == 3) {
lcd.setCursor(8, 0);
lcd.print(" ");
lcd.setCursor(12, 0);
lcd.print(">");
}
while (reg == 3) {
if (digitalRead(Down) == 0) {
delay(100);
se --;
}
if (digitalRead(Up) == 0) {
delay(100);
se ++;
}
if (se > 59) {
se = 0;
}
if (se == -1) {
se = 59;
}
if (se < 10 ) {
lcd.setCursor(13, 0);
lcd.print("0");
lcd.print(se);
}
if (se >= 10 ) {
lcd.setCursor(13, 0);
lcd.print(se);
}
if (digitalRead(SETpin) == 0) {
delay(200);
if (digitalRead(SETpin) == 0) {
reg++;
se1[ref1][ref2] = se;
delay(200);
}
}
}
if (reg == 4) {
lcd.setCursor(12, 0);
lcd.print(" ");
lcd.setCursor(4, 1);
lcd.print(">");
}
while (reg == 4) {
if (digitalRead(Down) == 0) {
delay(100);
hr --;
}
if (digitalRead(Up) == 0) {
delay(100);
hr ++;
}
if (hr > 24) {
hr = 0;
}
if (hr == -1) {
hr = 24;
}
if (hr < 10 ) {
lcd.setCursor(5, 1);
lcd.print("0");
lcd.print(hr);
}
if (hr >= 10 ) {
lcd.setCursor(5, 1); ;
lcd.print(hr);
}
if (digitalRead(SETpin) == 0) {
delay(200);
if (digitalRead(SETpin) == 0) {
reg++;
Dhr1[ref1][ref2] = hr;
delay(200);
}
}
}
if (reg == 5) {
lcd.setCursor(4, 1);
lcd.print(" ");
lcd.setCursor(8, 1);
lcd.print(">");
}
while (reg == 5) {
if (digitalRead(Down) == 0) {
delay(100);
mn --;
}
if (digitalRead(Up) == 0) {
delay(100);
mn ++;
}
if (mn > 59) {
mn = 0;
}
if (mn == -1) {
mn = 59;
}
if (mn < 10 ) {
lcd.setCursor(9, 1);
lcd.print("0");
lcd.print(mn);
}
if (mn >= 10 ) {
lcd.setCursor(9, 1);
lcd.print(mn);
}
if (digitalRead(SETpin) == 0) {
delay(200);
if (digitalRead(SETpin) == 0) {
reg++;
Dmn1[ref1][ref2] = mn;
delay(200);
}
}
}
if (reg == 6) {
lcd.setCursor(8, 1);
lcd.print(" ");
lcd.setCursor(12, 1);
lcd.print(">");
}
while (reg == 6) {
if (digitalRead(Down) == 0) {
delay(100);
se --;
}
if (digitalRead(Up) == 0) {
delay(100);
se ++;
}
if (se > 59) {
se = 0;
}
if (se == -1) {
se = 59;
}
if (se < 10 ) {
lcd.setCursor(13, 1);
lcd.print("0");
lcd.print(se);
}
if (se >= 10 ) {
lcd.setCursor(13, 1);
lcd.print(se);
}
if (digitalRead(SETpin) == 0) {
delay(200);
if (digitalRead(SETpin) == 0) {
reg++;
reg = 0;
Dse1[ref1][ref2] = se;
delay(200);
}
}
}
if (item2 == 6) {
lcd.setCursor(4, 0);
lcd.print("<Exit> ");
lcd.setCursor(3, 1);
lcd.print(">>menu<< ");
}
}
if (digitalRead(SETpin) == 0 && item2 == 6) {
SET = 0;
item1 = 0; item2 = 0;
lcd.clear();
delay(100);
}
if (digitalRead(Down) == 0 || digitalRead(Up) == 0) {
if (digitalRead(Down) == 0) {
delay(100);
lcd.clear() ;
item2 --;
}
if (digitalRead(Up) == 0) {
delay(100);
lcd.clear() ;
item2 ++;
}
if (item2 == -1 && SET == 2 ) {
lcd.clear() ;
item2 = 6;
}
if (item2 == 7 && SET == 2 ) {
lcd.clear() ;
item2 = 0;
}
lcd.setCursor(5, 0); lcd.print(hr1[ref1][item2]);
lcd.setCursor(9, 0); lcd.print(mn1[ref1][item2]);
lcd.setCursor(13, 0); lcd.print(se1[ref1][item2]);
lcd.setCursor(5, 1); lcd.print(Dhr1[ref1][item2]);
lcd.setCursor(9, 1); lcd.print(Dmn1[ref1][item2]);
lcd.setCursor(13, 1); lcd.print(Dse1[ref1][item2]);
}
}
}
}
Thousands of thanks.
