quocbao gửi vào
- 17706 lượt xem
Đây là một dự án làm mẫu nho nhỏ giúp các bạn đang nghiên cứu về Intel Galileo có thể nắm bắt nhanh chóng hơn cách sử dụng bo mạch thú vị này :D
Bản Linux được mình sử dụng trong bài viết này là Linux Yocto Standard (iot-devkit 1.5). Tham khảo bài viết Cài đặt Linux Yocto (iot-devkit) lên Intel Galileo để biết cách cài đặt.
Bạn có thể sử dụng cả 2 board Intel Galileo Gen 1 và Gen 2 cho dự án này.
Bài viết có tham khảo và cải tiến một số bước và code so với bài viết Galileo Unread Email Counter của SparkFun.
1. Mô tả dự án
Bạn cần xây dựng một hệ thống kiểm tra số lượng Email chưa đọc trong hộp thư Gmail của mình, sau đó hiển thị số lượng này lên màn hình LCD.
2. Các vấn đề gặp phải
2.1 Đăng nhập vào Gmail trên Galileo để kiểm tra số lượng thư chưa đọc
Để truy cập vào được hộp thư Gmail, bạn phải sử dụng một giao thức là IMAP (Internet Message Access Protocol).
In computing, the Internet Message Access Protocol (IMAP) is an Internet standard protocol used by e-mail clients to retrieve e-mail messages from a mail server over a TCP/IP connection. IMAP is defined by RFC 3501.
Wikipedia
Tài khoản Gmail của bạn cần phải bật chức năng IMAP trước. Ngoài ra, bạn cũng phải tắt chức năng Xác thực 2 bước khi đăng nhập trước khi bật tiếp Cho phép ứng dụng kém an toàn truy cập trong cài đặt tài khoản Gmail của mình.
Trên Python có hỗ trợ một thư viện mặc định là imaplib giúp lập trình viên sử dụng giao thức IMAP. Do vậy, chúng ta sẽ dùng ngôn ngữ Python để thực hiện viện lấy số lượng email chưa đọc trong hộp thư Gmail.
Về Python, đặc trưng của ngôn ngữ này là việc nó giúp lập trình viên viết code với số lượng kí tự được sử dụng ít nhất có thể. Bạn nên thử qua một lần, vì nó là một trong những ngôn ngữ lập trình thuộc hàng top hiện nay.
Tạo file Python mail.py trên board Intel Galileo có nội dung sau
# mail.py - Logs into your gmail and prints the number of unread emails. # Scripy ghi so luong mail chua doc vao file unreadMail.txt # Script co the can den 5 giay de chay # Su dung giao thuc IMAP duoc cung cap boi thu vien imaplib. import imaplib # Cai dat giao thuc IMAP imapServer = 'imap.gmail.com' imapPort = '993' # Cai dat thong tin dang nhap username = 'email@gmail.com' password = 'password' # File luu so luong mail chua doc logfile = '/home/root/mailCounter/unreadMail.txt' # Ket noi den server IMAP4 qua giao thuc SSL obj = imaplib.IMAP4_SSL(imapServer, imapPort) # Dang nhap vao hop thu voi ten dang nhap va mat khau da khai bao obj.login(username,password) # Chon lam viec voi hop thu den trong tai khoan (tham so mac dinh) obj.select() # Lay so thu chua doc: unread = len(obj.search(None,'UnSeen')[1][0].split()) # In so thu chua doc ra man hinh console print unread # Luu so thu chua doc ra file f = open(logfile, 'w') f.write(str(unread)) f.close
Trong project này, mình đặt file mail.py tại thư mục /home/root/mailCounter/
Đoạn chương trình này sẽ lấy số lượng email chưa đọc trong hộp thư Gmail của bạn và ghi xuống một file trong thẻ nhớ của Galileo. Chương trình mất khoảng 5 giây để chạy (tuỳ vào tốc độ đường truyền Internet).
Trong mục # User config, nhập địa chỉ email và password của bạn. logfile là đường dẫn đến một file tạm bất kì dùng để lưu số lượng email chưa đọc. Mình sẽ trình bày lí do vì sao phải tạo file tạm này trong phần tiếp theo.
Có một chú ý là tài khoản Gmail của bạn phải:
- Tắt chức năng Xác thực 2 bước
- Cho phép đăng nhập bằng ứng dụng kém an toàn.
2.2 Lập trình để Galileo có thể xuất nội dung ra màn hình LCD.
Bạn tham khảo bài viết Đọc nhiệt độ - độ ẩm và xuất ra màn hình LCD. Phần cứng và phần mềm (code, thư viện) trong bài viết này đều y hệt với bài viết ở trên.
2.3 Chuyển dữ liệu từ môi trường Linux sang môi trường Arduino của Galileo.
Ý tưởng ở đây rất đơn giản, đó là sử dụng file tạm như mình đã trình bày ở mục 2.1.
Mình cũng có tham khảo trên Intel Community thì được biết rằng đây là một trong hai chuyển dữ liệu giữa 2 môi trường Linux và Arduino.
Cách còn lại là chuyển dữ liệu trên bộ nhớ RAM giữa 2 process đang chạy (một arduino sketch chạy trên Galileo thực chất là một process chạy trên Linux). Tuy nhiên, cách này khá là phức tạp, nhưng lại rất hiệu quả nếu bạn cần truyền nhiều dữ liệu hoặc truyền dữ liệu thời gian thực. Tham khảo thêm tại Efficient communication between Arduino* and Linux native processes.
- Ở môi trường Linux, việc đọc ghi file là khá dễ dàng từ các lệnh command-line (như echo, cat, less,...) đến các ngôn ngữ lập trình như C/C++, Python, Perl,... hay NodeJS.
- Ở môi trường Arduino, do được viết bằng C/C++ nên cách duy nhất để đọc ghi file là sử dụng lệnh fopen (hoặc cách lệnh khác tương đương).
Tham khảo code mẫu trên GitHub tại đây. Bằng cách upload code này lên board Galileo trên môi trường Arduino qua ArduinoIntel IDE, bạn có thể lấy được thông tin về hệ điều hành Linux Yocto đang chạy thông qua cửa sổ Serial Monitor.
Trong môi trường Arduino, bạn có thể dùng hàm system() để chạy một lệnh trong môi trường Linux
3. Upload chương trình ở môi trường Arduino
Mình đã có comment trong code nên mình sẽ không giải thích thêm nữa. Nếu bạn có thắc mắc gì, hãy sử dụng chức năng comment phía dưới bài viết.
#include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 16, 2); // Số mail chưa đọc unsigned int unread = 0; // Biến đếm thời gian unsigned int ccctime = 0; // Thời gian delay giữa 2 lần kiểm tra mail. unsigned int delaySec = 20; void setup() { lcd.init(); lcd.backlight(); lcd.print("Unread mail"); lcd.setCursor(0, 1); lcd.print(" counter"); // Chạy lệnh cập nhật số thư chưa đọc ban đầu updateUnreadMail(); // Đợi 6 giây để quá trình cập nhật hoàn tất delay(6000); // Cập nhật biến lưu số thư chưa đọc unread = readUnreadMail(); lcd.clear(); lcd.print("Gmail:quocbao474"); lcd.setCursor(0, 1); lcd.print("Unread: "); } void loop() { // In một số thứ vớ vẩn ra màn hình LCD :D lcd.setCursor(8, 1); lcd.print(unread); if (unread < 10) lcd.print(" "); lcd.setCursor(11, 1); lcd.print(++ccctime); delay(1000); if (millis() / 1000 % delaySec == 0) { // Cập nhật số lượng thư chưa đọc // Chú ý rằng quá trình cập nhật bằng Python mất đến // khoảng 5 giây, do vậy hàm readUnreadMail() // sẽ trả về dữ số lượng mail chưa đọc được cập nhật // bằng hàm updateUnreadMail() chạy ở trước đó delaySec giây updateUnreadMail(); unread = readUnreadMail(); } } void updateUnreadMail() { // Chạy file Python để cập nhật số email chưa đọc system("python /home/root/mailCounter/mail.py &"); } int readUnreadMail() { char data[3]; //Đọc file FILE *f = fopen("/home/root/mailCounter/unreadMail.txt", "r"); if (f) { // Đọc 2 byte đầu tiên từ file tương ứng với số mail // tối đa là 99 (2 kí tự = 2 byte) fgets(data, 2, f); fclose(f); } //Chuyển từ chuỗi sang số để trả về return atoi(data); }
Thứ thực sự điều khiển màn hình LCD nằm ở môi trường Arduino, còn thứ cung cấp dữ liệu cho màn hình LCD nằm ở môi trường Linux. Galileo thật đáng tiền phải không :D
- Kiểm tra số thư chưa đọc trong hộp thư quocbao474@gmail.com (mail tạm mình dùng để test các project thôi)
- Có 11 thư chưa đọc
- Project đã chạy được 10543 giây :D