Bài trước: Điều khiển led bằng remote
1. Giới thiệu về Module IR 1838
Module IR 1838 có ba chân theo thứ tự là (-) (+) (Signal) như hình được dùng để thu nhận tín hiệu hồng ngoại từ các nguồn phát 38khz như remote,.... Thông thường chân (+) được nối với chân 5V trong Arduino, chân (-) nối với GND và chân (S) nối với chân digital.
Để điều khiển IR1838 chúng ta cần cài đặt thư viện IRRemote (Download tại đây) .
2. Sơ đồ kết nối với Arduino.
3. Code
a. Trước hết chúng ta cần đoạn code để đọc các giá trị nút nhấn trên một Remote cụ thể để từ các giá trị đó chúng ta xử lý theo ý đò của mình.
Đoạn code sau đây sẽ cho phép đọc và in ra Serial giá trị một nút nhân trên Remote.
#include<IRremote.h> Khai báo thư viện IR
const int chanRemote=8; //Chân IR nối với chân 8
IRrecv irrecv(chanRemote); //khai báo
decode_results results; //Khai báo biến nhận giá trị trả về
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
irrecv.enableIRIn(); //Cho phép nhận tín hiệu
}
void loop() {
// put your main code here, to run repeatedly:
if(irrecv.decode(&results)) //Nếu có kết quả trả về
{
Serial.println(results.value, HEX); //In giá trị nút nhấn kiểu HEX
delay(200);
irrecv.resume(); //Chờ nhận tín hiệu tiếp theo
}
}
Giải thích code:
Với đoạn code trên mình dùng remote hồng ngoại như sau:
Khi nhấn trước cảm biến thu hồng ngoại sẽ có mã như sau:#include<IRremote.h>
const int chanRemote=8; //Chân IR1838
IRrecv irrecv(chanRemote);
decode_results results; //Nhận kết quả trả về
int in3=9; //Chân In3 trên L298N
int in4=10; //Chân In4 trên L298N
int ctht1=2; //Công tắc hành trình 1 nối với chân 2
int ctht2=3; //Công tắc hành trình 2 nối với chan 3
int cbmua=7; // CB mưa nối với chân 7
void setup() {
Serial.begin(9600);
irrecv.enableIRIn();
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
pinMode(ctht1,INPUT);
pinMode(ctht2,INPUT);
pinMode(cbmua,INPUT);
}
void loop() {
int trangthaict1=digitalRead(ctht1);
int trangthaict2=digitalRead(ctht2);
int thcbmua=digitalRead(cbmua);
Serial.print(trangthaict1);
Serial.println(trangthaict2);
if(thcbmua==1) //Dang khong mua
{
if(irrecv.decode(&results))
{
if (results.value==0xFF18E7 )//Nhấn lên
{
while(trangthaict1!=1 ) //Công tắc hành trình trên chưa chạm thì chạy lên đến khi chạm
{ //Nếu muốn dừng giữa chừng thì không dùng while mà dùng if
len();
trangthaict1=digitalRead(ctht1);
}
dung();
}
else if (results.value==0xFF4AB5 )//Nhấn nút xuống
{
while(trangthaict2!=1 ) //Công tắc hành trình dưới chưa chạm
{
xuong();
trangthaict2=digitalRead(ctht2);
}
dung();
}
else {dung();}
irrecv.resume();
}
}
else //Co Mua
{
if(trangthaict2!=1)//Nếu có mưa cà cửa đang mở thì chạy xuống
{
xuong();
}
else {dung();}
}
}
void len(){
digitalWrite(in3,HIGH);
digitalWrite(in4,LOW);
}
void xuong(){
digitalWrite(in3,LOW);
digitalWrite(in4,HIGH);
}
void dung(){
digitalWrite(in3,LOW);
digitalWrite(in4,LOW);
}
Giải thích: Trong đoạn code trên hệ thống sẽ hoạt đông như sau.
- Lúc đầu đọc trạng thái của 2 công tăc hành trình và cảm biến mưa.
- Nếu không có mưa:
- Nếu nút lên được nhấn thì kiểm tra tiếp công tắc hành trình trên, nếu chưa chạm tức khác 1 thì cho chạy lên đến khi công tắc hành trình trên bằng 1 thì dừng. Nếu các bạn muốn nhấn giữ nút nhấn khi buôn ra thì dừng các bạn không nên dùng vòng while ở đây mà dùng if như sau:
#include<IRremote.h>
const int chanRemote=8; //Chân IR1838
IRrecv irrecv(chanRemote);
decode_results results; //Nhận kết quả trả về
int in3=9; //Chân In3 trên L298N
int in4=10; //Chân In4 trên L298N
int ctht1=2; //Công tắc hành trình 1 nối với chân 2
int ctht2=3; //Công tắc hành trình 2 nối với chan 3
int cbmua=7; // CB mưa nối với chân 7
void setup() {
Serial.begin(9600);
irrecv.enableIRIn();
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
pinMode(ctht1,INPUT);
pinMode(ctht2,INPUT);
pinMode(cbmua,INPUT);
}
void loop() {
int trangthaict1=digitalRead(ctht1);
int trangthaict2=digitalRead(ctht2);
int thcbmua=digitalRead(cbmua);
Serial.print(trangthaict1);
Serial.println(trangthaict2);
if(thcbmua==1) //Dang khong mua
{
if(irrecv.decode(&results))
{
if (results.value==0xFF18E7 )//Nhấn lên
{
if(trangthaict1!=1 ) //Công tắc hành trình trên chưa chạm thì chạy lên đến khi chạm
{ //Nếu muốn dừng giữa chừng thì không dùng while mà dùng if
len();
//trangthaict1=digitalRead(ctht1);
}else {dung();}
}
else if (results.value==0xFF4AB5 )//Nhấn nút xuống
{
if(trangthaict2!=1 ) //Công tắc hành trình dưới chưa chạm
{
xuong();
//trangthaict2=digitalRead(ctht2);
}
else {dung();}
}
else {dung();}
irrecv.resume();
}
}
else //Co Mua
{
if(trangthaict2!=1)//Nếu có mưa cà cửa đang mở thì chạy xuống
{
xuong();
}
else {dung();}
}
}
void len(){
digitalWrite(in3,HIGH);
digitalWrite(in4,LOW);
}
void xuong(){
digitalWrite(in3,LOW);
digitalWrite(in4,HIGH);
}
void dung(){
digitalWrite(in3,LOW);
digitalWrite(in4,LOW);
}
- Ngược lại nếu nút xuống được nhấn thì kiểm tra công tắc hành trình dưới nếu chưa chạm thì chạy xuống ngược lại thì dừng.
- Trong trường hợp có mưa thì chương trình sẽ kiển tra công tắc dưới xem có bằng 1 không nếu chưa bằng 1 có nghĩa là cửa đang mở nên cho cửa chạy xuống.
- Bên dưới là các hàm len xuong dung để điều khiển động cơ.
Đăng nhận xét