Construyendo un reloj. Necesita alguna orientación

1

Bien, aprendí todos los fundamentos del AVR y ahora estoy pensando en construir un reloj como un proyecto. Usaré el ATMega328P junto con el DS1307 RTC. La hora se mostrará en una pantalla LCD u pantalla OLED. Lo que quiero saber es cómo será la estructura general del programa en general. Sé que habrá dos modos; uno para ajustar la hora y otro en el que el reloj funciona normalmente. Necesito ayuda sobre cómo implementaré estos modos y dos cambiarán entre ellos usando botones externos. Sería genial si alguien pudiera arrojar luz sobre esto. Gracias.

    
pregunta hacker804

2 respuestas

1

Cuando trabaje con modos y estados, le recomiendo que utilice los bucles while.

Así que un comienzo sería algo como esto:

#define up_button 0
#define down_button 1
#define set_button 2
#define leave_set_button 3

main_loop(){

    read_RTC_clock();
    //Through spi or i2c or what have you

    write_RTC_clock_to_display(); 
    //To the LCD or OLED display

    read_button_states(); 
    //Update the input_port variable

    if(input_port&set_time_button){
        while(!input_port&leave_set_button){//"and" out the leave button
            //If you are in this loop, then you will stay in here
            //until the user chooses to leave.

            //so we better make it possible for the user to leave by
            //reading the inputs and updating the button status

            read_button_states(); 
            //Update the input_port variable

            switch(input_port){
                case up_button|down_button: 
                //up_button|down_button means that
                // I press both simultaneously
                increment_step = 60/increment_step;
                //if increment_step is 60, then it's now 1 second
                //if increment_step is 1, then it's now 60 seconds
                break;
                case up_button: time+=increment_step; break;                    
                case down_button: time-=increment_step; break;
            }

            //and why not show the LED or OLED what we're doing
            write_settings_to_display();
        }
        write_time_to_RTC_clock();//update the RTC with the time we set
    }
}

No escribiré más ... pero ... así es como comenzaría el proyecto. También me gustaría rebotar los botones en el software. También me preguntaría cuántos botones realmente quiero, cuantos más botones sea más fácil de usar. Podría funcionar con solo 2 botones, pero luego necesita usar algo de tiempo, así que si mantiene presionado un botón durante 1 segundo, significa algo diferente que si lo toca durante 10 milisegundos.

    
respondido por el Harry Svensson
0

¿Orientación? Claro ... no lo traigas a la escuela.

Con toda seriedad, si está utilizando el RTC, esto es bastante simple, ya que no tiene que preocuparse por mantener el tiempo. La visualización del tiempo podría ser simplemente un ciclo de conveniencia que consulta el RTC y luego actualiza la pantalla. Parece que su pantalla también está orientada a comandos en lugar de algo que necesita multiplexar explícitamente como un LED de 4 dígitos de 7 segmentos.

En términos de configurar el reloj, un enfoque sería considerar el concepto de Máquina de estados finitos .

Sin embargo, en el nivel más simple, podría tener lógica que verifique si se presiona un solo botón de "ajuste". Si es así, entonces el tiempo se adelanta en una unidad de tiempo más rápido que el real y se muestra, se espera una demora de una fracción de segundo y el ciclo se repite.

Ese retraso posterior tendrá el beneficio de las dos cosas de estimulación para el usuario y de la solución del problema contact bounce simplemente ignorando el botón un poco después de cada vez que concluyas que está (aún) presionado.

Un diseño más refinado podría ofrecer un botón tanto rápido como lento. O puedes construir un botón de aceleración en el que el retraso comience durante mucho tiempo y se reduzca al mínimo a medida que se mantenga presionado el botón.

En un extremo, puede proporcionar botones individuales hacia arriba y hacia abajo durante horas y minutos, o incluso para cada dígito de cada uno.

O puede crear un esquema más con estado, donde tiene un botón de selección de dígitos que cambia los dígitos que parpadean, y un botón de incremento que incrementa el dígito seleccionado.

Un proyecto más avanzado sería hacer todo esto con MCU y sus temporizadores en chip, sin el chip RTC. Potencialmente podría incluso hacerlo desde el oscilador de baja velocidad que corre desde un cristal de reloj.

    
respondido por el Chris Stratton

Lea otras preguntas en las etiquetas