#include "LiquidCrystal.h"
// This defines the LCD wiring to the DIGITALpins
const int rs = 2, en = 3, d4 = 4, d5 = 5, d6 = 6, d7 = 7;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
// Digital LCD Constrast setting
int pinContrast = 9;// pin 9 for contrast PWM
const int contrast = 1;// default contrast
// initial Time display is 12:59:45 PM
int varOra = 0;
int varMin = 0;
int varSec = 0;
// Time Set Buttons
int button1;
int button2;
int button3;
// Pins definition for Time Set Buttons
int pinOra = 0;// pin 0 for Hours Setting
int pinMin = 1;// pin 1 for Minutes Setting
// Backlight Time Out
const int Time_light = 50;
int bl_TO = Time_light;// Backlight Time-Out
int pinBackLight = 10; // Backlight pin
const int backlight = 90; // no more then 7mA !!!
// For accurate Time reading, use Arduino Real Time Clock and not just delay()
static uint32_t last_time, now = 0; // RTC
int durataSunet = 1;
int pinDurataSunet = 8; // pin 8 pentru durata sunet
int pinSunet = 12;
void setup()
{
lcd.begin(16,2);
pinMode(pinOra, INPUT_PULLUP);// avoid external Pullup resistors for Button 1
pinMode(pinMin, INPUT_PULLUP);// and Button 2
analogWrite(pinContrast, contrast);// Adjust Contrast VO
analogWrite(pinBackLight, backlight);// Turn on Backlight
now = millis(); // read RTC initial value
pinMode(pinDurataSunet, INPUT_PULLUP);
pinMode(pinSunet, OUTPUT);
}
void loop()
{
lcd.begin(16,2);// every second
// Update LCD Display
// Print TIME in Hour, Min, Sec + AM/PM
lcd.setCursor(0,0);
if(varOra < 10)
lcd.print("0");// always 2 digits
lcd.print(varOra);
lcd.print(":");
if(varMin < 10)
lcd.print("0");
lcd.print(varMin);
lcd.print(":");
if(varSec < 10)
lcd.print("0");
lcd.print(varSec);
lcd.setCursor(0,1);// for Line 2
lcd.print("Durata: ");
lcd.print(durataSunet);
lcd.print(" min ");
// make 5 time 200ms loop, for faster Button response
for (int i = 0; i < 5; i++) {
//delay200ms
while ((now - last_time) < 200) {
now = millis();
}
// inner 200ms loop
last_time = now; // prepare for next loop
// read Setting Buttons
button1 = digitalRead(pinOra);// Read Buttons
button2 = digitalRead(pinMin);
button3 = digitalRead(pinDurataSunet);
// Backlight time out
bl_TO--;
if(bl_TO == 0) {
analogWrite(pinBackLight, 0);// Backlight OFF
bl_TO++;
}
// Hit any to activate Backlight
if(((button1 == 0)|(button2 == 0)|(button3 == 0)) && (bl_TO==1)) {
bl_TO = Time_light;
analogWrite(pinBackLight, backlight);
// wait until Button released
while ((button1 == 0)|(button2 == 0)|(button3 == 0)) {
//Read Buttons
button1 = digitalRead(pinOra);
button2 = digitalRead(pinMin);
button3 = digitalRead(pinDurataSunet);
}
} else {
// Process Button 1, Button 2, Button 3 or Button 4 when hit while Backlight on
if(button1 == 0){
varOra = varOra + 1;
bl_TO = Time_light;
analogWrite(pinBackLight, backlight);
}
if(button2 == 0){
varSec = 0;
varMin = varMin + 1;
bl_TO = Time_light;
analogWrite(pinBackLight, backlight);
}
if(button3 == 0) {
durataSunet += 1;;
bl_TO = Time_light;
analogWrite(pinBackLight, backlight);
}
// manage durata sunet si delay sunet overflow
if(durataSunet > 10)
durataSunet = 1;
// ---- manage seconds, minutes, hours am/pm overflow ----
if(varSec == 60) {
varSec = 0;
varMin = varMin + 1;
}
if(varMin == 60) {
varMin = 0;
varOra = varOra + 1;
}
if(varOra == 24)
varOra = 0;
// Update display if time set button pressed
if((button1 == 0)|(button2 == 0)) {
lcd.begin(16,2);// every second
// Update LCD Display
// Print TIME in Hour, Min, Sec + AM/PM
lcd.setCursor(0,0);
if(varOra < 10)
lcd.print("0");// always 2 digits
lcd.print(varOra);
lcd.print(":");
if(varMin < 10)
lcd.print("0");
lcd.print(varMin);
lcd.print(":");
if(varSec < 10)
lcd.print("0");
lcd.print(varSec);
lcd.setCursor(0,1);// for Line 2
lcd.print("Durata: ");
lcd.print(durataSunet);
lcd.print(" min ");
}
}
}
// outer 1000ms loop
varSec = varSec + 1; //increment varSec. counting
// manage seconds, minutes
if(varSec == 60){
varSec = 0;
varMin = varMin + 1;
}
if(varMin == 60) {
varMin = 0;
varOra = varOra + 1;
}
if(varOra == 24)
varOra = 0;
if(durataSunet > 10) {
durataSunet = 1;
}
// Programare sunet
if((varOra >= 6) && (varOra <= 20)) {
if(((varMin >= 0) && (varMin < durataSunet)) || ((varMin >= 30) && (varMin < 30 + durataSunet)))
digitalWrite(pinSunet, HIGH);
else
digitalWrite(pinSunet, LOW);
}
}