[Intel Galileo] Kiểm tra email chưa đọc với Intel Galileo và màn hình LCD

Đâ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:

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
lên
2 thành viên đã đánh giá bài viết này hữu ích.
Chuyên mục: 
Các dự án được truyền cảm hứng

Select any filter and click on Apply to see results

Các bài viết cùng tác giả

Nạp bootloader cho vi điều khiển trên Arduino

Bài viết này hướng dẫn các bạn nạp bootloader cho vi điều khiển trên mạch Arduino. Trên thực tế, vi điều khiển trên mạch Arduino đã có sẵn bootloader rồi nên bạn không cần thao tác gì cả. Tuy nhiên, với một số trường hợp cần nạp bootloader, bạn sẽ cần đọc bài viết này để biết cách thực hiện.

lên
18 thành viên đã đánh giá bài viết này hữu ích.

Bài 4: Đọc điện áp điều chỉnh bởi biến trở

Bài ví dụ này sẽ giới thiệu cho các bạn cách đọc giá trị của một biến trở. Biến trở chỉ đơn giản chỉ là một điện trở có thể thay đổi được trị số. Mạch Arduino không đọc điện trở này mà đọc điện áp do biến trở tạo ra. Một vài IC cũng sử dụng mức điện áp để biểu thị thông tin tương tự như biến trở.

lên
34 thành viên đã đánh giá bài viết này hữu ích.