背景說明:辦公室的飲水機壞了,剛好最近在玩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綜合項目】改造飲水機 LCD顯示屏【Arduino綜合項目】改造飲水機 LED燈【Arduino綜合項目】改造飲水機
元件接線
- FSR402力敏電阻器和Arduino
FSR402 | Arduino | |
---|---|---|
+ | -> | 5v |
- | 10kOhm | GND |
同上 | A0 |
- 繼電器和Arduino
IN | 8 | |
VCC | 5V | |
-
繼電器和小型水泵
小型水泵的電源線剝開可以看到正負兩條線,正極從中間剪斷,負極不要動,正極(從電源過來的一端)接常開端,正極(接小型水泵的一端)接公共端,如下圖所示。
小型水泵與繼電器接線示意圖【Arduino綜合項目】改造飲水機 -
按鈕和Arduino
(按鈕兩端都是一樣的)
按鈕1 | ||
---|---|---|
一端 | ||
另一端 | 10kOhm電阻 | |
2 |
按鈕2 | ||
---|---|---|
3 |
按鈕3 | ||
---|---|---|
4 |
- LED和Arduino
LED1 | ||
---|---|---|
正極 | 5 | |
負極 |
LED2 | ||
---|---|---|
6 | ||
LED3 | ||
---|---|---|
7 | ||
- LCD和Arduino
LCD | ||
---|---|---|
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.過程寫得有點粗略,如果你在實作的過程遇到任何問題,或者有更好的建議,随時歡迎溝通交流,共同進步哈~