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主板,主控程序运行的所在地
Arduino UNO主板

下面是轻触开关,在本实验中作为工作按钮
轻触开关

接下来是触摸开关,在本实验中充当壶内水位监测按钮
触摸开关

下面是直流电机和达林顿阵列,在本实验中充当抽水泵
直流电机和达林顿阵列

还有三色LED灯,在本实验中作为状态指示灯
三色LED灯

下面是热敏温度传感器,在本实验中作为水温检测模块
热敏温度传感器

蜂鸣器,当水烧好了之后,嘀嘀嘀叫三声
蜂鸣器

舵机,在本实验中充当加水杆的旋转电机
舵机

继电器,在本实验中充当加热器模块
继电器

未完待续

版权声明:
作者:Mr李
链接:https://www.techfm.club/p/1042.html
来源:TechFM
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>