『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 33867|回复: 32

智能循环泵制作安装教程

  [复制链接]

8

主题

110

帖子

957

积分

论坛技术达人

积分
957
金钱
832
HASS币
40
发表于 2018-10-19 19:44:02 | 显示全部楼层 |阅读模式
本帖最后由 jedmeng 于 2018-10-19 19:56 编辑

之前发了一过帖子,“自制智能循环泵,享受“即开即热”的生活”,本意介绍一下思路,抛砖引玉。结果囧大还有几个朋友都比较感兴趣,所以又又了这个帖子,讲一下详细制作安装过程。由于过程中没怎么拍照,现在装在天花板上不太好上去拍,所以实物图不多,大家见谅。


帖子超长了,只好分楼发:
(原来不是帖子超长,可能是图片的问题。管他的,反正已经分了,就这样把)

二楼:水路部分
三楼:电路部分
四楼:固件部分
五楼:程序部分

评分

参与人数 3金钱 +45 HASS币 +20 收起 理由
neroxps + 20 强贴留名。
laynexx + 5 大神666!
+ 20 + 20 楼主辛苦了,精华奉上!

查看全部评分

回复

使用道具 举报

8

主题

110

帖子

957

积分

论坛技术达人

积分
957
金钱
832
HASS币
40
 楼主| 发表于 2018-10-19 19:45:15 | 显示全部楼层
本帖最后由 jedmeng 于 2018-10-19 19:54 编辑

一、水管部分

水管部分整体示意图如下,其中阀门左侧为既有管道的末端,右侧为新增部分。
1.png

实际效果图:
2.png

其中包含了以下部分:

1. 铜管件
铜管件主要是连接使用,根据具体情况可能会用到弯头、三通等。水泵两端还一般需要两个4分-6分活接头,大部分水泵会自带。

2. 温度传感器 3.png
这里用的pt100热电阻,封装在不锈钢盲管中。这个可以去马云家买,线长和盲管长度都可以定制,注意丝口尺寸别选错。
我把它和三通装在一起了,像这样:
4.png

实际安装效果:
5.png

3. POM快接管件
目前绝大部分的家庭水管应该都是PPR管,最常见的管件是热熔管件。但是热熔操作相复杂,需要专业热熔设备,而且操作不可逆,一旦手滑失误没办法复原。

我选用了快接管件,无需热熔,强度也够用,即便是装好有问题也很方便拆下来改动。
6.png

4. 不锈钢波纹管
因为既有管路位置固定,很难改动,如果选用新增部分和既有部分使用刚性连接,则对安装精度要求很高。为了避免安装偏差带来的问题,所以连接的部分使用了柔性管路。

常见的不锈钢软管有两种:不锈钢软管(织纹管)、不锈钢波纹管。不锈钢软管在外壳里还有一层橡胶柔管,柔韧性较好,最常见的是连接花洒的管道。不锈钢波纹管则只有一层不锈钢壳,所以柔韧性差一点,但没有橡胶层,所以寿命更长。我选用了后者。

5. 阀门
阀门用于隔离新装的部分,它不是必须的,但强烈建议安装,方便后续检修。我装的是家里之前拆下来的的普通角阀,角阀会对流量有一定的影响,不过几乎不影响使用。需要大流量的可以考虑三角阀或球阀等。

6. 水泵
水泵我是在马云家买的100W的增压泵。实测数据,15米4分水管,末端升温至40℃大约用时50秒,大家可以参考。如果管路更长或更粗的可以考虑加大水泵功率。

经过网友提醒,水泵可能会给热水器(壁挂炉)带来额外的压力,尤其在使用大功率水泵时可以酌情考虑增加膨胀水箱。

7. 电磁阀
电磁阀的作用是平时阻断热水管与凉水管的联通,防止串流。常见的电磁阀有12v、24v和220v几种,为了方便我用得是220v,直接接市电,由继电器控制。因为阀门关闭的时长远远大于打开的时长,所以选用常闭式电磁阀。需要注意电磁有方向性,装反了则起不到阻断的效果。


回复

使用道具 举报

8

主题

110

帖子

957

积分

论坛技术达人

积分
957
金钱
832
HASS币
40
 楼主| 发表于 2018-10-19 19:46:29 | 显示全部楼层
本帖最后由 jedmeng 于 2018-10-19 19:59 编辑

二、电路部分

电路部分整体图示如下:
11.png


1. 水泵和电磁阀
水泵和电磁阀直接连接市电,火线串入继电器控制通断。由于水泵属于感性负载,当水泵超过300W时注意选用大功率继电器(>10A)。

2. 温度传感器
PT100接线方式分为2线、3线、4线几种,其中3线最常见、4线精度最高。
PT100连接的是MAX31865芯片。MAX31865是一款集成的RTD转换芯片,它支持PT100、PT1000两种热电阻,支持2、3、4线连接,最高精度0.5℃。
MAX31865使用SPI协议,除电源外需要连接4跟线到ESP8266相应的引脚。
连接线如图,注意图中需要短接的两个焊点:
7.png

