teq 发表于 2015-10-10 22:51:36

新手改装把电热水壶改装成自动的,求指点

本帖最后由 teq 于 2015-10-10 22:57 编辑

完全是菜鸟新手,没有经验,请高手们指点一下,特别是程序。如果有更简单的方法,还请赐教

要求功能:
1、电热水壶24小时通电,到指定时间自动加水到固定水位后,加热烧开。(6点半和17点)
2、同时有一键烧水的功能,只要按一下按钮,水壶自动加水到固定水位后,加热烧开。

水壶做了改装,装了一个浮球开关来判定水位,浮球开关常开,当水位上升,浮球上升后闭合;
原配的蒸汽开关换成90度的KSD301温度开关,温度开关常闭,贴在水壶外表面,当温度上升到90度,开关断开
2路继电器,一路控制12V电磁水阀(常闭)进水,当检测到浮球阀闭合,就断电停止加水
继电器另一路控制电热水壶底部加热管,当温度开关断开时,断开加热管的电路

按钮、温度开关、浮球开关都加了1个10K的电阻,这是参考《爱上arduino》书第41页的例子,具体是为什么,我还不清楚,可能是上拉或下拉的作用,至于什么是上拉下拉,我还不知道{:soso_e120:}




//时钟模块按以下接线SCL--A5SDA--A4 VCC--5V GND--GND
#include <DS3231.h>
#include <Wire.h>
//----------------
#define LED 10// 继电器CH1信号-电磁水阀
#define HOT 11// 继电器CH2信号-热水壶加热
#define BUTTON 7 //按钮信号
#define BALL 8//浮球阀信号
#define TEP 6   //温控开关信号
int an = 0;
int ba = 0;
int te = 0;
int n = 0;
int h = 0;
int m = 0;
int s =0;

//-----------------
DS3231 Clock;
bool Century = false;
bool h12;
bool PM;
byte ADay, AHour, AMinute, ASecond, ABits;
bool ADy, A12h, Apm;
byte year, month, date, DoW, hour, minute, second;
void setup() {
// 启动I2C(IIC)接口
Wire.begin();
//以下部分是初始化时间,每次板子通电之后都会初始化成这个时间,只是测试用,以后可以删除。
//Clock.setSecond(00);//Set the second
// Clock.setMinute(31);//Set the minute 设置分钟
// Clock.setHour(21);//Set the hour 设置小时
// Clock.setDoW(7);    //Set the day of the week 设置星期几
//Clock.setDate(4);//Set the date of the month 设置月份
//Clock.setMonth(10);//Set the month of the year 设置一年中的月份
//Clock.setYear(15);//Set the year (Last two digits of the year) 设置年份(在今年的最后两位数——比如2013年最后的13)
// Start the serial interface
Serial.begin(115200);
//---------------
pinMode (LED, OUTPUT); // 继电器CH1信号-电磁水阀
pinMode (HOT, OUTPUT);   // 继电器CH2信号-热水壶加热
pinMode (BUTTON, INPUT);//按钮信号
pinMode (BALL, INPUT);//浮球阀信号
pinMode (TEP, INPUT);   //温控开关信号
//-------------------
}

void loop()
{
//ReadDS3231();
//   delay(1000);//间隔1000ms(1000ms=1秒)循环一次。
//--------------
an = digitalRead (BUTTON);//读取按钮开关的信号
ba = digitalRead (BALL);//读取浮球开关的信号
te = digitalRead (TEP);   //读取温控开关的信号
m = Clock.getMinute();    //定时自动烧水的小时
h = Clock.getHour(h12, PM); //定时自动烧水的分钟
s= Clock.getSecond();定时自动烧水的秒钟
if (te == LOW)   //一开始就检查温控开关,如果温控开关是断开的,即水温已经达到95度,
{
    digitalWrite(HOT, LOW); //则继电器CH2信号为断开,热水壶不加热
}
else {
    if (h == 6 && m == 35 && s==1||h == 16 && m == 50 && s==1) //检查时间是否符合定时自动烧水时间,如果到了
    { n =1;                         //引入变量n
      digitalWrite(LED, HIGH);      //继电器CH1信号通电,电磁水阀开始加水
      if (n == 1) {
      if (ba == HIGH)               //如果浮球开关通电,即加水已经到达水位,
      { digitalWrite(LED, LOW);   //则继电器CH1信号断电,电磁水阀停止加水
          digitalWrite(HOT, HIGH);    //然后继电器CH2信号为通,热水壶开始加热
          n = 0;                      //一个定时烧水流程结束,变量n设为0
      }
      }
    }
    { if (an == HIGH)               //如果按钮开关按下,即开始一键烧水
      {
      n =1;                     //引入变量n
      digitalWrite(LED, HIGH);      //继电器CH1信号通电,电磁水阀开始加水
      }
      if (n == 1) {
      if (ba == HIGH)               //如果浮球开关通电,即加水已经到达水位,
      { digitalWrite(LED, LOW);   //则继电器CH1信号断电,电磁水阀停止加水
          digitalWrite(HOT, HIGH);    //然后继电器CH2信号为通,热水壶开始加热
          n = 0;                     //一个定时烧水流程结束,变量n设为0
      }
      }
    }
}
}


sleept 发表于 2015-10-11 08:06:51

想法是好的,但是估计使用起来会很麻烦,每次用水后都须要连接外部的温度感应开关、浮球开关后才能再次使用,没有节省一点操作,反而增加了不少。

如果想做这个建议做成家延智能物联,温度感应以及浮球开关全部使用WIFI连接,壶身模块等全部由壶底电源转后连接。还有最好保留蒸汽开关,做为一个保险,防止由于感应元件故障或网络等原因无法断开造成危险。

我只是提供你一个思路,水壶这种东西由于特殊性没有必要成智能物联控制,因为你总须要做开水后来拿一下,用完水后还得放回去。操作不能减少了。

最多做到一个开水后可以远程提醒,可以防止开水后忘记,白白浪费能源。

独行者 发表于 2015-10-11 08:12:50

楼主辛苦,谢谢分享。学习中。。。

164335413 发表于 2015-10-12 08:51:48

当引脚作为输入时,上拉或下拉电阻可以很好的将电平锁定,防止干扰引起的波动造成误识别。作为输出时也是为了提供给外设稳定的信号,不然也会造成外设模块误动作。

86588988 发表于 2015-10-13 20:55:59

新手同交流

wxws 发表于 2015-10-15 13:21:44

称重检测水量比较好,
自已加温度传感控制烧水更好

很多功能就自己程序中来实现了,
也容易改成wifi之类的变“智能”
页: [1]
查看完整版本: 新手改装把电热水壶改装成自动的,求指点