Hẹn giờ DIY

Thảo luận trong 'Góc sáng tạo' bắt đầu bởi motu, 12/3/11.

  1. motu

    motu Well-Known Member

    Tham gia:
    23/9/06
    Bài viết:
    75
    Thích đã nhận:
    41
    Đến từ:
    VN
    Theo yêu cầu của một số bạn, hôm nay e xin mạn phép post sơ đồ nguyên lý và code C của cái hẹn giờ của em cho ae nào yêu thích điện tử và ham mê chọc ngoáy tham khảo. Mạch sử dụng vi xử lý PIC, có 8 đầu ra để điều khiển, có thể kết nối thêm cảm biến nhiệt độ (để rảnh e làm code có đo nhiệt độ up lên sau). Những khó khăn khi DIY cái này:
    1. Mạch in (em sẽ post sau). Cái này phải đặt người ta làm nếu muốn nhỏ gọn đẹp, tự làm thì không gọn được vì chỉ làm được một mặt.
    2. Chép code vào vi xử lý. Phải mua pickit, hơi phí nếu chỉ để làm cái này thôi, nên nếu ai cần up code em có thể giúp.
    3. Mua đồ hơi bị nhiều thứ cũng khá tốn tiền, mắc nhất là con PIC (khoảng 70k thì phải), mấy con rờle tùy loại và con DS1307 (15k).
    Code này e đã test chạy ổn định trên cái bo test PIC của em. Do không phải dân điện tử nên có pro nào thấy scheme và code hơi gà cũng đừng cười em. Chào cả nhà. Chúc vui với aqua.
    [​IMG]
    Uploaded with ImageShack.us
    http://www.mediafire.com/?653e8dm1sg9oika
    Mã:
    #include <16F877A.H>
    #include <def_877a.h>
    #device *=16 ADC=8
    #FUSES NOWDT, HS, PUT, NOPROTECT, NODEBUG, BROWNOUT, NOLVP, NOCPD, NOWRT
    #use delay(clock=4000000)
    #use i2c(MASTER, SDA=PIN_C4, SCL=PIN_C3, force_hw)
    #include <DS1820.c>
    #include <Temperature.c>
    #define increase RC6
    #define decrease RC7
    #define mode RC5
    #define emer RC0
    #define led1 RA0
    #define led2 RA1
    #define led3 RA2
    #define led4 RA3
    #define led5 RA4
    #define led6 RA5
    int8 const led_code[10] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //ma cho led7
    int8 sec, min, hour, sec1, sec2, min1, min2, hour1, hour2, mode_f, day, date, month, year;
    int1 on_off;
    //float temperature;
    void time_init()              //cai dat gio cho ds1307
    {           
    int8 temp = 0;
    i2c_start();
    i2c_write(0xD0);               //den dia chi ds1307.
    i2c_write(0x00);   //den dia chi thanh ghi 00H.
    temp = 0x00;
    temp = temp & 0b01111111;
    i2c_write(temp);      
    temp = min1 + (min2<<4);
    i2c_write(temp);
    temp = hour1 + (hour2<<4);
    i2c_write(temp);
    i2c_write(0x00);               
    i2c_stop();
    }
    void update_time()            //lay thong tin thoi gian tu ds1307
    {
    i2c_start();
    i2c_write(0xD0);
    i2c_write(0x00);
    i2c_start();
    i2c_write(0xD1);
    sec = i2c_read();
    min = i2c_read();
    hour   = i2c_read();
    day    = i2c_read();
    date   = i2c_read();
    month  = i2c_read();
    year   = i2c_read(0);    
    i2c_stop();
    sec1 = sec & 0x0F;      //chuyen doi BCD-->so de hien thi
    sec2 = (sec & 0x70)>>4;
    min1 = min & 0x0F;
    min2 = (min & 0x70)>>4;
    hour1 = hour & 0x0F;
    hour2 = (hour & 0x30)>>4;      
    }
    void show_sec()               //hien thi giay
    {
    portb = led_code[sec2];
    led5 = 0;
    delay_us(500);
    led5 = 1;
    portb = led_code[sec1];
    led6 = 0;
    delay_us(500);
    led6 = 1;
    }
    void show_min()               //hien thi phut
    {
    portb = led_code[min2];
    led3 = 0;
    delay_us(500);
    led3 = 1;
    portb = led_code[min1];
    led4 = 0;
    delay_us(500);
    led4 = 1;
    }
    void show_hour()              //hien thi gio
    {
    portb = led_code[hour2];
    led1 = 0;
    delay_us(500);
    led1 = 1;
    portb = led_code[hour1];
    led2 = 0;
    delay_us(500);
    led2 = 1;
    }
    void set_min()                //thiet lap phut
    {
    while (mode_f==2)
    {
    delay_ms(50);         //chong rung nut nhan
    if (increase == 0)    //kiem tra nut tang duoc nhan
    {
    delay_ms(50);     //chong rung nut nhan
    while (increase == 0) {}
    min1++;
    if ((min2==5)&(min1==10))
    {
    min1 = 0;
    min2 = 0;
    }
    if (min1==10)
    {
    min2++;
    min1 = 0;
    } 
    }
    if (decrease == 0)    //kiem tra nut giam duoc nhan
    {
    delay_ms(50);     //chong rung nut nhan
    while (decrease == 0){}
    min1--;
    if ((min2==0)&(min1==255))
    {
    min1 = 9;
    min2 = 5;
    }
    if (min1==255)
    {
    min2--;
    min1 = 9;
    } 
    }
    if (mode == 0)        //kiem tra nut dieu chinh duoc nhan
    {
    delay_ms(50);       //chong rung nut nhan
    while (mode == 0) {}
    mode_f=0;
    }
    show_min();
    }
    time_init();            
    }
    void set_hour()               //thiet lap gio
    {
    while (mode_f==1)
    {
    delay_ms(50);
    if (increase == 0)
    {
    delay_ms(50);
    while (increase == 0) {}
    hour1++;
    if ((hour2==2)&(hour1==4))
    {
    hour1 = 0;
    hour2 = 0;
    }
    if (hour1==10)
    {
    hour2++;
    hour1 = 0;
    } 
    }
    if (decrease == 0)
    {
    delay_ms(50);
    while (decrease == 0){}
    hour1--;
    if ((hour2==0)&(hour1==255))
    {
    hour1 = 3;
    hour2 = 2;
    }
    if (hour1==255)
    {
    hour2--;
    hour1 = 9;
    } 
    }
    if (mode == 0)
    {
    delay_ms(50);
    while (mode == 0) {}
    mode_f=2;
    }
    show_hour();
    }
    }
    void turn_it_on()
    {
    int8 ti;
    ti = (hour2*10+hour1)*10+min2;
    if (((ti >=60)&&(ti <=110))||((ti >=140)&&(ti <=230)))     //6h00 - 11h00 ; 14h00 - 23h00
    on_off = 0;
    else
    on_off = 1;
    RD0 = on_off && emer;   
    }
    void main()
    {
    set_tris_a(0x00);
    set_tris_b(0x00);
    set_tris_c(0xFF);
    set_tris_d(0x00);
    portA = 0xFF;
    portB = 0xFF;
    portD = 0x00;
    mode_f=0;
    while(1)
    {      
    update_time();
    if(mode == 0)
    {
    delay_ms(50);
    while (mode == 0) {}
    mode_f = 1;
    set_hour();
    set_min();
    }        
    show_hour();    
    show_min(); 
    show_sec();
    turn_it_on();
    } 
    }
    
     
    soulstar, MrSiro, HuyNX and 3 others like this.
  2. Dragonking

    Dragonking Well-Known Member

    Tham gia:
    24/4/06
    Bài viết:
    999
    Thích đã nhận:
    469
    Đến từ:
    HCMC
    Cái này dành cho dân pro điện tử làm nè, mình nhìn vào cái sơ đồ là rối cả mắt lên :D
     
  3. teivcart

    teivcart Active Member

    Tham gia:
    21/8/10
    Bài viết:
    41
    Thích đã nhận:
    34
    Đến từ:
    Ho Chi Minh
    Hoan hô bác đã chia sẽ cho anh em. Em vẫn đang tự nghiên cứu, để hôm nào có dịp sẽ hỏi bác 1 số vấn đề thêm :)
     
  4. omegavnn

    omegavnn Member

    Tham gia:
    29/3/11
    Bài viết:
    18
    Thích đã nhận:
    6
    Đến từ:
    biên hòa
    không biết có ai làm mấy cái này bằng LabVIEW chưa nhỉ. thấy cái này có vể khó khó
     
  5. teivcart

    teivcart Active Member

    Tham gia:
    21/8/10
    Bài viết:
    41
    Thích đã nhận:
    34
    Đến từ:
    Ho Chi Minh
    Chưa có thời gian làm thử nhưng thấy code có 3 dòng #include bị thiếu hay sao ấy :D
    Chắc phải là #include<16f877a.c> chứ nhỉ. Thêm nữa mạch này dùng relay thì phải làm sao để chống nhiễu đây bác motu? Em nghe nói khi relay bật tắt sẽ sinh ra tia lửa điện ->...-> làm pic bị reset hoặc đơ luôn. Có 1 cách làm làm nguồn riêng cho relay nhưng mà vậy thì nó sẽ cồng kềnh lắm.
     
  6. motu

    motu Well-Known Member

    Tham gia:
    23/9/06
    Bài viết:
    75
    Thích đã nhận:
    41
    Đến từ:
    VN
    Sorry bạn, không biết sao copy lên bị thiếu mất mấy dòng, để chỉnh lại. Nếu thấy cần thiết bạn có thể cách ly rờle qua con opto cho chắc, còn nguồn thì do mình xài đèn led nên chơi luôn cục nguồn máy tính. Chơi hồ thủy sinh thì thường có chân, mình đóng tủ bỏ hết vào trong, có gì mà sợ cồng kềnh chứ.
     
  7. HuyNX

    HuyNX Well-Known Member

    Tham gia:
    22/1/10
    Bài viết:
    209
    Thích đã nhận:
    441
    Đến từ:
    HAN
    oh hôm nay mình mới biết bạn motu post lên rồi. Mạch vậy ok rồi. Có thể câu dây trên panel có sẵn cũng được. Nếu làm có thể mua loại led được ghép sẵn mấy con lại thì đỡ phải đi nhiều dây so với từng con led riêng rẽ. Relay thì chắc ko cần cách ly (mình cũng làm vậy), có con diode chống xung ngược là được rồi, mình sử dụng loại diode xung (schottky diode). Vì cách ly thực sự thì phải nguồn riêng biệt hẳn, ko chung đất.
    Chúc bạn phát triển thêm nhiều tính năng nữa :)
     
    motu thích bài này.
  8. motu

    motu Well-Known Member

    Tham gia:
    23/9/06
    Bài viết:
    75
    Thích đã nhận:
    41
    Đến từ:
    VN
    @HuyNX: Thk bạn, hy vọng show code không làm ảnh hưởng đến doanh thu của bạn :D, nói vui thôi chứ so về mức độ pro thì sao có thể cạnh tranh với sản phẩm của HuyNX. Post mạch đơn giản lên để ai không có điều kiện mua của bạn và thích tự làm tham khảo thôi, còn mạch full của mình có các chức năng điều khiển dàn đèn led, đo nhiệt độ, điều khiển thay nước hồ nữa.
    Tuy nhiên có lẽ việc DIY những thiết bị như thế này đi sâu vào kỹ thuật điện tử quá nên không được quan tâm lắm, hơn nữa mình cũng không muốn ABV thành diễn đàn dientuvietnam.net :) cho nên xin phép dừng post bài về chủ đề này tại đây, nhưng ae nào có thắc mắc muốn hỏi mình có thể liên lạc qua email business.com.muoi@gmail.com, mình không phải dân điện tử nhưng sẽ cố gắng giải đáp, câu hỏi nào khó quá thì nhờ bạn HuyNX vậy :D.
    Chào cả nhà! Chúc vui cùng ABV!
     
    Last edited: 21/4/11
    soulstar and HuyNX like this.

Chia sẻ trang này