制作一个智能饮水机:基于Arduino Uno的DIY项目

 

在日常生活中,饮水机是办公室和家庭中不可或缺的设备。然而,传统的饮水机功能较为单一,无法满足智能化的需求。今天,我将向大家展示如何使用Arduino Uno和一些常见的传感器制作一个智能饮水机。这个项目不仅能够根据环境温湿度自动调整状态,还能在检测到水杯靠近时自动出水,同时通过OLED屏幕显示相关信息。

随着物联网技术的发展,越来越多的设备开始智能化。智能饮水机不仅可以提高用户的便利性,还能通过实时监测环境温湿度和水位,提升用户体验。

  1. 温湿度监测

    • 使用DHT11传感器检测环境温湿度。

    • 当温湿度低于设定值时,蓝色LED亮起。

    • 当温湿度高于设定值时,红色LED亮起。

  2. 水杯检测

    • 使用HC-SR04超声波传感器检测水杯是否靠近。

    • 当水杯靠近并稳定后(连续检测到水杯靠近3秒),开始出水。

  3. 出水控制

    • 出水时,根据当前温湿度状态,对应的LED闪烁(红色或蓝色)。

  4. 水位显示

    • 使用水位传感器检测水箱水位,并在OLED屏幕上显示。

  5. 时间显示

    • 使用DS3231模块获取当前时间,并在OLED屏幕上显示。

  6. OLED显示

    • 显示温湿度、时间、水位等信息。


硬件连接

  1. DHT11温湿度传感器

    • 数据引脚连接到数字引脚D2。

  2. DS3231实时时钟模块

    • SDA连接到A4。

    • SCL连接到A5。

  3. HC-SR04超声波传感器

    • VCC连接到5V。

    • GND连接到GND。

    • Trig连接到数字引脚D3。

    • Echo连接到数字引脚D4。

  4. 水位传感器

    • VCC连接到5V。

    • GND连接到GND。

    • S连接到模拟引脚A0。

  5. 0.96寸OLED显示屏(I2C)

    • SDA连接到A4。

    • SCL连接到A5。

  6. 红色LED

    • 阳极连接到数字引脚D5。

    • 阴极通过电阻接地。

  7. 蓝色LED

    • 阳极连接到数字引脚D6。

    • 阴极通过电阻接地。

  8. 出水控制(模拟出水)

    • 使用数字引脚D7控制一个继电器或电机。


功能描述

  1. 温湿度监测

    • 当温湿度低于设定值时,蓝色LED亮起。

    • 当温湿度高于设定值时,红色LED亮起。

  2. 水杯检测

    • 使用HC-SR04超声波传感器检测水杯是否靠近。

    • 当水杯靠近并稳定3秒后,开始出水。

  3. 出水控制

    • 出水时,根据当前温湿度状态,对应的LED闪烁。

  4. 水位显示

    • 使用水位传感器检测水箱水位,并在OLED屏幕上显示。

  5. 时间显示

    • 使用DS3231模块获取当前时间,并在OLED屏幕上显示。

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <RTClib.h>
#include <DHT.h>
#include <Ultrasonic.h>

// 定义OLED屏幕参数
#define SCREEN_WIDTH 128 // OLED显示屏幕的宽度,以像素为单位
#define SCREEN_HEIGHT 64 // OLED显示屏幕的高度,以像素为单位
#define OLED_RESET     -1 // 重置引脚;不使用时设置为 -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

// 定义温湿度传感器
#define DHTPIN 2        // DHT11数据引脚连接到D2
#define DHTTYPE DHT11   // DHT 11
DHT dht(DHTPIN, DHTTYPE);

// 定义实时时钟模块
RTC_DS3231 rtc;

// 定义超声波传感器
Ultrasonic ultrasonic(3, 4); // Trig引脚连接到D3,Echo引脚连接到D4

// 定义其他引脚
#define WATER_LEVEL_PIN A0 // 水位传感器连接到A0
#define LED_RED_PIN 5      // 红色LED连接到D5
#define LED_BLUE_PIN 6     // 蓝色LED连接到D6
#define PUMP_PIN 7         // 出水控制连接到D7

// 定义温湿度阈值
#define TEMP_LOW_THRESHOLD 20.0 // 温度过低阈值(摄氏度)
#define TEMP_HIGH_THRESHOLD 25.0 // 温度过高阈值(摄氏度)
#define HUMIDITY_LOW_THRESHOLD 40.0 // 湿度过低阈值(百分比)
#define HUMIDITY_HIGH_THRESHOLD 60.0 // 湿度过高阈值(百分比)

