在日常生活中,饮水机是办公室和家庭中不可或缺的设备。然而,传统的饮水机功能较为单一,无法满足智能化的需求。今天,我将向大家展示如何使用Arduino Uno和一些常见的传感器制作一个智能饮水机。这个项目不仅能够根据环境温湿度自动调整状态,还能在检测到水杯靠近时自动出水,同时通过OLED屏幕显示相关信息。
随着物联网技术的发展,越来越多的设备开始智能化。智能饮水机不仅可以提高用户的便利性,还能通过实时监测环境温湿度和水位,提升用户体验。
-
温湿度监测:
-
使用DHT11传感器检测环境温湿度。
-
当温湿度低于设定值时,蓝色LED亮起。
-
当温湿度高于设定值时,红色LED亮起。
-
-
水杯检测:
-
使用HC-SR04超声波传感器检测水杯是否靠近。
-
当水杯靠近并稳定后(连续检测到水杯靠近3秒),开始出水。
-
-
出水控制:
-
出水时,根据当前温湿度状态,对应的LED闪烁(红色或蓝色)。
-
-
水位显示:
-
使用水位传感器检测水箱水位,并在OLED屏幕上显示。
-
-
时间显示:
-
使用DS3231模块获取当前时间,并在OLED屏幕上显示。
-
-
OLED显示:
-
显示温湿度、时间、水位等信息。
-
硬件连接
-
DHT11温湿度传感器:
-
数据引脚连接到数字引脚D2。
-
-
DS3231实时时钟模块:
-
SDA连接到A4。
-
SCL连接到A5。
-
-
HC-SR04超声波传感器:
-
VCC连接到5V。
-
GND连接到GND。
-
Trig连接到数字引脚D3。
-
Echo连接到数字引脚D4。
-
-
水位传感器:
-
VCC连接到5V。
-
GND连接到GND。
-
S连接到模拟引脚A0。
-
-
0.96寸OLED显示屏(I2C):
-
SDA连接到A4。
-
SCL连接到A5。
-
-
红色LED:
-
阳极连接到数字引脚D5。
-
阴极通过电阻接地。
-
-
蓝色LED:
-
阳极连接到数字引脚D6。
-
阴极通过电阻接地。
-
-
出水控制(模拟出水):
-
使用数字引脚D7控制一个继电器或电机。
-
功能描述
-
温湿度监测:
-
当温湿度低于设定值时,蓝色LED亮起。
-
当温湿度高于设定值时,红色LED亮起。
-
-
水杯检测:
-
使用HC-SR04超声波传感器检测水杯是否靠近。
-
当水杯靠近并稳定3秒后,开始出水。
-
-
出水控制:
-
出水时,根据当前温湿度状态,对应的LED闪烁。
-
-
水位显示:
-
使用水位传感器检测水箱水位,并在OLED屏幕上显示。
-
-
时间显示:
-
使用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); // 每秒更新一次
}
代码说明
-
温湿度监测:
-
使用DHT11传感器读取温湿度。
-
根据设定阈值,点亮蓝色或红色LED。
-
-
水杯检测:
-
使用HC-SR04超声波传感器检测水杯是否靠近。
-
当水杯靠近并稳定3秒后,开始出水。
-
-
出水控制:
-
出水时,根据当前温湿度状态,对应的LED闪烁。
-
-
OLED显示:
-
显示温湿度、水位、时间等信息。
-
-
水位传感器:
-
使用模拟引脚读取水位传感器的值,并显示在OLED屏幕上。
-