极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12209|回复: 4

arduino pro mini 自动控制吊扇

[复制链接]
发表于 2014-9-6 16:51:33 | 显示全部楼层 |阅读模式
本帖最后由 yenan1001 于 2014-9-14 01:50 编辑

家里吊扇的拉绳被熊孩子弄断了。
想了几天,决定换个arduino+继电器作为风扇换挡开关。
拆开风扇,发现里面控制转速的就是一个电容块,里面集成了三种不同的电容。通过不同的电容值对交流电限流来控制转速。就好像电阻之于直流电。

猜测着画了个原理图。

决定用arduino pro mini 和一个四路继电器控制转速。
外加人体感应器来自动关闭吊扇。
触发开关不打算用实体开关,而是用红外开关。

实现的功能和原来一样,有触发就打开吊扇,再有触发就换一档。
原装的换挡顺序是 停-最快-中等-最慢-停。因为通常都是用最慢。所以程序设置就自动控制风扇换挡到最慢。

原来打算用中断的。可是红外开关触发一次会发送很多抖动到中断。不想用电容啥的了,就算了。
程序很简单。没想到最困扰我的是对自然光的滤波。白天太阳强烈的时候,就会触发红外开关。所以整个程序有一部分都在解决这个问题。
到现在也没有完全搞定。吊扇偶尔还是会发疯。

