Hải Đăng PPK gửi vào
- 49275 lượt xem
Đú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Ị
- 1 x Điều khiển điều hòa
- 1 x Điều hòa tương ứng
- 1 x boad arduino (Uno R3)
- 1 x led thu hồng ngoại
- 1 x led phát hồng ngoại
- 1 x trở 30k
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!