3. 遥控开关
此部分可以省略,联网接入HA后可以使用小米无线按键、智能音箱等控制。不过独立组件的好处是可靠性要更高一些。
8.png

我用的是在马云家买的一组433接收器+随意贴发射器的套装。按键点动式控制继电器通断,继电器一端连接GND一端连接数字引脚。

4. ESP8266
我选用的ESP-07S模块,因为考虑到要安装到厕所铝扣板吊顶上方,无线信号可能不好,而ESP-07S带有IPX接口,可以使用外接天线。
但是ESP-07S没找到现成的模块,只有一块转接板,需要自己焊接。
为了方便以后调试和升级固件,没有直接把线焊接在转接板上,而是用一块洞洞板作为母版。母版上焊接了插ESP-07S的排针座和各种连线。
9.png 10.png

5. 电源
电源用的旧手机电源,接了一个降压模块降到3.3V。
回复

使用道具 举报

8

主题

110

帖子

957

积分

论坛技术达人

积分
957
金钱
832
HASS币
40
 楼主| 发表于 2018-10-19 19:47:43 | 显示全部楼层
本帖最后由 jedmeng 于 2018-10-19 20:05 编辑

三、固件部分
固件使用的是nodemcu,它支持使用lua语言开发,相对C语言更加便捷。但nodemcu的弊端也很明显,和其他脚本语言一样,对内存的使用效率较低。使用float固件时mqtts完全无法建立连接,即便使用int固件mqtts连接也极易失败。以至于最后不得以,我只好家里的mqtt服务的ssl加密去掉了。

1. 编译固件
编译固件有几种方式:本地编译、docker编译、云编译等。
推荐使用云编译,十分方便:https://nodemcu-build.com/
编译时勾选以下依赖模块:bit、file、gpio、http、mqtt、node、spi、timer、wifi
点击编译之后大约2-3分钟就能收到邮件,邮件中会给出固件的下载链接。

2. 烧录固件
烧录前需要将ESP模块GPIO0管脚接地以便进入烧录模式,之后使用USB-TTL连接ESP模块。
打开“NodeMCU PyFlasher”,选择正确的串口和下载好的固件文件,波特率选115200,其他不动,点击“烧录”
12.png

3. 上传代码
(这里先讲上传的方法,具体代码见第四部分)
取掉GPIO0的接地,进入正常启动模式。
打开ESPlorer,点击右侧“连接”按钮。点左侧“上传”,选择写好的lua脚本文件,点击确定。
注意观察右侧的记录,如果遇到某个文件上传失败,则重新上传。
13.png

P.S. 我在这一步遇到一点问题,当取消掉GPIO0接地后,电脑中死活找不到这个串口设备。怎么尝试都不行,我甚至一度怀疑ESP模块在焊接时被烫坏了。后来在一个国外的网站上看有人提到供电的问题,于是在连接USB-TTL时外加了独立的供电,果然一切正常了。

回复

使用道具 举报

8

主题

110

帖子

957

积分

论坛技术达人

积分
957
金钱
832
HASS币
40
 楼主| 发表于 2018-10-19 19:50:20 | 显示全部楼层
本帖最后由 jedmeng 于 2018-10-19 20:16 编辑

第四部分:代码
代码写的比较匆忙比较乱,就不全放上来了,只把控制相关的部分贴上来。

1. 水泵和电磁阀

local isPumoOn = false

-- 初始化
gpio.mode(GPIO_BUTTON_PIN, gpio.INT, gpio.PULLUP)
gpio.mode(GPIO_PUMP_PIN, gpio.OUTPUT)
gpio.mode(GPIO_VALVE_PIN, gpio.OUTPUT)
gpio.write(GPIO_PUMP_PIN, GPIO_PUMP_INIT)
gpio.write(GPIO_VALVE_PIN, GPIO_VALVE_INIT)

-- 订阅mqtt消息
MQTT.subscribe(MQTT_TOPIC_PUMP, function(payload)
    if payload == MQTT_PAYLOAD_ON and not isPumoOn then
        turnPumpOn()
    elseif payload == MQTT_PAYLOAD_OFF and isPumoOn then
        turnPumpOff()
    end
end)

-- 按键防抖
local buttonTrigger = false
buttonTimer = tmr.create()
buttonTimer:register(100, tmr.ALARM_SEMI, function()
    buttonTrigger = false
end)

-- 响应按键动作
gpio.trig(GPIO_BUTTON_PIN, 'low', function()
    if gpio.read(GPIO_BUTTON_PIN) == gpio.HIGH then
        return
    end

    buttonTimer:stop()
    buttonTimer:start()
    if buttonTrigger == true then
        return
    end

    buttonTrigger = true
    debug("pump button trigger")

    if isPumoOn then
        turnPumpOff()
    else
        turnPumpOn()
    end
end)

-- 间隔100ms查询水温,到达阈值后关闭水泵
timer = tmr.create()
timer:register(100, tmr.ALARM_AUTO, function()
    if THERM.temperature() >= TEMPERATURE_THRESHOULD then
        turnPumpOff()
    end
end)

