So in a nutshell the code is poorly written because I plan it to be the fundation for a calculator, but rigth now is just a timer, so that may be the problem, but everything works until I try to stablish a connection with the serial monitor "Serial.begin(9600)"
Without the serial line the code works fine, if you put it, the lcd display dosnt turn on. (The contrast and backligth are on, but they are not controled by the code
The code:
#include <Keypad.h>
#include <LiquidCrystal.h>
// This defines the LCD wiring to the DIGITALpins
const int rs = 0, en = 1, d4 = 2, d5 = 3, d6 = 4, d7 = 5;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
// Digital LCD Constrast setting
int cs = 6; // pin 9 for contrast PWM
const int contrast = 100; // default contrast
// Time Set Buttons REMOVE LATER
int button1;
int button2;
// Pins definition for Time Set Buttons
int hs=0;// pin 0 for Hours Setting
int ms=2;// pin 1 for Minutes Setting
// initial Time display is 12:59:45 PM
int h = 7;
int m = 6;
int s = 45;
int flag = 1; //PM
// Keypad
const byte ROWS = 4; // number of rows
const byte COLS = 3; // number of columns
char keys[ROWS][COLS] = {
{'1', '2', '3'},
{'4', '5', '6'},
{'7', '8', '9'},
{'*', '0', '#'}
};
byte rowPins[ROWS] = {8, 7, 6, 5}; // row pinouts of the keypad R1 = D8, R2 = D7, R3 = D6, R4 = D5
byte colPins[COLS] = {4, 3, 2}; // column pinouts of the keypad C1 = D4, C2 = D3, C3 = D2
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
// Backlight Time Out
const int Time_light = 150;
int bl_TO = Time_light; // Backlight Time-Out
int bl = 9; // Backlight pin
const int backlight = 120; // no more than 7mA !!!
// For accurate Time reading, use Arduino Real Time Clock and not just delay()
static uint32_t last_time, now = 0; // RTC
void setup() {
lcd.begin(16, 2);
pinMode(hs,INPUT_PULLUP);// avoid external Pullup resistors for Button 1 REMOVE LATER
pinMode(ms,INPUT_PULLUP);// and Button 2 REMOvE LATER
analogWrite(cs, contrast); // Adjust Contrast VO
analogWrite(bl, backlight); // Turn on Backlight
now = millis(); // read RTC initial value
Serial.begin(9600);
}
void loop()
{
lcd.begin(16,2);// every second
// Update LCD Display
// Print TIME in Hour, Min, Sec + AM/PM
lcd.setCursor(0,0);
lcd.print("Time ");
if(h<10)lcd.print("0");// always 2 digits
lcd.print(h);
lcd.print(":");
if(m<10)lcd.print("0");
lcd.print(m);
lcd.print(":");
if(s<10)lcd.print("0");
lcd.print(s);
if(flag==0) lcd.print(" AM");
if(flag==1) lcd.print(" PM");
lcd.setCursor(0,1);// for Line 2
lcd.print("Precision clock");
// improved replacement of delay(1000)
// Much better accuracy, no more dependant of loop execution time
for ( int i=0 ;i<5 ;i++)// make 5 time 200ms loop, for faster Button response
{
while ((now-last_time)<200) //delay200ms
{
now=millis();
}
// inner 200ms loop
last_time=now; // prepare for next loop
// read Setting Buttons
button1=digitalRead(hs);// Read Buttons
button2=digitalRead(ms);
//Backlight time out
bl_TO--;
if(bl_TO==0)
{
analogWrite(bl,0);// Backlight OFF
bl_TO++;
}
// Hit any to activate Backlight
if( ((button1==0)|(button2==0)) & (bl_TO==1) )
{
bl_TO=Time_light;
analogWrite(bl,backlight);
// wait until Button released
while ((button1==0)|(button2==0))
{
button1=digitalRead(hs);// Read Buttons
button2=digitalRead(ms);
}
}
else
// Process Button 1 or Button 2 when hit while Backlight on
{
if(button1==0){
h=h+1;
bl_TO=Time_light;
analogWrite(bl,backlight);
}
if(button2==0){
s=0;
m=m+1;
bl_TO=Time_light;
analogWrite(bl,backlight);
}
/* ---- manage seconds, minutes, hours am/pm overflow ----*/
if(s==60){
s=0;
m=m+1;
}
if(m==60)
{
m=0;
h=h+1;
}
if(h==13)
{
h=1;
flag=flag+1;
if(flag==2)flag=0;
}
if((button1==0)|(button2==0))// Update display if time set button pressed
{
// Update LCD Display
// Print TIME in Hour, Min, Sec + AM/PM
lcd.setCursor(0,0);
lcd.print("Time ");
if(h<10)lcd.print("0");// always 2 digits
lcd.print(h);
lcd.print(":");
if(m<10)lcd.print("0");
lcd.print(m);
lcd.print(":");
if(s<10)lcd.print("0");
lcd.print(s);
if(flag==0) lcd.print(" AM");
if(flag==1) lcd.print(" PM");
lcd.setCursor(0,1);// for Line 2
lcd.print("Precision clock");
}
} // end if else
}// end for
// outer 1000ms loop
s=s+1; //increment sec. counting
// ---- manage seconds, minutes, hours am/pm overflow ----
if(s==60){
s=0;
m=m+1;
}
if(m==60)
{
m=0;
h=h+1;
}
if(h==13)
{
h=1;
flag=flag+1;
if(flag==2)flag=0;
}
// Loop end
}
>Solution :
Arduino Uno uses pins 0 and 1 for serial. According to the reference:
On Uno, Nano, Mini, and Mega, pins 0 and 1 are used for communication with the computer. Connecting anything to these pins can interfere with that communication, including causing failed uploads to the board.
Right now, you’re using those pins for the LCD:
// This defines the LCD wiring to the DIGITALpins
const int rs = 0, en = 1, d4 = 2, d5 = 3, d6 = 4, d7 = 5;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
Try using different pins for the rs and en connections.