ctl3q3q 发表于 2017-4-28 18:54:25

用红外遥控和光控步进电机,如何实现两种模式的遥控切换?

小白刚入门arduino,毕业设计做可以光控和红外遥控的智能窗帘,我编辑好了红外遥控步进电机转动和通过光敏电阻控制步进电机转动,两个程序分开运行可以,但是不会怎样合并,感觉是红外接收的代码那里出了问题,在LOOP循环中,每次我设定接收一个按键后,后面就无法收到新的红外信号了。我想实现通过红外遥控,可以在光控模式和遥控模式之间切换,请问应该怎么解决呢?
两个程序的代码:
红外遥控电机模式:
#include <IRremote.h>
int RECV_PIN = 3;
IRrecv irrecv(RECV_PIN);   //初始化红外接收
decode_results results;   //存放接受的数据
int n=1;         // 定义电机转轴初始位置

void setup()
{
for(int i=8;i<12;i++)         //8,9,10,11口定义为输出
{
pinMode(i,OUTPUT);
}
irrecv.enableIRIn();               //允许接收器接收数据
Serial.begin(9600);
}

void shun()                  //定义顺时针旋转
{
int a;
a=16;                         //通电16次
while(a--&&n<5)                  //n是设置只准走多少下就到头了
{
for(int i=8;i<12;i++)         //8,9,10,11口依次通断
{
digitalWrite(i,1);
delay(10);
digitalWrite(i,0);
}
}
n++;
if(n>=5)                     
n=5;
}
void ni()
{
int a;
a=16;
while(a--&&n>1)
{
for(int i=12;i>=8;i--)
{
digitalWrite(i,1);
delay(10);
digitalWrite(i,0);
}
}
n--;
if(n<=1)
n=1;
}
void loop()
{
if (irrecv.decode(&results))      //解码接收到的数据
{
if(results.value==0x00FFA857)   //如果接收到的值为某某按键
{
Serial.println("shun");
Serial.println(n);
shun();
}
else if(results.value==0x00ffE01F)
{
   Serial.println("ni");
   Serial.println(n);
ni();
}
irrecv.resume(); // 接受下一个数据
}
}


光控模式:
int photocellPin=14;    //光敏电阻端口
int old=analogRead(photocellPin);
void setup(){
   for(int i=8;i<12;i++)
{
pinMode(i,OUTPUT);
}
Serial.begin(9600);

}

void shun()
{
int a;
a=64;
while(a--)
{
for(int i=8;i<12;i++)
{
digitalWrite(i,1);
delay(10);
digitalWrite(i,0);
}
}
}
void ni()
{
int a;
a=64;
while(a--)
{
for(int i=12;i>=8;i--)
{
digitalWrite(i,1);
delay(10);
digitalWrite(i,0);
}
}
}

void loop(){
int val=analogRead(photocellPin);   //读取光敏电阻电路中的电压
    Serial.println("val=");
    Serial.println(analogRead(photocellPin));    //把读取到的数据输出
    Serial.println("old-val=");
    Serial.println(old-val);
delay(2000);   //延迟一段时间以查看结果
if(old-val>30)
{
    delay(1000);
    int val=analogRead(photocellPin);
    if(old-val>30)
    {
      shun();
    }
}

      
else if(val-old>30)
    {
    delay(1000);
    int val=analogRead(photocellPin);
    if(val-old>30)
    {
      ni();
    }
}
   // digitalWrite(ledPin,HIGH);      //光强度较低则输出高电压点亮LED
    old = val;
    delay(1000);
}

HEIKEJI 发表于 2017-6-15 07:54:25

能写出来 也不错了   步进电机干嘛不用 自带的库呢{step}   你这样写似乎太占用资源了

静静金 发表于 2017-12-30 21:23:08

你好,亲,请问你最后做成功了吗?我最近也在做这个项目,可以请教你吗:D
页: [1]
查看完整版本: 用红外遥控和光控步进电机,如何实现两种模式的遥控切换?