Logging data from Arduino to Excel - Lưu dữ liệu từ Arduino vào tệp Excel trên máy tính

Xin chào các bạn, hôm qua có một bạn hỏi rằng: Làm sao để ghi dữ liệu từ Arduino vào file excel, vấn đề này khá hay nhưng lại chưa có bài viết nào trên cộng đồng nên mình sẽ thực hiện Logging data với Processing 3. (Có nhiều ngôn ngữ có thể thực hiện được logging data nhưng mình thích Processing nên nhích thôi!^^).

CHUẨN BỊ

  • Processing 3 (https://processing.org/download/?processing)
  • 1 project với Arduino mà bạn cần logging dữ liệu. Trong bài viết này, mình sẽ ghi dữ liệu mình đọc được từ RFID card vào file .csv để có thể đọc với Excel.

ARDUINO SIDE

Dữ liệu bạn đọc được (nhiệt độ, độ ẩm, nồng độ CO2,....) sẽ cần được print ra Serial Monitor theo 1 định dạng nào đó mà bạn đưa ra, VD như: data1,data2,data3 hoặc là data1:data2:data3 hoặc là data1+data2+data3 v.v.. cái này là do bạn quy định. Trong bài viết này, mình sẽ print ra theo định dạng sau: UID;Name;Age 

Mình dùng hàm sprintf(...) để in ra 1 chuỗi theo 1 định dạng trước là: uid[0]-uid[1]-uid[2]-uid[3];name;age (mình dùng dấy chẩm phẩy để ngăn cách các dữ liệu).

Trong đó, uid là mảng kiểu byte chứa 4 byte UID của RFID card, name và age là 2 biến dữ liệu kiểu string.

char uidStr[80];
sprintf(uidStr, "%d-%d-%d-%d;%s;%s", uid[0], uid[1], uid[2], uid[3], name, age);
Serial.print(uidStr);

Ví dụ, khi print ra thì mình có chuỗi này ở Serial Monitor:

102-27-39-86;NTP_PRO;22

Nếu bạn cũng đã print ra được chuỗi theo đúng định dạng bạn đã chọn thì ngon lành rồi đó, sang bước tiếp theo nào.

PROCESSING SIDE

Mình sẽ lưu dữ liệu nhận được từ cổng Serial theo định dạng csv, để có thể mở được bằng Excel.

LẬP TRÌNH

import processing.serial.*;
Serial port;

Table table; // Table object
PFont font;
String rawData;
String[] data;

void setup() {
  size(400, 400);
  port = new Serial(this, "COM19", 115200);
  /* hiển thị ra màn hình */
  font = loadFont("TimesNewRomanPSMT-48.vlw");
  textFont(font, 32);
  textAlign(CENTER);
  fill(0);
  /* tạo bảng lưu dữ liệu */
  table = new Table();
  /* thêm cột cho bảng */
  table.addColumn("UID");
  table.addColumn("Name");
  table.addColumn("Age");
}

void draw() {
  background(255);
  rawData = "";
  if (port.available() > 0) {
    rawData = port.readString();
  }
  
  if (rawData != "") {
    /* tách dữ liệu từ raw data nhận từ Serial */
    data = split(rawData, ';');
    
    /* Exception handling */
    try {
      text(data[0], 200, 50);
      text(data[1], 200, 150);
      text(data[2], 200, 250);
      
      TableRow row = table.addRow();
      row.setString("UID", data[0]);
      row.setString("Name", data[1]);
      row.setString("Age", data[2]);
      saveTable(table, "C:\\Users\\T\\Desktop\\IDtable.csv");
    } 
    catch (Exception e) {
      background(255);
      data = new String[3];
      data[0] = data[1] = data[2] = "Error";
      text(data[0], 200, 50);
      text(data[1], 200, 150);
      text(data[2], 200, 250);
    }
  }
   delay(500);
}

GIẢI THÍCH

  • table = new Table(): tạo 1 Table object mới.
  • table.addColumn("column name"): dùng để thêm 1 cột có tên "column name" cho bảng. Tên của cột được dùng để truy cập vào cột tương ứng.
  • TableRow row = table.addRow(): dùng để thêm 1 hàng vào bảng.
  • row.setString("column name", "string data"): thêm dữ liệu kiểu string vào cột tương ứng của hàng.
  • row.setInt("column name", data): thêm dữ liệu kiểu integer vào cột tương ứng của hàng.
  • saveTable(table, "file name"): lưu bảng vừa tạo vào file. VD: saveTable(table, "C:\\Users\\T\\Desktop\\IDtable.csv"): lưu bảng vừa tạo vào file IDtable.csv ở Desktop. Lưu ý là dấu \\ không phải dấu \ nha!
  • Nếu chẳng may cổng Serial có vấn đề, dữ liệu nhận được không đầy đủ thì phần Exception Handling sẽ báo lỗi ra màn hình và chương trình sẽ vẫn tiếp tục chạy bình thường.

Mình đã dùng và cảm nhận sự khác biệt, còn các bạn thì sao?!laugh

Các bạn cứ còm men nếu có thắc mắc. Cảm ơn vì đã đọc bài viết của mình.

 Chúc các bạn thành công!^^

lên
22 thành viên đã đánh giá bài viết này hữu ích.
Các dự án được truyền cảm hứng

Xe điều khiển bằng tay game Dual Shock3 thông qua Bluetooth

Vừa bắt đầu với arduino được hơn 1 tuần, có tham khảo qua các nguồn từ "trung ương đến địa phương", nắm được 1 số kiến thức cơ bản nên mình bắt đầu thực hiện 1 sản phẩm để đúc kết kinh nghiệm. Trong số đó thì xe điều khiển là dễ nhất. Kết hợp với cái tay game ps3 nằm lăn lóc ở góc nhà. Thế là có 1 chiếc xe điều khiển từ xa. Bắt đầu nhé.

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

Làm xe điều khiển từ xa bằng Bluetooth - Điều khiển bằng Android với App Inventor

Mình rất thích điện tử nhưng không học về ngành điện tử. Rất may là có Adruino, rồi có cộng đồng Adruino Việt Nam, đặc biệt là sự nhiệt tình của tất cả các bạn trong cộng đồng, mình đã làm được 1 chiếc xe điều khiển từ xa. Cho con chơi là lí do phụ thôi, còn tìm hiểu, học tập là chính. Hôm nay chia sẻ cùng các bạn, cùng gửi lời cảm ơn đến tất cả các bạn trong cộng đồng. Có bạn thì giúp đỡ trực tiếp, có bạn thì viết bài, rồi có bạn thì bình luận, nêu câu hỏi. Tất cả đều có giá trị đối với mình.

Ngại viết bài nên mình đăng dưới dạng ảnh.

lên
26 thành viên đã đánh giá bài viết này hữu ích.
Các bài viết cùng tác giả

Truyền tín hiệu với module radio frequence 433Mhz

Xin chào các bạn, bài viết hôm nay của mình sẽ giới thiệu về cách truyền dữ liệu không dây bằng modules RF (radio frequence) 433Mhz.

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

Timer/Counter trên AVR/Arduino

Như các bạn đã biết, Arduino là một nền tảng hướng tới sự đơn giản, giúp cho việc hiện thực hóa các ý tưởng dễ dàng hơn rất nhiều, nhưng cũng vì thế mà chúng ta sẽ không thể khai thác hết được sức mạnh của vi điều khiển nằm trên board Arduino. Điều mà mình cảm thấy tiếc nhất là sự thiếu sót của các Interrupt Vector trong môi trường Arduino (Arduino hiện chỉ có built-in function hỗ trợ External Interrupts).

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