O problema é que sempre que entras num delay de 4 ou 3 segundos, o programa não corre... e como tal não actualiza os dados do ecrã.
Da mesma maneira, os ciclos while à espera que um sinal seja recebido, bloqueiam o programa e fazem com que não actualize esses mesmos dados.
Se vires, a lógica que necessitas já está no programa e no entanto não vês as horas a mudar, logo a conclusão a tirar é que o programa está preso nalgum lado.
Para evitares que isso aconteça tens de alterar a maneira como estás a programar de forma a que a função loop continue sempre a ser processada e dessa maneira actualizar também o ecrã. Pesquisa por máquinas de estados para teres uma ideia de como programar de forma a que o programa corra sempre. Olha também a como usar a função millis() em vez de delay e acima de tudo não bloqueies o programa num único sítio sempre que esperas que algo aconteça.