این پروژه یک ساعت زیبا با چهار عدد سون سگمنت بزرگ است که قابلیت نمایش ساعت و دما را داراست. البته این پروژه با استفاده از آی سی RTC DS1307 ساخته شده و همینطور دارای باتری Backup نیز هست که در مواقع برق رفتگی دیگر تنظیمات به هم نمیخورد و نیاز به باز تنظیم مجدد نیست.
سنسور این ساعت LM335، یکی از رایج ترین و ارزان ترین سنسور دما، می باشد. میکروکنترلر به کار رفته در این ساعت از خانواده PIC و مدل آن PIC18F252 می باشد. یکی از مشکلات این مدار آی سی کنترل سون سگمنت ها (MAX7219CNG) می باشد که شاید در ایران موجود نباشد. در منبع تغذیه این مدار شما آی سی تبدیل کننده ولتاژ ۱۲ به ۵ ولت را مشاهده می کنید که اگر در بازار موجود نبود شما می توانید از مداری برای منبع تغذیه استفاده کنید که از آی سی تبدیل کننده LM7805 که بسیار بسیار رایج می باشد، استفاده شده باشد. برای مثال شما می توانید مدار زیر را به عنوان منبع تغذیه استفاده کنید:
شماتیک مدار ساعت
لیست قطعات
تعداد موردنیاز | مشخصات قطعات | شماره روی مدار |
---|---|---|
۱ | CR2032 Battery Holder | B1 |
۱ | ۲۲uF 16V Tantalum Capacitor | C1 |
۱ | ۱۰uF 16V Electrolytic Capacitor | C10 |
۱ | ۲۲۰uF 16V Electrolytic Capacitor | C2 |
۵ | ۱۰۰nf 63V Ceramic Capacitor | C3 C6 C7 C8 C9 |
۲ | ۲۲pF 50V Ceramic Capacitor | C4 C5 |
۱ | MBR-150 1A 50V Schottky Diode | D1 |
۱ | ۳mm Red LED | D2 |
۱ | ۳mm Green LED | D4 |
۱ | LM335 Temperature Sensor | D3 |
۱ | BAT42 200mA 30V Schottky Diode | D5 |
۱ | DC-001 Power Connector | J1 |
۱ | ۱×۵ ۲.۵۴mm Male Header | J2 |
۱ | ۲×۴ ۲.۵۴mm Male Header | J3 |
۱ | ۱۵۰uH 850mA Inductor | L1 |
۴ | ۳۸mm Common Anode 7 Segment Display | LD1 LD2 LD3 LD4 |
۳ | ۳۳۰R 1/4W Resistor | R1 R2 R11 |
۶ | ۱۰K 1/4W Resistor | R3 R4 R5 R7 R8 R10 |
۱ | ۲K 1/4W Resistor | R6 |
۱ | ۲۷K 1/4W Resistor | R9 |
۳ | SPST-NO 6mmx3.5mm Tactile Switch | SW1 SW2 SW3 |
۱ | LM2574N-5.0 0.5A Step-Down Converter | U1 |
۱ | PIC18F252-I/SP Microcontroller | U2 |
۱ | ۲۸ Pin DIP Socket 300mil | U2 Socket |
۱ | MAX7219CNG 8 Digit Display Driver | U3 |
۱ | DS1307+ Real Time Clock | U4 |
۱ | ۳۲.۷۶۸KHz Crystal | Y1 |
۱ | ۱۰Mhz Crystal | Y2 |
تصاویری از مدار
برنامه
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ ۱۱ ۱۲ ۱۳ ۱۴ ۱۵ ۱۶ ۱۷ ۱۸ ۱۹ ۲۰ ۲۱ ۲۲ ۲۳ ۲۴ ۲۵ ۲۶ ۲۷ ۲۸ ۲۹ ۳۰ ۳۱ ۳۲ ۳۳ ۳۴ ۳۵ ۳۶ ۳۷ ۳۸ ۳۹ ۴۰ ۴۱ ۴۲ ۴۳ ۴۴ ۴۵ ۴۶ ۴۷ ۴۸ ۴۹ ۵۰ ۵۱ ۵۲ ۵۳ ۵۴ ۵۵ ۵۶ ۵۷ ۵۸ ۵۹ ۶۰ ۶۱ ۶۲ ۶۳ ۶۴ ۶۵ ۶۶ ۶۷ ۶۸ ۶۹ ۷۰ ۷۱ ۷۲ ۷۳ ۷۴ ۷۵ ۷۶ ۷۷ ۷۸ ۷۹ ۸۰ ۸۱ ۸۲ ۸۳ ۸۴ ۸۵ ۸۶ ۸۷ ۸۸ ۸۹ ۹۰ ۹۱ ۹۲ ۹۳ ۹۴ ۹۵ ۹۶ ۹۷ ۹۸ ۹۹ ۱۰۰ ۱۰۱ ۱۰۲ ۱۰۳ ۱۰۴ ۱۰۵ ۱۰۶ ۱۰۷ ۱۰۸ ۱۰۹ ۱۱۰ ۱۱۱ ۱۱۲ ۱۱۳ ۱۱۴ ۱۱۵ ۱۱۶ ۱۱۷ ۱۱۸ ۱۱۹ ۱۲۰ ۱۲۱ ۱۲۲ ۱۲۳ ۱۲۴ ۱۲۵ ۱۲۶ ۱۲۷ ۱۲۸ ۱۲۹ ۱۳۰ ۱۳۱ ۱۳۲ ۱۳۳ ۱۳۴ ۱۳۵ ۱۳۶ ۱۳۷ ۱۳۸ ۱۳۹ ۱۴۰ ۱۴۱ ۱۴۲ ۱۴۳ ۱۴۴ ۱۴۵ ۱۴۶ ۱۴۷ ۱۴۸ ۱۴۹ ۱۵۰ ۱۵۱ ۱۵۲ ۱۵۳ ۱۵۴ ۱۵۵ ۱۵۶ ۱۵۷ ۱۵۸ ۱۵۹ ۱۶۰ ۱۶۱ ۱۶۲ ۱۶۳ ۱۶۴ ۱۶۵ ۱۶۶ ۱۶۷ ۱۶۸ ۱۶۹ ۱۷۰ ۱۷۱ ۱۷۲ ۱۷۳ ۱۷۴ ۱۷۵ ۱۷۶ ۱۷۷ ۱۷۸ ۱۷۹ ۱۸۰ ۱۸۱ ۱۸۲ ۱۸۳ ۱۸۴ ۱۸۵ ۱۸۶ ۱۸۷ ۱۸۸ ۱۸۹ ۱۹۰ ۱۹۱ ۱۹۲ ۱۹۳ ۱۹۴ ۱۹۵ ۱۹۶ ۱۹۷ ۱۹۸ ۱۹۹ ۲۰۰ ۲۰۱ ۲۰۲ ۲۰۳ ۲۰۴ ۲۰۵ ۲۰۶ ۲۰۷ ۲۰۸ ۲۰۹ ۲۱۰ ۲۱۱ ۲۱۲ ۲۱۳ ۲۱۴ ۲۱۵ ۲۱۶ ۲۱۷ ۲۱۸ ۲۱۹ ۲۲۰ ۲۲۱ ۲۲۲ ۲۲۳ ۲۲۴ ۲۲۵ ۲۲۶ ۲۲۷ ۲۲۸ |
// VARIABLES char second = ۰; char second_old = ۰; char minute = ۰; char minute_ten = ۰; char minute_one = ۰; char hour = ۰; char hour_ten = ۰; char hour_one = ۰; char counter_1=۰; char counter_2=۰; unsigned temp = ۰; char temp_ten=۰; char temp_one=۰; char temp_neg=۰; char blink=۰; char i=۰; void send_to_max7219(char address,char data) { PORTC.F6 = ۰; // LOAD(CS) LINE LOW Spi_Write(address); Spi_Write(data); PORTC.F6 = ۱; // LOAD(CS) LINE HIGH } void init_MAX7219() { send_to_max7219(0x09,0xFF);// BCD Mode Code B send_to_max7219(0x0A,0x0F);// INTENSITY MAX send_to_max7219(0x0B,0x03);// SCAN ONLY DIGITS 0,1,2,3 send_to_max7219(0x0C,0x01);// TURN ON send_to_max7219(0x00,0x0F);// TEST OFF } void show_temp() { // READ AN0 INPUT 50 TIMES CUMULATIVELY temp=۰; for (i=۰;i<=۴۹;i++) { temp = temp+ Adc_Read(۰); delay_ms(۱); } temp=temp/۵۰; //CALCULATE THE AVERAGE temp = temp*۴.۵۷;//CALCULATE THE SENSOR OUTPUT in mV // TEMPERATURE POSITIVE OR NEGATIVE? if (temp>=۲۷۳۰) { temp = temp-۲۷۳۰; temp_neg=۰;} else {temp=۲۷۳۰-temp;temp_neg=۱;} // CONVERT TEMPERATURE VALUE INTO BCD FORMAT temp=Dec2Bcd16(temp); // MAX7219 NO DECODE MODE send_to_max7219(0x09,0x00); // DISPLAY THE MINUS SIGN IF TEMP IS NEGATIVE if (temp_neg) { send_to_max7219(0x01,0x01); } else { send_to_max7219(0x01,0x00); } // SEPERATE THE TEMPERATURE DIGITS temp_one=(temp>>۴)&0b00001111; temp_ten=(temp>>۸)&0b00001111; // DISPLAY THE TEMPERATURE DIGITS if (temp_one==0x00) {send_to_max7219(0x03,0x7E);} else if (temp_one==0x01) {send_to_max7219(0x03,0x30);} else if (temp_one==0x02) {send_to_max7219(0x03,0x6D);} else if (temp_one==0x03) {send_to_max7219(0x03,0x79);} else if (temp_one==0x04) {send_to_max7219(0x03,0x33);} else if (temp_one==0x05) {send_to_max7219(0x03,0x5B);} else if (temp_one==0x06) {send_to_max7219(0x03,0x5F);} else if (temp_one==0x07) {send_to_max7219(0x03,0x70);} else if (temp_one==0x08) {send_to_max7219(0x03,0x7F);} else if (temp_one==0x09) {send_to_max7219(0x03,0x7B);} if (temp_ten==0x00) {send_to_max7219(0x03,0x7E);} else if (temp_ten==0x01) {send_to_max7219(0x02,0x30);} else if (temp_ten==0x02) {send_to_max7219(0x02,0x6D);} else if (temp_ten==0x03) {send_to_max7219(0x02,0x79);} else if (temp_ten==0x04) {send_to_max7219(0x02,0x33);} else if (temp_ten==0x05) {send_to_max7219(0x02,0x5B);} else if (temp_ten==0x06) {send_to_max7219(0x02,0x5F);} else if (temp_ten==0x07) {send_to_max7219(0x02,0x70);} else if (temp_ten==0x08) {send_to_max7219(0x02,0x7F);} else if (temp_ten==0x09) {send_to_max7219(0x02,0x7B);} // DISPLAY THE DEGREE SIGN send_to_max7219(0x04,0x62); } void main() { // INITIALIZE SPECIAL FUNCTION REGISTERS ADCON1=0b00001110; // SELECT THE ANALOG INPUTS TRISC = 0b00010000; // ASSIGN DIRECTIONS FOR PORTC TRISB = 0b11111111; // ASSIGN DIRECTIONS FOR PORTB TRISA = 0b00000001; // ASSIGN DIRECTIONS FOR PORTA PORTC.F6 = ۱; //LOAD(CS) LINE IS INITIALLY LOW // INIT HW SPI Spi_Init_Advanced(MASTER_OSC_DIV16,DATA_SAMPLE_MIDDLE,CLK_IDLE_LOW,LOW_2_HIGH); // INIT SW I2C Soft_I2C_Config(&PORTB, 1, 0); while(۱) { init_MAX7219(); // READ SECOND, MINUTE and HOUR INFO FROM DS1307 Soft_I2C_Start(); Soft_I2C_Write(0xD0); Soft_I2C_Write(0x00); Soft_I2C_Start(); Soft_I2C_Write(0xD1); second = Soft_I2C_Read(۱); minute = Soft_I2C_Read(۱); hour = Soft_I2C_Read(۰); Soft_I2C_Stop(); // SEPERATE THE HOUR AND MINUTE DIGITS hour_one = 0b00001111 & hour; hour_ten = (hour >> ۴) & 0b00001111; minute_one = 0b00001111 & minute; minute_ten = (minute >> ۴) & 0b00001111; // BLINKING AND TEMP. DISPLAY PERIOD if (second != second_old) { // DETECT A SECOND counter_1++; counter_2++; second_old=second; if (counter_1==۱) { // BLINK EVERY 1 SECOND counter_1=۰; blink=~blink; } if (counter_2==۱۵) { // DISPLAY TEMP EVERY 15 SECONDS counter_2=۰; show_temp(); delay_ms(۳۰۰۰); // DISPLAY FOR THREE SECONDS send_to_max7219(0x09,0xFF); // SET BCD CODE B } } // MANUALLY SHOW TEMP IF SW2 IS PRESSED if (PORTB.F3==۰) { counter_2=۰; show_temp(); delay_ms(۳۰۰۰); send_to_max7219(0x09,0xFF); // SET BCD CODE B } // DISPLAY THE HOUR DIGITS if (hour_ten == 0x00) { // IF THE DECIMAL DIGIT IS 0 send_to_max7219(0x01,0x0F);} // THEN DISPLAY NOTHING IN FIRST DIGIT else { send_to_max7219(0x01,hour_ten);} if (blink==0xFF) { hour_one|=0b10000000;} // DETERMINE THE DOT STATUS OF THE 2nd DIGIT else { hour&=0b01111111;} send_to_max7219(0x02,hour_one); // DISPLAY THE MINUTE DIGITS if (blink==0xFF) { minute_ten|=0b10000000;} // DETERMINE THE DOT STATUS OF THE 3th DIGIT else { minute_ten&=0b01111111;} send_to_max7219(0x03,minute_ten); send_to_max7219(0x04,minute_one); // INCREASE THE HOUR IF SW IS PRESSED hour_one&=0b01111111; if (PORTB.F2==۰) { if (hour_one<=0x08) { if ((hour_ten==0x02) && (hour_one==0x03)) { hour_one=0; hour_ten=۰; } else { hour_one++;} } else {hour_one=0x00; if (hour_ten<=0x1) { hour_ten++;} else { hour_ten=0x00;} } // WRITE THE NEW HOUR VALUE TO DS1307 hour_ten = (hour_ten<<۴)&0b11110000; hour = hour_one|hour_ten; Soft_I2C_Start(); Soft_I2C_Write(0xD0); Soft_I2C_Write(0x02); Soft_I2C_Write(hour); Soft_I2C_Stop(); do {} while (PORTB.F2==۰) ; // SW DEBOUNCE } // INCREASE MINUTE IF SW3 IS PRESSED minute_ten&=0b01111111; if (PORTB.F4==۰) { if (minute_one<=0x08) { minute_one++; } else { if ((minute_ten==0x05) && (minute_one==0x09)) { minute_one=0x00; minute_ten=0x00; } else if (minute_ten<=0x05) { minute_ten++; minute_one=0x00;} else { minute_ten=0x00; minute_one=0x00;} } // WRITE THE NEW MINUTE VALUE TO DS1307 minute_ten = (minute_ten<<۴)&0b11110000; minute = minute_one|minute_ten; Soft_I2C_Start(); Soft_I2C_Write(0xD0); Soft_I2C_Write(0x00); Soft_I2C_Write(0x00); Soft_I2C_Write(minute); Soft_I2C_Stop(); do {} while (PORTB.F4==۰); // SW DEBOUNCE } } } |
سلام
خسته نباشید از مطالب خوبتون
سوال: چطوری میشود کیت ساعت دیجیتالی ارائه شده در این سایت ، خرید کرد؟
متشکرم
سلام. سلامت باشید!
متاسفانه این مدار رو باید خودتون بسازید و کیت اش رو بعید میدونم تو ایران پیدا بشه. ولی احتمالا مشابه این مدار (حتی پیشرفته تر) به صورت کیت در ایران وجود دارد و شما میتوانید آنرا تهیه کنید.