Nghiên cứu về tín hiệu hồng ngoại của Remote điều hòa, ứng dụng trong các dự án nhà thông minh

Đúng như tiêu đề bài viết. Mình đã bỏ ra khá nhiều thời gian để nghiên cứu về cấu trúc lệnh trong tín hiệu điều khiển của điều hòa.Tuy nhiên vẫn chưa thực sự thẫm đẫm tinh túy của nó. Vì vậy bài viết có gì sai sót mong các bạn đóng góp nhé. Mỗi loại điều hòa có 1 dạng tín hiệu khác nhau có thể là 8 bit, 12bit, 24 bit, 32bit và thậm chí có thể 128 bit hoặc nhiều hơn nữa. Điều đó có nghĩa là mỗi 1 lần bạn nhất nút trên điều khiển, 1 chuỗi các dữ liệu được gửi đi với "Khối lượng" tương đối nhiều.

Trước đây mình đã có 1 bài viết hướng dẫn về cách học mã hồng ngoại của điều khiển để điều khiển thiết bị bật tắt wifi và bài viết hướng dẫn sử dụng led thu hồng ngoại của bác NTP_PRO các bạn có thể tham khảo lại để nghiên cứu về cách thức sử dụng led thu hồng ngoại để thu tín hiệu từ điều khiển.

I. CHUẨN BỊ

II. TIẾN HÀNH

Giới thiệu

Trước khi bước vào mục này, mình xin nhắc lại rằng, tín hiệu hồng ngoại của điều hòa hoàn toàn khác so với tín hiệu hồng ngoại của điều khiển tivi hay 1 số thiết bị gia dụng khác

Các bạn hãy tưởng tượng! khi bạn điều khiển tivi, bạn nhất 1 kênh, nó sẽ truyền về led thu hồng ngoại của TV 1 mã cố định tương ứng với kênh đã định sẵn và Số lượng bít dữ liệu được truyền đi khác nhau: có loại 7 bit(sony),loại 8 bít, 12 bít, 16 bít , 18 bít, 32 bít, 42 bít (AIWA). Cùng 1 hãng điện tử ví dụ sony thì số bít cũng có thể khác nhau, điều khiển tivi sony có 7 bit, còn dàn âm thanh sony là 16 bit

Nhưng với điều khiển điều hòa, nó có thể lên tới 128 bit dữ liệu. Tại sao nó lại nhiều như vậy?

Mỗi khi bạn nhất 1 nút trên điều khiển điều hòa, nó sẽ không truyền tín hiệu của 1 nút đó về điều hòa, mà lúc này nó sẽ truyền tất cả các thông số hiện tại trên điều khiển về điều hòa như: nhiệt độ, tốc độ quạt, quạt quay tự động hay đứng im, chế độ dry, cool... nói tóm lại là nó sẽ truyền tất tần tật những thông số đó về điều hòa.

Thử làm 1 thí nghiệm nho nhỏ nhé. Nếu bạn để điều hòa ở 19 độ, sau đó bạn chạy sang phòng khác, chỉnh nhiệt độ trong điều khiển sang 29 độ, sau đó quay về phòng và nhấn nút tăng nhiệt 1 lần. Bạn nghĩ điều hòa sẽ đang ở 30 độ hay 20 độ?

ok! Tiến hành nào.

Sơ đồ kết nối led thu để giải mã hồng ngoại

Code

Trước tiên các bạn hãy tải thư viện IrRemote này về, và include nó vào library của bạn

Trên IDE bạn vào Example=>IrRemote=>IrRecvDemo

#include <IRremote.h>

int RECV_PIN = 8;// Sửa pin này cho đúng với pin của IRLED

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
}

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value
  }
}

Nạp đoạn code này và tiến hành bật Serial monitor lên, chĩa điều khiển vào led thu. Đối với điều khiển TV bạn sẽ nhận được đoạn mã có dạng 0xA6HJ2J1ED3 hoặc123196491934

Nhưng đối với điều khiển điều hòa. Bạn chỉ nhận được dòng mã 0xFFFFFFFF. Điều đó có nghĩa nó đã vượt quá giới hạn để nhận được.

