极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10506|回复: 2

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

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

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

  15. void shun()                  //定义顺时针旋转
  16. {
  17.   int a;
  18. a=16;                         //通电16次
  19. while(a--&&n<5)                  //n是设置只准走多少下就到头了
  20. {
  21. for(int i=8;i<12;i++)         //8,9,10,11口依次通断
  22. {
  23. digitalWrite(i,1);
  24. delay(10);
  25. digitalWrite(i,0);
  26. }
  27. }
  28. n++;
  29. if(n>=5)                     
  30. n=5;
  31. }
  32. void ni()
  33. {
  34.   int a;
  35. a=16;
  36. while(a--&&n>1)
  37. {
  38. for(int i=12;i>=8;i--)
  39. {
  40. digitalWrite(i,1);
  41. delay(10);
  42. digitalWrite(i,0);
  43. }
  44. }
  45. n--;
  46. if(n<=1)
  47. n=1;
  48. }
  49. void loop()
  50. {
  51. if (irrecv.decode(&results))      //解码接收到的数据
  52. {
  53. if(results.value==0x00FFA857)     //如果接收到的值为某某按键
  54. {
  55.   Serial.println("shun");
  56.   Serial.println(n);
  57. shun();
  58. }
  59. else if(results.value==0x00ffE01F)
  60. {
  61.    Serial.println("ni");
  62.    Serial.println(n);
  63. ni();
  64. }
  65. irrecv.resume(); // 接受下一个数据
  66. }
  67. }
复制代码


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

  11. void shun()
  12. {
  13.   int a;
  14. a=64;
  15. while(a--)
  16. {
  17. for(int i=8;i<12;i++)
  18. {
  19. digitalWrite(i,1);
  20. delay(10);
  21. digitalWrite(i,0);
  22. }
  23. }
  24. }
  25. void ni()
  26. {
  27.   int a;
  28. a=64;
  29. while(a--)
  30. {
  31. for(int i=12;i>=8;i--)
  32. {
  33. digitalWrite(i,1);
  34. delay(10);
  35. digitalWrite(i,0);
  36. }
  37. }
  38. }

  39. void loop(){
  40.   int val=analogRead(photocellPin);   //读取光敏电阻电路中的电压
  41.     Serial.println("val=");
  42.     Serial.println(analogRead(photocellPin));    //把读取到的数据输出
  43.     Serial.println("old-val=");
  44.     Serial.println(old-val);
  45.   delay(2000);     //延迟一段时间以查看结果
  46.   if(old-val>30)
  47.   {
  48.     delay(1000);
  49.     int val=analogRead(photocellPin);
  50.     if(old-val>30)
  51.     {
  52.       shun();
  53.     }
  54.   }
  55.   
  56.         
  57. else if(val-old>30)
  58.     {
  59.     delay(1000);
  60.     int val=analogRead(photocellPin);
  61.     if(val-old>30)
  62.     {
  63.       ni();
  64.     }
  65.   }
  66.    // digitalWrite(ledPin,HIGH);      //光强度较低则输出高电压点亮LED
  67.     old = val;
  68.     delay(1000);
  69. }
复制代码
回复

使用道具 举报

发表于 2017-6-15 07:54:25 | 显示全部楼层
能写出来 也不错了   步进电机干嘛不用 自带的库呢{step}   你这样写似乎太占用资源了
回复 支持 反对

使用道具 举报

发表于 2017-12-30 21:23:08 | 显示全部楼层
你好,亲,请问你最后做成功了吗?我最近也在做这个项目,可以请教你吗
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-23 15:09 , Processed in 0.039080 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表