Uhr bauen. Brauche eine Anleitung

Okay, also habe ich alle Grundlagen des AVR gelernt und denke jetzt darüber nach, eine Uhr als Projekt zu bauen. Ich werde den ATMega328P zusammen mit dem DS1307 RTC verwenden. Die Uhrzeit wird auf einem LCD- oder OLED-Display angezeigt. Was ich wissen möchte, ist, wie die allgemeine Struktur des Gesamtprogramms aussehen wird. Ich weiß, dass es zwei Modi geben wird; eine zum Einstellen der Uhrzeit und eine, in der die Uhr normal läuft. Ich brauche etwas Hilfe, wie ich diese Modi implementieren und zwei mit externen Tasten zwischen ihnen umschalten werde. Es wäre toll, wenn jemand Licht ins Dunkel bringen könnte. Danke schön.

Antworten (2)

Wenn Sie mit Modi und Zuständen arbeiten, rate ich Ihnen dringend, While-Schleifen zu verwenden.

Ein Anfang wäre also etwa so:

#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
    }
}

Ich werde nicht mehr schreiben ... aber ... so würde ich das Projekt starten. Ich würde die Tasten auch per Software entprellen. Ich würde mich auch fragen, wie viele Knöpfe ich wirklich will, je mehr Knöpfe, desto einfacher ist es zu bedienen. Es könnte mit nur 2 Tasten funktionieren, aber dann müssen Sie ein gewisses Timing verwenden. Wenn Sie also eine Taste 1 Sekunde lang gedrückt halten, bedeutet dies etwas anderes, als wenn Sie sie nur 10 Millisekunden lang antippen.

Orientierungshilfe? Sicher ... bring es nicht mit zur Schule.

Ganz im Ernst, wenn Sie die RTC verwenden, ist dies ziemlich einfach, da Sie sich keine Gedanken darüber machen müssen, ob Sie die Zeit tatsächlich einhalten. Das Anzeigen der Zeit könnte einfach eine At-Convenience-Schleife sein, die die RTC abfragt und dann die Anzeige aktualisiert. Es hört sich so an, als ob Ihr Display auch befehlsorientiert ist und nicht etwas, das Sie explizit wie eine 4-stellige 7-Segment-LED multiplexen müssten.

In Bezug auf das Stellen der Uhr wäre ein Ansatz, das Konzept einer endlichen Zustandsmaschine in Betracht zu ziehen .

Auf der einfachsten Ebene könnten Sie jedoch nur eine Logik haben, die überprüft, ob eine einzelne Schaltfläche "Anpassen" gedrückt wird. Wenn dies der Fall ist, wird die Zeit um eine Einheit schneller als die tatsächliche Zeit vorgerückt und angezeigt, eine Verzögerung von einem Bruchteil einer Sekunde wird abgewartet, dann wiederholt sich der Zyklus.

Diese Nachverzögerung hat den Vorteil, dass sowohl die Dinge für den Benutzer beschleunigt werden als auch das contact bounceProblem gelöst wird, indem die Taste jedes Mal, wenn Sie schließen, dass sie (noch) gedrückt wird, einfach ein wenig ignoriert wird.

Ein raffinierteres Design bietet möglicherweise sowohl eine schnelle als auch eine langsame Taste. Oder Sie könnten eine Beschleunigungstaste bauen, bei der die Verzögerung lang beginnt und sich auf ein Minimum reduziert, je länger die Taste gedrückt wird.

Im Extremfall könnten Sie einzelne Auf- und Ab-Tasten für Stunden und Minuten oder sogar für jede Ziffer von jedem bereitstellen.

Oder Sie könnten ein zustandsbehafteteres Schema erstellen, bei dem Sie eine Ziffernauswahltaste haben, die ändert, welche Ziffern blinken, und eine Inkrementtaste, die die ausgewählte Ziffer erhöht.

Ein fortgeschritteneres Projekt wäre, dies alles mit MCU und seinen On-Chip-Timern ohne den RTC-Chip zu tun. Möglicherweise könnten Sie dies sogar mit dem langsamen Oszillator tun, der von einem Uhrglas läuft.

Ich freute mich auf 3 Tasten, UP, DOWN und SET, mit denen Sie die Sekunden, Minuten, Stunden usw. einstellen können. Das Unterprogramm zum Einstellen der Uhrzeit würde nur einmal ausgeführt, wenn die Uhr eingeschaltet wird, und danach würde die Uhr funktioniert normal, bis es wieder zurückgesetzt wird, um die Zeit einzustellen. Die Hauptsache, mit der ich arbeiten müsste, ist, wie man die Zeit erhöht, verringert, seit die RTC in BCD und nicht binär speichert.
So etwas wie die Anzahl der Tasten und die BCD-Anforderung sollte in Ihrer Frage wirklich explizit sein. Es sollte nicht zu schwer sein, Additionen durchzuführen und Übertragslogik zu implementieren - denken Sie nur darüber nach, wie Sie es manuell tun würden . Beginnen Sie ohne die Abwärtstaste, damit Sie sich keine Gedanken über die Subtraktion machen müssen, und stellen Sie eine implizite Regel auf, dass, wenn sowohl die Aufwärts- als auch die Set-Taste gedrückt werden, einer „gewinnt“, da dies Ihnen ermöglicht, alles in derselben Entscheidungs-/Verzögerungsschleife mit ihrer Implizite zu betrachten entprellen.