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ả

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 <Phần 2>

Ở bài viết trước mình đã hướng dẫn các bạn cách cấu hình lại thư viện để nhận được tín hiệu điều khiển hồng ngoại có độ dài lớn hơn 100 rawbuff. Tuy nhiên thực tế các biến trong thư viện đang sử dụng dạng 8bit cho rawbuff, điều đó đồng nghĩa với giá trị rawbuff chúng ta có thể tăng tối đa là 255. Mình đã nghiên cứu rất nhiều các bài viết, các câu trả lời trên các diễn đàn quốc tế chuyên về arduino tuy nhiên chưa tìm được câu trả lời thỏa đáng cho các vấn đề mình gặp phải. Việc giải mã tín hiệu là vô cùng khó khăn và phức tạp. Thậm chí mình đã phải bỏ ra 10$ để thanh toán cho 1 phần mềm để phân tích, giải mã tín hiệu hồng ngoại.Đây chính là rào cản lớn đối với các bạn muốn nghiên cứu về tín hiệu hồng ngoại của điều hòa. Bài viết này mình sẽ hướng dẫn các bạn cách nhận giá trị điều khiển hồng ngoại có kích thước tín hiệu lớn. Và đưa ra các vấn đề mà các bạn thường mắc phải khi nghiên cứu tín hiệu hồng ngoại.

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

LCD Graphic 128x64 dòng KS0108 VÀ ST7920 - Viết, vẽ và làm mọi thứ với LCD

Graphic LCD (gọi tắt là GLCD) loại chấm không màu là các loại màn hình tinh thể lỏng nhỏ dùng để hiển thị chữ, số hoặc hình ảnh. Khác với Text LCD, GLCD không được chia thành các ô để hiển thị các mã ASCII vì GLCD không có bộ nhớ CGRAM (Character Generation RAM). GLCD 128x64 có 128 cột và 64 hàng tương ứng có 128x64=8192 chấm (dot). Mỗi chấm tương ứng với 1 bit dữ liệu, và như thế cần 8192 bits hay 1024 bytes RAM để chứa dữ liệu hiển thị đầy mỗi 128x64 GLCD. Tùy theo loại chip điều khiển, nguyên lý hoạt động của GLCD có thể khác nhau, trong bài này tôi giới thiệu loại GLCD được điều khiển bởi chip KS0108 của Samsung, có thể nói GLCD với KS0108 là phổ biến nhất trong các loại GLCD loại này (chấm, không màu). Hình 1 là hình ảnh thật của 1 GLCD 128x64 điều khiển bởi KS0108.

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