Chúng ta phải mở Example khác. Tiếp tục trong IDE các bạn vào Example=>IRRemote=>IRrecvDump

#include <IRremote.h>

int RECV_PIN = 8;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
}

// Dumps out the decode_results structure.
// Call this after IRrecv::decode()
// void * to work around compiler issue
//void dump(void *v) {
//  decode_results *results = (decode_results *)v
void dump(decode_results *results) {
  int count = results->rawlen;
  if (results->decode_type == UNKNOWN) {
    Serial.print("Unknown encoding: ");
  } 
  else if (results->decode_type == NEC) {
    Serial.print("Decoded NEC: ");
  } 
  else if (results->decode_type == SONY) {
    Serial.print("Decoded SONY: ");
  } 
  else if (results->decode_type == RC5) {
    Serial.print("Decoded RC5: ");
  } 
  else if (results->decode_type == RC6) {
    Serial.print("Decoded RC6: ");
  }
  else if (results->decode_type == PANASONIC) {	
    Serial.print("Decoded PANASONIC - Address: ");
    Serial.print(results->panasonicAddress,HEX);
    Serial.print(" Value: ");
  }
  else if (results->decode_type == JVC) {
     Serial.print("Decoded JVC: ");
  }
  Serial.print(results->value, HEX);
  Serial.print(" (");
  Serial.print(results->bits, DEC);
  Serial.println(" bits)");
  Serial.print("Raw (");
  Serial.print(count, DEC);
  Serial.print("): ");

  for (int i = 0; i < count; i++) {
    if ((i % 2) == 1) {
      Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
    } 
    else {
      Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC);
    }
    Serial.print(" ");
  }
  Serial.println("");
}


void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    dump(&results);
    irrecv.resume(); // Receive the next value
  }
}

Nạp đoạn code trên về và tiến hành mở Serial moniter lên. Kết quả các bạn nhận được 1 đoạn mã dài lê thê

Raw[99] = {4500, 4400, 650, 1550, 650, 500, 650, 1550, 650, 1550, 650, 450, 650, 500, 600, 1600, 600, 500, 650, 450, 650, 1550, 650, 500, 650, 500, 600, 1550, 650, 1600, 600, 500, 650, 1550, 650, 1550, 650, 450, 650, 1600, 600, 1600, 600, 1600, 600, 1600, 600, 1600, 600, 1600, 600, 500, 650, 1550, 650, 500, 600, 500, 650, 450, 650, 500, 650, 450, 650, 500, 600, 1600, 600, 1600, 600, 500, 650, 500, 600, 500, 600, 500, 650, 500, 600, 500, 650, 500, 600, 500, 600, 1600, 650, 1550, 650, 1550, 650, 1550, 650, 1550, 650, 1550, 650}

 đoạn mã trên thực chất là tín hiệu dạng thô của sóng hồng ngoại nhận được. Tuy nhiên đến đây chưa phải đã dừng lại. Thực chất thư viện này chỉ hỗ trợ bộ nhớ đệm cho tín hiệu thô là 100. Tức là mảng của tín hiệu chỉ có 100 giá trị. Có những loại điều hòa sở hữu mảng giá trị lên đến 179 như điều hòa Funiki. thậm chí còn nhiều hơn nữa. Làm sao để khác phục điều này?

Quay trở lại với thư viện các bạn vừa cài đặt. Vào ổ C, nơi các bạn chứa thư viện đã được include. tìm file IRremote.h mở ra và tìm đến dòng

// Some useful constants

#define USECPERTICK 50  // microseconds per clock interrupt tick
#define RAWBUF 100 // Length of raw duration buffer

// Marks tend to be 100us too long, and spaces 100us too short
// when received due to sensor lag.
#define MARK_EXCESS 100

#endif

sửa #define RAWBUF 100 thành #define RAWBUF 300 và lưu lại.

Lúc này bộ nhớ đệm cho tín hiệu thô đã được tăng lên gấp 3 lần.

