沐浴花洒要么太冷,要么太热如之奈何?用Arduino自制一套非接触式温控制系统完美解决!

制作一种浴室花洒度控制系统,可用于淋浴时的冷热水混合温度调节或混合两种不同的液体,而不需和它们进行身体接触。

组件和物料

  Arduino Nano R3 1块
面包板(通用) 一块
MOSFET驱动器,低有效 2只
电阻器10 k欧姆 2只
100欧姆电阻 2只
电容器100 nF 2个
红外接线近传感器1只

小水泵 2台

app和在线服务

Arduino IDE

简介

创建一个通过利用接近红外接近传感器来改变两种不同液体的相对数量的系统,从而混合两种不同的液体,而不需要触碰任何按钮或开关。

这种电路可以很容易地应用于任何需要控制按钮的情况,例如电梯、机床、ATM机上的数字键盘等。

电路

为了简化并高效实现这个项目,我采用了精简的电子元件组合和简洁的编程逻辑,仅使用了少量的硬件组件和几十行代码。

整个控制系统的核心是Arduino Nano,它担任着“大脑”的角色,负责接收来自传感器的输入信号,并据此控制一个蜂鸣器和两个水泵的运作。

在传感器方面,我选择了红外接近传感器,因其易用性和高灵敏度而备受青睐。这款传感器包含一个LED发射器和一个接收器,二者组合可以探测到几厘米范围内的障碍物。传感器的连接非常简便,仅需要连接Vcc(电源正极)、GND(电源负极)和OUTPUT(信号输出)三根线。

LED发射器发射的是人眼无法察觉的红外光。当该红外光遇到传感器附近的障碍物时,部分光线会被反射回来,这些反射的红外光随后被红外接收传感器捕捉到。一旦红外接收传感器检测到了足够的反射光,它会触发一个比较器电路,导致输出状态变为“高电平”。

Arduino Nano在每个工作循环中都会执行一项任务,即检查这两个红外传感器的状态(一个用于检测热水传感器附近的障碍物,另一个用于检测冷水传感器附近的障碍物)。根据传感器的状态,Arduino会执行以下操作:

  • 如果热水传感器附近检测到障碍物(例如手指),Arduino会增加输出到热水泵的方波信号的占空比,这会导致热水泵的输送量增加,从而提供更多的热水。
  • 如果冷水传感器附近检测到障碍物(例如手指),Arduino则会减少输出到冷水泵的方波信号的占空比,这将降低冷水泵的出水量,减少冷水的供应。

热水泵和冷水泵的工作是互补的:当热水供应量增加时,冷水供应量相应减少,以保持出口处水的总量相对稳定。这种设计确保了在任何时候,无论用户如何选择,都能保持水流的稳定。

如果两个传感器同时检测到障碍物(例如两个手指同时放在两个传感器上),Arduino会执行一个复位操作,即同时关闭热水泵和冷水泵,实现“关闭水龙头”的效果。这样的设计既保证了系统的安全性,也提供了用户友好的交互体验。

PWM (脉宽调制)

脉宽调制(PWM)是一种数字调制技术,它通过改变方波信号的“开”时间(即占空比)来模拟输入信号(调制信号)的幅值。简单来说,PWM信号由一系列具有固定周期但不同宽度的脉冲组成,这些脉冲的宽度与输入信号的振幅成比例。

在实际应用中,PWM信号的生成相当简单,无论是通过专门的电子电路还是像Arduino Nano这样的微控制器。在Arduino Nano中,通过编程几行代码,我们就可以控制特定引脚输出PWM信号,这些信号的占空比可以根据需要调整。

PWM技术的一个主要应用是控制电阻负载的亮度或电动机的速度,通过调整PWM信号的占空比,我们可以改变这些负载所消耗的功率。

然而,Arduino Nano的PWM引脚虽然具有256级的分辨率,但它们提供的驱动电流通常较小,仅适用于控制一些低功耗设备,如LED的亮度。对于需要更高电流的负载,尤其是感性负载(如电动机),我们通常会使用外部驱动器来避免Arduino Nano过载。

在驱动大电流感性负载时,我们通常采取以下措施:使用一个外部电源来供电,并使用功率MOSFET作为开关元件。这样,我们可以利用Arduino Nano的PWM信号来控制MOSFET的开关状态,从而实现对负载电流的精确控制。这样不仅保护了Arduino Nano免受过载损害,还提高了系统的整体效率和可靠性。

Arduino 代码

#define HOT 2 // HOT SENSOR PIN

#define COLD 3 // COLD SENSOR PIN

#define HOT_pin 6 //HOT WATER MOTOR PIN

#define COLD_pin 5 //COLD WATER MOTOR PIN

#define BUZZER_pin 9 // BUZZER PIN

int WATER = LOW;

int detectionHOT = HIGH; // NO USER

int detectionCOLD = HIGH; // NO USER

int TEMPERATURE = 0; //TEMPERATURE BETWEEN HOT AND COLD

void off(){

analogWrite(HOT_pin, 0); //PWM HOT MOTOR

analogWrite(COLD_pin,0); //PWM COLD MOTOR

delay(1500);

}

void setup() {

Serial.begin(9600);

pinMode(HOT, INPUT);

pinMode(COLD, INPUT);

pinMode(HOT_pin, OUTPUT);

pinMode(COLD_pin, OUTPUT);

pinMode(BUZZER_pin, OUTPUT);

}

void loop() {

digitalWrite(BUZZER_pin, LOW);

detectionHOT = digitalRead(HOT);

detectionCOLD = digitalRead(COLD);

if(detectionHOT == LOW and detectionCOLD == LOW){

off(); //no water

}

else {

if(detectionHOT == HIGH and detectionCOLD == HIGH){

return;

}

if(detectionHOT == LOW){

Serial.print("HOT WATER!\n");

if(TEMPERATURE < 255){

if (TEMPERATURE + 32 > 255) {

TEMPERATURE = 255;

}

else{

TEMPERATURE = TEMPERATURE + 32;

}

}

}

if(detectionCOLD == LOW){

Serial.print("COLD WATER!\n");

if(TEMPERATURE > 0){

if (TEMPERATURE - 32 < 0){

TEMPERATURE = 0;

}

else {

TEMPERATURE = TEMPERATURE - 32;

}

}

}

if(TEMPERATURE == 0 or TEMPERATURE == 255){

analogWrite(BUZZER_pin, 100);

Serial.print("\nBUZZER");

}

Serial.print("\nTemperature = ");

Serial.print(TEMPERATURE);

analogWrite(HOT_pin,TEMPERATURE); //PWM HOT MOTOR

analogWrite(COLD_pin,255-TEMPERATURE); //PWM COLD MOTOR

delay(1000); // in ms

}

}

电路原理图

电路

用面包板实现一个示例

水泵驱动电路

怎么去驱动水泵?

Similar Posts

Leave a Reply