美文网首页玩转Arduinoarduinoarduino
【Arduino综合项目】改造饮水机

【Arduino综合项目】改造饮水机

作者: 繁著 | 来源:发表于2016-07-05 20:44 被阅读1060次

    背景说明:办公室的饮水机坏了,刚好最近在玩Arduino,就想用Arduino来改造一下,废物利用,于是就有了这个项目。直接上图看成果:

    正面
    背面
    侧面

    实现功能

    1.在按键1为on的状态下,杯子放在压力传感器上即可出水;
    2.按下按键2即可出水,再按一下便关闭;
    3.侧面的lcd显示屏可以记录喝水次数,按下按键3可将次数清零。

    物料清单

    • 饮水机 *1(坏的。。没坏你想改造我也没话说)
    • Arduino Uno *1
    • 按钮 *3
    • LED灯 *3
    • FSR402力敏电阻器(压力传感器) *1
    • LCD 1602显示屏(带转接板) *1
    • 小型水泵 *1
    • 继电器 *1
    • 导线、跳线若干
    • 热缩管若干
    • 电烙铁、热风枪、十字螺丝刀、钻孔器等
      附上部分元件图
      小型水泵
      按钮
      LCD显示屏
      LED灯

    元件接线

    • FSR402力敏电阻器和Arduino
    FSR402 Arduino
    + -> 5v
    - 10kOhm GND
    同上 -> A0
    • 继电器和Arduino
    继电器 Arduino
    IN -> 8
    VCC -> 5V
    GND -> GND
    • 继电器和小型水泵
      小型水泵的电源线剥开可以看到正负两条线,正极从中间剪断,负极不要动,正极(从电源过来的一端)接常开端,正极(接小型水泵的一端)接公共端,如下图所示。


      小型水泵与继电器接线示意图
    • 按钮和Arduino
      (按钮两端都是一样的)

    按钮1 Arduino
    一端 -> 5v
    另一端 10kOhm电阻 GND
    同上 -> 2
    按钮2 Arduino
    一端 -> 5v
    另一端 10kOhm电阻 GND
    同上 -> 3
    按钮3 Arduino
    一端 -> 5v
    另一端 10kOhm电阻 GND
    同上 -> 4
    • LED和Arduino
    LED1 Arduino
    正极 -> 5
    负极 -> GND
    LED2 Arduino
    正极 -> 6
    负极 -> GND
    LED3 Arduino
    正极 -> 7
    负极 -> GND
    • LCD和Arduino
    LCD Arduino
    GND -> GND
    VCC -> 5V
    SDA -> A4
    SCL -> A5

    源程序

    #include <SCoop.h>
    #include <Wire.h> 
    #include <LCD.h> 
    #include <LiquidCrystal_I2C.h> 
    LiquidCrystal_I2C lcd(0x3F,2,1,0,4,5,6,7); 
    
    int Button1 = 2;
    int Button2 = 3;
    int Button3 = 4;
    int Led1 = 5;
    int Led2 = 6;
    int Led3 = 7;
    int sensorPin = A0;
    int value;
    void button1Function();
    void button2Function();
    void button3Function();
    boolean switchFlag = LOW;
    boolean waterFlag = LOW;
    int times = 0;
    
    defineTask(Task1) 
    void Task1::setup() { 
    
    }
    void Task1::loop() { 
        button1Function();
    }
    
    defineTask(Task2) 
    void Task2::setup() { 
    
    }
    void Task2::loop() { 
        button2Function();
    }
    
    defineTaskLoop(Task3) { 
      button3Function();
    } 
    
    
    void setup() {
      mySCoop.start(); 
      lcd.begin (16,2); // for 16 x 2 LCD module 
      lcd.setBacklightPin(3,POSITIVE); 
      lcd.setBacklight(HIGH); 
      pinMode(Button1,INPUT);
      pinMode(Button2,INPUT); 
      pinMode(Button3,INPUT); 
      pinMode(Led1,OUTPUT); 
      pinMode(Led2,OUTPUT); 
      pinMode(Led3,OUTPUT); 
      pinMode(sensorPin,INPUT);
      pinMode(8,OUTPUT);
      Serial.begin(9600);
    }
    
    void loop() {
      int a1,a2,a3;
      yield();  //本函数必须放在主线的loop循环体中 
      
      a1 = analogRead(sensorPin);
      a2 = analogRead(sensorPin);
      a3 = analogRead(sensorPin);
      value = (a1+a2+a3)/3;
        Serial.println(value);
      if(value > 15 && switchFlag == HIGH){
        digitalWrite(8,LOW);
        times++;
        delay(2000);
        digitalWrite(8,HIGH);
      }else
        digitalWrite(8,HIGH);
      if(waterFlag == HIGH){
         digitalWrite(8,LOW);
      }else
        digitalWrite(8,HIGH);
    
      lcd.home (); // set cursor to 0,0 
      lcd.print("Drink Water Times"); 
      lcd.setCursor (6,1); // go to start of 2nd line 
      lcd.print(times);  
      lcd.setCursor (12,1); // go to start of 2nd line 
      lcd.print("CUPS");
      
    }
    
    void button1Function(){
      if(digitalRead(Button1)==LOW)  //由于本例检测上升沿触发,所以先检测输入是否低电平,
      {
        delay(10); //然后延时一段时间,
        if(digitalRead(Button1)==HIGH) //然后检测是不是电平变为高了。是的话,就是刚好按钮按下了。
        { 
          switchFlag = !switchFlag;
          Serial.println(switchFlag);
          digitalWrite(Led1,switchFlag);
          delay(10);  //延时一段时间,防止按钮突然断开再按下。
          while(digitalRead(Button1)==HIGH) //判断按钮状态,如果仍然按下的话,等待松开。防止一直按住导致LED输出端连续反转
          {
            delay(1);
          }
        }
      }
    }
    
    void button2Function(){
      if(digitalRead(Button2)==LOW)  //由于本例检测上升沿触发,所以先检测输入是否低电平,
      {
        delay(10); //然后延时一段时间,
        if(digitalRead(Button2)==HIGH) //然后检测是不是电平变为高了。是的话,就是刚好按钮按下了。
        { 
          waterFlag = !waterFlag;
          Serial.println(waterFlag);
          digitalWrite(Led2,waterFlag);
          if(waterFlag == HIGH)
            times++;
          delay(10);  //延时一段时间,防止按钮突然断开再按下。
          while(digitalRead(Button2)==HIGH) //判断按钮状态,如果仍然按下的话,等待松开。防止一直按住导致LED输出端连续反转
          {
            delay(1);
          }
        }
      }
    }
    
    void button3Function(){
      if(digitalRead(Button3)==LOW)  //由于本例检测上升沿触发,所以先检测输入是否低电平,
      {
        delay(10); //然后延时一段时间,
        if(digitalRead(Button3)==HIGH) //然后检测是不是电平变为高了。是的话,就是刚好按钮按下了。
        { 
          times = 0;
          delay(10);  //延时一段时间,防止按钮突然断开再按下。
          while(digitalRead(Button3)==HIGH) //判断按钮状态,如果仍然按下的话,等待松开。防止一直按住导致LED输出端连续反转
          {
            delay(1);
          }
        }
      }
    }
    

    写在最后

    1.压力感应模块在加入小型水泵后,读出的值就会不稳定,建议采取各种滤波。
    2.项目完整实现下来,存在一个问题,就是会漏水,就是水泵停止泵水后水龙头还会滴水,目前还在想解决方案。
    3.过程写得有点粗略,如果你在实现的过程遇到任何问题,或者有更好的建议,随时欢迎沟通交流,共同进步哈~

    相关文章

      网友评论

      • exLucifer:继电器是和220V交流电连接的吗?求详细的连接方法呀
        繁著:@exLucifer 可以控制220v的。详见:http://www.jianshu.com/p/d7820918b148
      • Luat物联网通信模块:可以关注下Luat开源项目,基于Air200 GPRS模块(价格才12块多),基于Lua开发应用软件,超级容易上手。 而且开发点阵LCD 的UI 非常方便,有丰富的底层库,支持中文很方便。
      • 1865c3099513:水泵和继电器有什么用啊
        繁著:@真TM搞笑 用来控制出水

      本文标题:【Arduino综合项目】改造饮水机

      本文链接:https://www.haomeiwen.com/subject/bsohjttx.html