نمایش نتایج: از 1 به 10 از 10
Like Tree7 لایک
  • 3 Post By sina2sms@yahoo.com
  • 1 Post By magmagmary
  • 1 Post By sina2sms@yahoo.com
  • 1 Post By razmjoo
  • 1 Post By magmagmary

موضوع: راه اندازی ماژول ساعت ds3231 و سنسور دما

  1. #1
    Member
    تاریخ عضویت
    Aug 2015
    محل سکونت
    ایران اسلامی
    نوشته ها
    67

    راه اندازی ماژول ساعت ds3231 و سنسور دما

    ماژول ds3231 بعنوان یک ماژول دماسنج در کنار ساعت نیز میتوان استفاده کرد ، برای انجام اینکار پایه vcc را به پین 5v پایه gnd را به gnd روی اردوینو پایه scl و sda را نیز به اردوینو طبق شکل زیر نصب میکنیم.
    برای دیدن سایز بزرگ روی عکس کلیک کنید

نام: RTC_DS1307_08.gif
مشاهده: 345
حجم: 67.0 کیلو بایت

    و بعدا کد رو اپلود میکنیم بر روی برد (توضیح اینکه در این آموزش یه فیلم نیز در صورت امکان گذاشته خواهد شد که میتوان از روی آن ساعت و دقیقه وسال را نیز تنظیم کرد)
    کد:
    #include <Wire.h>
    #include "ds3231.h"
    #include "rtc_ds3231.h"
    
    #define BUFF_MAX 128
    
    uint8_t time[8];
    char recv[BUFF_MAX];
    unsigned int recv_size = 0;
    unsigned long prev, interval = 5000;
    
    void setup()
    {
        Serial.begin(9600);
        Wire.begin();
        DS3231_init(DS3231_INTCN);
        memset(recv, 0, BUFF_MAX);
        Serial.println("GET time");
    }
    
    void loop()
    {
        char in;
        char buff[BUFF_MAX];
        unsigned long now = millis();
        struct ts t;
    
        // show time once in a while
        if ((now - prev > interval) && (Serial.available() <= 0)) {
            DS3231_get(&t);
    
            // there is a compile time option in the library to include unixtime support
    #ifdef CONFIG_UNIXTIME
            snprintf(buff, BUFF_MAX, "%d.%02d.%02d %02d:%02d:%02d %ld", t.year,
                 t.mon, t.mday, t.hour, t.min, t.sec, t.unixtime);
    #else
            snprintf(buff, BUFF_MAX, "%d.%02d.%02d %02d:%02d:%02d", t.year,
                 t.mon, t.mday, t.hour, t.min, t.sec);
    #endif
    
            Serial.println(buff);
            prev = now;
        }
    
        if (Serial.available() > 0) {
            in = Serial.read();
    
            if ((in == 10 || in == 13) && (recv_size > 0)) {
                parse_cmd(recv, recv_size);
                recv_size = 0;
                recv[0] = 0;
            } else if (in < 48 || in > 122) {;       // ignore ~[0-9A-Za-z]
            } else if (recv_size > BUFF_MAX - 2) {   // drop lines that are too long
                // drop
                recv_size = 0;
                recv[0] = 0;
            } else if (recv_size < BUFF_MAX - 2) {
                recv[recv_size] = in;
                recv[recv_size + 1] = 0;
                recv_size += 1;
            }
    
        }
    }
    
    void parse_cmd(char *cmd, int cmdsize)
    {
        uint8_t i;
        uint8_t reg_val;
        char buff[BUFF_MAX];
        struct ts t;
    
        //snprintf(buff, BUFF_MAX, "cmd was '%s' %d\n", cmd, cmdsize);
        //Serial.print(buff);
    
        // TssmmhhWDDMMYYYY aka set time
        if (cmd[0] == 84 && cmdsize == 16) {
            //T355720619112011
            t.sec = inp2toi(cmd, 1);
            t.min = inp2toi(cmd, 3);
            t.hour = inp2toi(cmd, 5);
            t.wday = cmd[7] - 48;
            t.mday = inp2toi(cmd, 8);
            t.mon = inp2toi(cmd, 10);
            t.year = inp2toi(cmd, 12) * 100 + inp2toi(cmd, 14);
            DS3231_set(t);
            Serial.println("OK");
        } else if (cmd[0] == 49 && cmdsize == 1) {  // "1" get alarm 1
            DS3231_get_a1(&buff[0], 59);
            Serial.println(buff);
        } else if (cmd[0] == 50 && cmdsize == 1) {  // "2" get alarm 1
            DS3231_get_a2(&buff[0], 59);
            Serial.println(buff);
        } else if (cmd[0] == 51 && cmdsize == 1) {  // "3" get aging register
            Serial.print("aging reg is ");
            Serial.println(DS3231_get_aging(), DEC);
        } else if (cmd[0] == 65 && cmdsize == 9) {  // "A" set alarm 1
            DS3231_set_creg(DS3231_INTCN | DS3231_A1IE);
            //ASSMMHHDD
            for (i = 0; i < 4; i++) {
                time[i] = (cmd[2 * i + 1] - 48) * 10 + cmd[2 * i + 2] - 48; // ss, mm, hh, dd
            }
            uint8_t flags[5] = { 0, 0, 0, 0, 0 };
            DS3231_set_a1(time[0], time[1], time[2], time[3], flags);
            DS3231_get_a1(&buff[0], 59);
            Serial.println(buff);
        } else if (cmd[0] == 66 && cmdsize == 7) {  // "B" Set Alarm 2
            DS3231_set_creg(DS3231_INTCN | DS3231_A2IE);
            //BMMHHDD
            for (i = 0; i < 4; i++) {
                time[i] = (cmd[2 * i + 1] - 48) * 10 + cmd[2 * i + 2] - 48; // mm, hh, dd
            }
            uint8_t flags[5] = { 0, 0, 0, 0 };
            DS3231_set_a2(time[0], time[1], time[2], flags);
            DS3231_get_a2(&buff[0], 59);
            Serial.println(buff);
        } else if (cmd[0] == 67 && cmdsize == 1) {  // "C" - get temperature register
            Serial.print("temperature reg is ");
            Serial.println(DS3231_get_treg(), DEC);
        } else if (cmd[0] == 68 && cmdsize == 1) {  // "D" - reset status register alarm flags
            reg_val = DS3231_get_sreg();
            reg_val &= B11111100;
            DS3231_set_sreg(reg_val);
        } else if (cmd[0] == 70 && cmdsize == 1) {  // "F" - custom fct
            reg_val = DS3231_get_addr(0x5);
            Serial.print("orig ");
            Serial.print(reg_val,DEC);
            Serial.print("month is ");
            Serial.println(bcdtodec(reg_val & 0x1F),DEC);
        } else if (cmd[0] == 71 && cmdsize == 1) {  // "G" - set aging status register
            DS3231_set_aging(0);
        } else if (cmd[0] == 83 && cmdsize == 1) {  // "S" - get status register
            Serial.print("status reg is ");
            Serial.println(DS3231_get_sreg(), DEC);
        } else {
            Serial.print("unknown command prefix ");
            Serial.println(cmd[0]);
            Serial.println(cmd[0], DEC);
        }
    }
    تنظیم ماه سال روز ساعت و دقیقه:
    برای دیدن سایز بزرگ روی عکس کلیک کنید