Vậy là các bạn đã thu nhận được tín hiệu của điều khiển điều hòa. Vậy làm thế nào để gửi nó đi?

Sơ đồ kết nối led phát để phát tín hiệu điều khiển

Mặc định chân của led phát là chân số 3 trên arduino nano, uno. Chân số 9 trên mega....

#include <IRremote.h>
IRsend irsend;

unsigned int  raw[99] = {4500, 4400, 650, 1550, 650, 500, 650, 1550, 650, 1550, 650, 450, 650, 500, 600, 1600, 600, 500, 650, 450, 650, 1550, 650, 500, 650, 500, 600, 1550, 650, 1600, 600, 500, 650, 1550, 650, 1550, 650, 450, 650, 1600, 600, 1600, 600, 1600, 600, 1600, 600, 1600, 600, 1600, 600, 500, 650, 1550, 650, 500, 600, 500, 650, 450, 650, 500, 650, 450, 650, 500, 600, 1600, 600, 1600, 600, 500, 650, 500, 600, 500, 600, 500, 650, 500, 600, 500, 650, 500, 600, 500, 600, 1600, 650, 1550, 650, 1550, 650, 1550, 650, 1550, 650, 1550, 650}; 

void setup()
{
}
void loop()
{
irsend.sendRaw(raw, 99, 38);// raw là mã thô cần gửi đi. 
                             // 99 là số phần tử trong mảng
                            // 38 là tần sử gửi đi, tính theo kHz
delay(5000);
}

Như vậy các bạn có thể gửi đi tín hiệu điều khiển của điều hòa.

Có 1 lưu ý nhỏ. Đó là mỗi lần các bạn nhận tín hiệu của điều hòa ở dạng raw lại là 1 lần khác nhau, các phần tử trong mảng raw gần như không cố định, nhưng tỉ lệ giữa các phần tử trong mảng là cố định.

Riêng nút on/OFF thì tín hiệu sẽ thay đổi theo mỗi lần nhấn. Tức là: Lần nhất thứ 1 bạn sẽ nhận được mã On, lần nhấn thứ 2 bạn sẽ nhận được mã Off.

Để đặt điều hòa ở nhiệt độ theo mong muốn. hãy chỉnh thông số nhiệt độ trước trên điều khiển sau đó nhấn nút on và chỉ về phía led thu hồng ngoại. tương tự như vậy ấn nút off

Bây giờ các bạn đã nắm trong tay phương pháp dịch và truyền lại mã điều khiển điều hòa. Ứng dụng trong xây dựng hệ thống ngôi nhà thông minh quá đơn giản đúng không?

Tiện đây mình cũng giới thiệu với các bạn thiết bị mình mới hoàn thành cách đây ít ngày. Thiết bị điều khiển 2 điều hòa bật tắt theo thời gian định sẵn.

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

lên
29 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

Select any filter and click on Apply to see results

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

Điều khiển desktop (máy tính) từ xa bằng hồng ngoại - Dễ như trở bàn tay

Điều khiển máy tính bằng hồng ngoại là dự án mình đã hoàn thành cách đây 1 năm dựa trên ý tưởng "Đang nằm trên giường muốn cầm điều khiển tivi để bật, tắt, next, preview bài hát, cũng như là điều khiển chuột máy tính mà không muốn lết đến bên máy tính để làm điều tương tự bằng chuột". Nếu xét 1 cách rộng hơn, dự án này gần như là chế 1 con chuột không dây. Bài viết này mình xin giới thiệu 1 phần của dự án, phần cơ bản nhất để các bạn có thể tham khảo và phát triển thêm theo ý tưởng của mình.

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

Giao tiếp I2C giữa nhiều arduino với nhau

Đôi khi chúng ta muốn chia sẻ khối lượng công việc của một Arduino với 1 arduino khác. Hoặc có khi chúng ta muốn nhiều chân digital hoặc analog hơn để xử lý công việc.I2C là giải pháp tốt nhất. Bài viết này mình sẽ hướng dẫn các bạn cách giao tiếp giữa 2 boad arduino với nhau qua giao thức I2C.

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