<!-- .slide: data-background="https://i.imgur.com/gJLfldF.jpg" data-background-color="#111111" data-background-opacity="0.2" -->
###### tags: `iot-greenhouse` `lab` 返回[物聯網自動化溫室監控系統](/s/PJIS24sFR76axKI0xOrnjQ)
## <span style="color:#F9BF45;">控制幫浦與電磁閥</span>
###### [點我開啟簡報模式](/@BEExANT-ta/B1hkyb9ut#)
###### <kbd>ESC</kbd> 鍵進入總覽模式
###### <kbd>←</kbd> <kbd>↑</kbd> <kbd>↓</kbd> <kbd>→</kbd> 切換頁面
---
## 目標
**使用幫浦端網頁,熟悉如何使用手動及程式控制幫浦與電磁閥進行灑水、管線壓力轉換,設定指定時間開啟/關閉幫浦。**
---
## 設計原理
- ==開啟電磁閥的同時啟動幫浦==,預設當 ==5 ~ 8== 號開啟時馬達為==半速==、 ==9 ~ 12== 號為==全速==。
- 以==手動及程式==控制方式將每一個==電磁閥輪流啟動/關閉==。
- 在==程式編輯區塊==中先==測試轉換程式與結果==,再將程式設定至圖表中顯示結果,與[溫室感測器設定](/s/6m3A90ogQwK4LpYYSxrxEQ)方式相同。
- 設定開始執行與結束的日期與時間,使裝置在指定時間中自動執行,日期時間格式為==mm/dd/yy hr:min:sec==(24小時制)。
----
:::info
:globe_with_meridians: 參考資源
- [電磁閥 - 維基百科](https://zh.wikipedia.org/wiki/%E7%94%B5%E7%A3%81%E9%98%80)
- [幫浦 - 維基百科](https://zh.wikipedia.org/wiki/%E6%B3%B5)
- [壓力感測器 - 維基百科](https://zh.wikipedia.org/wiki/%E5%8E%8B%E5%8A%9B%E4%BC%A0%E6%84%9F%E5%99%A8)
- [JavaScript Date 時間和日期](https://www.fooish.com/javascript/date/)
- [UNIX時間](https://zh.wikipedia.org/wiki/UNIX%E6%97%B6%E9%97%B4)
:::
---
## 範例程式碼
新增程式檔並命名 ==控制幫浦與電磁閥==,將以下程式碼複製貼上程式編輯區執行。
```javascript=
let pump_P_output = Math.round((Math.abs(DATA.pump_P_raw - 105) / 89)*100)/100;
console.log(pump_P_output);
let date = new Date(Date.now());
let start = new Date("12/27/2021 17:24:00");
let end = new Date("12/27/2021 17:25:00");
let step = 5 * 1000;
if(date.getTime() >= start.getTime() && date.getTime() < end.getTime())
{
console.log("已達啟動時間,開始各站灑水。");
valveOn.set(5);
delay(step);
valveOff.set(5);
delay(1000);
valveOn.set(6);
delay(step);
valveOff.set(6);
delay(1000);
valveOn.set(7);
delay(step);
valveOff.set(7);
delay(1000);
valveOn.set(8);
delay(step);
valveOff.set(8);
delay(1000);
}
if(date.getTime() >= end.getTime())
{
console.log("已達結束時間,停止排程。");
}
```
---
## 程式解說
逐行講解程式意義。
----
```javascript=
let pump_P_output = Math.round((Math.abs(DATA.pump_P_raw - 105) / 89)*100)/100;
console.log(pump_P_output);
```
- 將==壓力感測==原始資料轉換為壓力值,顯示在訊息欄位中。
----
```javascript=
let date = new Date(Date.now());
let start = new Date("12/27/2021 17:24:00");
let end = new Date("12/27/2021 17:25:00");
let step = 5 * 1000;
```
- 定義date為當前時間。
- 定義start為啟動控制的時間。
- 定義end為結束控制的時間。
- 定義step為每站噴灑的時間,單位為毫秒。
----
```javascript=
if(date.getTime() >= start.getTime() && date.getTime() < end.getTime())
{
console.log("已達啟動時間,開始各站灑水。");
valveOn.set(5);
delay(step);
valveOff.set(5);
delay(1000);
valveOn.set(6);
delay(step);
valveOff.set(6);
delay(1000);
valveOn.set(7);
delay(step);
valveOff.set(7);
delay(1000);
valveOn.set(8);
delay(step);
valveOff.set(8);
delay(1000);
}
```
- 利用 ==Date.getTime()== 這個方法將==時間轉換為UNIX時間==,UNIX時間表示UTC 1970年1月1日0時0分0秒起算的秒數,從這個秒數去判斷是否已達啟動時間,且需小於結束時間。
----
```javascript=
if(date.getTime() >= end.getTime())
{
console.log("已達結束時間,停止排程。");
}
```
- 當前時間大於結束時間時,結束排程的執行。
---
## 參數修改
為方便實作,以下會將範例程式中可修改的參數標示出來,進行實作時只需修改對應參數,並觀察結果即可。
:::warning
:zap: 詳細內建JS參數參考 - [內建Js參數及功能總覽](/s/1TmPhQPFRyKsDRf5d3xyzg)
:::
----
:::success
**let start = new Date("==mm==/==dd==/==yy== ==hr==:==min==:==sec==");
let end = new Date("==mm==/==dd==/==yy== ==hr==:==min==:==sec==");**
:::
- mm: 月,dd: 日,yy: 西元年,hr: 時,min: 分,sec: 秒
----
:::success
**let step = ==x==**
:::
- x為每站噴灑的間隔時間,單位為毫秒。
---
## 範例影片
{%youtube 3ipARjjq9sk %}
<a class="btn btn-warning" style="width:100%;color:#333333;" href="/s/nSWrH8KxTpualN8Ws8kkwA" role="button"> 裝置互聯設定與遠程控制 **⇨** </a>
<a class="btn btn-primary" style="width:100%;" href="/s/6m3A90ogQwK4LpYYSxrxEQ" role="button"> **⇦** 感測器數值轉換與校正
</a>
{"metaMigratedAt":"2023-06-16T15:03:47.813Z","metaMigratedFrom":"YAML","title":"控制幫浦與電磁閥","breaks":true,"slideOptions":"{\"transition\":\"slide\",\"transitionSpeed\":\"fast\",\"theme\":\"league\"}","contributors":"[{\"id\":\"a1db0c29-d848-4070-be84-9191a2398ca8\",\"add\":5841,\"del\":2018}]"}