零知开源小项目-制作一个红外遥控的摇头风扇

风扇是我们生活中常见的一种工具,本篇教程将DIY一个自己的红外遥控小风扇。

1、材料

零知标准板(点击购买)
红外遥控+红外线接收头(点击购买)
JQC-3FF继电器(点击购买)
SG90舵机(点击购买)
面包板(点击购买)
杜邦线(点击购买)
直流电机(点击购买)
鳄鱼夹子(点击购买)

使用的遥控器及其对应编码如下:

2、硬件连接

各部件接线如图所示:

实物连线如图所示:

2、程序


												
	/***********************************************************
	*    文件: fengshan.ino      by 零知实验室([url=http://www.lingzhilab.com]www.lingzhilab.com[/url])
	*    -^^- 零知开源,让电子制作变得更简单! -^^-
	*    时间: 2019/07/23 15:47
	*    说明:
	************************************************************/
	#include <IRremote.h>
	#include <Servo.h>
	 
	uint8_t IR_RECV_pin = 3;
	 
	int Relay_pin = 1;
	 
	int pos = 0;
	 
	IRreceiver irrecv(IR_RECV_pin);
	 
	Servo myservo;
	 
	IRdecode_results decode_result;
	 
	const int code[4]= {0xff6897,0xff30cf,0xff18e7,0xff7a85};
	        // 复位或上电后运行一次:
	        void setup() {
	                //在这里加入初始化相关代码,只运行一次:
	                Serial.begin(9600);
	                irrecv.enableIRIn();  //打开红外接收
	                myservo.attach(2);  //舵机连接到2号引脚
	                pinMode(Relay_pin,OUTPUT);
	                digitalWrite(Relay_pin,HIGH);
	                 
	        }
	         
	        //一直循环执行:
	        int get_code=0;
	        void loop() {
	                //在这里加入主要程序代码,重复执行:
	                 
	                if(get_code == 0)  //未获取到红外信号
	                {
	                        if(irrecv.decode(&decode_result))
	                        {
	                                 
	                                get_code = 1;  //获取到信号赋1
	                        }
	                         
	                }
	                 
	                 
	                if(get_code == 1)  //获取到信号
	                {
	                        Serial.print("receive code: 0X");
	                         
	                        int dvalue =decode_result.value;
	                        Serial.println(dvalue,HEX);
	                        get_code = 0;
	                        irrecv.resume();  //接收下一次指令
	                         
	                        if(dvalue == code[0])  //按键0
	                        {
	                                digitalWrite(Relay_pin,HIGH);  //关闭继电器,即关闭风扇
	                                Serial.println("code[0]");
	                        }
	                        else if(dvalue == code[1])  //按键1
	                        {
	                                Serial.println("code[1]");
	                                digitalWrite(Relay_pin,LOW);  //打开风扇
	                        }
	                        else if(dvalue == code[2])
	                        {
	                                while(1)  //舵机140°循环转动
	                                {
	                                        for(pos = 160;pos>20;pos--)
	                                        {
	                                                myservo.write(pos);
	                                                delay(20);
	                                                if(irrecv.decode(&decode_result))  //转动时判断是否接收到指令
	                                                {
	                                                         
	                                                        get_code = 1;
	                                                        break;//在for循环时接收到红外信号,中断当前for循环
	                                                }
	                                        }
	                                        for(pos = 20;pos<160;pos++
	                                                )
	                                        {
	                                                myservo.write(pos);
	                                                delay(20);
	                                                if(irrecv.decode(&decode_result))
	                                                {
	                                                         
	                                                        get_code = 1;
	                                                        break;
	                                                }
	                                        }
	                                        if(get_code==1)
	                                        {
	                                                 
	                                                break;//中断while循环
	                                        }
	                                }
	                                 
	                                 
	                        }
	                        else if(dvalue == code[3])
	                        {
	                                myservo.detach();  //停止舵机
	                        }
	                         
	                }
	                 
	        }
						

2、按照之前的方式先【验证】,然后【上传】到开发板中。

四、效果展示

上传之后,我们就可以通过红外遥控器遥控风扇了,按遥控器的1打开风扇,2打开舵机,0关闭风扇。