本帖最后由 birdinskyd***sy 于 2016-8-3 18:43 编辑
上一篇,我们玩耍了红外,已经能够发送接收不同频率稳定的信号,这回我们制作自己的协议,以辅助窗帘和灯光的控制。
实际上本篇是对控城篇一的无线化改造。改造前是这个样紫,
改造的目标是这个样紫,
我们照此蓝图先从小兰开始改。
小兰现在有两种三个最基本任务,两类是接收执行和接收转发,三个是小艾的红外指令控制电机,接收无线遥控的指令控制电机(这个我们将去掉直接用红外控制),转发小艾给小兰2号的指令控制灯光。
我们开始修改代码,先处理接收指令的前两个任务代码,也就是红外接收控制电机的。我们规定,当接收到的红外频率为850Hz±30Hz时,为开窗帘指令,接收到1890Hz±30Hz时,为关闭窗帘指令。
二话不说上代码,
- /*
- * 无线
- */
- //bool _ABVAR_1_A= false ;
- //bool _ABVAR_2_B= false ;
- //bool _ABVAR_3_C= false ;
- //bool _ABVAR_4_D= false ;
- /*
- * 红外频率测量
- */
- int divider[6] = {0, 1, 8, 64, 256, 1024};
- int prescaler = 5;
- double count = 0;
- double middle = 0;
- char x = 0;
- unsigned char checkOpenCount = 0;
- unsigned char checkCloseCount = 0;
- ISR(tiMER1_OVF_vect)
- {
- if (prescaler < 4)
- {
- prescaler++;
- }
- }
- void interrupt()
- {
- if (!x)
- {
- count = TCNT1;
- TCNT1 = 0x000;
- TCCR1B = prescaler;
- attachInterrupt(0, interrupt, FALLING);
- }
- else
- {
- middle = TCNT1;
- attachInterrupt(0, interrupt, RISING);
- }
- x = ~x;
- }
- void setup()
- {
- // pinMode( 7 , INPUT);
- // pinMode( 8 , INPUT);
- // pinMode(12 , INPUT);
- // pinMode(13 , INPUT);
- pinMode( 3 , OUTPUT );
- pinMode( 5 , OUTPUT );
- pinMode( 6 , OUTPUT );
- pinMode( 9 , OUTPUT );
-
- TIMSK1 = 0x01;// 启用全局计时器中断
- TCCR1A = 0x00;//普通模式
- attachInterrupt(0, interrupt, RISING);
- Serial.begin(57600);
- }
- void checkFreq()
- {
- double f = 16000000.0 / divider[prescaler] / count;
- //Serial.print("Freq: ");
- if(f > 820 && f < 880)
- {
- //5次验证
- if(checkOpenCount < 5)
- {
- checkOpenCount++;
- }
- else if(checkOpenCount >= 5)
- {
- //开下窗帘
- openCurtain();
- checkOpenCount = 0;
- }
- }
- else if(f >1860 && f<1920)
- {
- //5次验证
- if(checkCloseCount <5)
- {
- checkCloseCount++;
- }
- else if(checkCloseCount >= 5)
- {
- closeCurtain();
- checkCloseCount = 0;
- }
- }
- Serial.println(f);
- if (prescaler > 1)
- {
- prescaler--;
- delay(200);
- }
- }
- inline void closeCurtain()
- {
- analogWrite( 3 , 250 );
- analogWrite(5,0);
- delay( 1000 );
- analogWrite( 3 , 0 );
- analogWrite(5,0);
- }
- inline void openCurtain()
- {
- analogWrite( 3 , 0 );
- analogWrite(5,250);
- delay( 1000 );
- analogWrite( 3 , 0 );
- analogWrite(5,0);
- }
- void loop()
- {
- // _ABVAR_1_A = digitalRead(7) ;
- // _ABVAR_2_B = digitalRead(8) ;
- // _ABVAR_3_C = digitalRead(12) ;
- // _ABVAR_4_D = digitalRead(13) ;
- //
- // if (_ABVAR_1_A)
- // {
- // closeCurtain();
- // }
- // if (_ABVAR_4_D)
- // {
- // openCurtain();
- // }
- checkFreq();
-
- delay(110);
- }
-
复制代码
接收时候我们验证了5次频率以免外界干扰,当然你可以做得再完善些,验证还是要有的。电机管脚只用3和5即可,因为我们只控制一个电机。
下边看效果
通过小艾发送不同频率的红外,A和a,实际就是两个数字,控制红外频率,达到控制电机正反转的效果
上视频效果图,咦,有张毛爷爷,呵呵,为了电机不抖,请来毛爷爷压阵。
只要 小艾这边控制好频率,就可以顺利控制电机了,不在这俩频率范围时,电机就不转了,因为只用一个电机,可以去掉6和9的控制优化下代码。我们下一篇实现用手机躺着控制窗帘。
|