-- 开启水泵和电磁阀
function turnPumpOn()
    isPumoOn = true
    gpio.write(GPIO_VALVE_PIN, GPIO_VALVE_ON)
    gpio.write(GPIO_PUMP_PIN, GPIO_PUMP_ON)
    MQTT.publish(MQTT_TOPIC_PUMP, MQTT_PAYLOAD_ON)

    THERM.start()
    timer:start()
    debug("pump on")
end

-- 关闭水泵和电磁阀
function turnPumpOff()
    isPumoOn = false
    gpio.write(GPIO_PUMP_PIN, GPIO_PUMP_OFF)
    gpio.write(GPIO_VALVE_PIN, GPIO_VALVE_OFF)
    MQTT.publish(MQTT_TOPIC_PUMP, MQTT_PAYLOAD_OFF)

    THERM.stop()
    timer:stop()
    debug("pump off")
end



2. 温度传感器

-- 计算温度用到的两个常数
local RTD_A = 3.9083e-3
local RTD_B = -5.775e-7

-- 这个是MAX31865模块中参照电阻的阻值,一般在400左右
local R_REF = 430

THERM = {}

-- 初始化温度传感器
function THERM.init()
    spi.setup(SPI_ID, spi.MASTER, spi.CPOL_LOW, spi.CPHA_HIGH, 8, 40)
    gpio.mode(SPI_PIN_CS, gpio.OUTPUT)
    gpio.write(SPI_PIN_CS, gpio.LOW)

    -- 设置使用三线电阻
    local config = THERM.read(0x00)
    config = bit.bor(config, 0x10)

    config = 0xD2
    THERM.write(0x00, config)
end

-- 从SPI读入
function THERM.read(add)
    gpio.write(SPI_PIN_CS, gpio.LOW)
    spi.send(SPI_ID, add)
    local data = spi.recv(SPI_ID, 1)
    gpio.write(SPI_PIN_CS, gpio.HIGH)
    return string.byte(data)
end

-- 写入到SPI
function THERM.write(add, data)
    gpio.write(SPI_PIN_CS, gpio.LOW)
    spi.send(SPI_ID, bit.bor(add, 0x80), data)
    gpio.write(SPI_PIN_CS, gpio.HIGH)
end

-- 开始测温
function THERM.start()
    -- 使能BIAS、开启自动转换
    local config = THERM.read(0x00)
    config = bit.bor(config, 0xC0)
    THERM.write(0x00, config)
    debug("thermonmeter start")
end

-- 结束测温
function THERM.stop()
    -- 去使能BIAS、关闭自动转换
    local config = THERM.read(0x00)
    config = bit.band(config, 0x3)
    THERM.write(0x00, config)
    debug("thermonmeter stop")
end

-- 读取并计算温度
function THERM.temperature()
    local r1 = THERM.read(0x01)
    local r2 = THERM.read(0x02)

    local adc = bit.lshift(r1, 7) + bit.rshift(r2, 1)
    local rtd = adc * R_REF / 32768

    local z1 = -RTD_A
    local z2 = RTD_A * RTD_A - (4 * RTD_B)
    local z3 = (4 * RTD_B) / 100
    local z4 = 2 * RTD_B

    local temp = (math.sqrt(z2 + (z3 * rtd)) + z1) / z4;
    debug("temperature: " .. temp)

    return temp
end

THERM.init()


回复

使用道具 举报

27

主题

2143

帖子

8930

积分

论坛元老

Rank: 8Rank: 8

积分
8930
金钱
6782
HASS币
30

论坛元老

发表于 2018-10-19 19:51:45 | 显示全部楼层
沙发是我?
回复

使用道具 举报

0

主题

316

帖子

1732

积分

金牌会员

Rank: 6Rank: 6

积分
1732
金钱
1416
HASS币
0
发表于 2018-10-19 21:37:52 | 显示全部楼层
看来买厨下宝的计划可以换了
回复

使用道具 举报

3

主题

203

帖子

604

积分

高级会员

Rank: 4

积分
604
金钱
399
HASS币
0
发表于 2018-10-19 21:56:22 | 显示全部楼层
膜拜大神
回复

使用道具 举报

0

主题

245

帖子

1813

积分

金牌会员

Rank: 6Rank: 6

积分
1813
金钱
1568
HASS币
0
发表于 2018-10-20 11:37:51 | 显示全部楼层
膜拜大神。请教大神一下,我想用土壤湿度传感器,来控制自动浇水,需要用什么方案。

现有硬件:小米智能插座和电磁阀,已经能实现远程控制水阀开关,现在想添加一个土壤湿度传感器,初步看中了大连哲勤科技的一款,参数如下

参数

参数

回复

使用道具 举报

19

主题

457

帖子

8161

积分

元老级技术达人

云淡风轻近午天

积分
8161
金钱
7704
HASS币
0

教程狂人

发表于 2018-10-20 20:21:10 | 显示全部楼层
看看大神的作品
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-11-24 09:37 , Processed in 0.355883 second(s), 36 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表