***我在四楼放了一个很好的解决方案。要试试看。***

  1. /*
  2.    This code is to control the fan to tune the speed and turn on.

  3.    当风扇停止时,触动一次开关会顺次打开3档-停五秒-2档-停五秒-一档。
  4.    如果在五秒停顿时间内再次触发,将会停在当前档位。
  5.    如果风扇在某一档运行,触发开关会降一档。

  6.    LED颜色:蓝色-2档;绿色-3档;红色-1档

  7.    成功  2014/5/8
  8.   */


  9. #include <avr/wdt.h>  //看门狗头文件
  10. boolean on = LOW;  //both relay and LED low is on
  11. boolean off = HIGH;
  12. int speed = 0;


  13. # define brown_line  10
  14. # define gray_line   4
  15. # define purple_line 5

  16. # define led_red     6
  17. # define led_green   7
  18. # define led_blue    8

  19. # define body_sensor 11
  20. # define control     3



  21. void setup() {

  22.   //attachInterrupt(1, speed_change, FALLING);   //pin 3
  23.   //Serial.begin(9600);
  24.   wdt_enable(WDTO_8S);  //定义看门狗8秒超时。

  25.   pinMode(brown_line, OUTPUT);
  26.   pinMode(gray_line, OUTPUT);
  27.   pinMode(purple_line, OUTPUT);
  28.   pinMode(led_blue, OUTPUT);
  29.   pinMode(led_green, OUTPUT);
  30.   pinMode(led_red, OUTPUT);

  31.   pinMode(body_sensor, INPUT);
  32.   pinMode(control, INPUT);

  33.   speed0();

  34.   }

  35. void loop()
  36. {

  37.   delay(2000);                      //省电,不要总是运行;等待红外信号

  38.    if (digitalRead(body_sensor)==HIGH)   //if human body detected
  39.    {if (digitalRead(control)==LOW)     //如果有红外信号
  40.     {
  41.      delay(1000);                       //延迟,过滤误触发
  42.      if (digitalRead(control)==LOW)     //如果还有红外信号,不是误触发
  43.      {
  44.        blink_red();
  45.        delay(1000);
  46.        if (digitalRead(control)==HIGH)    //如果没有信号,不是自然光
  47.        {
  48.          wdt_reset();                     //喂狗
  49.          speed_change();                  //换挡
  50.        }
  51.       
  52.      }
  53.     }  
  54.    }
  55.   wdt_reset();   //喂狗

  56.   if (digitalRead(body_sensor)==LOW)   //if no human body detected, off the fan
  57.    {
  58.      speed0();
  59.    }


  60. void blink_red()
  61. {digitalWrite(led_red, on);
  62. delay(50);
  63. digitalWrite(led_red,off);
  64. delay(500);
  65. }

  66. void blink_green()
  67. {digitalWrite(led_green, on);
  68. delay(50);
  69. digitalWrite(led_green,off);
  70. delay(500);
  71. }


  72. void speed1()  
  73. {   
  74.    
  75.      digitalWrite(brown_line, off);   //slow fan speed, only purple line on
  76.      digitalWrite(led_blue, off);
  77.      
  78.      digitalWrite(led_red, on);
  79.      speed =1;

  80. }

  81. void speed2()
  82. {   
  83.      digitalWrite(gray_line, off);  //off fast fan
  84.      digitalWrite(led_green, off);
  85.      digitalWrite(led_blue, on);
  86.      delay(500);

  87.      digitalWrite(brown_line, on); //middle fan speed
  88.      digitalWrite(purple_line, on);
  89.      
  90.      speed =2;

  91. }   

  92. void speed3()
  93. {      
  94.      digitalWrite(gray_line, on);  //fast fan speed
  95.      digitalWrite(led_green, on);
  96.      speed=3;

  97. }

  98. void speed0()
  99. {   
  100.      digitalWrite(gray_line, off);
  101.      digitalWrite(brown_line, off);
  102.      digitalWrite(purple_line, off);
  103.      
  104.      digitalWrite(led_red, off);
  105.      digitalWrite(led_blue, off);
  106.      digitalWrite(led_green, off);
  107.      speed=0;

  108. }

  109. void normal_on()
  110. {   

  111.   switch(speed)
  112.     {
  113.       case 0:
  114.            speed3();
  115.            delay(1000);
  116.            if (digitalRead(control)==LOW)
  117.                  {
  118.                   delay(1000);
  119.                   if (digitalRead(control)==LOW)
  120.                      {
  121.                       digitalWrite(led_green,off);
  122.                       delay(50);
  123.                       digitalWrite(led_green,on);
  124.                      
  125.                       delay(1000);
  126.                       wdt_reset();                     //喂狗
  127.                       if (digitalRead(control)==HIGH)
  128.                       {break;}
  129.                      }
  130.                   }   
  131.            else {delay(4000);
  132.                  wdt_reset();                          //喂狗
  133.                 }

  134.                  
  135.            
  136.      
  137.       case 3:
  138.            speed2();
  139.            delay(1000);
  140.            if (digitalRead(control)==LOW)   //如果检测到控制信号,
  141.                  {
  142.                   delay(1000);
  143.                   if (digitalRead(control)==LOW)   //不是误触发
  144.                      {
  145.                       digitalWrite(led_blue,off);   //闪一下led
  146.                       delay(50);
  147.                       digitalWrite(led_blue,on);
  148.                      
  149.                       delay(1000);
  150.                       wdt_reset();                   //喂狗
  151.                       if (digitalRead(control)==HIGH)   //如果不是自然光
  152.                       {break;}                        //跳出,保持,不再降档
  153.                      }
  154.                   }   
  155.            else {delay(4000);                 //否则,等5秒,降档
  156.                  wdt_reset();                  //喂狗
  157.                  }                       
  158.                  
  159.          

  160.       case 2:
  161.            speed1();
  162.      }
  163.      
  164. }  


  165. void speed_change()
  166. {   
  167.   
  168.   switch(speed)
  169.   {
  170.     case 0:
  171.              normal_on();
  172.              break;
  173.     case 1:
  174.              speed0();
  175.              break;
  176.     case 2:
  177.              speed1();
  178.              break;
  179.     case 3:
  180.              speed2();
  181.              break;
  182.   }
  183. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2014-9-6 23:46:45 | 显示全部楼层
看门狗一直没明白 看了楼主的文档有点启发
回复 支持 反对

使用道具 举报

发表于 2014-9-6 23:51:45 | 显示全部楼层
是不是電容降壓?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-10 22:53:01 来自手机 | 显示全部楼层
k8706342 发表于 2014-9-6 23:51
是不是電容降壓?

是,电容在交流电里就是一个电阻的作用。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-14 01:49:41 | 显示全部楼层
本帖最后由 yenan1001 于 2014-9-14 01:52 编辑

偶然看到了这篇,非常有启发。
可惜我的红外开关是模块,看来要买单独的原件来做了。


http://www.doyoung.net/articles/A_NEAR_IR/index.html
回复 支持 反对

使用道具 举报

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

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

Archiver|联系我们|极客工坊

GMT+8, 2024-4-24 03:32 , Processed in 0.045743 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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