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

Θέμα: RTC real time clock

  1. #1
    Νέο Μέλος
    Όνομα
    Δημήτριος
    Εγγραφή
    Nov 2014
    Περιοχή
    Αθηνα, Περιστερι
    Μηνύματα
    21

    Προεπιλογή RTC real time clock

    παιδια προσφατα πηρα το arduino uno + ds1307 και θελω να κανω μια ερωτηση το ds1307 δεν θελει button; εννοω κραταει την ωρα η θελει ρυθμιση καθε φορα που μενει εκτος ρευματος; με την αλλαγη ωρας αλλαζει η θελει ρυθμιση; πηρα προσφατα οπως ειπα το
    1.arduino uno r3
    2.ds1307 AT24C32
    3.DHT22
    4.lcd 20x4 i2c

    λοιπον κατεβασα την πλατφορμα και κατεβασα τις βιβλιοθηκες ειδα τα παραδειγματα και διαβασα μερικες λεπτομεριες στο νετ και τελικα εφτιαξα αυτον τον κωδικα... οποιος θελει μπορει να με διορθωσει! ειμαι καινουργιος και οποια παρατηρηση σιγουρα θα με κανει καλυτερο!!
    στο κυκλωμα δεν εχω βαλει καμια αντισταση απλα ειναι ολα συνδεδεμενα μεταξυ τους και τρεχει μια χαρα για την ωρα πανω στο breadboard! οταν ομως μου δωσετε και σεις το οκ οτι ειμαι οκ και παρω απαντησεις οτι δεν ή χρειαζεται καποιο κουμπακι για ρυθμιση ωρας τοτε θα πρεπει να φτιαξω ενα ωραιο κουτακι! θα πρεπει να βγαλω το ολοκληρωμενο (ATmega32 σωστα; αλλα μετα πως θα συνδεσω το ρευμα; η θα πρεπει να το αφησω πανω και να χασω ολη την πλακετα και να παω για καινουργια; ευχαριστω!! γενικα οτι πληροφοριες νομιζετε ειναι παντα ευπροσδεκτες!! ( οι εικονες ειναι χθεσινες ελπιζω να μην σας πειραζει )

    #include <LiquidCrystal_I2C.h>
    #include <Wire.h>
    #include "RTClib.h"
    #include <DHT22.h>




    #define BACKLIGHT_PIN 3


    #define DHT22_PIN 2


    LiquidCrystal_I2C lcd(0x27, 2,1,0,4,5,6,7);


    RTC_DS1307 RTC;


    DHT22 myDHT22(DHT22_PIN);


    byte thermometro[8] = //icon for termometer
    {
    B00100,
    B01010,
    B01010,
    B01110,
    B01110,
    B11111,
    B11111,
    B01110
    };


    byte igrasia[8] = //icon for water droplet
    {
    B00100,
    B00100,
    B01010,
    B01010,
    B10001,
    B10001,
    B10001,
    B01110,
    };


    void setup(void)
    {
    Wire.begin();
    lcd.backlight();
    lcd.begin(20,4);
    lcd.createChar(1,thermometro);
    lcd.createChar(2,igrasia);
    lcd.home();
    lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
    lcd.setBacklight(HIGH);
    RTC.begin();
    RTC.adjust(DateTime(__DATE__, __TIME__));
    delay (3000);
    }


    void loop(void)
    {
    DateTime now = RTC.now();

    DHT22_ERROR_t errorCode;
    errorCode = myDHT22.readData();
    switch(errorCode)
    case DHT_ERROR_NONE:


    lcd.setCursor(0,0);
    lcd.print("Weather Station");
    lcd.setCursor(0,1);
    printDigits(now.hour());
    lcd.print(":");
    printDigits(now.minute());
    lcd.print(":");
    printDigits(now.second());
    delay(1000);
    lcd.setCursor(0,2);
    int dayOfWeek = now.dayOfWeek();
    switch(dayOfWeek){
    case 1:
    lcd.print("Monday");
    break;
    case 2:
    lcd.print("Tuesday");
    break;
    case 3:
    lcd.print("Wednesday");
    break;
    case 4:
    lcd.print("Thursday");
    break;
    case 5:
    lcd.print("Friday");
    break;
    case 6:
    lcd.print("Saturday");
    break;
    case 7:
    lcd.print("Sunday");
    break;
    delay(1000);
    }
    lcd.setCursor(10,2);
    lcd.print(now.day(), DEC);
    lcd.print('/');
    lcd.print(now.month(), DEC);
    lcd.print('/');
    lcd.print(now.year(), DEC);
    lcd.setCursor(0,3);
    lcd.write(1);
    lcd.setCursor(2,3);
    lcd.print(myDHT22.getTemperatureC());
    lcd.print((char)223);
    lcd.print("C");
    lcd.setCursor(12,3);
    lcd.write(2);
    lcd.setCursor(14,3);
    lcd.print(myDHT22.getHumidity());
    lcd.print("%");

    }
    void printDigits(int digits){
    if(digits < 10)
    lcd.print('0');
    lcd.print(digits);
    }






    1 Not allowed! Not allowed!

  2. #2
    Μέλος
    Όνομα
    ..
    Εγγραφή
    Oct 2008
    Περιοχή
    Athens
    Μηνύματα
    246

    Προεπιλογή

    tl;dr για να κρατάει την ώρα βάλτου μπαταρία για μπακάπ, δες στο datasheet τι και πως

    0 Not allowed! Not allowed!

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

    Προεπιλογή

    Στη βιβλιοθήκη που χρησιμοποιείς για το RTC, φορτώνεται η ώρα του υπολογιστή απο τον compiler μέσω της συνάρτησης __DATE__ και __TIME__ (κρυφές). Για να διαχειριστείς τώρα αυτή την πληροφορία, πρέπει στο σκετσάκι αυτή να περάσει στο RTC και αφού αποθηκευτεί σε αυτό, θα τρέχει απο εκεί σε πραγματικό χρόνο. Αν τώρα θέλεις να ρυθμίσεις την ημερομηνία/ώρα, θα χρειαστείς ένα υποτυπώδες πληκτρολόγιο που να σε πλοηγεί σε κάθε παράμετρο της πραγματικής ώρας (δευτερόλεπτα, λεπτά, ώρα, ημέρα εβδομάδας, ημερομηνία, μήνα, έτος) και σε κάθε μια ξεχωριστά απο αυτές να ρυθμίζεις την μεταβλητή τους. Πάντα στην έξοδο απο το μενού ρύθμισης που κάνεις, η καινούρια ώρα/ημερομηνία αποθηκεύεται στο RTC και απο εκεί και πέρα αυτό τρέχει ακόμα και χωρίς εφαρμογή τροφοδοσίας την ώρα σου, αρκεί να διαθέτει και μια μικρή μπαταρία των 3V.

    Παρακάτω, υπάρχει σαν αναφορά κώδικας για το RTC Μ41Τ80 της ST που έχω γράψει και χρησιμοποιεί μόνο τη βιβλιοθήκη Wire. Έχει αναλογικό πληκτρολόγιο με 6 κουμπιά και μπορείς να κάνει πλοήγηση-ρύθμιση ώρας/ημερομηνίας με αυτά. Με λίγες μετατροπές, μπορεί να δουλέψει για το DS1307 πάρα πολύ εύκολα.

    Κώδικας:
    #include <LiquidCrystal.h>  //this library is included in the Arduino IDE
    #include <Wire.h>
    
    
    LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
    
    
    
    
    #define M41T80_I2C_ADDRESS       0x68
    
    
    #define RIGHT                    1
    #define UP                       2
    #define DOWN                     3
    #define LEFT                     4
    #define SELECT                   5
    #define ESCAPE                   0
    #define NONE                     6
    
    
    int adcKeyIn;
    int NUM_KEYS = 6;
    int key=-1;
    int oldKey=-1;
    int  adcKeyVal[6] ={0, 150, 360, 530, 760, 980};
    const int DEBOUNCE_DELAY = 50;
    byte msecond, second, minute, hour, dayOfWeek, dayOfMonth, month, year;
    byte hourBuffer, minuteBuffer, secondBuffer, dateBuffer, monthBuffer, yearBuffer = 0; 
    
    
    int command = 0;       // This is the command char, in ascii form, sent from the serial port     
    int i;
    long previousMillis = 0;        // will store last time Temp was updated
    byte test;
    byte zero;
    char  *Day[] = {"SUN","MON","TUE","WED","THU","FRI","SAT"};
    char  *Mon[] = {"JAN","FED","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"};
     
    // Convert normal decimal numbers to binary coded decimal
    byte decToBcd(byte val)
    {
      return ( (val/10*16) + (val%10) );
    }
     
    // Convert binary coded decimal to normal decimal numbers
    byte bcdToDec(byte val)
    {
      return ( (val/16*10) + (val%16) );
    }
     
    // 1) Sets the date and time on the ds1307
    // 2) Starts the clock
    // 3) Sets hour mode to 24 hour clock
    // Assumes you're passing in valid numbers, Probably need to put in checks for valid numbers.
     
    void setDateDs1307()                
    {
       msecond = (byte) (0);
       second = (byte) (0); // Use of (byte) type casting and ascii math to achieve result.  
       minute = (byte) (35);
       hour  = (byte) (8);
       dayOfWeek = (byte) (0);
       dayOfMonth = (byte) (2);
       month = (byte) (8);
       year= (byte) (12);
       Wire.beginTransmission(M41T80_I2C_ADDRESS);
       Wire.write(zero);
       Wire.write(decToBcd(msecond));
       Wire.write(decToBcd(second) & 0x7f);    // 0 to bit 7 starts the clock
       Wire.write(decToBcd(minute));
       Wire.write(decToBcd(hour));      // If you want 12 hour am/pm you need to set
                                       // bit 6 (also need to change readDateDs1307)
       Wire.write(decToBcd(dayOfWeek));
       Wire.write(decToBcd(dayOfMonth));
       Wire.write(decToBcd(month));
       Wire.write(decToBcd(year));
       Wire.endTransmission();
    }
     
    // Gets the date and time from the ds1307 and prints result
    void getDateDs1307()
    {
      // Reset the register pointer
      Wire.beginTransmission(M41T80_I2C_ADDRESS);
      Wire.write(zero);
      Wire.endTransmission();
     
      Wire.requestFrom(M41T80_I2C_ADDRESS, 8);
     
      // A few of these need masks because certain bits are control bits
      msecond    = bcdToDec(Wire.read());
      second     = bcdToDec(Wire.read() & 0x7f);
      minute     = bcdToDec(Wire.read());
      hour       = bcdToDec(Wire.read() & 0x3f);  // Need to change this if 12 hour am/pm
      dayOfWeek  = bcdToDec(Wire.read());
      dayOfMonth = bcdToDec(Wire.read());
      month      = bcdToDec(Wire.read());
      year       = bcdToDec(Wire.read());
     
     lcd.setCursor(0,0);
     lcd.print(Day[dayOfWeek]);
      lcd.print(", ");
      lcd.print(dayOfMonth, DEC);
      lcd.print(" ");
      lcd.print(Mon[month]);
      lcd.print(" 20");
      if (year < 10)
        lcd.print("0");
      lcd.print(year, DEC);
       lcd.setCursor(0,1);
      if (hour < 10)
        lcd.print("0");
      lcd.print(hour, DEC);
      lcd.print(":");
      if (minute < 10)
        lcd.print("0");
      lcd.print(minute, DEC);
      lcd.print(":");
      if (second < 10)
        lcd.print("0");
      lcd.print(second, DEC);  
    }
     
     
    void setup() 
    {
      lcd.begin(20, 4);
      Wire.begin();
      zero=0x00;
    //  setDateDs1307();
      lcd.clear();
     
    }
     
    void loop() {
         
           
           getDateDs1307();
    //      dump();
             
             
          delay(1000);
        }
    
    
    // ===================================================================
    int getKeyDebounce() 
    {
      int val;
        val = analogRead(0);
       if((val>=0) &&(val<=70)) key=1;
       else if((val>=150) &&(val<=170)) key=2;
       else if((val>=300) &&(val<=390)) key=3;
       else if((val>=500) &&(val<=595)) key=4;
       else if((val>=800) &&(val<=875)) key=5;
       else if((val>=940) &&(val<=950)) key=0;
       else if(val>=1000) key=6;
       
      adcKeyIn = analogRead(0);     
      key = getKey(adcKeyIn);                
      do 
      {
        key = getKey(analogRead(0));
      } while (key != -1);
      oldKey = key;
      while (oldKey == -1 || key == -1 || key != oldKey) 
      {
        oldKey = key;
        delay(DEBOUNCE_DELAY);
        key = getKey(analogRead(0));
      }
    
    
      return key;
      
    }
    // ===================================================================
    int getKey(unsigned int input)
    {
      int k;
      for (k = 0; k < NUM_KEYS; k++)
      {
        if (input < adcKeyVal[k])
        {
          return k;
        }
      }
      if (k >= NUM_KEYS)
        k = -1;     // No valid key pressed
      return k;
    }
    
    
    void dump()
    {
      lcd.setCursor(0,2);
              Wire.beginTransmission(M41T80_I2C_ADDRESS);
              Wire.write(0x20);
              Wire.endTransmission();
              Wire.requestFrom(M41T80_I2C_ADDRESS, 32);  
              for (i = 32; i <= 63; i++) {         //Register 32-63 - only 32 registers allowed per I2C connection
                 test = Wire.read();
                 lcd.print(i);
                 lcd.print(": ");
                 lcd.print(test, DEC);
                 lcd.print(" : ");
                 lcd.print(test, HEX);
              }            
     }
    http://www.hlektronika.gr/forum/showthread.php?t=74812

    0 Not allowed! Not allowed!

  4. #4
    Νέο Μέλος
    Όνομα
    Δημήτριος
    Εγγραφή
    Nov 2014
    Περιοχή
    Αθηνα, Περιστερι
    Μηνύματα
    21

    Προεπιλογή

    Παιδια ευχαριστω για τις απαντησεις σας! να πω μονο οτι υπαρχει μπαταρια στο RTC 3V απο πισω! ο κωδικας μου ηταν καλος; tl;dr με αυτο τι εννοεις; datasheet τι ειναι; θα δω τον κωδικα Μανο και θα το προσπαθησω! τα 6 κουμπακια ειναι δικα σου τα εφτιαξες εσυ ενα ενα; η τα πηρες ετοιμα;

    0 Not allowed! Not allowed!

  5. #5
    Νέο Μέλος
    Όνομα
    Δημήτριος
    Εγγραφή
    Nov 2014
    Περιοχή
    Αθηνα, Περιστερι
    Μηνύματα
    21

    Προεπιλογή




    απλα δεν ξερω που να συνδεσω το BAT και το SQ μπορει καποιος να μου πει; ισως γιαυτο δεν μου το κραταει... συνδεω μονο τα
    DS στο 2
    SCL στο 5
    SDA στο 4
    VCC στο 5V
    GND στο GND διπλα στο 5V

    0 Not allowed! Not allowed!

  6. #6
    Μέλος Το avatar του χρήστη picdev
    Όνομα
    akis
    Εγγραφή
    Jul 2007
    Περιοχή
    ____
    Μηνύματα
    7.375

    Προεπιλογή

    η μπαταρία είναι συνδεμένη είδη με το ολοκληρομένο ,δεν χρειάζεται να συνδέσεις κάτι, απλά σου δίνει ένα pin σε περίπτωση που θες να διαβάζεις τη τάση της μπαταρίας απο τον μΕ

    0 Not allowed! Not allowed!

  7. #7
    Νέο Μέλος
    Όνομα
    Δημήτριος
    Εγγραφή
    Nov 2014
    Περιοχή
    Αθηνα, Περιστερι
    Μηνύματα
    21

    Προεπιλογή

    Ναι ευχαριστω εχεις δικιο το βρηκα και γω στο νετ! απλα επρεπε να βγαλω την γραμμη RTC.adjust(DateTime(__DATE__, __TIME__)); και ειναι οκ τωρα... απλα τωρα πρεπει να φτιαξω πως θα κανει τις αλλαγες τις ωρας...

    0 Not allowed! Not allowed!

  8. #8
    Μέλος Το avatar του χρήστη picdev
    Όνομα
    akis
    Εγγραφή
    Jul 2007
    Περιοχή
    ____
    Μηνύματα
    7.375

    Προεπιλογή

    βάλε 4 κουμπιά, πάνω κάτω, και δεξιά αριστερά, με πάνω κάτω θα αλλάζεις τα νούμερα και με το δεξιά αριστερά θα επιλέγεις τι θέλει να αλλάξεις

    0 Not allowed! Not allowed!

  9. #9
    Μέλος Το avatar του χρήστη thebadtall
    Όνομα
    vlad
    Εγγραφή
    Jul 2012
    Περιοχή
    Impal Tov
    Μηνύματα
    128

    Προεπιλογή

    Εχε υποψιν οτι το RTC που χρησιμοποιεις χανει 1 περιπου λεπτο την εβδομάδα. Mπορεις να το διορθωσεις με μια ρουτινα που καθε εβδομαδα θα αφαιρει 1 λεπτο

    0 Not allowed! Not allowed!
    Can't you hear, can't you hear the thunder
    You better run, you better take cover
    t=€ π+i(μ) =

  10. #10
    Νέο Μέλος
    Όνομα
    Δημήτριος
    Εγγραφή
    Nov 2014
    Περιοχή
    Αθηνα, Περιστερι
    Μηνύματα
    21

    Προεπιλογή

    Σοβαρα δεν το ηξερα αυτο... αφου τωρα βρηκα πως κραταει ωρα ψαχνω να του βαλω και την αλλαγη ωρας... και πιστευα οτι ειχα τελειωσει... (για να μην μπλεξω με κουμπακια κτλ να το κανω τελειως "εξυπνο" χαχα ) ευτυχως που μου το ειπες... δεν ξερω πως γινεται να αφαιρεσω ενα λεπτο καθε εβδομαδα... αλλα θα το ψαξω!! ευχαριστω για την ενημερωση!!

    0 Not allowed! Not allowed!

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

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

  1. Ερωτηση για ρελε real time
    By manos30 in forum Ερωτήσεις Αρχάριων
    Απαντήσεις: 7
    Τελευταίο Μήνυμα: 13-10-11, 21:59
  2. real time αντίγραφο σκληρού
    By haris_216 in forum Software Η/Υ
    Απαντήσεις: 6
    Τελευταίο Μήνυμα: 26-04-11, 23:30
  3. real time desktop
    By briko in forum Software Η/Υ
    Απαντήσεις: 9
    Τελευταίο Μήνυμα: 23-08-09, 21:18
  4. Real Time Toolbox Του Matlab ??
    By NeKTaRioS - auto in forum Λογισμικά Σχεδίασης
    Απαντήσεις: 0
    Τελευταίο Μήνυμα: 08-04-09, 14:38

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

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