精简版智能植物生长机,快速打造绿植守护神

更新时间Invalid date

概况

我们已经设计了一款功能极全面的 智慧植物生长系统,解决了几乎所有植物生长机的功能需求。但由于功能较为全面,不便于快速制作,然后我们又设计了这款精简版的智能植物生长机,让您能够快速制作出一台智能植物生长机。

功能设计

为了方便更多涂鸦爱好者制作植物生长机,这款精简版的智能植物生长机将会实现以下功能:

  • 涂鸦智能App远程遥控和监测
  • 监测土壤湿度
  • 智能补光
  • 自动浇水
  • 自定义补光颜色

预期功能逻辑

SmartPlanterLite.png

物料清单

硬件 (13)软件 (3) 其它 (18)
  • 涂鸦三明治 Wi-Fi SoC 主控板(WB3S)

    数量:1

    方便开发者快速实现各种智能硬件产品原型的一款开发板。查看详情

  • 智能植物生长机功能板

    数量:1

    用来实现 DC 12V 供电、5V 水泵控制、读取土壤湿度模拟量、4 路 PWM 灯板控制。

  • 4路PWM灯板

    数量:1

    用来实现 RGBW 四路调光功能,可通过 App 调节各个颜色的灯的亮度值,从而调配出植物生长所需要的不同类型的光照。

  • 立式直流水泵

    数量:1

    解决浇水动力输出。

  • 电容式土壤湿度传感器模块

    数量:1

    检测土壤湿度

  • XH 2.54 端子线 2P

    数量:1

    推荐规格为 80mm,2p,XH单头

  • XH 2.54端子线 3P

    数量:1

    推荐规格为150mm,3p,XH双头一正一反

  • XH 2.54端子线 5P

    数量:1

    推荐规格为400mm,5P,XH双头一正一反

  • C 型灯架(定制亚克力)

    数量:1

    外形搭建

  • 水箱结构

    数量:1

    推荐采用 3D 打印

  • M3*16平头机牙螺丝

    数量:8

    推荐规格为标准件

  • M3 六角螺母

    数量:4

    推荐规格为标准件

  • 硅胶水管

    数量:1

    与水泵链接

步骤

第一步:设计功能板

我们选取 涂鸦三明治 Wi-Fi SoC 主控板(WB3S) 作为主控。由此,我们需要设计一块智能植物生长机功能板,它可以实现以下功能:

  • DC 12V 供电
  • 5V 水泵控制
  • 读取土壤湿度模拟量
  • 4 路 PWM 灯板控制