// 定义水杯检测参数
#define WATER_CUP_DISTANCE 10 // 水杯靠近的距离阈值(单位:cm)
#define DELAY_BEFORE_WATER 3000 // 水杯靠近后延迟出水的时间(单位:毫秒)

void setup() {
  Serial.begin(115200);
  delay(10);

  // 初始化OLED屏幕
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for (;;)
      ; // 进入无限循环
  }
  display.display();
  delay(2000); // 等待2秒
  display.clearDisplay();

  // 初始化温湿度传感器
  dht.begin();

  // 初始化实时时钟模块
  if (!rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }

  // 初始化LED和出水控制引脚
  pinMode(LED_RED_PIN, OUTPUT);
  pinMode(LED_BLUE_PIN, OUTPUT);
  pinMode(PUMP_PIN, OUTPUT);

  // 初始化超声波传感器
  ultrasonic.setTimeout(10000); // 设置超声波传感器超时时间
}

void loop() {
  // 读取温湿度数据
  float temperature = dht.readTemperature();
  float humidity = dht.readHumidity();

  // 读取当前时间
  DateTime now = rtc.now();

  // 读取水位传感器数据
  int waterLevel = analogRead(WATER_LEVEL_PIN);

  // 检测水杯是否靠近
  long distance = ultrasonic.read(); // 获取距离(单位:cm)
  bool waterCupNear = (distance > 0 && distance <= WATER_CUP_DISTANCE);

  // 显示数据到OLED屏幕
  display.clearDisplay();
  display.setTextSize(1); // 设置字体大小
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 0);
  display.println(F("Smart Water Dispenser"));

  display.setCursor(0, 15);
  display.print(F("Temp: "));
  display.print(temperature);
  display.println(F(" C"));

  display.setCursor(0, 28);
  display.print(F("Humidity: "));
  display.print(humidity);
  display.println(F(" %"));

  display.setCursor(0, 41);
  display.print(F("Water Level: "));
  display.print(waterLevel);
  display.println(F(" (RV)"));//RV:Raw Value

  display.setCursor(0, 54);
  display.print(F("Time: "));
  display.print(now.hour(), DEC);
  display.print(F(":"));
  display.print(now.minute(), DEC);
  display.print(F(":"));
  display.println(now.second(), DEC);

  display.display();

  // 控制LED状态
  if (temperature < TEMP_LOW_THRESHOLD || humidity < HUMIDITY_LOW_THRESHOLD) {
    digitalWrite(LED_BLUE_PIN, HIGH);
    digitalWrite(LED_RED_PIN, LOW);
  } else if (temperature > TEMP_HIGH_THRESHOLD || humidity > HUMIDITY_HIGH_THRESHOLD) {
    digitalWrite(LED_BLUE_PIN, LOW);
    digitalWrite(LED_RED_PIN, HIGH);
  } else {
    digitalWrite(LED_BLUE_PIN, LOW);
    digitalWrite(LED_RED_PIN, LOW);
  }

  // 水杯靠近时,3秒后出水
  if (waterCupNear) {
    unsigned long startTime = millis();
    while (millis() - startTime < DELAY_BEFORE_WATER) {
      long currentDistance = ultrasonic.read();
      if (currentDistance > WATER_CUP_DISTANCE) { // 如果水杯离开
        break;
      }
      delay(100);
    }
    if (ultrasonic.read() <= WATER_CUP_DISTANCE) { // 再次确认水杯是否仍在
      digitalWrite(PUMP_PIN, HIGH); // 模拟出水
      int ledPin = (temperature < TEMP_LOW_THRESHOLD || humidity < HUMIDITY_LOW_THRESHOLD) ? LED_BLUE_PIN : LED_RED_PIN;
      for (int i = 0; i < 10; i++) { // 出水时LED闪烁
        digitalWrite(ledPin, HIGH);
        delay(200);
        digitalWrite(ledPin, LOW);
        delay(200);
      }
      digitalWrite(PUMP_PIN, LOW); // 停止出水
    }
  }

  delay(1000); // 每秒更新一次
}

代码说明

  1. 温湿度监测

    • 使用DHT11传感器读取温湿度。

    • 根据设定阈值,点亮蓝色或红色LED。

  2. 水杯检测

    • 使用HC-SR04超声波传感器检测水杯是否靠近。

    • 当水杯靠近并稳定3秒后,开始出水。

  3. 出水控制

    • 出水时,根据当前温湿度状态,对应的LED闪烁。

  4. OLED显示

    • 显示温湿度、水位、时间等信息。

  5. 水位传感器

    • 使用模拟引脚读取水位传感器的值,并显示在OLED屏幕上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值