Arduino初体验-自动加水烧水壶
前言
春节疫情期间有些闲,
在某宝上看到物联网开发套件,
于是分6期花呗(穷)买下来玩一下。
货到了之后,没啥想法,简单体验了一下蜂鸣器模块,做了重复播放摩斯电码的demo之后,突然想到以前夸下海口说:这自动电热水壶我自己都能做得出来。好吧,装逼重要能装得下去,对吧?
思路
这个热水壶只有一个按钮,
插上电后,电源指示灯亮起来,状态指示灯是灭的,
按下按钮(水壶已就位,否则按钮无响应),壶内如果没八成水就加水,有八成就直接开始加热,
加水时,状态指示灯为蓝色,先旋转加水臂杆至壶口,然后水泵开始工作,
直到壶内足够八成水便收起臂杆并开始加热,
加热时,状态指示灯为红色,壶内水温加热至100℃,停止加热,
加热完成后,状态指示灯为绿色,
当水温下降或者再次点击工作按钮后,状态指示灯灭掉。
代码(C语言)
嗯,直接贴代码吧:
#include <Servo.h>
const int tempDigitalPin = 4; // 温度传感器
// 三色LED状态指示灯
const int stateLedRPin = 9;
const int stateLedGPin = 10;
const int stateLedBPin = 11;
const int startBtnPin = 8; // 工作按钮
const int poolBtnPin = 12; // 水位检测按钮
const int baseBtnPin = 6; // 水壶基座按钮
const int pumpRelayPin = 5; // 抽水泵
const int heatingCoilRelayPin = 2; // 加热线圈继电器
const int buzzerPin = 7; // 蜂鸣器
const int readyLedPin = 13; // 电源指示灯
const int servoPin = 3; // 舵机
// 0:初始状态
// 1:加水状态
// 2:烧水状态
// 3:开水状态
int GState = 0;
// 上一次状态记录
int GStateLast = -1;
Servo myservo;
void setup() {
pinMode(tempDigitalPin, INPUT);
pinMode(stateLedRPin, OUTPUT);
pinMode(stateLedGPin, OUTPUT);
pinMode(stateLedBPin, OUTPUT);
pinMode(startBtnPin, INPUT);
pinMode(poolBtnPin, INPUT);
pinMode(baseBtnPin, INPUT);
pinMode(pumpRelayPin, OUTPUT);
pinMode(heatingCoilRelayPin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
pinMode(readyLedPin, OUTPUT);
myservo.attach(servoPin);
tone(buzzerPin, 4000, 500);
digitalWrite(readyLedPin, LOW);
}
void loop() {
boolean startBtnVal = digitalRead(startBtnPin);
boolean poolBtnPinVal = digitalRead(poolBtnPin);
boolean baseBtnPin = digitalRead(baseBtnPin);
baseBtnPin = LOW;//模块足够时删去
// 如果水壶不在基座上,恢复初始状态
if (baseBtnPin == HIGH) {
GState = 0;
startBtnVal = HIGH; // 使工作按钮无效
}
// 初始状态,按钮被按下
if (GState == 0 && startBtnVal == LOW) {
//水壶有水,那就烧水,水壶没水,那就加水
if (poolBtnPinVal == HIGH) {
GState = 2;
} else {
GState = 1;
}
}
// 加水状态,水壶满了,那就烧水
if (GState == 1 && poolBtnPinVal == HIGH) {
GState = 2;
}
// 烧水状态,水温达到目标值,变成完成状态
if (GState == 2 && digitalRead(tempDigitalPin) == LOW) {
GState = 3;
}
// 完成状态,水温下降则恢复为初始状态,点击按钮恢复初始状态
//if (GState == 3 && (digitalRead(tempDigitalPin) == LOW || startBtnVal == LOW)){
if (GState == 3 && startBtnVal == LOW) {
GState = 0;
delay(1500);
}
//检查状态是否发生改变
if (GState == GStateLast) {
return;
} else {
GStateLast = GState;
}
switch (GState) {
case 0:
defaultState();
break;
case 1:
addWaterState();
break;
case 2:
heatingState();
break;
case 3:
finishState();
break;
}
}
void stateLedColor(unsigned char red, unsigned char green, unsigned char blue) {
analogWrite(stateLedRPin, red);
analogWrite(stateLedBPin, blue);
analogWrite(stateLedGPin, green);
}
void defaultState() {
stateLedColor(0, 0, 0); //关闭指示灯
digitalWrite(heatingCoilRelayPin, HIGH);// 关闭加热线圈
//digitalWrite(pumpRelayPin, HIGH);// 关闭加水马达
analogWrite(pumpRelayPin, 0);
myservo.write(0);// 归位加水导杆
}
void addWaterState() {
stateLedColor(0, 0, 255); //指示灯纯蓝色
myservo.write(45);// 启动加水导杆
delay(1000);
//digitalWrite(pumpRelayPin, LOW);// 启动加水马达
analogWrite(pumpRelayPin, 200);
}
void heatingState() {
stateLedColor(255, 0, 0); //指示灯纯红色
digitalWrite(heatingCoilRelayPin, LOW);// 启动加热线圈
//digitalWrite(pumpRelayPin, HIGH);// 关闭加水马达
analogWrite(pumpRelayPin, 0);
delay(1000);
myservo.write(0);// 归位加水导杆
}
void finishState() {
stateLedColor(0, 255, 0); //指示灯纯绿色
digitalWrite(heatingCoilRelayPin, HIGH);// 关闭加热线圈
//digitalWrite(pumpRelayPin, HIGH);// 关闭加水马达
analogWrite(pumpRelayPin, 0);
myservo.write(0);// 归位加水导杆
// 蜂鸣器响三声
tone(buzzerPin, 4000, 500);
delay(600);
tone(buzzerPin, 4000, 500);
delay(600);
tone(buzzerPin, 4000, 500);
}
各模块实拍
就随手拍几张图片吧:
首先上场的是来自某宝的Arduino UNO主板,主控程序运行的所在地
下面是轻触开关,在本实验中作为工作按钮
接下来是触摸开关,在本实验中充当壶内水位监测按钮
下面是直流电机和达林顿阵列,在本实验中充当抽水泵
还有三色LED灯,在本实验中作为状态指示灯
下面是热敏温度传感器,在本实验中作为水温检测模块
蜂鸣器,当水烧好了之后,嘀嘀嘀叫三声
舵机,在本实验中充当加水杆的旋转电机
继电器,在本实验中充当加热器模块
未完待续
共有 0 条评论