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

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

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

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

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

实现功能

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

物料清单

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

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

    【Arduino综合项目】改造饮水机
    LCD显示屏

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

元件接线

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


    【Arduino综合项目】改造饮水机
    小型水泵与继电器接线示意图
  • 按钮和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.过程写得有点粗略,如果你在实现的过程遇到任何问题,或者有更好的建议,随时欢迎沟通交流,共同进步哈~

上一篇:Mac OS安装mongodb


下一篇:Mysqlbinlog的一些操作和用法