相关设计思路如下:

  • 原理图(点击下载原理图 PDF 文件

    image.png

  • PCB 设计(点击下载 PCB PDF 文件

  • PCB 制板(点此下载 Gerber ZIP 文件

    image.png

  • 绘制坐标文件(点击下载 CSV 文件

    标志 封装 Mid X Mid Y Ref X Ref Y Pad X Pad Y 图层 旋转(°) 说明
    L1 IND-SMD_L5.0-W5.0-P3.60_SMNR5040 9.02mm -15.24mm 9.02mm -15.24mm 9.02mm -17.04mm T 90 68uH
    U2 R0603 30.35mm -19.94mm 30.35mm -19.94mm 31.11mm -19.94mm T 180 0603L100SLYR
    R2 R0603 45.21mm -18.41mm 45.21mm -18.41mm 44.46mm -18.41mm T 0 1K
    D2 SMB_L4.6-W3.6-LS5.3-BI 24.26mm -5.33mm 24.26mm -5.33mm 24.26mm -2.74mm T 270 SMBJ12CA_C699031
    U5 HDR-TH_8P-P2.54-V 16.33mm -75.56mm 16.33mm -75.56mm 16.33mm -66.67mm T 270 MTP125-1108S1
    U6 HDR-TH_8P-P2.54-V 64.59mm -57.78mm 64.59mm -57.78mm 64.59mm -48.89mm T 270 MTP125-1108S1
    C1 CAP-SMD_BD10.0-L10.3-W10.3-FD 32.77mm -6.98mm 32.77mm -6.98mm 32.77mm -2.79mm T 90 470uF
    U3 SOT-223_L6.5-W3.5-P2.30-LS7.0-BR 38.23mm -17.65mm 38.23mm -17.65mm 35.37mm -15.35mm T 180 ASPL1117-3.3-DT-R/SOT223
    CN2 CONN-TH_XH-3AW 61.98mm -33.53mm 61.98mm -33.53mm 61.98mm -31.03mm T 270 XH-3AW
    F1 F1206 18.8mm -2.79mm 18.8mm -2.79mm 17.5mm -2.79mm T 0 JK-NSMD300L-12V
    U4 HDR-TH_10P-P2.54-V 16.38mm -51.18mm 16.38mm -51.18mm 16.38mm -39.75mm T 270 MTP125-1110S1
    U1 SOIC-8_L5.0-W4.0-P1.27-LS6.0-BL 24.51mm -17.78mm 24.51mm -17.78mm 21.81mm -15.87mm T 270 XL1509-5.0E1
    Q1 SOT-23_L2.9-W1.3-P0.95-LS2.4-BR 48.77mm -17.14mm 48.77mm -17.14mm 47.82mm -18.34mm T 270 NCE3401AY
    DC1 DC-IN-TH_DC005 10.8mm -95.89mm 10.8mm -95.88mm 13.89mm -93.53mm T 0 dc-005 5.5-2.0
    CN1 CONN-TH_2P-P2.50_XH-2AW 50mm -7.75mm 50mm -7.75mm 48.75mm -7.75mm T 0 XH-2AW
    D1 SMA_L4.4-W2.8-LS5.4-RD 17.65mm -12.83mm 17.65mm -12.83mm 17.65mm -15.39mm T 90 SS34_C83961
    C2 C0603 40.01mm -3.43mm 40.01mm -3.43mm 40.01mm -4.13mm T 90 1uF
    U7 HDR-TH_6P-P2.54-V 64.59mm -78.1mm 64.59mm -78.1mm 64.59mm -71.75mm T 270 MTP125-1106S1
    C4 C0603 30.35mm -18.03mm 30.35mm -18.03mm 29.65mm -18.03mm T 0 10uF
    C5 C0603 30.35mm -16.13mm 30.35mm -16.13mm 29.65mm -16.13mm T 0 10uF
    C3 CAP-SMD_BD8.0-L8.3-W8.3-RD 8.89mm -24.26mm 8.89mm -24.26mm 8.89mm -20.96mm T 270 47uF
    CN3 CONN-TH_XH-6AW 61.98mm -17.02mm 61.98mm -17.02mm 61.98mm -10.77mm T 90 XH-6AW
    R1 R0603 48.64mm -20.83mm 48.64mm -20.83mm 49.39mm -20.83mm T 180 100K
  • BOM清单(点击下载 CSV 文件

    ID 名称 代号 封装 数量
    1 470uF C1 CAP-SMD_BD10.0-L10.3-W10.3-FD 1
    2 1uF C2 C0603 1
    3 47uF C3 CAP-SMD_BD8.0-L8.3-W8.3-RD 1
    4 10uF C4,C5 C0603 2
    5 XH-2AW CN1 CONN-TH_2P-P2.50_XH-2AW 1
    6 XH-3AW CN2 CONN-TH_XH-3AW 1
    7 XH-6AW CN3 CONN-TH_XH-6AW 1
    8 SS34_C83961 D1 SMA_L4.4-W2.8-LS5.4-RD 1
    9 SMBJ12CA_C699031 D2 SMB_L4.6-W3.6-LS5.3-BI 1
    10 dc-005 5.5-2.0 DC1 DC-IN-TH_DC005 1
    11 JK-NSMD300L-12V F1 F1206 1
    12 68uH L1 IND-SMD_L5.0-W5.0-P3.60_SMNR5040 1
    13 NCE3401AY Q1 SOT-23_L2.9-W1.3-P0.95-LS2.4-BR 1
    14 100K R1 R0603 1
    15 1K R2 R0603 1
    16 XL1509-5.0E1 U1 SOIC-8_L5.0-W4.0-P1.27-LS6.0-BL 1
    17 0603L100SLYR U2 R0603 1
    18 ASPL1117-3.3-DT-R/SOT223 U3 SOT-223_L6.5-W3.5-P2.30-LS7.0-BR 1
    19 MTP125-1110S1 U4 HDR-TH_10P-P2.54-V 1
    20 MTP125-1108S1 U5,U6 HDR-TH_8P-P2.54-V 2
    21 MTP125-1106S1 U7 HDR-TH_6P-P2.54-V 1

第二步:设计 4 路 PWM 灯板

一:光谱成分对植物的影响

波长辐射范围 影响
大于 1.00μm 被植物吸收转化为热能,影响植物体温和蒸腾情况,可促进干物质的积累,但不参与光合作用。
720-800nm 的远红外光 对光周期及种子的形成有重要作用,并控制开花与果实的颜色。
720-1000nm 对植物伸长起作用。
610-720nm 的红光、橙光 可被叶绿素强烈吸收,某种情况下表现为强的光周期作用。
510-610nm 的光,主要为绿光 表现为的光合作用与弱成形作用。
400-510m 的光,主要为蓝紫光 被叶绿素和黑色素强烈吸收,表现为强的光合作用与成形作用。
320-400nm 的光,主要为紫外光 紫外辐射起成形和着色作用,如使植物变矮,颜色变深,叶片变厚等。
280-320nm 的紫外线 对大多数植物有害。
小于280nm 的远紫外辐射 可立即杀死植物。

二:灯珠选择

根据光谱成分对植物生长的影响,我们选用以下五种灯珠作为灯板的发光部件:

  • 接线原理图(点此下载 PDF 文件

    image.png

  • PCB 设计(点击下载PDF文件

  • PCB 制板(点此下载 Gerber ZIP 文件

    image.png

  • PCB 坐标文件(点击下载 CSV 文件

    代号 封装 Mid X Mid Y Ref X Ref Y Pad X Pad Y 图层 旋转(°) 说明
    R1 R0603 -910mil 315mil -910mil 315mil -910mil 285.34mil B -90 0.5
    R2 R0603 -910mil 115mil -910mil 115mil -910mil 85.34mil B -90 0.8
    R3 R0603 -900mil -75mil -900mil -75mil -900mil -104.66mil B -90 0.8
    R4 R0603 -900mil -280mil -900mil -280mil -900mil -309.66mil B -90 0.8
    C1 C0603 -840mil 315mil -840mil 315mil -840mil 287.44mil B -90 4.7uF
    C2 C0603 -830mil 115mil -830mil 115mil -830mil 87.44mil B -90 4.7uF
    C3 C0603 -830mil -70mil -830mil -70mil -830mil -97.56mil B -90 4.7uF
    C4 C0603 -830mil -280mil -830mil -280mil -830mil -307.56mil B -90 4.7uF
    U1 SOT-89-5_L4.5-W2.5-P1.50-LS4.5-BR -1121.1mil 314.96mil -1121.1mil 314.96mil -1187.93mil 374.01mil B 0 MT7201C
    U2 SOT-89-5_L4.5-W2.5-P1.50-LS4.5-BR -1121.1mil 118.11mil -1121.1mil 118.11mil -1187.93mil 177.16mil B 0 MT7201C
    U3 SOT-89-5_L4.5-W2.5-P1.50-LS4.5-BR -1120mil -75.01mil -1120mil -75mil -1186.83mil -15.95mil B 0 MT7201C
    U4 SOT-89-5_L4.5-W2.5-P1.50-LS4.5-BR -1121.1mil -275.6mil -1121.1mil -275.59mil -1187.93mil -216.54mil B 0 MT7201C
    C5 C0603 -1355mil 340mil -1355mil 340mil -1355mil 312.44mil B -90 4.7uF
    C6 C0603 -1355mil 145mil -1355mil 145mil -1355mil 117.44mil B -90 4.7uF
    C7 C0603 -1355mil -45mil -1355mil -45mil -1355mil -72.56mil B -90 4.7uF
    C8 C0603 -1355mil -250mil -1355mil -250mil -1355mil -277.56mil B -90 4.7uF
    LED31 LED-SMD_L3.5-W2.8-RD_TJ-S2835UG5W8TLC2R-A5 175mil -375mil 175mil -375mil 219.78mil -375mil T 0 2835 850nm红外LED
    LED1 LED-SMD_L3.3-W2.8-RD 1479.83mil 538.61mil 1479.83mil 538.61mil 1437.01mil 538.61mil T 0 2835 暖白LED
    LED2 LED-SMD_L3.3-W2.8-RD 787.39mil 1363.82mil 787.4mil 1363.82mil 744.58mil 1363.82mil T 0 2835 暖白LED
    LED3 LED-SMD_L3.3-W2.8-RD -273.47mil 1550.88mil -273.46mil 1550.88mil -316.28mil 1550.88mil T 0 2835 暖白LED
    LED4 LED-SMD_L3.3-W2.8-RD -1206.37mil 1012.26mil -1206.37mil 1012.26mil -1249.19mil 1012.26mil T 0 2835 暖白LED
    LED5 LED-SMD_L3.3-W2.8-RD -1574.81mil 0mil -1574.8mil 0mil -1617.62mil 0mil T 0 2835 暖白LED
    LED6 LED-SMD_L3.3-W2.8-RD -1206.37mil -1012.26mil -1206.37mil -1012.26mil -1249.19mil -1012.26mil T 0 2835 暖白LED
    LED7 LED-SMD_L3.3-W2.8-RD -273.45mil -1550.88mil -273.46mil -1550.88mil -230.64mil -1550.88mil T 180 2835 暖白LED
    LED8 LED-SMD_L3.3-W2.8-RD 787.4mil -1363.82mil 787.4mil -1363.82mil 830.22mil -1363.82mil T 180 2835 暖白LED
    LED9 LED-SMD_L3.3-W2.8-RD 1479.83mil -538.61mil 1479.83mil -538.61mil 1437.01mil -538.61mil T 0 2835 暖白LED
    D1 SMB_L4.6-W3.6-LS5.3-L-FD 1455mil 310mil 1455mil 310mil 1368mil 310mil T 0 SMBJ12A_C294866
    D2 SMB_L4.6-W3.6-LS5.3-L-FD 1455mil 110mil 1455mil 110mil 1368mil 110mil T 0 SMBJ12A_C294866
    D3 SMB_L4.6-W3.6-LS5.3-L-FD 1455mil -85mil 1455mil -85mil 1368mil -85mil T 0 SMBJ12A_C294866
    D4 SMB_L4.6-W3.6-LS5.3-L-FD 1455mil -285mil 1455mil -285mil 1368mil -285mil T 0 SMBJ12A_C294866
    LED16 LED-SMD_L3.5-W2.8-R-RD_TJ-S2835UG5W8TLC6B-A5 755mil 330mil 755mil 330mil 710.22mil 330mil T 180 2835 绿色LED
    LED17 LED-SMD_L3.5-W2.8-R-RD_TJ-S2835UG5W8TLC6B-A5 -100mil 835mil -100mil 835mil -144.78mil 835mil T 180 2835 绿色 LED
    LED18 LED-SMD_L3.5-W2.8-R-RD_TJ-S2835UG5W8TLC6B-A5 -760mil 335mil -760mil 335mil -715.22mil 335mil T 0 2835 绿色 LED
    LED19 LED-SMD_L3.5-W2.8-R-RD_TJ-S2835UG5W8TLC6B-A5 -755mil -645mil -755mil -645mil -710.22mil -645mil T 0 2835 绿色LED
    LED20 LED-SMD_L3.5-W2.8-R-RD_TJ-S2835UG5W8TLC6B-A5 100mil -1140mil 100mil -1140mil 55.22mil -1140mil T 180 2835 绿色LED
    LED21 LED-SMD_L3.5-W2.8-R-RD_TJ-S2835UG5W8TLC6B-A5 955mil -650mil 955mil -650mil 999.78mil -650mil T 0 2835 绿色LED
    LED10 LED-SMD_L3.5-W2.8-R-RD_TJ-S2835UG5W8TLC6B-A5 950mil 330mil 950mil 330mil 994.78mil 330mil T 0 2835 蓝色LED
    LED11 LED-SMD_L3.5-W2.8-R-RD_TJ-S2835UG5W8TLC6B-A5 95mil 835mil 95mil 835mil 139.78mil 835mil T 0 2835 蓝色LED
    LED12 LED-SMD_L3.5-W2.8-R-RD_TJ-S2835UG5W8TLC6B-A5 -955mil 335mil -955mil 335mil -999.78mil 335mil T 180 2835 蓝色LED
    LED13 LED-SMD_L3.5-W2.8-R-RD_TJ-S2835UG5W8TLC6B-A5 -955mil -645mil -955mil -645mil -999.78mil -645mil T 180 2835 蓝色LED
    LED14 LED-SMD_L3.5-W2.8-R-RD_TJ-S2835UG5W8TLC6B-A5 -90mil -1140mil -90mil -1140mil -134.78mil -1140mil T 180 2835 蓝色LED
    LED15 LED-SMD_L3.5-W2.8-R-RD_TJ-S2835UG5W8TLC6B-A5 755mil -650mil 755mil -650mil 710.22mil -650mil T 180 2835 蓝色LED
    LED22 LED-SMD_L3.5-W2.8-RD_TJ-S2835UG5W8TLC2R-A5 852.39mil 492.12mil 852.39mil 492.13mil 852.39mil 536.91mil T 90 2835 660nm红色LED
    LED23 LED-SMD_L3.5-W2.8-RD_TJ-S2835UG5W8TLC2R-A5 0mil 984.26mil 0mil 984.25mil 0mil 1029.04mil T 90 2835 660nm红色LED
    LED24 LED-SMD_L3.5-W2.8-RD_TJ-S2835UG5W8TLC2R-A5 -852.39mil 492.12mil -852.39mil 492.13mil -852.39mil 536.91mil T 90 2835 660nm红色LED
    LED25 LED-SMD_L3.5-W2.8-RD_TJ-S2835UG5W8TLC2R-A5 -852.39mil -492.12mil -852.39mil -492.13mil -852.39mil -447.34mil T 90 2835 660nm红色LED
    LED26 LED-SMD_L3.5-W2.8-RD_TJ-S2835UG5W8TLC2R-A5 0mil -984.26mil 0mil -984.25mil 0mil -939.47mil T 90 2835 660nm红色LED
    LED27 LED-SMD_L3.5-W2.8-RD_TJ-S2835UG5W8TLC2R-A5 852.39mil -492.12mil 852.39mil -492.13mil 852.39mil -447.34mil T 90 2835 660nm红色LED
    LED29 LED-SMD_L3.5-W2.8-RD_TJ-S2835UG5W8TLC2R-A5 170mil 360mil 170mil 360mil 214.78mil 360mil T 0 2835 850nm红外LED
    LED30 LED-SMD_L3.5-W2.8-RD_TJ-S2835UG5W8TLC2R-A5 -393.7mil 0mil -393.7mil 0mil -438.48mil 0mil T 180 2835 850nm红外LED
    CN3 CONN-TH_XH-6AW 1653.54mil 0mil 1653.54mil 0mil 1653.54mil 246.1mil T 90 XH-6AW
    L1 IND-SMD_L3.5-W3.0_GSDR32P 1200mil 305mil 1200mil 305mil 1148.82mil 305mil T 0 47uH
    L2 IND-SMD_L3.5-W3.0_GSDR32P 1200mil 108.15mil 1200mil 108.15mil 1148.82mil 108.15mil T 0 47uH
    L3 IND-SMD_L3.5-W3.0_GSDR32P 1200mil -88.7mil 1200mil -88.7mil 1148.82mil -88.7mil T 0 47uH
    L4 IND-SMD_L3.5-W3.0_GSDR32P 1200mil -285.55mil 1200mil -285.55mil 1148.82mil -285.55mil T 0 47uH
  • BOM 清单(点此下载 CSV 文件

    ID 名称 代号 封装 数量
    1 4.7uF C1,C2,C3,C4 C0603 4
    2 4.7uF C5,C6,C7,C8 C0603 4
    3 XH-6AW CN3 CONN-TH_XH-6AW 1
    4 SMBJ12A_C294866 D1,D2,D3,D4 SMB_L4.6-W3.6-LS5.3-L-FD 4
    5 47uH L1,L2,L3,L4 IND-SMD_L3.5-W3.0_GSDR32P 4
    6 2835 暖白LED LED1,LED2,LED3,LED4,LED5,LED6,LED7,LED8,LED9 LED-SMD_L3.3-W2.8-RD 9
    7 2835 蓝色LED LED10,LED11,LED12,LED13,LED14,LED15 LED-SMD_L3.5-W2.8-R-RD_TJ-S2835UG5W8TLC6B-A5 6
    8 2835 绿色LED LED16,LED17,LED18,LED19,LED20,LED21 LED-SMD_L3.5-W2.8-R-RD_TJ-S2835UG5W8TLC6B-A5 6
    9 2835 660nm红色LED LED22,LED23,LED24,LED25,LED26,LED27 LED-SMD_L3.5-W2.8-RD_TJ-S2835UG5W8TLC2R-A5 6
    10 2835 850nm红外LED LED29,LED30,LED31 LED-SMD_L3.5-W2.8-RD_TJ-S2835UG5W8TLC2R-A5 3
    11 0.5 R1 R0603 1
    12 0.8 R2,R3,R4 R0603 3
    13 M3铜柱 TP1,TP2,TP3,TP4 M3铜柱 4
    14 MT7201C U1,U2,U3,U4 SOT-89-5_L4.5-W2.5-P1.50-LS4.5-BR 4

第三步:结构设计

一:C 型灯架设计

点此下载 DWG 2D 图纸

使用8mm亚克力切割和热弯制成,用于固定灯板和水箱。

二:水箱 3D 打印

用于盛水或者水杯,另外在其内部放置主控板和功能板。整体采用 PLA 材质,通过 3D 打印制作而成。

三:装配效果

第四步:根据清单收集物料

相关物料,请参考上文物料章节。

第五步:在 IoT 产品创建产品

完成整机搭建后,还需要在 IoT 平台上创建智能产品,创建产品后您才能获得相关嵌入式开发包,进行智能设备的 TuyaOS 开发。该产品代表了智能设备在 IoT 平台上的功能映射、包含了相关授权信息、产品配置等,方便植物生长机与 IoT 平台的通信。本小节步骤介绍了您在平台上创建植物生长机的主要步骤,详细步骤请参考 选品类创建产品

  1. 进入 涂鸦 IoT 平台,点击创建产品。选择 小家电 > 宠物 > 植物生长机

  2. 选择自定义方案,输入产品名称,选择通讯协议为WIFI+蓝牙,点击创建产品。

    image.png

  3. 功能定义 阶段,添加标准功能,选择 开关水泵开关倒计时倒计时剩余时间故障告警

    功能点名称、枚举值等,您可自行编辑修改。

    image.png

  4. 在自定义功能区域,点击添加功能按钮,编辑功能点名称、标识名,勾选数据类型和数据传输类型即可完成功能点创建。

    要实现所有的设备功能,还需要根据功能需求自行创建额外的 DP 功能点。

    • 添加 红灯设置绿灯设置蓝灯设置暖灯设置 4 个 DP 点,用于设置四路 LED 灯的亮度,实现 RGBW 调光的功能。

    • 添加 灯光开关,布尔型 DP,用于控制灯的开关。

    • 添加 土壤湿度等级,枚举型 DP,用于设置水泵自动浇水的阈值等级。

      image.png

  5. 设定完功能点后,下一步点击设备面板,选择 App 的面板样式。推荐选择开发调试面板,比较直观,且可以开到 DP 数据包的接收和发送,方便开发阶段调试使用。

    至此,产品的创建基本完成,可以正式开始嵌入式软件部分的开发。

第六步:嵌入式开发

本 Demo 方案的嵌入式代码基于 BK7231 平台,使用涂鸦通用 Wi-Fi SDK 进行 SoC 低代码开发,具体代码可下载查看 Demo 例程。点此下载本 Demo 完整例程

一:应用层入口

打开 Demo 例程,其中的apps文件夹内就是 Demo 的应用代码。应用代码结构如下:

├── src
|    ├── plant_driver
|    |      └── plant_pwm.c      // 驱动灯板,调用 SoC 层的 PWM 接口进行再封装
|    ├── plant_soc               // 涂鸦 SDK SoC 层接口相关文件
|    ├── tuya_device.c           // 应用层入口文件
|    ├── app_plant.c             // 植物生长机主要应用层
|    └── plant_control.c         // 植物生长机各个功能组件的控制逻辑相关
|
├── include				// 头文件目录
|    ├── plant_driver
|    |      └── plant_pwm.h
|    ├── plant_soc
|    ├── tuya_device.h
|    ├── app_plant.h
|    └── plant_control.h
|
└── output              // 编译产物

打开 tuya_device.c 文件,找到 device_init 函数:

OPERATE_RET device_init(VOID)
{
  OPERATE_RET op_ret = OPRT_OK;

  UCHAR_T connect_mode = 0;

  PR_NOTICE("goto device_init!!!");

  TY_IOT_CBS_S wf_cbs = {
      status_changed_cb,\
      gw_ug_inform_cb,\
      gw_reset_cb,\
      dev_obj_dp_cb,\
      dev_raw_dp_cb,\
      dev_dp_query_cb,\
      NULL,
  };

  connect_mode = GWCM_OLD;

  op_ret = tuya_iot_wf_soc_dev_init_param(connect_mode,WF_START_SMART_FIRST,&wf_cbs,NULL,PRODECT_KEY,DEV_SW_VERSION);

  if(OPRT_OK != op_ret) {
      PR_ERR("tuya_iot_wf_soc_dev_init_param error,err_num:%d",op_ret);
      return op_ret;
  }

  op_ret = tuya_iot_reg_get_wf_nw_stat_cb(wf_nw_status_cb);
  if(OPRT_OK != op_ret) {
      PR_ERR("tuya_iot_reg_get_wf_nw_stat_cb is error,err_num:%d",op_ret);
      return op_ret;
  }

  op_ret = app_plant_init(APP_PLANT_NORMAL);
  if(OPRT_OK != op_ret) {
      PR_ERR("plant init err!");
      return op_ret;
  }

  return op_ret;
}

在 BK7231T 平台的 SDK 环境中,device_init 函数为重要的应用代码入口。设备上电后平台适配层运行完一系列初始化代码后就会调用该函数来进行应用层的初始化操作。该函数主要做三件事:

  1. 调用 tuya_iot_wf_soc_dev_init_param()接口进行SDK初始化,配置了工作模式、配网模式,同时注册了各种回调函数并存入了PID(代码中宏定义为PRODECT_KEY)。

        TY_IOT_CBS_S wf_cbs = {
            status_changed_cb,\
            gw_ug_inform_cb,\
            gw_reset_cb,\
            dev_obj_dp_cb,\
            dev_raw_dp_cb,\
            dev_dp_query_cb,\
            NULL,
        };
    
        connect_mode = GWCM_OLD;
    
        op_ret = tuya_iot_wf_soc_dev_init_param(connect_mode,WF_START_SMART_FIRST,\
        &wf_cbs,NULL,PRODECT_KEY,DEV_SW_VERSION);
    
        if(OPRT_OK != op_ret) {
            PR_ERR("tuya_iot_wf_soc_dev_init_param error,err_num:%d",op_ret);
            return op_ret;
        }
    
  2. 调用 tuya_iot_reg_get_wf_nw_stat_cb()接口注册设备网络状态回调函数。

        op_ret = tuya_iot_reg_get_wf_nw_stat_cb(wf_nw_status_cb);
        if(OPRT_OK != op_ret) {
            PR_ERR("tuya_iot_reg_get_wf_nw_stat_cb is error,err_num:%d",op_ret);
            return op_ret;
        }
    
  3. 调用应用层初始化函数。

        op_ret = app_plant_init(APP_PLANT_NORMAL);
        if(OPRT_OK != op_ret) {
            PR_ERR("plant init err!");
            return op_ret;
        }
    

二:应用结构

本 Demo 应用代码主要分三层来实现:

  • 最底层为 PWM 和各个传感器的驱动代码,封装出传感器的初始化、采集等接口,但由于本 Demo 为植物生长机的小型版本,只使用了 ADC 采集型的土壤湿度传感器,故此层只涉及到 PWM 相关接口的调用。
  • 第二层为控制逻辑部分的代码,调用驱动层的传感器接口,实现各个组件的控制逻辑,封装出数据处理轮询接口;
  • 第一层为主要应用层,创建应用任务调用第二层的接口,同时处理 DP 数据的上报和接收解析。

第一层是在app_plant.c文件中实现的,大致内容如下:

  • app_plant_init() 调用第二层封装出的设备初始化接口,创建应用任务;

    OPERATE_RET app_plant_init(IN APP_PLANT_MODE mode)
    {
        OPERATE_RET op_ret = OPRT_OK;
    
    
        if(APP_PLANT_NORMAL == mode) {
    
            // IO、传感器、pwm等初始化
            plant_device_init();
    
            // 创建ADC类传感器数据采集任务
            tuya_hal_thread_create(NULL, "thread_data_get_adc", 512*4, TRD_PRIO_4, sensor_data_get_adc_theard, NULL);
    
            // 创建数据处理任务
            tuya_hal_thread_create(NULL, "thread_data_deal", 512*4, TRD_PRIO_4, sensor_data_deal_theard, NULL);
    
            // 创建 DP 数据定时循环上报任务
            tuya_hal_thread_create(NULL, "thread_data_report", 512*4, TRD_PRIO_4, sensor_data_report_theard, NULL);
    
        }else {
            // 非产测模式
        }
    
        return op_ret;
    }
    
  • app_report_all_dp_status()上报所有DP数据。

    VOID app_report_all_dp_status(VOID)
    {
        OPERATE_RET op_ret = OPRT_OK;
    
        INT_T dp_cnt = 0;
        dp_cnt = 12;
    
        TY_OBJ_DP_S *dp_arr = (TY_OBJ_DP_S *)Malloc(dp_cnt*SIZEOF(TY_OBJ_DP_S));
        if(NULL == dp_arr) {
            PR_ERR("malloc failed");
            return;
        }
    
        memset(dp_arr, 0, dp_cnt*SIZEOF(TY_OBJ_DP_S));
    
        dp_arr[0].dpid = DPID_SWITCH_P;
        dp_arr[0].type = PROP_BOOL;
        dp_arr[0].time_stamp = 0;
        dp_arr[0].value.dp_value = plant_ctrl_data.Switch;
        ......
    
        op_ret = dev_report_dp_json_async(NULL,dp_arr,dp_cnt);
        Free(dp_arr);
        if(OPRT_OK != op_ret) {
            PR_ERR("dev_report_dp_json_async relay_config data error,err_num",op_ret);
        }
    
        PR_DEBUG("dp_query report_all_dp_data");
        return;
    }
    
  • 任务函数,任务内循环调用的plant_get_adc_sensor_data()plant_ctrl_handle()plant_ctrl_all_off()都是第二层的接口,实现在plant_control.c文件中。

    STATIC VOID sensor_data_get_adc_theard(PVOID_T pArg)
    {
        while(1) {
    
            PR_DEBUG("plant_get_adc_sensor_data");
            tuya_hal_system_sleep(TASKDELAY_SEC*2);
    
            if(TRUE == plant_ctrl_data.Switch) {
                plant_get_adc_sensor_data();
            }
    
        }
    }
    
    STATIC VOID sensor_data_deal_theard(PVOID_T pArg)
    {
        while(1) {
            tuya_hal_system_sleep(TASKDELAY_SEC);
    
            if(TRUE == plant_ctrl_data.Switch) {
                plant_ctrl_handle();
            }else {
                plant_ctrl_all_off();
            }
    
        }
    
    }
    
    STATIC VOID sensor_data_report_theard(PVOID_T pArg)
    {
        while(1) {
            tuya_hal_system_sleep(TASKDELAY_SEC*5);
            app_report_all_dp_status();
        }
    
    }
    
  • deal_dp_proc()处理接受到的 DP 数据,通过识别 DP 来进行相应的数据接收处理。

    VOID deal_dp_proc(IN CONST TY_OBJ_DP_S *root)
    {
        UCHAR_T dpid;
    
        dpid = root->dpid;
        PR_DEBUG("dpid:%d",dpid);
    
        switch (dpid) {
    
        case DPID_SWITCH_P:
            PR_DEBUG("set switch:%d",root->value.dp_bool);
            plant_ctrl_data.Switch = root->value.dp_bool;
            break;
    
        case DPID_PUMP:
            PR_DEBUG("set pump:%d",root->value.dp_bool);
            plant_ctrl_data.Pump = root->value.dp_bool;
            break;
    
            ......
    
        default:
            break;
        }
    
        return;
    
    }
    

实现了上述的几个函数后,应用层代码的大概结构就已经确定下来了,接下来就需要实现上面提到的被调用的第二层接口,这些接口都放在本 Demo 的plant_control.c文件中。在下面的内容里,本篇 Demo 教程将根据实现的具体功能解说 Demo 例程。

三:灯光控制

本 Demo 方案实现了 RGBW 四路调光功能,可通过 App 调节各个颜色的灯的亮度值,从而调配出植物生长所需要的不同类型的光照。

通过输出PWM波的方式来调整灯的亮度,有关PWM的初始化和输出控制函数接口都实现在 plant_pwm.c中,在plant_device_init() 中初始化PWM,并在plant_ctrl_handle()中调用实现灯光控制逻辑的接口。

USER_PWM_DUTY_T user_pwm_duty = {0};

VOID plant_device_init(VOID)
{
    ......
    plant_pwm_init();
    ......
}

STATIC VOID __set_pwm_duty(VOID)
{
    user_pwm_duty.duty_red = (USHORT_T)(((float)plant_ctrl_data.Red_value/255.0)*1000);
    user_pwm_duty.duty_green = (USHORT_T)(((float)plant_ctrl_data.Green_value/255.0)*1000);
    user_pwm_duty.duty_blue = (USHORT_T)(((float)plant_ctrl_data.Blue_value/255.0)*1000);
    user_pwm_duty.duty_warm = (USHORT_T)(((float)plant_ctrl_data.Warm_value/255.0)*1000);
}

STATIC VOID __initiative_ctrl_module_light(VOID)
{
    if (plant_ctrl_data.Countdown_set != cancel)
    {
        if(IsThisSysTimerRun(light_timer) == FALSE) {
            light_flag_min = (USHORT_T)plant_ctrl_data.Countdown_set * 60;
            plant_pwm_set(&user_pwm_duty);
            sys_start_timer(light_timer,1000*60,TIMER_CYCLE);
        }else {
            plant_pwm_set(&user_pwm_duty);
        }
    }else {
        light_flag_min = 0;
        if(TRUE == plant_ctrl_data.Light_switch) {
            plant_pwm_set(&user_pwm_duty);
        }else {
            plant_pwm_off();
        }
    }
    plant_report_data.Countdown_left = light_flag_min;
}

VOID plant_ctrl_handle(VOID)
{
    ......
    __set_pwm_duty();
    __initiative_ctrl_module_light();
}

四:土壤湿度控制

本 Demo 方案使用的土壤湿度检测传感器可以根据土壤的湿度情况输出模拟量,因此代码上就需要通过ADC采集模拟量转换为数字量的方式来监测土壤湿度。

app_plant.c文件中创建的获取ADC采集任务中循环调用了plant_control.cplant_get_adc_sensor_data(),所有有关adc采集的代码都放在该函数接口内。

VOID plant_get_adc_sensor_data(VOID)
{
    tuya_hal_adc_init(&tuya_adc);

    tuya_hal_adc_value_get(TEMP_ADC_DATA_LEN, &soil_moisture_value);

    PR_NOTICE("water_tank_value = %d",soil_moisture_value);

    tuya_hal_adc_finalize(&tuya_adc);
}

获取土壤湿度值后,将该值与预设的三档湿度阈值做比较,决定水泵是否需要打开并浇水。具体与哪一档阈值比较是在 app 上设置的。除了自动控制浇水的模式外,本 Demo 也可以设置为手动浇水模式,通过面板上的水泵开关直接控制是否浇水。

plant_ctrl_handle()中调用实现控制浇水逻辑的接口,引入了ADD_WATER_COUNTADD_WATER_READY两个变量,实现水泵每开启一段时间后就会关闭一段时间,防止浇水过度。

STATIC VOID __passive_ctrl_module_soil_humidity(VOID)
{
    if(!ADD_WATER_READY) {
        tuya_gpio_write(WATER_PUMP_PORT, WATER_PUMP_LEVEL);
        ADD_WATER_COUNT++;
        if(ADD_WATER_COUNT >15) {
            ADD_WATER_READY = 1;
            ADD_WATER_COUNT = 0;
        }
    }

    switch (plant_ctrl_data.soil_moisture_level) {

    case manual_control:
        ADD_WATER_COUNT == 0;
        ADD_WATER_READY == 1;
        break;
    case low:
        if(soil_moisture_value > soil_moisture_threshold.Low) {
            if(ADD_WATER_READY) {
                tuya_gpio_write(WATER_PUMP_PORT, !WATER_PUMP_LEVEL);
                ADD_WATER_COUNT++;
                if(ADD_WATER_COUNT > 2) {
                    ADD_WATER_READY = 0;
                }
            }
        }else {
            tuya_gpio_write(WATER_PUMP_PORT, WATER_PUMP_LEVEL);
        }
        break;
    case medium:
        if(soil_moisture_value > soil_moisture_threshold.Medium) {
            if(ADD_WATER_READY) {
                tuya_gpio_write(WATER_PUMP_PORT, !WATER_PUMP_LEVEL);
                ADD_WATER_COUNT++;
                if(ADD_WATER_COUNT > 2) {
                    ADD_WATER_READY = 0;
                }
            }
        }else {
            tuya_gpio_write(WATER_PUMP_PORT, WATER_PUMP_LEVEL);
        }
        break;
    case high:
        if(soil_moisture_value > soil_moisture_threshold.High) {
            if(ADD_WATER_READY) {
                tuya_gpio_write(WATER_PUMP_PORT, !WATER_PUMP_LEVEL);
                ADD_WATER_COUNT++;
                if(ADD_WATER_COUNT > 2) {
                    ADD_WATER_READY = 0;
                }
            }
        }else {
            tuya_gpio_write(WATER_PUMP_PORT, WATER_PUMP_LEVEL);
        }
        break;
    default:
        break;
    }
}

STATIC VOID __initiative_ctrl_module_pump(VOID)
{
    if(plant_ctrl_data.soil_moisture_level != manual_control) {
        return;
    }

    if(TRUE == plant_ctrl_data.Pump) {
        tuya_gpio_write(WATER_PUMP_PORT, !WATER_PUMP_LEVEL);
    }else {
        tuya_gpio_write(WATER_PUMP_PORT, WATER_PUMP_LEVEL);
    }

}

VOID plant_ctrl_handle(VOID)
{
    ......
    // 水泵自动控制
    __passive_ctrl_module_pump();
	// 水泵手动控制
    __initiative_ctrl_module_pump();
    ......
}

至此,本 Demo 的大部分控制逻辑代码就基本完成了。在完善 DP 发送和接收部分后,即可开始后续的功能调试。如果您想了解 Demo 代码的更多细节,可以自行查看 Demo 例程。

五:编译和烧录

在 Linux 终端输入命令运行 SDK 环境目录下的 build_app.sh 脚本来编译代码生成固件。固件生成路径为 apps > APP_PATH > output

  • 命令格式:

    build_app.sh <APP_PATH> <APP_NAME> <APP_VERSION>
    
  • 命令示例:

    /home/share/samba/ci/ty_iot_wf_bt_sdk_bk7231t$ sudo sh build_app.sh apps/bk7231t_plant_grow_mach_demo bk7231t_plant_grow_mach_demo 1.0.0
    
  • 成功返回示例:若出现下图所示提示,则表示编译成功,固件已经生成。

将固件烧录至模组后,即可开始功能调试阶段。有关烧录和授权方式请参考 WB 系列模组烧录授权

第七步:设备控制

一:设备配网

  1. 在移动应用商店中(例如 App Store)下载涂鸦智能 App。

  2. 打开涂鸦智能 App,点击右上角 + 图标,添加设备。

    image.png
  3. 选择 小家电 > 其他设备 > 植物生长机

    Screenshot_20210322_115746_com.tuya.smart.jpg
  4. 选择您的 Wi-Fi,并输入 Wi-Fi 密码。

  5. 等待配网成功。

    Screenshot_20210322_115746_com.tuya.smart.jpg

二:清除配网信息

在更换用户账号、初始化设备、遗忘配网信息、遗忘绑定账号等情况下,您可以尝试清除配网信息。

方式一:在涂鸦智能 App 上移除设备

  1. 打开涂鸦智能APP。
  2. 长按设备列表任意设备,选择您添加的精简版植物生长机设备,点击移除设备。

方式二:给设备通断电三次

为精简版植物生长机设备接上电源,等待灯板亮白色光,拔掉电源。重复三次即可。

小结

至此,一款精简版的智能植物生长机就制作完成了,它可以App远程遥控、土壤湿度监测、自动浇水、远程控制灯板颜色等功能。您可以基于涂鸦 IoT 平台丰富它的功能,您还可以更加方便的搭建更多智能产品原型,加速智能产品的开发流程。恭喜您完成了一款智能植物生长机的原型开发。

3.jpg