Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 45 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
45
Dung lượng
1,37 MB
Nội dung
HỌC VIỆN KỸ THUẬT MẬT MÃ KHOA ĐIỆN TỬ- VIỄN THÔNG BÁO CÁO MÔN HỌC HỆ ĐIỀU HÀNH NHÚNG THỜI GIAN THỰC Đề tài: “Thiết kế đồng hồ thời gian thực có LED nháy theo nhạc sử dụng hệ điều hành FREERTOS” Giảng viên hướng dẫn: Lê Thị Hồng Vân Sinh viên thực hiện: Nguyễn Đình Hiếu DT030216 Nguyễn Đăng Tồn DT030244 Nguyễn Cơng Tùng DT030247 Hà Nội 11/ 2022 LỜI NÓI ĐẦU Ngày khoa học công nghệ ngày phát triển, vi điều khiển AVR vi điều khiển PIC ngày thông dụng hồn thiện hơn, nói xuất Arduino vào năm 2005 Italia mở hướng cho vi điều khiển Sự xuất Arduino hỗ trợ cho người nhiều lập trình thiết kế, người bắt đầu tìm tịi vi điều khiển mà khơng có q nhiều kiến thức, hiểu biết sâu sắc vật lý điện tử Phần cứng thiết bị tích hợp nhiều chức mã nguồn mở Ngôn ngữ lập trình Java lại vơ dễ sử dụng tương thích với ngơn ngữ C hệ thư viện phong phú chia sẻ miễn phí Chính lý nên Arduino dần phổ biến phát triển ngày mạnh mẽ toàn giới Trên sở kiến thức học môn học: Tin học đại cương, Điện tử tương tự số, Hệ điều hành nhúng thời gian thực… với hiểu biết thiết bị điện tử, chúng em định thực đề tài “Thiết kế đồng hồ thời gian thực có LED nháy theo nhạc sử dụng hệ điều hành thời gian thực FreeRTOS” Do kiến thức hạn hẹp nên chắn khơng tránh khỏi thiếu sót, hạn chế chúng em mong có góp ý nhắc nhờ từ giáo để hồn thiện đề tài Chúng em xin chân thành cảm ơn cô Lê Thị Hồng Vân giúp đỡ chúng em nhiều trình tìm hiểu, thiết kế hoàn thành đề tài đồ án mơn học Mục lục LỜI NĨI ĐẦU .2 Mục lục Danh mục hình ảnh .4 CHƯƠNG I: TỔNG QUAN VỀ HỆ THỐNG 1.1 Đặt vấn đề 1.2 Lý chọn đề tài .5 1.3 Mục đích nghiên cứu đề tài .5 1.4 Giải pháp thiết kế CHƯƠNG II: CƠ SỞ LÝ THUYẾT 2.1 Tìm hiểu hệ điều hành nhúng thời gian thực FreeRTOS .7 2.1.1 Lịch sử phát triển hệ điều hành nhúng thời gian thực FreeRTOS 2.1.2 Cách thức hoạt động FreeRTOS 2.1.3 Các chức FreeRTOS .9 2.2 Giới thiệu thiết bị phần cứng sử dụng 10 2.2.1 Kit Arduino UNO R3 10 2.2.2 Module thời gian thực Module Tiny RTC I2C 17 2.2.3 Module LED P10 .18 2.2.4 Module cảm biến âm .20 CHƯƠNG III: THIẾT KẾ VÀ THI CÔNG SẢN PHẨM 22 3.1 Thiết kế thi công phần cứng 22 3.2 Thiết kế thi công phần mềm 24 3.2.1 Chương trình hiển thị lên LED P10 24 3.2.2 Thiết kế chương trình 25 3.2.3 Chương trình điều khiển sản phẩm 27 CHƯƠNG IV: TỔNG KẾT .29 4.1 Nhận xét, đánh giá 29 4.2 Hướng phát triển 29 4.3 Kết luận 29 TÀI LIỆU THAM KHẢO 30 PHỤ LỤC 31 Danh mục hình ảnh Hình 1: Sơ đồ khối Hình 1: Cách hoạt động RTOS .9 Hình 2: Board Arduino Uno 11 Hình 3: Vi điều khiển Arduino Uno .12 Hình 4: Các chân Arduino Uno R3 14 Hình 5: Module Tiny RTC I2C (khơng PIN) 17 Hình 6: Màn hình LED P10 18 Hình 7: Chiều data LED 19 Hình 8: Module cảm biến âm 20 Hình 1: Mơ mạch proteus 22 Hình 2: Thiết kế thi cơng vỏ hộp để chứa bảo vệ thiết bị 23 Hình 3: Thuật tốn qt LED 24 Hình 4: Phương pháp ngắt timer thực thuật toán quét led 24 Hình 5: Lưu đồ thuật tốn chương trình .25 Hình 6: Lưu đồ thuật toán tác vụ taskRealTime 26 Hình 7: Lưu đồ thuật tốn tác vụ “animation” 27 Hình 8: Sơ đồ điều khiển sản phẩm 27 Hình 9: Lưu đồ thuật tốn chương trình điều khiển 28 CHƯƠNG I: TỔNG QUAN VỀ HỆ THỐNG 1.1 Đặt vấn đề Khoa học kỹ thuật ngày phát triển kéo theo việc đời loại đồng hồ nhằm xác định thời gian rõ ràng xác hơn, tiêu biểu đồng hồ đồng hồ số Đồng hồ số đời mang tính vượt bậc so với đồng hồ hay loại đồng hồ xưa mặt: kinh phí, độ xác nhiều tính khác 1.2 Lý chọn đề tài Hiện nay, thị trường có số loại đồng hồ kim đồng hồ số đơn giản thông thường dùng để xem Thiết kế đồng hồ thời gian thực có LED nháy theo nhạc ngồi nhằm mục đích hỗ trợ người dùng theo dõi thời gian, đồng thời sản phẩm gần gũi, có tính lạ đẹp mắt dễ dàng sử dụng Thiết bị hoạt động dùng vi điều khiển để xử lý nên có độ xác cao, giao tiếp trực tiếp với module thơng dụng thành thể thống Vì vậy, thiết bị giúp người thân gia đình xếp quản lý thời gian tốt hơn, xác với độ tin cậy cao 1.3 Mục đích nghiên cứu đề tài Thiết kế thi công đồng hồ thời gian thực Đồng hồ có tính hiển thị thời gian giờ, led nháy theo nhạc có giao diện tiện lợi, đẹp mắt cho người dùng 1.4 Giải pháp thiết kế Hệ thống thiết kế gồm khối: Khối nguồn, khối thời gian, khối vi điều khiển, khối hiển thị, khối điều khiển, khối cảm biến âm Hình 1: Sơ đồ khối Chức khối: - Khối nguồn: cung cấp nguồn hoạt động cho hệ thống vi điều khiển - Khối xử lý trung tâm: Đóng vai trị đầu não hệ thống Xử lý tín hiệu nhận từ khối thời gian thực khối cảm biến âm từ hiển thị thơng tin lên khối hiển thị Nhận tín hiệu điều khiển để thay đổi trạng thái hoạt động - Khối hiển thị: Hiển thị thông số thời gian giờ, phút, giây - Khối RTC: Khối thực chất chíp thời gian thực (Real Time Clock), sử dụng với ý nghĩa thời gian tuyệt đối mà người sử dụng Trong sơ đồ đảm nhiệm chức cấp time xác cho vi điều khiển xử lý - Khối điều khiển: Sử dụng nút bấm Thực chức nhập liệu đưa đến vi điều khiển bao gồm thao tác thay đổi hiển thị - Khối cảm biến âm thanh: Cảm biến âm có chức nặng nhận biết âm giúp LED nháy theo điệu nhạc CHƯƠNG II: CƠ SỞ LÝ THUYẾT 2.1 Tìm hiểu hệ điều hành nhúng thời gian thực FreeRTOS Hệ điều hành thời gian thực – Real Time Operating Systems (RTOS) hệ điều hành cho hệ thống nhúng Loại hệ điều hành thường thiết kế để tiết kiệm tài nguyên đáng tin cậy Phần cứng chạy hệ điều hành nhúng hạn chế tài nguyên RAM ROM, thiết kế nhúng hệ điều hành có phạm vi hẹp phù hợp với ứng dụng cụ thể để đạt hoạt động mong muốn theo ràng buộc Để tận dụng tốt sức mạnh xử lý CPU, nhà phát triển phần mềm viết mã quan trọng trực tiếp ngơn ngữ máy (tốc độ, chi phí, khả bảo trì), ngôn ngữ khả chuyển (portable language) C Một số hệ điều hành nhúng phổ biến như: QNX, PDOS, pSOS, VxWorks, Nulceus, ERCOS, EMERALDS, Windows CE….Nhưng đồ án môn học chúng em sử dụng hệ điều hành nhúng thời gian thực FreeRTOS Vì FreeRTOS phù hợp cho nghiên cứu, học tập kỹ thuật, công nghệ viết hệ điều hành nói chung hệ điều hành nhúng thời gian thực nói riêng, việc phát triển mở rộng tiếp thành phần cho hệ điều hành (bổ sung mơ-đun, trình điều khiển, chuyển đổi môi trường thực hiện) 2.1.1 Lịch sử phát triển hệ điều hành nhúng thời gian thực FreeRTOS FreeRTOS lõi hệ điều hành thời gian thực miễn phí Hệ điều hành Richard Barry công bố rộng rãi từ năm 2003, phát triển mạnh đến cộng đồng mạng mã nguồn mở ủng hộ FreeRTOS có tính khả chuyển, mã nguồn mở, lõi down miễn phí dùng cho ứng dụng thương mại Nó phù hợp với hệ nhúng thời gian thực nhỏ Hầu hết code viết ngơn ngữ C nên có tính phù hợp cao với nhiều khác Ưu điểm dung lượng nhỏ chạy mà nhiều hệ khơng chạy Có thể port cho nhiều kiến trúc vi điều khiển cơng cụ phát triển khác Mỗi port thức bao gồm ứng dụng ví dụ tiền cấu hình biểu riêng biệt lõi, kiến thức hướng phát triển Những hỗ trợ miễn phí cung cấp cộng đồng mạng Hỗ trợ thương mại với dịch vụ phát triển đầy đủ cung cấp FreeRTOS cấp giấy phép chỉnh sửa GPL (GeneralPublic License sử dụng ứng dụng thương mại với giấy phép Ngồi liên quan đến FreeRTOS có OpenRTOS SafeRTOS OpenRTOS thương mại FreeRTOS.org khơng liên quan đến GPL SafeRTOS dựa FreeRTOS phân tích, chứng minh tài liệu kiểm tra nghiêm ngặt với chuẩn IEC61508 Và chuẩn IEC61508 SIL3 tạo phát triển độc lập để hoàn thiện tài liệu cho SafeRTOS 2.1.2 Cách thức hoạt động FreeRTOS RTOS phân đoạn phần chương trình, giải việc điều phối task, lập lịch phân mức ưu tiên cho task, nắm bắt thông điệp gửi từ task RTOS phức tạp, nói cách dễ hiểu thực việc xử lý trạng thái máy (State Machine) Để giải toán nhiều trạng thái máy, thông thường sử dụng code sau: while(1) { switch(state) { case 1: //Code for Task 1; state= 2; case 2: //Code for Task 2; state= 3; case 3: //Code for Task 3; state= 4; case 4: //Code for Task 4; state=1; } } Chương trình thực thi từ states tới states sau quay vịng lại Bất kì states thay đổi, chương trình nhảy qua phục vụ task Nhược điểm phương pháp tài nguyên sử dụng chung, tốc độ chuyển chậm thay đổi states phải hồn thành Task trước chuyển sang Task khác, khó kiểm sốt nhiều tác vụ (Task) Hình 1: Cách hoạt động RTOS Nhân Kernel điều phối hoạt động tác vụ (Task), task có mức ưu tiên (prioritize) thực thi theo chu kì cố định Nếu có tác động ngắt, tín hiệu tin nhắn Task, Kernel điều phối chuyển tới Task tương ứng với Code 10 Hình 7: Lưu đồ thuật tốn tác vụ “animation” 3.2.3 Chương trình điều khiển sản phẩm Sơ đồ điều khiển sản phẩm Hình 8: Sơ đồ điều khiển sản phẩm 31 Chương trình điều khiển nhận liệu trực tiếp từ người dùng thơng qua nút nhấn Để q trình tương tác điễn đáp ứng thời gian thực chúng em sử dụng tính ngắt cứng arduino uno Lưu đồ thuật tốn chương trình điều khiển: Hình 9: Lưu đồ thuật tốn chương trình điều khiển 32 CHƯƠNG IV: TỔNG KẾT 4.1 Nhận xét, đánh giá Sản phẩm hoạt động ổn định, đạt yêu cầu đặt ra, nhiên số hạn chế sau: - Chưa điều chỉnh ngày, tháng, năm - Sản phẩm chưa có tính thẩm mỹ cao 4.2 Hướng phát triển - Có thêm hiển thị nhiệt độ độ ẩm - Tích hợp thêm nhiều hiệu ứng chuyển mode qua nút nhấn, không dây smartphone PC thông qua chuẩn không dây (bluetooth, wifi, NFC, ) - Đọc tín hiệu âm qua cổng usb pc - Tích hợp phát nhạc trực tiếp từ SD Card USB có thêm chức máy nghe nhạc - Bổ sung thêm cột led để nháy theo mức âm trái phải riêng biệt - Thiết kế mơ hình với kích thước nhỏ gọn, kiểu dáng đẹp 4.3 Kết luận Trong suốt trình thực đề tài này, với nhiều cố gắng nỗ lực chúng em với hướng dẫn, bảo tận tình Lê Thị Hồng Vân chúng em hoàn thành đề tài Tuy nhiên số hạn chế khâu thiết kế Đây hành trang quý báu cho sinh viên bước vào sống nghề nghiệp sau Mặc dù có nhiều cố gắng, song hạn chế mặt thời gian khả nên tránh khỏi có sai sót Rất mong nhận đóng góp ý kiến thầy bạn để chúng em hoàn chỉnh 33 TÀI LIỆU THAM KHẢO Trong báo cáo này, chúng em sử dụng tài liệu tham khảo: [1] “Giáo Trình Vi Điều Khiển” Của GV Phạm Hùng Kim Khánh [2] Từ trang web: www.dientuvietnam.net, codientu.org [3] Vi điều khiển với lập trình C_Ngơ Diên Tập Trang Web tham khảo http://arduino.vn/bai-viet/369-giao-tiep-i2c-va-su-dung-module-realtimeclock-ds1307 34 PHỤ LỤC #include #include #include #include #include #define R1 #define G1 #define B1 #define R2 #define G2 #define B2 #define CLK 10 #define OE 11 #define STB 12 #define A A0 #define B A1 #define C A2 #define M A3 unsigned char Buffer_display[3][16][4]; TaskHandle_t animationHandle = NULL; TaskHandle_t danceOfMusicHandle = NULL; TaskHandle_t realTimeHandle = NULL; char col[32]; int wday, day, month, year; char color_row[4] = {0x01, 0x03, 0x06, 0x02}; const char font [][7] ={ 0x38,0x44,0x4C,0x54,0x64,0x44,0x38, //0 48 0x10,0x30,0x10,0x10,0x10,0x10,0x38, //1 49 0x38,0x44,0x04,0x18,0x20,0x40,0x7C, //2 50 0x38,0x44,0x04,0x38,0x04,0x44,0x38, //3 51 0x08,0x18,0x28,0x48,0x7C,0x08,0x08, //4 52 0x7C,0x40,0x40,0x78,0x04,0x44,0x38, //5 53 0x18,0x20,0x40,0x78,0x44,0x44,0x38, //6 54 0x7C,0x04,0x08,0x10,0x20,0x20,0x20, //7 55 0x38,0x44,0x44,0x38,0x44,0x44,0x38, //8 56 0x38,0x44,0x44,0x3C,0x04,0x08,0x30, //9 57 0x00,0x00,0x00,0x00,0x00,0x00,0x00, }; const char dayOfTheWeek[7][3][7]= { 35 0x38,0x44,0x40,0x38,0x04,0x44,0x38,0x00,0x00,0x48,0x48,0x4 8,0x58,0x28,0x00,0x00,0x68,0x54,0x54,0x44,0x44,// Su 0x44,0x6C,0x54,0x44,0x44,0x44,0x44,0x00,0x00,0x38,0x44,0x4 4,0x44,0x38,0x00,0x00,0x70,0x48,0x48,0x48,0x48,// Mo 0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x48,0x48,0x4 8,0x58,0x28,0x00,0x00,0x38,0x40,0x38,0x04,0x38,// Tu 0x44,0x44,0x54,0x54,0x54,0x54,0x28,0x00,0x00,0x38,0x44,0x7 8,0x40,0x38,0x00,0x00,0x70,0x48,0x48,0x48,0x48,// We 0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x40,0x40,0x70,0x48,0x4 8,0x48,0x48,0x00,0x00,0x48,0x48,0x48,0x58,0x28,// Th 0x7C,0x40,0x40,0x78,0x40,0x40,0x40,0x00,0x00,0x58,0x24,0x2 0,0x20,0x70,0x10,0x00,0x10,0x10,0x10,0x10,0x18,// Fr 0x38,0x44,0x40,0x38,0x04,0x44,0x38,0x00,0x00,0x38,0x04,0x3 C,0x44,0x3C,0x00,0x20,0x78,0x20,0x20,0x28,0x10,// Sa }; const char miniFont [][3] = { 0xf8, 0x88, 0xf8,// 0x40, 0xf8, 0x00,// 0xb8, 0xa8, 0xe8,// 0xa8, 0xa8, 0xf8,// 0xe0, 0x20, 0xf8,// 0xe8, 0xa8, 0xb8,// 0xf8, 0xa8, 0xb8,// 0x80, 0x80, 0xf8,// 0xf8, 0xa8, 0xf8,// 0xe8, 0xa8, 0xf8 // }; QueueHandle_t mode = NULL; ISR (TIMER1_OVF_vect) //Chương trình ngắt Timer1 { static unsigned char z = 0;// biến đếm hàng; unsigned char i; digitalWrite (OE, HIGH); // tắt hết LED for (i = 0; i < 4; i++){ data_transfet (Buffer_display[0][z][i], Buffer_display[1][z][i], Buffer_display[2][z][i], Buffer_display[0][z+8][i], Buffer_display[1][z+8][i], Buffer_display[2][z+8] [i]); } rows(z); digitalWrite (STB, LOW); digitalWrite (STB, HIGH); digitalWrite (OE, LOW);// bật LED z++; 36 if (z == 8) z = 0; delay(1); TCNT1= 65300; } void setup() { Serial.begin (9600); Wire.begin(); pinMode (G1, OUTPUT);// cài đặt chế độ hoạt động chân pinMode (R1, OUTPUT); pinMode (B1, OUTPUT); pinMode (R2, OUTPUT); pinMode (G2, OUTPUT); pinMode (B2, OUTPUT); pinMode (A, OUTPUT); pinMode (B, OUTPUT); pinMode (C, OUTPUT); pinMode (CLK, OUTPUT); pinMode (OE, OUTPUT); pinMode (STB, OUTPUT); pinMode (M, INPUT); pinMode (2, INPUT_PULLUP); pinMode (3, INPUT_PULLUP); mode = xQueueCreate (1, sizeof (int)); int status = 0; xQueueSend(mode, &status, 0); attachInterrupt(digitalPinToInterrupt(3),changeOnMode , RISING); //attachInterrupt(digitalPinToInterrupt(2),changeMode , RISING); getDate(); cli(); //Tắt ngắt toàn cục TCCR1A = 0; //Reset Timer1 TCCR1B = 0; TIMSK1 = 0; TCCR1B |= (1 x) ) != 0) set_pixel (x + 5, y +9, 0x05); else set_pixel (x + 5, y +9 ,0x00); } } vTaskDelay(20); for (y = 0; y > x) ) != 0) set_pixel (x + 10, y +9, 0x05); else set_pixel (x + 10, y +9,0x00); } } vTaskDelay(20); put_mini_number (16,11,day/10,0x04); put_mini_number (20,11,day%10,0x04); vTaskDelay(20); put_mini_number (25,11,month/10,0x07); put_mini_number (29,11,month%10,0x07); delay (5000); for (x =31; x >=0; x ){ for ( y =9; y < 16;y++){ set_pixel(x,y,0x00); } vTaskDelay(5); } put_char (4,9,2,0x03); vTaskDelay(20); put_char (10,9,0,0x03); vTaskDelay(20); put_char (16,9,year /10,0x03); vTaskDelay(20); put_char (22,9,year %10,0x03); delay (5000); for (x =31; x >=0; x ){ for ( y =8; y < 16;y++){ set_pixel(x,y,0x00); } vTaskDelay(5); } }else{ for (x =0; x 507) y = y -508; else y = 506- y; drawRow (x,y/3); } } } } 39 void taskRealTime (void *pv){ int nowStatus, nextStatus; xQueuePeek(mode,&nowStatus, 0); while (1){ xQueuePeek(mode,&nextStatus, 0); if (nowStatus != nextStatus) { nowStatus = nextStatus; vTaskDelete(animationHandle); clear_display(); xTaskCreate (animation,"3", 128, NULL, 2, & animationHandle); } if (nowStatus == 0){ getTime(); }else if (nowStatus == 1) { getTime1(); }else { vTaskSuspend(realTimeHandle); } } } void taskDanceMusic (void *pv){ int i, sensor, sensor2; while (1){ for (i =1; i 507) sensor = sensor -508; else sensor = 506- sensor; drawRow (i,sensor/3); } } } void data_transfet (char byte_r1, char byte_g1, char byte_b1, char byte_r2, char byte_g2, char byte_b2 ){ // chyển liệu vào hình unsigned char i, mask; for (i = 0; i < 8; i++){ mask = 0x80 >> i; digitalWrite (R1, byte_r1 & mask); digitalWrite (G1, byte_g1 & mask); digitalWrite (B1, byte_b1 & mask); digitalWrite (R2, byte_r2 & mask); digitalWrite (G2, byte_g2 & mask); 40 digitalWrite (B2, byte_b2 & mask); digitalWrite (CLK, LOW); digitalWrite (CLK, HIGH); // tạo xung clk cho phép chuyển liệu } } void rows (unsigned char row_number){ // chọn hàng sáng switch (row_number){ case 0:{ digitalWrite(A, LOW);digitalWrite (B, LOW); digitalWrite (C, LOW);break;} case 1:{ digitalWrite(A, HIGH);digitalWrite (B, LOW); digitalWrite (C, LOW);break;} case 2:{ digitalWrite(A, LOW);digitalWrite (B, HIGH); digitalWrite (C, LOW);break;} case 3:{ digitalWrite(A, HIGH);digitalWrite (B, HIGH); digitalWrite (C, LOW);break;} case 4:{ digitalWrite(A, LOW);digitalWrite (B, LOW); digitalWrite (C, HIGH);break;} case 5:{ digitalWrite(A, HIGH);digitalWrite (B, LOW); digitalWrite (C, HIGH);break;} case 6:{ digitalWrite(A, LOW);digitalWrite (B, HIGH); digitalWrite (C, HIGH);break;} case 7:{ digitalWrite(A, HIGH);digitalWrite (B, HIGH); digitalWrite (C, HIGH);break;} } } void set_pixel (unsigned char x, unsigned char y, unsigned char color) { if (x >31 || x 15|| y > (x %8)); else Buffer_display[0][y][x/8] = Buffer_display[0][y][x/8] & (~(0x80 >> (x %8))); if ((color & 0x02) != 0) Buffer_display [1][y][x/8] = Buffer_display[1][y][x/8] | (0x80 >> (x %8)); else Buffer_display[1][y][x/8] =Buffer_display[1][y][x/8] & (~(0x80 >> (x %8))); if ((color & 0x04) != 0) Buffer_display [2][y][x/8] = Buffer_display[2][y][x/8] | (0x80 >> (x %8)); else Buffer_display[2][y][x/8] =Buffer_display[2][y][x/8] & (~(0x80 >> (x %8))); } 41 void put_char (int i, int j, char txt, char color){ char x =0, y=0, z = txt; for (y = 0; y > x) ) != 0) set_pixel (x + i, y +j, color); else set_pixel (x + i, y +j ,0x00); } } } void drawRow(int x,int height){ int i; if (height > 14) height = 14; height = 15 - height; for (i = 14; i > height +1; i ) set_pixel(x,i,0x02); if (i = 0;i ) set_pixel(x,i,0x00); col[x] = height; } int bcd2dec(byte num){ return ((num/16 * 10) + (num % 16)); } int dec2bcd(byte num){ return ((num/10 * 16) + (num % 10)); } void getDate(){ Wire.beginTransmission(0x68); Wire.write ((byte)0x00); Wire.endTransmission (); Wire.requestFrom (0x68, 7); day = Wire.read(); day = Wire.read(); day = Wire.read(); wday = bcd2dec (Wire.read()); day = bcd2dec (Wire.read()); month = bcd2dec (Wire.read()); 42 year = bcd2dec (Wire.read()); } void getTime(){ Wire.beginTransmission(0x68); Wire.write ((byte)0x00); Wire.endTransmission (); Wire.requestFrom (0x68, 7); int x; x = bcd2dec (Wire.read() & 0x7f); put_mini_number(24,3,x/10,0x03); put_mini_number(28,3,x%10,0x03); if (x %2 == 0){ draw_point(11,2,0x01); draw_point(11,5,0x01); }else { draw_point(11,2,0x00); draw_point(11,5,0x00); } x = bcd2dec (Wire.read()); put_char(13,1, x/10,0x02); put_char(18, 1, x%10, 0x02); x = bcd2dec (Wire.read()); put_char(1,1, x/10,0x02); put_char(6, 1, x%10, 0x02); if (x == 0){ getDate(); } } void getTime1(){ Wire.beginTransmission(0x68); Wire.write ((byte)0x00); Wire.endTransmission (); Wire.requestFrom (0x68, 7); int x; x = bcd2dec (Wire.read() & 0x7f); if (x %2 == 0){ draw_point(15,5,0x02); draw_point(15,9,0x02); }else { draw_point(15,5,0x00); draw_point(15,9,0x00); 43 } x = bcd2dec (Wire.read()); put_mini_number_2(18,3,x/10,0x01); put_mini_number_2(25,3,x%10,0x01); x = bcd2dec (Wire.read()); put_mini_number_2(1,3,x/10,0x01); put_mini_number_2(8,3,x%10,0x01); if (x == 0){ getDate(); } } void draw_point (int x, int y, char color){ set_pixel (x ,y, color); set_pixel (x+1,y, color); set_pixel (x+1,y+1, color); set_pixel (x,y+1, color); } void put_mini_number(int i, int j, char txt, char color){ char x, y; for (y = 0; y > x)) != 0) set_pixel(y+i, x+j, color); else set_pixel(y+i, x+j, 0x00); } } } void put_mini_number_2(int i, int j, char txt, char color){ char x, y; for (y = 0; y > x)) != 0) draw_point(2*y +i, x*2 +j, color); else draw_point(2*y +i, x*2 +j, 0x00); } } } void draw_icon(int x, int y, char color){ set_pixel (x , y, color); set_pixel (x+1 , y+1, color); set_pixel (x+1 , y, color); set_pixel (x+2 , y, color); } 44 void draw_icon1(int x, int y, char color){ set_pixel (x , y, color); set_pixel (x+1 , y-1, color); set_pixel (x+1 , y, color); set_pixel (x+2 , y, color); } void clear_display (){ unsigned char i, j; for (i = 0;i < 16; i++) for (j =0; j < 32; j++){ set_pixel(j,i,0x00); } } 45