In một chuỗi với nội dung được quy định sẵn trong Arduino (Formatted String)

Giới thiệu

Trong các bài trước, chúng ta đã tìm hiểu khá nhiều về chuỗi trong Arduino, hôm nay sẽ là một trick nho nhỏ nhằm giúp cho bạn quản lý các câu lệnh gửi qua Serial.

Mục đích

Mục đích của mình khi viết bài này đó là khi xây dựng những ứng dụng kiểu Arduino kết nối với các thiệt bị cứng ngang hàng khác (ví dụ như máy tính) thì ta sẽ không tốn bất kỳ một vùng RAM nào trong não để lưu nhớ và tìm kiếm đoạn lệnh nữa.

Phần cứng

Đặt vấn đề

Bây giờ mình muốn sử dụng một bé Arduino UNO R3 để làm một module nhiệt độ, độ ẩm truyền dữ liệu đến máy tính. Giả sử ở trên máy tính, mình có một chương trình Processing có khả năng được một format kiểu và tự lấy ra được thông tin nhiệt độ (temp) và độ ẩm (humi)

TEMP_HUMI "temp" "humi"

Ví dụ: TEMP_HUMI 23.21312 87.2131

Vậy bây giờ, làm thế nào để gửi được dòng lệnh trên máy tính một các tối ưu nhất?

Giải quyết

Việc đơn giản nhất mà ai cũng có thể cài đặt được, đó là xây dựng một hàm với 2 tham số nhiệt độ, độ ẩm và sau đó xuất ra Serial.


//Hàm in giá trị temp và humi ra Serial
void print_temp_humi(float temp, float humi) {
  Serial.print("TEMP_HUMI ");  // in "TEMP_HUMI "
  Serial.print(temp);          // in "temp"
  Serial.print(" ");           // in " "
  Serial.println(humi);        // in "humi" và xuống dòng
}

void setup () {
    Serial.begin(9600);
    print_temp_humi(23.21312f, 87.2131f);
}
void loop () {/*do nothing*/}

Và bạn có thể nhận được kết quả

TEMP_HUMI 23.21 87.21 1814

Có thể thấy rằng, chúng ta khá ẩu trong việc in, vì nếu có một lý do nào đó mà bạn muốn thay đổi cấu trúc của câu lệnh trả về cho Serial thì bạn phải sửa dưới hàm print_temp_humi, như vậy rất mất thời gian và việc để cho người khác (trong nhóm) hiểu được code của bạn sẽ trở nên khó hơn. Vậy hãy cải tiến lại bằng cách sử dụng hằng chuỗi và thiết đặt các hằng số ở đầu chương trình nào

// start define
const char TEMP_HUMI_COMMAND[] = "TEMP_HUMI %d.%d %d.%d\n";
#define MAX_LENGTH        100
#define EXP               1000  // độ chính xác đến 3 chữ số thập phân (1
// - end define

// Trả về phần nguyên và phần thực của một số thực, các biến prefix và suffix là "tham biến" (có dấu & ở trước)
// nên giá trị của 2 biến đó sẽ thay đổi khi chạy xong hàm
void parse_float(float val, int &prefix, int &suffix) {
  prefix = int(val);
  suffix = (val - prefix) * EXP;
}

//Hàm in giá trị temp và humi ra Serial
//Chúng ta không thể in một biến kiểu float ra ngoài một cách trực tiếp được. Vì họ AVR's không hỗ trợ việc in một biến kiểu float hoặc tương tự.
// Giải pháp: Ta sẽ cắt số thực thành 2 phần: phần nguyên, và phần thực, sau đó in phần nguyên và phần thực lần lượt ra
void print_temp_humi(float temp, float humi) {
  int temp_pre, temp_suf, humi_pre, humi_suf;
  
  parse_float(temp, temp_pre, temp_suf);  // 2 biến prefix, suffix là ánh xạ đến vùng nhớ của biến temp_pre, temp_suf
  parse_float(humi, humi_pre, humi_suf);

  char buffer[MAX_LENGTH];
  sprintf(buffer, TEMP_HUMI_COMMAND, temp_pre, temp_suf, humi_pre, humi_suf);
  Serial.println(buffer); 
}

void setup () {
    Serial.begin(9600);
    print_temp_humi(23.231, 87.21);
}
void loop () {/*do nothing*/}

Ok, bây giờ mọi thứ trong tốt hơn hẳn, bạn hãy đọc những dòng comment trong code để nhâm nhi nhé hehe

Kết luận

Đây là một mẹo nhỏ mà mình mong muốn các bạn hãy áp dụng trong việc code, đừng để việc in chuỗi lung tung vì khi chương trình có quá nhiều chuỗi thì bạn sẽ cạn kiệt RAM, lúc đấy thì chỉ có mệt đầu mà thôi smiley!

Hãy code để người bạn của bạn có thể hiểu và cùng nhau san sẻ công việc với bạn, bạn nhé devil

lên
6 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ả

Code Arduino trên MÂY, bạn có muốn thử hay không?

Từ trước đến giờ, mỗi khi muốn lập trình một bé Arduino, bạn cần phải chuẩn bị driver cho Arduino (hiển nhiên buộc phải có, vì phải giao tiếp với thiết bị ngoại vi là mạch Arduino) và phần mềm lập trình Arduino IDE. Và khi bạn muốn chia sẻ code của mình cho bạn của mình thì cách đơn giản nhất là gửi file sketch cho họ, hoặc nếu cao cấp hơn là sử dụng github hoặc bitbucket (tất nhiên là phải include các thư viện bên thứ ba nếu có). Vậy vấn đề đặt ra trong ngày hôm nay là, liệu có cách nào để có thể chia sẻ sketch của mình với bạn bè và lớn hơn nữa là với cộng đồng Arduino trên thế giới (nói chung) và Việt Nam (nói riêng) hay không?

Và mình đã tìm ra câu trả lời, và không những thế, câu trả lời còn vượt ra ngoài sức mong đợi của chúng ta.

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

[iNut PLC]Hệ thống giám sát nước sinh hoạt bằng - Hướng dẫn giám sát PLC trên Internet

Trước đây, khi nghĩ về Scada - hệ thống điều khiển giám sát và thu thập dữ liệu, mọi người sẽ nghĩ nó rất phức tạp và đắt tiền. Rất khó tiếp cận và phải đi học chuyên sâu. Tuy nhiên, với sự xuất hiện của bo mạch iNut PLC. Mọi thứ đã dễ dàng hơn rất nhiều. Thế giới công nghiệp năm trong lòng bàn tay của bạn.

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