I have to reset arduino after I power it on to get the sketch to run

Every time i power on my arduino (usb or external) i have to press the reset button to get the sketch to run properly. When it first powers on there is a blinking curson on the lcd in the 13,3 position (the lcd is a 20x4) How can I fix this so I don’t have to hit reset every time I power it on. Eventually I will have all of this mounted so the arduino is hidden. And i’d prefer not to make an external reset.
Thanks in advance.
JT

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>

//constants for Control Pin

int controlPin = 12;
char currentTimeValue[4];
int currentState = 1;
int timerSeconds = 0;
int lpcnt = 0;

//define the keypad
const byte rows = 4;
const byte cols = 4;
char keys[rows][cols] = {

 {'1','2','3','A'},
 {'4','5','6','B'},
 {'7','8','9','C'},
 {'*','0','#','D'}
};

byte rowPins[rows] = {11,10,9,8};
byte colPins[cols] = {7,6,5,4};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, rows, cols);
LiquidCrystal_I2C lcd(0x3F,20,4); // set the LCD address to 0x27 for a 16 chars and 2 line 
//display

void setup()
{
 lcd.init(); // initialize the lcd

 // Print a message to the LCD.
 lcd.backlight();

 //display main screen
 displayCodeEntryScreen();

 //setup and turn off relay
 pinMode(controlPin, OUTPUT);
 digitalWrite(controlPin, LOW);
 
 //setup default time to 00:00
 currentTimeValue[0]='0';
 currentTimeValue[1]='0';
 currentTimeValue[2]='0';
 currentTimeValue[3]='0';
 showEnteredTime();
}

void loop()
{
 int l;
 char tempVal[3];
 char key = keypad.getKey();

 //key pressed and state is 1
 if (int(key) != 0 and currentState == 1) {

 switch (key) {
 case '*':
 relayStatus(false);
 currentTimeValue[0]='0';
 currentTimeValue[1]='0';
 currentTimeValue[2]='0';
 currentTimeValue[3]='0';
 showEnteredTime();
 currentState = 1;

 lpcnt = 0;
 timerSeconds = 0;
 break;

 case '#':
 tempVal[0] = currentTimeValue[0];
 tempVal[1] = currentTimeValue[1];
 tempVal[2] = 0;

 timerSeconds = atol(tempVal) * 60;

 tempVal[0] = currentTimeValue[2];
 tempVal[1] = currentTimeValue[3];
 tempVal[2] = 0;

 timerSeconds = timerSeconds + atol(tempVal);
 currentState = 2;
 break;

 default:
 currentTimeValue[0] = currentTimeValue[1];
 currentTimeValue[1] = currentTimeValue[2];
 currentTimeValue[2] = currentTimeValue[3];
 currentTimeValue[3] = key;
 showEnteredTime();
 break;
 }
 }

 if (currentState == 2) {
 if (int(key) != 0) {
 if (key == '*') {
 relayStatus(false);
 displayCodeEntryScreen();
 currentTimeValue[0]='0';
 currentTimeValue[1]='0';
 currentTimeValue[2]='0';
 currentTimeValue[3]='0';
 showEnteredTime();
 currentState = 1;
 lpcnt = 0;
 timerSeconds = 0;
 }
 } else {

 if (lpcnt > 9) {
 lpcnt = 0;
 --timerSeconds;
 showCountdown();

 if (timerSeconds <= 0) {
 currentState = 1;
 relayStatus(false);
 displayCodeEntryScreen();
 showEnteredTime();
 } else {
 relayStatus(true);
 }
 }

 ++lpcnt;
 delay(100);
 }
 }
}

void showEnteredTime()
{
 lcd.setCursor(8,3);
 lcd.print(currentTimeValue[0]);
 lcd.print(currentTimeValue[1]);
 lcd.print(":");
 lcd.print(currentTimeValue[2]);
 lcd.print(currentTimeValue[3]);
}
void relayStatus(bool state)
{
 if (state)
 digitalWrite(controlPin, HIGH);
 else
 digitalWrite(controlPin, LOW);
}
void showCountdown()
{
 char timest[6];\

 lcd.setCursor(0,0);
 lcd.print("   BURNING SCREEN   ");
 lcd.setCursor(0,1);
 lcd.print("                    ");
 lcd.setCursor(8,2);
 lcd.print("                    ");
 sprintf(timest, "%d:%.2d", (timerSeconds/60), (timerSeconds - ((timerSeconds/60)*60)));
 lcd.print(timest);
 lcd.print("   ");
 
}

void displayCodeEntryScreen()
{
 clearScreen();
 lcd.setCursor(0,0);
 lcd.print("     ENTER TIME     ");
}

void clearScreen()
{
 lcd.setCursor(0,0);
 lcd.print("                   ");
 lcd.setCursor(0,1);
 lcd.print("                   ");
 lcd.setCursor(0,2);
 lcd.print("                   ");
 lcd.setCursor(0,3);
 lcd.print("                   ");
}

As an experiment try adding a delay(1000); both before and after your lcd.init(); // initialize the lcd statement in your setup function. I've read that LCD can take a lot of time to initilize and can lock thing up if you don't let it complete.

retrolefty: As an experiment try adding a delay(1000); both before and after your lcd.init(); // initialize the lcd statement in your setup function. I've read that LCD can take a lot of time to initilize and can lock thing up if you don't let it complete.

Good idea but no luck. Thanks anyway.

How old is your arduino, and what kind is it? (Uno, Micro, Leonardo, etc…)

westfw: How old is your arduino, and what kind is it? (Uno, Micro, Leonardo, etc...)

It's new and it's an uno r3

I don’t have your hardware so I can’t try your code.

I suggest taking stuff out of the code until the problem goes away and then adding it back in small pieces.

…R