背景說明:辦公室的飲水機壞了鸽照,剛好最近在玩Arduino,就想用Arduino來改造一下颠悬,廢物利用矮燎,于是就有了這個項目。直接上圖看成果:
實現功能
1.在按鍵1為on的狀態(tài)下赔癌,杯子放在壓力傳感器上即可出水诞外;
2.按下按鍵2即可出水,再按一下便關閉灾票;
3.側面的lcd顯示屏可以記錄喝水次數峡谊,按下按鍵3可將次數清零。
物料清單
- 飲水機 *1(壞的铝条。靖苇。沒壞你想改造我也沒話說)
- Arduino Uno *1
- 按鈕 *3
- LED燈 *3
-
FSR402力敏電阻器(壓力傳感器) *1
-
LCD 1602顯示屏(帶轉接板) *1
- 小型水泵 *1
-
繼電器 *1
- 導線、跳線若干
- 熱縮管若干
- 電烙鐵班缰、熱風槍贤壁、十字螺絲刀、鉆孔器等
附上部分元件圖:
元件接線
FSR402 |
|
Arduino |
+ |
-> |
5v |
- |
10kOhm |
GND |
同上 |
-> |
A0 |
繼電器 |
|
Arduino |
IN |
-> |
8 |
VCC |
-> |
5V |
GND |
-> |
GND |
按鈕1 |
|
Arduino |
一端 |
-> |
5v |
另一端 |
10kOhm電阻 |
GND |
同上 |
-> |
2 |
按鈕2 |
|
Arduino |
一端 |
-> |
5v |
另一端 |
10kOhm電阻 |
GND |
同上 |
-> |
3 |
按鈕3 |
|
Arduino |
一端 |
-> |
5v |
另一端 |
10kOhm電阻 |
GND |
同上 |
-> |
4 |
LED1 |
|
Arduino |
正極 |
-> |
5 |
負極 |
-> |
GND |
LED2 |
|
Arduino |
正極 |
-> |
6 |
負極 |
-> |
GND |
LED3 |
|
Arduino |
正極 |
-> |
7 |
負極 |
-> |
GND |
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循環(huán)體中
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) //由于本例檢測上升沿觸發(fā)旨怠,所以先檢測輸入是否低電平渠驼,
{
delay(10); //然后延時一段時間,
if(digitalRead(Button1)==HIGH) //然后檢測是不是電平變?yōu)楦吡思濉J堑脑捗陨龋褪莿偤冒粹o按下了。
{
switchFlag = !switchFlag;
Serial.println(switchFlag);
digitalWrite(Led1,switchFlag);
delay(10); //延時一段時間爽哎,防止按鈕突然斷開再按下蜓席。
while(digitalRead(Button1)==HIGH) //判斷按鈕狀態(tài),如果仍然按下的話课锌,等待松開厨内。防止一直按住導致LED輸出端連續(xù)反轉
{
delay(1);
}
}
}
}
void button2Function(){
if(digitalRead(Button2)==LOW) //由于本例檢測上升沿觸發(fā),所以先檢測輸入是否低電平,
{
delay(10); //然后延時一段時間雏胃,
if(digitalRead(Button2)==HIGH) //然后檢測是不是電平變?yōu)楦吡饲朊J堑脑挘褪莿偤冒粹o按下了瞭亮。
{
waterFlag = !waterFlag;
Serial.println(waterFlag);
digitalWrite(Led2,waterFlag);
if(waterFlag == HIGH)
times++;
delay(10); //延時一段時間获印,防止按鈕突然斷開再按下。
while(digitalRead(Button2)==HIGH) //判斷按鈕狀態(tài)街州,如果仍然按下的話,等待松開玻孟。防止一直按住導致LED輸出端連續(xù)反轉
{
delay(1);
}
}
}
}
void button3Function(){
if(digitalRead(Button3)==LOW) //由于本例檢測上升沿觸發(fā)唆缴,所以先檢測輸入是否低電平,
{
delay(10); //然后延時一段時間黍翎,
if(digitalRead(Button3)==HIGH) //然后檢測是不是電平變?yōu)楦吡嗣婊铡J堑脑挘褪莿偤冒粹o按下了匣掸。
{
times = 0;
delay(10); //延時一段時間趟紊,防止按鈕突然斷開再按下。
while(digitalRead(Button3)==HIGH) //判斷按鈕狀態(tài)碰酝,如果仍然按下的話霎匈,等待松開。防止一直按住導致LED輸出端連續(xù)反轉
{
delay(1);
}
}
}
}
寫在最后
1.壓力感應模塊在加入小型水泵后送爸,讀出的值就會不穩(wěn)定铛嘱,建議采取各種濾波。
2.項目完整實現下來袭厂,存在一個問題墨吓,就是會漏水,就是水泵停止泵水后水龍頭還會滴水纹磺,目前還在想解決方案帖烘。
3.過程寫得有點粗略,如果你在實現的過程遇到任何問題橄杨,或者有更好的建議秘症,隨時歡迎溝通交流,共同進步哈~
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者