نام: 12.jpg
مشاهده: 323
حجم: 73.7 کیلو بایت

    برای دیدن سایز بزرگ روی عکس کلیک کنید

نام: 222.jpg
مشاهده: 340
حجم: 94.9 کیلو بایت

    کتابخانه ds3231:
    https://github.com/rodan/ds3231

    لینک توضیح ویدیو کامل :
    http://www.youtube.com/watch?v=NDwSrgfsiYQ
    ویرایش توسط sina2sms@yahoo.com : 09-11-2015 در ساعت 07:04 PM

  2. #2
    مدیر گروه
    تاریخ عضویت
    Nov 2013
    محل سکونت
    ایران
    نوشته ها
    4,064
    ایول به شما
    لایک کردن

  3. #3
    Member
    تاریخ عضویت
    Aug 2015
    محل سکونت
    ایران اسلامی
    نوشته ها
    67
    قربانت دوست من،
    ویرایش توسط sina2sms@yahoo.com : 06-26-2016 در ساعت 08:38 PM
    لایک کردن

  4. #4
    Junior Member
    تاریخ عضویت
    Feb 2016
    نوشته ها
    1
    دوست عزیز خیلی ممنون میشم آموزش اتصال ds3231 به آردوینو و نمایش ساعت روی lcd 16x2 و فعال شدن یک خروجی در ساعتی خاص را قرار بدید. متشکرم.
    من هر کاری میکنم باز تداخل بوجود میاد بین داده های ساعت و ال سی دی. یعنی یه اشکال بی ربطی روی ال سی دی میبینم ولی روی سریال مانیتور درسته زمان.
    آردوینو من لئوناردو است .
    خیلی خیلی متشکرم
    لایک کردن

  5. #5
    مدیر گروه
    تاریخ عضویت
    Nov 2013
    محل سکونت
    ایران
    نوشته ها
    4,064
    نقل قول نوشته اصلی توسط razmjoo نمایش پست ها
    دوست عزیز خیلی ممنون میشم آموزش اتصال ds3231 به آردوینو و نمایش ساعت روی lcd 16x2 و فعال شدن یک خروجی در ساعتی خاص را قرار بدید. متشکرم.
    من هر کاری میکنم باز تداخل بوجود میاد بین داده های ساعت و ال سی دی. یعنی یه اشکال بی ربطی روی ال سی دی میبینم ولی روی سریال مانیتور درسته زمان.
    آردوینو من لئوناردو است .
    خیلی خیلی متشکرم

    الان LCD ات و ساعتت دارن جدا جدا درستکار می کنن ؟

    اگه اره کدت رو بزار ببینیم کجاش داره خطا می کنه
    و این که دقیقا مشکل اختلاف lcd ات چیه ؟
    ممکنه لازم داشته باشی یه جا LCD ات رو اول پاک کنی و بعد داده بدی
    لایک کردن

  6. #6
    Member
    تاریخ عضویت
    Feb 2016
    نوشته ها
    55
    سلام دوستان یه مشکلی ایجاد شده و اون اینه که با کد بالا و بستن ماژول همان طور که ارائه شده در بالا، خروجی به صورت زیر در سریال مانیتور نشان داده می شود :
    GET time
    2165.25.165 165:165:165
    2165.25.165 165:165:165
    2165.25.165 165:165:165
    2165.25.165 165:165:165
    2165.25.165 165:165:165
    2165.25.165 165:165:165
    2165.25.165 165:165:165

    به نظر شما مشکل از چیست؟

  7. #7
    Member
    تاریخ عضویت
    May 2013
    نوشته ها
    44
    از رابط i2c نمیتونه ااطلاعات رو دریافت کنه

  8. #8
    Member
    تاریخ عضویت
    Feb 2016
    نوشته ها
    55
    ممنون چون پایه های آنالوگ 4و 5 من پر بود اول خواستم به جای استفاده از این دو پایه از 2 پایه بالای پین Aref در آردوینو UNO برای SCL و SDA اشون استفاده کنم که با اینکه فکر می کنم درست زده بودم کار نمی کرد ولی بعدش که به پایه 4و5 آنالوگ زدم کار کرد باز از همون 2 پایه بالا که استفاده کردم حل شد دیگه گیری نداد ضمنا بین این همه کتابخانه سایت دیجی اسپارک بهتر کار کرد :
    آموزش راه اندازی ماژول ساعت Ds3231 آردوینو - دیجی*اسپارک

    حالا باز یه سوال وقتی برنامه رو می ریزم اگه همون موقع خروجی اش رو در سریال مانیتور ببینم درست نشون می ده ولی اگه چند دقیقه بعد صبر کنم (در حالت غیر متصل به برق رایانه) وقتی خروجی اش رو می بینم زمانش عقب می افته و دقیق نیست چرا؟ مگر باتری اش برای همین نیست که در حالت خاموش برق ساعتش تامین شه و زمانش عقب نیفته یعنی ایراد از باتری است؟

  9. #9
    Member
    تاریخ عضویت
    Feb 2016
    نوشته ها
    55
    ضمنا من باتری ماژول ds3231 رو با ولت متر تست کردم همون 3 ولت رو به خوبی خروجی میده ولی نمی دونم برای چی وقتی برای بار دوم برد رو به رایانه متصل می کنم چرا از همان زمانی که برنامه رو برد ریخته شده شروع می کنه ؟

  10. #10
    Junior Member
    تاریخ عضویت
    May 2017
    نوشته ها
    13
    سلام
    چطور میشه الارم رو طوری تنظیم کرد که مثلا هر 5 دقیقه یکبار الارم فعال شود؟؟؟

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •  

SEO by vBSEO