Σελίδα 1 από 3 1 2 3 ΤελευταίαΤελευταία
Εμφάνιση αποτελεσμάτων : 1 έως 10 από 21

Θέμα: ARDUINO NANO RTC, COVID-19 TIMEKILLER PROJECT

  1. #1
    Μέλος Το avatar του χρήστη manolena
    Όνομα
    Μάνος
    Εγγραφή
    Dec 2006
    Περιοχή
    Ελευσίνα
    Μηνύματα
    2.709

    Προεπιλογή ARDUINO NANO RTC, COVID-19 TIMEKILLER PROJECT

    Χαιρετώ όλους,

    Μέσα στη βαρεμάρα που έχει όλη αυτή η κατάσταση και μεταξύ άλλων ασχολιών, έφτιαξα αυτό το ρολογάκι απο scratch.

    Πατήστε στην εικόνα για να τη δείτε σε μεγένθυνση Όνομα:  IMG_20200502_215910.jpg Εμφανίσεις:  497 Μέγεθος:  146,8 KB Πατήστε στην εικόνα για να τη δείτε σε μεγένθυνση Όνομα:  IMG_20200502_215719.jpg Εμφανίσεις:  257 Μέγεθος:  155,8 KB Πατήστε στην εικόνα για να τη δείτε σε μεγένθυνση Όνομα:  IMG_20200502_215633.jpg Εμφανίσεις:  265 Μέγεθος:  135,7 KB Πατήστε στην εικόνα για να τη δείτε σε μεγένθυνση Όνομα:  IMG_20200502_215545.jpg Εμφανίσεις:  243 Μέγεθος:  148,2 KB Πατήστε στην εικόνα για να τη δείτε σε μεγένθυνση Όνομα:  IMG_20200502_215620.jpg Εμφανίσεις:  249 Μέγεθος:  143,1 KB Πατήστε στην εικόνα για να τη δείτε σε μεγένθυνση Όνομα:  Schematics.jpg Εμφανίσεις:  284 Μέγεθος:  141,0 KB


    Βασίζεται σε έναν Arduino Nano (ATMega328 mcu) και με 6 ψηφία των 7 τμημάτων δείχνει ώρα και ημερομηνία προς το παρόν
    και κάποια στιγμή στο μέλλον και θερμοκρασία (δεν είχα μοντουλάκι θερμόμετρο), όπως και κάποια ξυπνητήρια. Μέσω 3 μπουτόν
    μπορεί να ρυθμίσει κάποιος την ώρα και την ημερομηνία. Δέν είναι κάτι εξωτικό, μπορεί να γίνει και άσκηση για κάποιους
    και σε κατασκευαστικό αλλά και σε προγραμματιστικό επίπεδο.
    Ακολουθούν τα σχετικά αρχεία κώδικα.

    20 Not allowed! Not allowed!

  2. 19 μέλη ευχαρίστησαν τον manolena για αυτό το χρήσιμο μήνυμα:

    αλπινιστης (04-05-20), airgeorge (03-05-20), aktis (04-05-20), aris285 (03-05-20), FH16 (03-05-20), Gaou (03-05-20), ironda19 (03-05-20), kentar (05-05-20), kioan (03-05-20), lepouras (03-05-20), liat (03-05-20), makisvl (03-05-20), michalism (08-05-20), mikemtb (03-05-20), moutoulos (06-05-20), nestoras (03-05-20), selectronic (03-05-20), SV1EDG (11-05-20), TSAKALI (05-05-20)

  3. #2
    Μέλος Το avatar του χρήστη manolena
    Όνομα
    Μάνος
    Εγγραφή
    Dec 2006
    Περιοχή
    Ελευσίνα
    Μηνύματα
    2.709

    Προεπιλογή

    CLOCK_8.ino
    Κώδικας:
    //==========================================                
    #include <TimerOne.h>                                       //Βιβλιοθήκη διαχείρησης TIMER1
    #include <MsTimer2.h>                                       //Βιβλιοθήκη διαχείρησης TIMER2
    #include <Wire.h>                                           //Βιβλιοθήκη διαχείρησης σειριακής πόρτας
    #include <RTClib.h>                                         //Βιβλιοθήκη διαχείρησης RTC
    #include "defines.h"
    //==========================================
    RTC_DS1307 rtc;                             //Ορισμός κλάσσης RTC
    //==========================================
    //SETUP
    //==========================================
    void setup()
    {
      Wire.begin();
      Serial.begin(9600);
      //rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    
    
      Timer1.initialize(500000);                                //Αρχικοποίησε Timer1 στα 0.5sec διακοπές
      Timer1.attachInterrupt(blinkLED);                         //Ενεργοποίησε τη ρουτίνα διακοπής blinkLED(); 
    
    
      MsTimer2::set(250, timer2Isr);                            //Αρχικοποίησε Timer2 στα 0.25sec διακοπές
      MsTimer2::start();                                        //Ενεργοποίησε τη ρουτίνα διακοπής timer2Isr();
    
    
      pinMode(LED_BUILTIN, OUTPUT);                             //Όρισε το LED του Arduino σαν έξοδο
      digitalWrite(LED_BUILTIN, state);                         //Δώσε έξοδο στο pin D13 ανάλογα με την boolean state
    
    
      pinMode(BUTTONS_PIN, INPUT_PULLUP);                       //Όρισε το pin A3 σαν αναλογική είσοδο για διάβασμα μπουτόν
    
    
      for (int y = 0; y < 7; y++)                               //Ρουτίνα αρχικοποίησης των τμημάτων των LED displays σαν έξοδοι
      {
        pinMode(DIGITS[y], OUTPUT);                             
      }
      for (int x = 0; x < 8; x++)                               //Ρουτίνα αρχικοποίησης των ανόδων τωνLED displays σαν έξοδοι                           
      {
        pinMode(SEGMENTS[x], OUTPUT);
      }
      menu = 0;                                                 //Όρισε σαν αρχικό μενού 0 την ένδειξη ώρας
    }
    //==========================================
    //MAIN LOOP
    //==========================================
    void loop()                         
    {
      readRTC();                                                //Ρουτίνα ανάγμωσης του RTC
      navigate();                                               //Πλοήγηση στα μενού
    }
    //==========================================
    //ΡΙΝΤ ΤΙΜΕ
    //==========================================
    void printTime()                                            //Ρουτίνα διαχείρισης πληροφορίας ώρας και ημερομηνίας
    {                                                           //ανά καταχωρητή ώρας, λεπτού, δευτερολέπτου, ημέρας, μήνα και έτους
      printDigit(setHourTemp / 10, hoursTenths);                //Διαίρεση δια 10 για να πάρεις τις δεκάδες
      delay(del_2);                                             //Καθυστέρηση απαραίτητη για να δείχνει σωστά
      printDigit(setHourTemp % 10, hoursUnits);                 //Διαίρεση με modulo 10 για να πάρεις τις μονάδες
      delay(del_2);                                             //Καθυστέρηση απαραίτητη για να δείχνει σωστά
      printDigit(setMinuteTemp / 10, minutesTenths);            //Διαίρεση δια 10 για να πάρεις τις δεκάδες
      delay(del_2);                                             //Καθυστέρηση απαραίτητη για να δείχνει σωστά
      printDigit(setMinuteTemp % 10, minutesUnits);             //Διαίρεση με modulo 10 για να πάρεις τις μονάδες
      delay(del_2);                                             //Καθυστέρηση απαραίτητη για να δείχνει σωστά
      printDigit(setSecondTemp / 10, secondsTenths);            //Διαίρεση δια 10 για να πάρεις τις δεκάδες
      delay(del_2);                                             //Καθυστέρηση απαραίτητη για να δείχνει σωστά
      printDigit(setSecondTemp % 10, secondsUnits);             //Διαίρεση με modulo 10 για να πάρεις τις μονάδες
      delay(del_2);                                             //Καθυστέρηση απαραίτητη για να δείχνει σωστά
    }
    //==========================================
    void printDate()
    {
      printDigit((setYearTemp - 2000) / 10, yearsTenths);       //Διαίρεση δια 10 για να πάρεις τις δεκάδες
      delay(del_2);                                             //Καθυστέρηση απαραίτητη για να δείχνει σωστά
      printDigit((setYearTemp - 2000) % 10, yearsUnits);        //Διαίρεση με modulo 10 για να πάρεις τις μονάδες
      delay(del_2);                                             //Καθυστέρηση απαραίτητη για να δείχνει σωστά
      printDigit(setMonthTemp / 10, monthsTenths);              //Διαίρεση δια 10 για να πάρεις τις δεκάδες
      delay(del_2);                                             //Καθυστέρηση απαραίτητη για να δείχνει σωστά
      printDigit(setMonthTemp % 10, monthsUnits);               //Διαίρεση με modulo 10 για να πάρεις τις μονάδες
      delay(del_2);                                             //Καθυστέρηση απαραίτητη για να δείχνει σωστά
      printDigit(setDateTemp / 10, daysTenths);                 //Διαίρεση δια 10 για να πάρεις τις δεκάδες  
      delay(del_2);                                             //Καθυστέρηση απαραίτητη για να δείχνει σωστά
      printDigit(setDateTemp % 10, daysUnits);                  //Διαίρεση με modulo 10 για να πάρεις τις μονάδες
      delay(del_2);                                             //Καθυστέρηση απαραίτητη για να δείχνει σωστά
    }
    //==========================================
    void printDigit(int number, int position)                   //Ρουτίνα διαχείρησης 'ενδειξης στα 7 segments
    {
      for (int j = 0; j < 7; j++)                               //Απαριθμητής για 7 επαναλήψεις
      {
        digitalWrite(SEGMENTS[j], num_array[number][j]);        //Γράψε στα OUTPUTS των 7 segments τα δεδομένα των πινάκων SEGMENTS, num_array[number] 
        delay(scTime);                                          //Καθυστέρηση απαραίτητη για να δείχνει σωστά
      }
      for (int y = 0; y < 6; y++)                               //Γράψε στα OUTPUTS των ΑΝΟΔΩΝ κάθε ψηφίου τα δεδομένα των πινάκων DIGITS, digits_array 
      {
        digitalWrite(DIGITS[y], digits_array[position][y]);
      }
    }
    //==========================================
    //ΡΟΥΤΙΝΑ ΕΞΥΠΗΡΕΤΗΣΗΣ ΔΙΑΚΟΠΗΣ ΤΙΜΕR2
    //==========================================
    void timer2Isr(void)
    {
      readButtons();                                             //Διάβασε τα μπουτόν ανά 250ms
    }
    //==========================================
    //ΡΟΥΤΙΝΑ ΕΞΥΠΗΡΕΤΗΣΗΣ ΔΙΑΚΟΠΗΣ ΤΙΜΕR1
    //==========================================
    void blinkLED(void)
    {
      cli();                                                     //Απενεργοποίησε τις διακοπές
      returningCounter++;                                        //Αύξησε κατά 1 τον απαριθμητή που κρατάει το χρόνο επιστροφής στο αρχικό μενου           
      state = !state;                                            //Εναλλαγή κατάστασης ανα 500ms για το αναβόσβημα των τελείων
      digitalWrite(LED_BUILTIN, state);                          //Άναψε ή σβήσε τα LED των δευτερολέπτων
      sei();                                                     //Ενεργοποίησε τις διακοπές
    }
    //==========================================
    //  !!!!!!!! ΤΕΛΟΣ ΚΩΔΙΚΑ !!!!!!!!!!!!!
    //==========================================
    defines.h
    Κώδικας:
    #define segA  12                                            //Όρισε το pin D12 σαν segment A
    #define segB  11                                            //Όρισε το pin D11 σαν segment B
    #define segC  10                                            //Όρισε το pin D9 σαν segment C
    #define segD  9                                             //Όρισε το pin D8 σαν segment D
    #define segE  8                                             //Όρισε το pin D7 σαν segment E
    #define segF  7                                             //Όρισε το pin D6 σαν segment F
    #define segG  6                                             //Όρισε το pin D5 σαν segment G
    
    
    #define UP      1                                           //Όρισε το μπουτόν ΠΑΝΩ σαν τιμή 1
    #define MIDDLE  2                                           //Όρισε το μπουτόν ΜΕΣΣΑΙΟ σαν τιμή 2
    #define DOWN    3                                           //Όρισε το μπουτόν ΚΑΤΩ σαν τιμή 3
    #define NONE    0                                           //Όρισε το μπουτόν ΚΑΝΕΝΑ σαν τιμή 0
    
    
    #define hoursTenths   0                                     
    #define hoursUnits    1 
    #define minutesTenths 2
    #define minutesUnits  3
    #define secondsTenths 4
    #define secondsUnits  5
    
    
    #define daysTenths    0
    #define daysUnits     1
    #define monthsTenths  2
    #define monthsUnits   3
    #define yearsTenths   4
    #define yearsUnits    5
    
    
    #define del_1          50                                   //Καθυστέρηση 50ms                         
    #define del_2          3                                    //Καθυστέρηση 3ms     
    #define scTime         0                                    //Καθυστέρηση 0ms    
    #define returningDelay 15                                   //Καθυστέρηση 15ms    
    //==========================================
    int DIG1 = 15;                                             //Όρισε το pin D15/A1 σαν ψηφίο δεκάδων ωρών
    int DIG2 = 14;                                             //Όρισε το pin D14/A0 σαν ψηφίο μονάδων ωρών
    int DIG3 = 2;                                              //Όρισε το pin D2 σαν ψηφίο δεκάδων λεπτών
    int DIG4 = 3;                                              //Όρισε το pin D3 σαν ψηφίο μονάδων λεπτών
    int DIG5 = 4;                                              //Όρισε το pin D4 σαν ψηφίο δεκάδων δευτερολέπτων
    int DIG6 = 5;                                              //Όρισε το pin D5 σαν ψηφίο μονάδων δευτερολέπτων
    const int BUTTONS_PIN = PIN_A3;                            //Όρισε το pin D5 σαν αναλογική είσοδο ανάγνωσης μπουτόν
    int old_button = 0;
    int pressed_button = 0;
    int button, button2;
    int i, sum;
    int val;
    int scanningTime = 0;
    int returningCounter = 0;
    int menu = 1;
    boolean state = false;
    boolean dateState = false;
    int counterDate = 0;
    unsigned int second = 0;
    unsigned int minute = 0;
    long hour = 0;
    long date = 0;
    unsigned int month = 0;
    unsigned int year = 0;
    //==========================================
    byte DIGITS[6] = {DIG1, DIG2, DIG3, DIG4, DIG5, DIG6};
    byte SEGMENTS[8] = {segA, segB, segC, segD, segE, segF, segG};
    int num_array[11][7] = {{ 1, 1, 1, 1, 1, 1, 0 }, // 0
      { 0, 1, 1, 0, 0, 0, 0 }, // 1
      { 1, 1, 0, 1, 1, 0, 1 }, // 2
      { 1, 1, 1, 1, 0, 0, 1 }, // 3
      { 0, 1, 1, 0, 0, 1, 1 }, // 4
      { 1, 0, 1, 1, 0, 1, 1 }, // 5
      { 1, 0, 1, 1, 1, 1, 1 }, // 6
      { 1, 1, 1, 0, 0, 0, 0 }, // 7
      { 1, 1, 1, 1, 1, 1, 1 }, // 8
      { 1, 1, 1, 0, 0, 1, 1 }, // 9
      { 0, 0, 0, 0, 0, 0, 0 }
    };   //blank
    
    
    int digits_array[7][6] = {{0, 1, 1, 1, 1, 1},
      {1, 0, 1, 1, 1, 1},
      {1, 1, 0, 1, 1, 1},
      {1, 1, 1, 0, 1, 1},
      {1, 1, 1, 1, 0, 1},
      {1, 1, 1, 1, 1, 0}
    };
    //==========================================
    uint16_t setYearTemp;
    int setMonthTemp;
    int setDateTemp;
    int setHourTemp;
    int setMinuteTemp;
    int setSecondTemp;



    4 Not allowed! Not allowed!

  4. Ένα μέλος ευχαρίστησε τον manolena για αυτό το χρήσιμο μήνυμα:

    kioan (03-05-20)

  5. #3
    Μέλος Το avatar του χρήστη manolena
    Όνομα
    Μάνος
    Εγγραφή
    Dec 2006
    Περιοχή
    Ελευσίνα
    Μηνύματα
    2.709

    Προεπιλογή

    rtc.ino
    Κώδικας:
    //==========================================
    //READ RTC
    //==========================================
    void readRTC()                                              //Ρουτίνα ανάγνωσης RTC και φόρτωση σχετικών καταχωρητών
    {                                                           //με δεδομένα ώρας, ημερομηνίας
      DateTime now = rtc.now();
      setHourTemp = now.hour();
      setMinuteTemp = now.minute();
      setSecondTemp = now.second();
      setYearTemp = now.year();
      setMonthTemp = now.month();
      setDateTemp = now.day();
    }
    //==========================================
    //ΡΟΥΤΙΝΑ ΡΥΘΜΙΣΗΣ ΩΡΑΣ
    //==========================================
    void adjustHour()                                            //
    {
      DateTime now = rtc.now();                                  //Διάβασε τους καταχωρητές του RTC... 
      setHourTemp = now.hour();                                  //...και αποθήκευσε τα δεδομένα της ώρας στον καταχωρητή τους
      if (pressed_button == UP)                                  //Αν πατήθηκε το μπουτόν ΠΑΝΩ...
      {
        returningCounter = 0;                                    //...μηδένισε τον απαριθμητή επιστροφής στο αρχικό μενού...
        setHourTemp++;                                           //...και αύξησε κατά 1 τις ώρες
        if (setHourTemp > 23) setHourTemp = 0;                   //Αν οι ώρες είναι μεγαλύτερες απο 23, τότε μηδένισε
        pressed_button = NONE;                                   //Όρισε σαν πατημένο μπουτόν κανένα
      }
      else if (pressed_button == DOWN)                           //Αλλιώς αν πατήθηκε το μπουτόν ΚΑΤΩ...
      {
        returningCounter = 0;                                    //...μηδένισε τον απαριθμητή επιστροφής στο αρχικό μενού...
        setHourTemp--;                                           //...και μείωσε κατά 1 τις ώρες
        if (setHourTemp < 0) setHourTemp = 23;                   //Αν οι ώρες είναι μικρότερες απο 0, τότε κάνε τις 23
        pressed_button = NONE;                                   //Όρισε σαν πατημένο μπουτόν κανένα
      }
    }
    //==========================================
    //ΡΟΥΤΙΝΑ ΡΥΘΜΙΣΗΣ ΛΕΠΤΩΝ
    //==========================================
    void adjustMinute()
    {
      DateTime now = rtc.now();                                  //Διάβασε τους καταχωρητές του RTC... 
      setMinuteTemp = now.minute();                              //...και αποθήκευσε τα δεδομένα των λεπτών στον καταχωρητή τους
    
    
      if (pressed_button == UP)                                  //Αν πατήθηκε το μπουτόν ΠΑΝΩ...
      {
        returningCounter = 0;                                    //...μηδένισε τον απαριθμητή επιστροφής στο αρχικό μενού...
        setMinuteTemp++;                                         //...και αύξησε κατά 1 τα λεπτά
        if (setMinuteTemp > 59) setMinuteTemp = 0;               //Αν τα λεπτά είναι μεγαλύτερα απο 59, τότε μηδένισε
        pressed_button = NONE;                                   //Όρισε σαν πατημένο μπουτόν κανένα
      }
      else if (pressed_button == DOWN)                           //Αλλιώς αν πατήθηκε το μπουτόν ΚΑΤΩ...
      {
        returningCounter = 0;                                    //...μηδένισε τον απαριθμητή επιστροφής στο αρχικό μενού...
        setMinuteTemp--;                                         //...και μείωσε κατά 1 τα λεπτά
        if (setMinuteTemp < 0) setMinuteTemp = 59;               //Αν τα λεπτά είναι μικρότερα απο 0, τότε κάνε τα 59
        pressed_button = NONE;                                   //Όρισε σαν πατημένο μπουτόν κανένα
      }
    }
    //==========================================
    //ΡΟΥΤΙΝΑ ΡΥΘΜΙΣΗΣ ΔΕΥΤΕΡΟΛΕΠΤΩΝ
    //==========================================
    void adjustSecond()
    {
      DateTime now = rtc.now();                                  //Διάβασε τους καταχωρητές του RTC... 
      setSecondTemp = now.second();                              //...και αποθήκευσε τα δεδομένα των δευτερολέπτων στον καταχωρητή τους
    
    
      if (pressed_button == UP)                                  //Αν πατήθηκε το μπουτόν ΠΑΝΩ...
      {
        returningCounter = 0;                                    //...μηδένισε τον απαριθμητή επιστροφής στο αρχικό μενού...
        setSecondTemp++;                                         //...και αύξησε κατά 1 τα δευτερόλεπτα
        if (setSecondTemp > 59) setSecondTemp = 0;               //Αν τα δευτερόλεπτα είναι μεγαλύτερα απο 59, τότε μηδένισε
        pressed_button = NONE;                                   //Όρισε σαν πατημένο μπουτόν κανένα
      }
      else if (pressed_button == DOWN)                           //Αλλιώς αν πατήθηκε το μπουτόν ΚΑΤΩ...
      {
        returningCounter = 0;                                    //...μηδένισε τον απαριθμητή επιστροφής στο αρχικό μενού...
        setSecondTemp--;                                         //...και μείωσε κατά 1 τα δευτερόλεπτα
        if (setSecondTemp < 0) setSecondTemp = 59;               //Αν τα δευτερόλεπτα είναι μικρότερα απο 0, τότε κάνε τα 59
        pressed_button = NONE;                                   //Όρισε σαν πατημένο μπουτόν κανένα
      }
    }
    //==========================================
    //ΡΟΥΤΙΝΑ ΡΥΘΜΙΣΗΣ ΗΜΕΡΩΜΗΝΙΑΣ
    //==========================================
    void adjustDate()
    {
      DateTime now = rtc.now();                                  //Διάβασε τους καταχωρητές του RTC... 
      setDateTemp = now.day();                                   //...και αποθήκευσε τα δεδομένα των ημερών στον καταχωρητή τους
    
    
      if (pressed_button == UP)                                  //Αν πατήθηκε το μπουτόν ΠΑΝΩ...
      {
        returningCounter = 0;                                    //...μηδένισε τον απαριθμητή επιστροφής στο αρχικό μενού...
        setDateTemp++;                                           //...και αύξησε κατά 1 τις ημέρες
        if (setDateTemp > 31) setDateTemp = 1;                   //Αν οι ημέρες είναι μεγαλύτερες απο 31, τότε κάνε τις 1
        pressed_button = NONE;                                   //Όρισε σαν πατημένο μπουτόν κανένα
      }
      else if (pressed_button == DOWN)                           //Αλλιώς αν πατήθηκε το μπουτόν ΚΑΤΩ...
      {
        returningCounter = 0;                                    //...μηδένισε τον απαριθμητή επιστροφής στο αρχικό μενού...
        setDateTemp--;                                           //...και μείωσε κατά 1 τις ημέρες
        if (setDateTemp < 1) setDateTemp = 31;                   //Αν οι ημέρες είναι μικρότερες απο 1, τότε κάνε τα 31
        pressed_button = NONE;                                   //Όρισε σαν πατημένο μπουτόν κανένα
      }
    }
    //==========================================
    //ΡΟΥΤΙΝΑ ΡΥΘΜΙΣΗΣ ΜΗΝΑ
    //==========================================
    void adjustMonth()
    {
      DateTime now = rtc.now();                                  //Διάβασε τους καταχωρητές του RTC... 
      setMonthTemp = now.month();                                //...και αποθήκευσε τα δεδομένα των μηνών στον καταχωρητή τους
    
    
      if (pressed_button == UP)                                  //Αν πατήθηκε το μπουτόν ΠΑΝΩ...
      {
        returningCounter = 0;                                    //...μηδένισε τον απαριθμητή επιστροφής στο αρχικό μενού...
        setMonthTemp++;                                          //...και αύξησε κατά 1 τους μήνες
        if (setMonthTemp > 12) setMonthTemp = 1;                 //Αν οι μήνες είναι μεγαλύτεροι απο 12, τότε κάνε τους 1
        pressed_button = NONE;                                   //Όρισε σαν πατημένο μπουτόν κανένα
      }
      else if (pressed_button == DOWN)                           //Αλλιώς αν πατήθηκε το μπουτόν ΚΑΤΩ...
      {
        returningCounter = 0;                                    //...μηδένισε τον απαριθμητή επιστροφής στο αρχικό μενού...
        setMonthTemp--;                                          //...και μείωσε κατά 1 τους μήνες
        if (setMonthTemp < 1) setMonthTemp = 12;                 //Αν οι μήνες είναι μικρότεροι απο 1, τότε κάνε τους 12
        pressed_button = NONE;                                   //Όρισε σαν πατημένο μπουτόν κανένα
      }
    }
    //==========================================
    //ΡΟΥΤΙΝΑ ΡΥΘΜΙΣΗΣ ΕΤΟΥΣ
    //==========================================
    void adjustYear()
    {
      DateTime now = rtc.now();                                  //Διάβασε τους καταχωρητές του RTC... 
      setYearTemp = now.year();                                  //...και αποθήκευσε τα δεδομένα των ετών στον καταχωρητή τους
    
    
      if (pressed_button == UP)                                  //Αν πατήθηκε το μπουτόν ΠΑΝΩ...
      {
        returningCounter = 0;                                    //...μηδένισε τον απαριθμητή επιστροφής στο αρχικό μενού...
        setYearTemp++;                                           //...και αύξησε κατά 1 τα έτη
        if (setYearTemp > 99) setYearTemp = 0;                   //Αν τα έτη είναι μεγαλύτερα απο 99, τότε κάνε τα 0 (2000-2099)
        pressed_button = NONE;                                   //Όρισε σαν πατημένο μπουτόν κανένα
      }
      else if (pressed_button == DOWN)                           //Αλλιώς αν πατήθηκε το μπουτόν ΚΑΤΩ...
      {
        returningCounter = 0;                                    //...μηδένισε τον απαριθμητή επιστροφής στο αρχικό μενού...
        setYearTemp--;
        if (setYearTemp < 0) setYearTemp = 99;                   //Αν τα έτη είναι μικρότερα απο 0, τότε κάνε τους 99 (2000-2099)
        pressed_button = NONE;                                   //Όρισε σαν πατημένο μπουτόν κανένα
      }
    }

    4 Not allowed! Not allowed!

  6. 2 μέλη ευχαρίστησαν τον manolena για αυτό το χρήσιμο μήνυμα:

    kioan (03-05-20), michalism (08-05-20)

  7. #4
    Μέλος Το avatar του χρήστη manolena
    Όνομα
    Μάνος
    Εγγραφή
    Dec 2006
    Περιοχή
    Ελευσίνα
    Μηνύματα
    2.709

    Προεπιλογή

    utilities.ino
    Κώδικας:
    
    //==========================================
    //NAVIGATE MENUS
    //==========================================
    void navigate()                                              //Ρουτίνα διαχείρισης της πλοήγησης στα μενού
    {
      if (pressed_button == MIDDLE)                              //Αν το μεσαίο μπουτόν πατηθεί... 
      {
        menu++;                                                  //...αύξησε κατά 1 τον αριθμό των μενού στον καταχωρητή menu
        returningCounter = 0;                                    //Μηδένισε τον απαριμητή που μετράει χρόνο για επιστροφή στην ώρα αν ξεχάσεις να προχωρήσεις 
        pressed_button = NONE;                                   //Όρισε σαν κατάσταση μπουτόν κανένα πατημένο
        if (menu > 7) menu = 0;                                  //Αν ξεπεράσεις το 6ο μενού, επιστρέφεις στο αρχικό 0
      }
      if (menu == 0)                                             //Αν είσαι στο αρχικό μενού 0...
      {
        scanningTime = 0;                                        //...μηδένισε την καθυστέρηση σάρωσης για να δείχνει σωστά...
        printTime();                                             //...και εμφάνισε την ώρα
      }
      if (menu == 1)                                             //Αν είσαι στο αρχικό μενού 1...
      {
        scanningTime = scTime;                                   //Διόρθωσε την καθυστέρηση σάρωσης για να δείχνει σωστά...
        adjustHour();                                            //...και μπες στη ρουτίνα ρύθμισης ώρας
        printDigit(setHourTemp / 10, hoursTenths);               //Εμφάνισε τις δεκάδες ώρας 0-2 με διαίρεση δια 10
        delay(del_1);                                            //Καθυστέρηση απαραίτητη για να δείχνει σωστά
        printDigit(setHourTemp % 10, hoursUnits);                //Εμφάνισε τις μονάδες ώρας 0-9 με διαίρεση modulo 10
        delay(del_1);                                            //Καθυστέρηση απαραίτητη για να δείχνει σωστά
        rtc.adjust(DateTime(setYearTemp, setMonthTemp, setDateTemp, setHourTemp, setMinuteTemp, setSecondTemp));//Ρύθμισε το RTC με τα νέα δεδομένα
        if(returningCounter >= returningDelay)                   //Αν ο απαριμητής επιστροφής στο αρχικό μενού είναι μεγαλύτερος απο χρόνο 7 sec...
        {
          menu = 0;                                              //Όρισε το μενού στο αρχικό...
          pressed_button = NONE;                                 ///...και το μπουτόν σε κανένα πατημένο.
        }
      }
      if (menu == 2)                                             //Αν είσαι στο αρχικό μενού 2...
      {
        scanningTime = scTime;                                   //Διόρθωσε την καθυστέρηση σάρωσης για να δείχνει σωστά...
        adjustMinute();                                          //...και μπες στη ρουτίνα ρύθμισης λεπτών
        printDigit(setMinuteTemp / 10, minutesTenths);           //Εμφάνισε τις δεκάδες λεπτών 0-5 με διαίρεση δια 10
        delay(del_1);                                            //Καθυστέρηση απαραίτητη για να δείχνει σωστά
        printDigit(setMinuteTemp % 10, minutesUnits);            //Εμφάνισε τις μονάδες λεπτών 0-9 με διαίρεση modulo 10
        delay(del_1);                                            //Καθυστέρηση απαραίτητη για να δείχνει σωστά
        rtc.adjust(DateTime(setYearTemp, setMonthTemp, setDateTemp, setHourTemp, setMinuteTemp, setSecondTemp));//Ρύθμισε το RTC με τα νέα δεδομένα
        if(returningCounter >= returningDelay)                   //Αν ο απαριμητής επιστροφής στο αρχικό μενού είναι μεγαλύτερος απο χρόνο 7 sec...
        {
          menu = 0;                                              //Όρισε το μενού στο αρχικό...
          pressed_button = NONE;                                 //...και το μπουτόν σε κανένα πατημένο.
        }
      }
      if (menu == 3)                                             //Αν είσαι στο αρχικό μενού 3...
      {
        scanningTime = scTime;                                   //Διόρθωσε την καθυστέρηση σάρωσης για να δείχνει σωστά...
        adjustSecond();                                          //...και μπες στη ρουτίνα ρύθμισης δευτερολέπτων
        printDigit(setSecondTemp / 10, secondsTenths);           //Εμφάνισε τις δεκάδες δευτερολέπτων 0-5 με διαίρεση δια 10
        delay(del_1);                                            //Καθυστέρηση απαραίτητη για να δείχνει σωστά
        printDigit(setSecondTemp % 10, secondsUnits);            //Εμφάνισε τις μονάδες δευτερολέπτων 0-9 με διαίρεση modulo 10
        delay(del_1);                                            //Καθυστέρηση απαραίτητη για να δείχνει σωστά
        rtc.adjust(DateTime(setYearTemp, setMonthTemp, setDateTemp, setHourTemp, setMinuteTemp, setSecondTemp));//Ρύθμισε το RTC με τα νέα δεδομένα
        if(returningCounter >= returningDelay)                   //Αν ο απαριμητής επιστροφής στο αρχικό μενού είναι μεγαλύτερος απο χρόνο 7 sec...
        {
          menu = 0;                                              //Όρισε το μενού στο αρχικό...
          pressed_button = NONE;                                 //...και το μπουτόν σε κανένα πατημένο.
        }
      }
      if (menu == 4)                                             //Αν είσαι στο αρχικό μενού 4...
      {
        scanningTime = scTime;                                   //Διόρθωσε την καθυστέρηση σάρωσης για να δείχνει σωστά...
        adjustDate();                                            //...και μπες στη ρουτίνα ρύθμισης ημέρας του μήνα
        printDigit(setDateTemp / 10, daysTenths);                //Εμφάνισε τις δεκάδες ημερών 0-3 με διαίρεση δια 10
        delay(del_1);                                            //Καθυστέρηση απαραίτητη για να δείχνει σωστά
        printDigit(setDateTemp % 10, daysUnits);                 //Εμφάνισε τις μονάδες ημερών 0-9 με διαίρεση modulo 10
        delay(del_1);                                            //Καθυστέρηση απαραίτητη για να δείχνει σωστά
        rtc.adjust(DateTime(setYearTemp, setMonthTemp, setDateTemp, setHourTemp, setMinuteTemp, setSecondTemp));//Ρύθμισε το RTC με τα νέα δεδομένα
        if(returningCounter >= returningDelay)                   //Αν ο απαριμητής επιστροφής στο αρχικό μενού είναι μεγαλύτερος απο χρόνο 7 sec...
        {
          menu = 0;                                              //Όρισε το μενού στο αρχικό...
          pressed_button = NONE;                                 //...και το μπουτόν σε κανένα πατημένο.
        }
      }
      if (menu == 5)                                             //Αν είσαι στο αρχικό μενού 5...
      {
        scanningTime = scTime;                                   //Διόρθωσε την καθυστέρηση σάρωσης για να δείχνει σωστά...
        adjustMonth();                                           //...και μπες στη ρουτίνα ρύθμισης του μήνα
        printDigit(setMonthTemp / 10, monthsTenths);             //Εμφάνισε τις δεκάδες μήνα 0-1 με διαίρεση δια 10
        delay(del_1);                                            //Καθυστέρηση απαραίτητη για να δείχνει σωστά
        printDigit(setMonthTemp % 10, monthsUnits);              //Εμφάνισε τις μονάδες μήνα 0-9 με διαίρεση modulo 10
        delay(del_1);                                            //Καθυστέρηση απαραίτητη για να δείχνει σωστά
        rtc.adjust(DateTime(setYearTemp, setMonthTemp, setDateTemp, setHourTemp, setMinuteTemp, setSecondTemp));//Ρύθμισε το RTC με τα νέα δεδομένα
        if(returningCounter >= returningDelay)                   //Αν ο απαριμητής επιστροφής στο αρχικό μενού είναι μεγαλύτερος απο χρόνο 7 sec...
        {
          menu = 0;                                              //Όρισε το μενού στο αρχικό...
          pressed_button = NONE;                                 //...και το μπουτόν σε κανένα πατημένο.
        }  
      }
      if (menu == 6)                                             //Αν είσαι στο αρχικό μενού 6...
      {
        scanningTime = scTime;                                   //Διόρθωσε την καθυστέρηση σάρωσης για να δείχνει σωστά...
        adjustYear();                                            //...και μπες στη ρουτίνα ρύθμισης του έτους
        printDigit((setYearTemp - 2000) / 10, yearsTenths);      //Εμφάνισε τις δεκάδες έτους 0-9 με διαίρεση δια 10
        delay(del_1);                                            //Καθυστέρηση απαραίτητη για να δείχνει σωστά
        printDigit((setYearTemp - 2000) % 10, yearsUnits);       //Εμφάνισε τις μονάδες έτους 0-9 με διαίρεση modulo 10
        delay(del_1);                                            //Καθυστέρηση απαραίτητη για να δείχνει σωστά
        rtc.adjust(DateTime(setYearTemp, setMonthTemp, setDateTemp, setHourTemp, setMinuteTemp, setSecondTemp));//Ρύθμισε το RTC με τα νέα δεδομένα
        if(returningCounter >= returningDelay)                   //Αν ο απαριμητής επιστροφής στο αρχικό μενού είναι μεγαλύτερος απο χρόνο 7 sec...
        {
          menu = 0;                                              //Όρισε το μενού στο αρχικό...
          pressed_button = NONE;                                 //...και το μπουτόν σε κανένα πατημένο.
        }  
      }
      if (menu == 7)                                             //Αν είσαι στο αρχικό μενού 7...
      {
        printDate();                                             //...εμφάνισε την ημερομηνία
      }
    }
    //==========================================
    //ΡΟΥΤΙΝΑ DEBOUNCING ΜΠΟΥΤΟΝ
    //==========================================
    void readButtons()
    {
      button = getButton();                                      //Καταχώρησε τα επιστρεφόμενα απο την getButton() στον καταχωρητή τους  
      if (button != old_button)                                  //Αν αυτά τα δεδομένα είναι διαφορετικά απο τα προηγούμενα...
      {
        delay(50);                                               //... βάλε μια καθυστέρηση 50ms
        button2 = getButton();                                   //Αποθήκευσε αυτά που διάβασες απο τα μπουτόν
        if (button == button2)                                   //Αν είναι ίδια με τα προηγούμενα...
        {
          old_button = button;                                   //...τότε όρισε σαν προηγούμενα δεδομένα τα τωρινά για να προχωρήσεις στο επόμενο πάτημα
          pressed_button = button;                               ///Όρισε σαν μπουτόν που πατήθηκε αυτό που διάβασες
        }
      }
    }
    //==========================================
    //ΡΟΥΤΙΝΑ ΑΝΑΓΝΩΣΗΣ ΜΠΟΥΤΟΝ
    //==========================================
    int getButton()
    {
      sum = 0;                                                   //Καθάρισε τον καταχωρητή αθρόισματος
      for (i = 0; i < 4; i++)                                    //Πρόσθεσε μεταξύ τους 4 φορές αυτά που διαβάζεις στην αναλογική είσοδο
      {
        sum += analogRead(BUTTONS_PIN);
      }
      val = sum / 4;                                             //Βγάλε μέσο όρο / 4
      
      if (val >= 1021) button = NONE;                             //Αν διάβασες μεγαλύτερο ή ίσο με 1021 τότε δεν πατήθηκε μπουτόν                       
      else if (val > 200 && val < 270) button = UP;              //...ή αν διάβασες μεταξύ 200 και 270, τότε πατήθηκε το μπουτόν ΠΑΝΩ
      else if (val > 300 && val < 400) button = MIDDLE;          //...ή αν διάβασες μεταξύ 300 και 400, τότε πατήθηκε το μπουτόν ΜΕΣΣΑΙΟ
      else if (val > 400 && val < 500) button = DOWN;            //...ή αν διάβασες μεταξύ 400 και 500, τότε πατήθηκε το μπουτόν ΚΑΤΩ
      else button = NONE;                                        //...αλλιώς δεν έχει πατηθεί κανένα μπουτόν σε κάθε άλλη περίπτωση
    
    
      return button;                                             //Επίστρεξε την τιμή του πατημένου μπουτόν
    }
    Αύριο που είναι μέρα, περισσότερα.
    Συνημμένα Αρχεία Συνημμένα Αρχεία

    5 Not allowed! Not allowed!

  8. 2 μέλη ευχαρίστησαν τον manolena για αυτό το χρήσιμο μήνυμα:

    kioan (03-05-20), Lord Vek (03-05-20)

  9. #5
    Μέλος
    Εγγραφή
    Nov 2007
    Μηνύματα
    1.459

    Προεπιλογή

    Όμορφο. Μου θύμησες πριν από 20-25 χρόνια που για να σκοτώσω ώρα μου είχα φτιάξει ένα ίδιο, αλλά με counters, CD40XX chipakia 7seg κλπ.

    1 Not allowed! Not allowed!

  10. #6
    Μέλος Το avatar του χρήστη airgeorge
    Όνομα
    Γιώργος
    Εγγραφή
    Jan 2015
    Περιοχή
    Θεσσαλονίκη
    Μηνύματα
    128

    Προεπιλογή

    Πολύ ωραίο Μάνο μπράβο.

    1 Not allowed! Not allowed!

  11. #7
    Μέλος Το avatar του χρήστη Eximnos
    Όνομα
    Γιάννης
    Εγγραφή
    Jul 2017
    Περιοχή
    Αθήνα
    Μηνύματα
    165

    Προεπιλογή

    Ωραίος!!! Εγώ είχα βαλθεί να φτιάξω ένα Word Clock και τα είχα καταφέρει πριν μερικά χρόνια με τον arduino uno αλλά χωρίς rtc. Δεν ολοκλήρωσα την κατασκευή μου με σασί κτλ κι έτσι δεν το δοκίμασα σε βάθος χρόνου να δω πόσο ξέφευγε από την πραγματική ώρα. Μου είχαν πει οτι θα ξεφεύγει πολύ αν κι εγώ πίστευα οτι θα μπορούσα να το διορθώσω αφαιρώντας - προσθέτοντας μερικά ms.
    Τελικά πιστεύω οτι είχα δίκιο χωρίς να το έχω δει με τα μάτια μου. Παίζει ρόλο και η θερμοκρασία στους ταλαντωτές...
    Το δικό σου έχεις δει τι απόκλιση έχει? Χάνει καθόλου?

    0 Not allowed! Not allowed!

  12. #8
    Μέλος Το avatar του χρήστη manolena
    Όνομα
    Μάνος
    Εγγραφή
    Dec 2006
    Περιοχή
    Ελευσίνα
    Μηνύματα
    2.709

    Προεπιλογή

    Παράθεση Αρχικό μήνυμα από Eximnos Εμφάνιση μηνυμάτων
    Το δικό σου έχεις δει τι απόκλιση έχει? Χάνει καθόλου?
    Χρησιμοποιεί εξωτερικό ρολόι βασισμένο στο I2C DS1307 RTC του οποίου οι προδιαγραφές ακριβείας βάσει του φύλλου πληροφοριών λένε πως εξαρτάται (η ακρίβεια) απο τις ανοχές του κρυστάλλου χρονισμού του (32.768KHz) και το χωρητικό φορτίο του ταλαντωτή ((https://datasheets.maximintegrated.com/en/ds/DS1307.pdf), σελίδα7). Σε κάθε περίπτωση και με πειραματικές μετρήσεις απόκλισης, λέει πως μπορεί να χάσει και 15ppm σε μια διάρκεια χρόνου περίπου 80 ωρών (https://www.switchdoc.com/2014/12/be...p79400-ds1307/)
    Πάντως, δεν είναι και ατομικό ρολόι καισίου, αυτό είναι η αλήθεια. Αν θες συνεχή ακριβή τηρηση της ώρας, πήγαινε στο αρχείο clock_8.ino και στη γραμμή που φαίνεται με bold

    Κώδικας:
    void setup()
    {
      Wire.begin();
      Serial.begin(9600);
      //rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    
    
      Timer1.initialize(500000);                                //Αρχικοποίησε Timer1 στα 0.5sec διακοπές
      Timer1.attachInterrupt(blinkLED);                         //Ενεργοποίησε τη ρουτίνα διακοπής blinkLED(); 
    
    
      MsTimer2::set(250, timer2Isr);                            //Αρχικοποίησε Timer2 στα 0.25sec διακοπές
      MsTimer2::start();                                        //Ενεργοποίησε τη ρουτίνα διακοπής timer2Isr();
    
    
      pinMode(LED_BUILTIN, OUTPUT);                             //Όρισε το LED του Arduino σαν έξοδο
      digitalWrite(LED_BUILTIN, state);                         //Δώσε έξοδο στο pin D13 ανάλογα με την boolean state
    
    
      pinMode(BUTTONS_PIN, INPUT_PULLUP);                       //Όρισε το pin A3 σαν αναλογική είσοδο για διάβασμα μπουτόν
    
    
      for (int y = 0; y < 7; y++)                               //Ρουτίνα αρχικοποίησης των τμημάτων των LED displays σαν έξοδοι
      {
        pinMode(DIGITS[y], OUTPUT);                             
      }
      for (int x = 0; x < 8; x++)                               //Ρουτίνα αρχικοποίησης των ανόδων τωνLED displays σαν έξοδοι                           
      {
        pinMode(SEGMENTS[x], OUTPUT);
      }
      menu = 0;                                                 //Όρισε σαν αρχικό μενού 0 την ένδειξη ώρας
    }
    ...βγάλε τα σχόλια (//), κάνε compile και φόρτωσε το nano που θα ρυθμίσει αυτόματα την ημερομηνία/ώρα με την ώρα του υπολογιστή σου. Μετά ξαναβάλε τα σχόλια,
    και ξαναπρογραμμάτισε άλλη μια φορά.

    0 Not allowed! Not allowed!

  13. #9
    Μέλος Το avatar του χρήστη manolena
    Όνομα
    Μάνος
    Εγγραφή
    Dec 2006
    Περιοχή
    Ελευσίνα
    Μηνύματα
    2.709

    Προεπιλογή

    Και οι βιβλιοθήκες που χρησιμοποιεί ο κώδικας. Σημείωση, η <Wire.h> είναι βιβλιοθήκη του συστήματος
    Συνημμένα Αρχεία Συνημμένα Αρχεία

    0 Not allowed! Not allowed!

  14. #10
    Μέλος Το avatar του χρήστη MacGyver
    Όνομα
    Steve
    Εγγραφή
    May 2009
    Περιοχή
    SKG
    Μηνύματα
    2.215

    Προεπιλογή

    Το DS3231 είναι πολύ ποιο ακριβές έναντι του DS1307 και έχει +1€.
    Από την άλλη με ένα ESP8266 μπορεί να έχουμε ατομική ακρίβεια (NTP), στο ίδιο κόστος.

    0 Not allowed! Not allowed!

Σελίδα 1 από 3 1 2 3 ΤελευταίαΤελευταία

Παρόμοια Θέματα

  1. Arduino on/off με RTC
    By bgalafagas in forum Μικροελεγκτές
    Απαντήσεις: 5
    Τελευταίο Μήνυμα: 16-07-19, 15:02
  2. Arduino Nano
    By leuteris107 in forum Μικροελεγκτές
    Απαντήσεις: 5
    Τελευταίο Μήνυμα: 24-12-16, 10:04
  3. ARDUINO NANO
    By electricalgian in forum Ηλεκτρονικά
    Απαντήσεις: 17
    Τελευταίο Μήνυμα: 17-05-16, 19:13
  4. arduino nano
    By FMTRIKALA in forum Μικροελεγκτές
    Απαντήσεις: 1
    Τελευταίο Μήνυμα: 26-11-15, 09:29
  5. Ραδιόφωνο FM με Arduino nano
    By CLOCKMAN in forum Παρουσίαση Ολοκληρωμένων Κατασκευών
    Απαντήσεις: 27
    Τελευταίο Μήνυμα: 16-02-15, 17:38

Tags for this Thread

Δικαιώματα - Επιλογές

  • Δημιουργία θεμάτων: Όχι
  • Υποβολή μηνυμάτων: Όχι
  • Σύναψη αρχείων: Όχι
  • Επεξεργασία μηνυμάτων: Όχι
  •  
  • BB code: σε λειτουργία
  • Smilies: σε λειτουργία
  • [IMG]: σε λειτουργία
  • [VIDEO] code is σε λειτουργία
  • HTML: εκτός λειτουργίας