如何通過物聯網打造一個牛逼且獨一無二的工位

語言: CN / TW / HK

theme: smartblue highlight: a11y-dark


作為程式猿大佬的你,工位也許是這樣的

image.png

也有可能是這樣的

image.png 但是不管怎麼樣,作為大佬的你肯定會想要有一個溫度適宜,不被打攪的工位,所以就開始幹起來吧!

我需要有一個適宜的環境

需求:

我要有一個溫度適宜的工位

技術方案:

方案概述:通過溫溼度感測器,獲取工位的溫溼度的資訊,樹莓派閘道器定時輪訓去拉取溫溼度感測器的資料,並對資料進行處理,處理完成之後將資料傳輸到 sls 平臺進行儲存。通過阿里雲的定時任務,去對日誌進行定時的統計分析。

所需材料:

樹莓派:

溫溼度感測器:

編碼與幹活:

```js // 引入溫溼度感測器的庫 const sensor = require("node-dht-sensor"); // 引入封裝好的 sls SDK const { SendLog } = require("./sendLog.js") // 初始化日誌庫 const sls = new SendLog('sensor-show', 'sensor_log') // 輪訓的時間 const DELAY_TIME = 6 * 1000; // 感測器型別 const SENSOR_TYPE = 11; // 引用針腳 const GPIO_PIN = 21;

// 輪訓 setInterval(() => { // 讀取溫溼度感測器資料 sensor.read(SENSOR_TYPE, GPIO_PIN, function (err, temperature, humidity) { if (!err) { const contents = [ // 溫度資料 { key: 'temperature', value: temperature.toString() }, // 溼度資料 { key: 'humidity', value: humidity.toString() }, ] sls.logPush(contents) } }); }, DELAY_TIME); ```

最終成品:

通過統計圖,可以知道時時刻刻工位的溫溼度變化,並且在溫度高於 30 度,溼度低於 40% 時給我傳送簡訊和郵件告警,趕緊調整空調或者逃離工位。如果這裡再加個紅外發射碼,可以通過發射紅外碼控制空調,在溫度發生一定變化時候,自動將空調調整到恆定溫度。

我不想要有人打擾

需求:

我只想安心碼程式碼,不想被產品打擾!

技術方案:

通過超聲波感測器得到感測器與物體反射回來的時差,並將時差在樹莓派閘道器中進行計算和處理,得到超聲波感測器與物體的距離,並將資料上傳到阿里雲 sls 中,並在 sls 中針對資料進行統計和分析。如果被打擾的次數到達 10 次,工位的紅色大燈亮起來了,警告產品,如果次數超過 20 次,工位的喇叭也就響起來了,禮(da)貌(sheng)的警告產品!!!

所需材料:

樹莓派:

超聲波感測器:

編碼與幹活:

```js // 引入 GPIO 程式設計依賴 const Gpio = require("pigpio").Gpio; const { SendLog } = require("./sendLog.js")

// 針對 Gpio 針腳進行程式設計 const trigger = new Gpio(20, { mode: Gpio.OUTPUT }); const echo = new Gpio(16, { mode: Gpio.INPUT, alert: true }); // sls 日誌依賴 SDK const sls = new SendLog('sensor-show', 'sensor-hcsr04_log') // 聲音在 20 攝氏度下傳播1釐米所需要的微秒數(343.21 m/s) const MICROSECDONDS_PER_CM = 1e6 / 34321;

trigger.digitalWrite(0);

const watch = () => { // 開始計時的時間 let startTick; echo.on("alert", (level, tick) => { if (level === 1) { startTick = tick; } else { // 收到回傳的資料的時間 const endTick = tick; // 得到時間間隔 const diff = endTick- startTick ; // 訊號傳送出去並反射回去所花費的時間,所以要除以 2 const distance = diff / 2 / MICROSECDONDS_PER_CM; // 上傳到 sls 上 const contents = [ { key: 'distance', value: distance.toFixed(2).toString() }, { key: 'isAnyBody', value: distance < 20 ? "1" : "0" }, ] sls.logPush(contents) } }) }

watch();

// 每秒觸發一次 setInterval(() => { trigger.trigger(10, 1) }, 1000); ```

最終成品:

通過超聲波感測器,可以實時得到物體的距離,但是因為聲音會受到溫度、溼度、物體表面反射的弧度等問題,得到的資料並不是特別準確,如果需要準確的距離測量,需要通過雷達和紅外進行測距,比如現在的智慧汽車,使用的是雷達感測器,實時得到前後車的間距。

什麼是物聯網

一句話定義

將普通裝置連線上區域網,形成一個整個網路,實現與人的互動。

使用我們熟悉的網際網路來理解物聯網

網際網路的應用基本上只有大前端和後端兩塊,而在物聯網裡,後端增加了韌體升級、時序資料、長連線等。底部增加了裝置端,裝置和後端進行通過 https、websocket(MQTT)進行通訊,裝置端內建 WIFI、藍芽等通訊模組,與後端進行通訊,裝置計算環境是對各個模組進行控制和資料處理,在上面的示例中就是樹莓派。感測器資料採集是對環境中的資料進行處理。

物聯網的四層模型如何解釋

物聯網的四層模型分為:感知 && 裝置層、網路層、平臺層、應用層。其中每一層的功能如下:

  • 感知 && 裝置層:有的物聯網有感知層,有的物聯網只有裝置層,有的兩者都有,感知主要的作用就是採集物理世界的資料,比如通過溫度感測器,獲取當前的溫度,通過人體感測器,獲取當前是否有人經過。裝置指的是物聯網中的裝置實體,比如智慧燈泡,智慧空調等,感知裝置也是屬於裝置的一種特例。
  • 網路層:網路層主要功能是傳輸資訊,將感知層和裝置層中的資料傳到指定的地方
  • 平臺層:平臺層可以理解成物聯網的大腦,平臺層主要的內容包括裝置接入、裝置管理、訊息通知、監控運維、裝置管理、安全管理等。
  • 應用層: 物聯網最終的目的,將裝置端收集的資料進行處理,提供給業務方,同時應用層也可以作為裝置指令的接收方,並將指令往下傳遞;

前端怎麼玩物聯網

1. 用 Node 寫物聯網程式碼的幾種方式

用 Node 呼叫 C 或 C++ 模組

Node 中使用應用二進位制介面(Application Binary Interface )來實現與 C 和 C ++ 的通訊的,特指應用去訪問編譯好的二進位制程式,是 Node 與 C、C+ + 通訊的橋樑。而在 ABI 上層,是使用 Native Addon 進行載入二進位制的檔案,讓二進位制檔案的內容可以通過 require 的方式匯入,因為他會在暴露出 module.exports 或 exports 物件。類似於如下所示:

js // greet.node 是編譯好的二進位制檔案 const addon = require('./build/Release/greet.node')

而在 C++ 程式碼中,實現如下:

```c++

include

include

include "greeting.h"

/ Napi 全稱為:Node-API C++ 包裝類,負責將 C ++ 的方法包裝成一個 node 可以訪問的方法, 可以理解成 Napi 就是 Native Addon 的實現 / // 定義一個返回型別為 Napi String 的 greetHello 函式 Napi::String greetHello(const Napi::CallbackInfo& info) { Napi::Env env = info.Env(); std::string user = (std::string) info[0].ToString(); std::string result = helloUser(user); return Napi::String::New(env, result); }

// 設定類似於 exports = {key:value}的模組匯出 Napi::Object Init(Napi::Env env, Napi::Object exports) { exports.Set( Napi::String::New(env, "greetHello"), // key Napi::Function::New(env, greetHello) // value );

return exports;

}

// 匯出 NODE_API_MODULE(greet, Init) ```

我們在使用溫溼度感測器的專案中,使用的是這種方式:

http://github.com/momenso/node-dht-sensor

```js var sensor = require("../build/Release/node_dht_sensor");

var promises = { initialize: sensor.initialize, setMaxRetries: sensor.setMaxRetries, readSync(type, pin) { return sensor.read(type, pin); }, read(type, pin) { return new Promise(function(resolve, reject) { sensor.read(type, pin, function(err, temperature, humidity) { if (err) { reject(err); } else { resolve({ temperature, humidity }); } }); }); } };

module.exports = { initialize: sensor.initialize, read: sensor.read, setMaxRetries: sensor.setMaxRetries, promises }; ```

用 Node 開發 GPIO 介面

GPIO (General-purpose input/output),通用型輸入輸出,用於電訊號在模組中的輸入輸出,在樹莓派中的 GPIO 介面如下所示:

從左到右,從上到下,左邊奇數,右邊偶數:1-40,GPIO 中的介面分為以下幾類:

  • 供電介面:有 5v 和 3v 的電壓供電介面,為模組提供電力;
  • 程式設計介面:有 GPIO xx 帶數字的介面,用來與模組進行通訊;
  • 接地介面: Ground 介面,用來給模組接地使用

我們在進行開發中,只需要將模組的電源介面、程式設計介面、接地介面接上,然後使用新增 pigpio 依賴, yarn add pigpio 便可以進行 GPIO 程式設計:

http://github.com/fivdi/pigpio

```js const Gpio = require('pigpio').Gpio;

const led = new Gpio(17, {mode: Gpio.OUTPUT});

let dutyCycle = 0;

setInterval(() => { led.pwmWrite(dutyCycle);

dutyCycle += 5; if (dutyCycle > 255) { dutyCycle = 0; } }, 20); ```

嵌入式內嵌 V8 引擎

http://github.com/jerryscript-project/jerryscript 是三星開發一個開源的物聯網執行引擎,採用了 V8 進行裁剪,並針對低記憶體消耗進行了優化,支援 160k 的記憶體,讓 Node 真正的跑在嵌入式裝置中。但是這個方式也有問題:

  1. 程式碼只支援 ECMAScript 5.1;
  2. 開發人員進行很大的裁剪,但是執行時和 C 相比效能還是比不上,導致硬體成本太高;
  3. 編譯複雜;

國內也有一家廠商使用 javascript 作為裝置的執行時:http://ruff.io/zh-cn/,由周愛民(《JavaScript 語言精髓與程式設計實踐》作者)大佬創辦,但是可能是因為硬體成本高,在商業化層面不太成功。

Node 轉義成別的平臺程式碼

國外對於 Node 轉義成別的平臺開源的方案較多,而且有些方案也挺成熟,比如:http://johnny-five.io/,從 2012 年開始深耕物聯網平臺,開源的倉庫有 12 k start,而且該開源專案還支援機器人,例項特別豐富,對於新手來說很友好,建議從這個方面入坑。

2. 瞭解常見的硬體

感測器

  • 溫度感測器:將環境中的溫度轉變成電訊號

  • 溼度感測器:將環境中的溼度轉變成電訊號

  • 人體感測器:檢測是否有人通過,通過與否返回不同的電訊號

  • 光感測器:將光訊號轉變成電訊號

微處理系統

  • MCU:英文(Microcontroller Unit),微控制單元,將 CPU 適當的裁剪,並將記憶體、USB、LCD 驅動電路整合到單一晶片中,形成晶片級的計算機,特別常見。

通訊

  • 藍芽模組:支援裝置進行藍芽通訊

  • WIFI 模組:支援裝置間通過 WIFI 接入和通訊

  • GPRS 模組:支援插入 SIM 卡進行聯網

總結

感測器相當於人的耳朵和面板,負責感知外界的資料和資訊,MCU 相當於人的大腦,負責針對資訊的處理,通訊模組相當於人的嘴巴和手,負責對外進行通訊。

古茗物聯網怎麼玩

古茗的主營業務是在餐飲行業做奶茶,對於餐飲行業,成本主要來自於三個方面:

  • 店租
  • 原材料
  • 人力成本

對於店租,跟位置和人流量強相關,所以如果選擇店租便宜的位置,會帶來人流量的減少,進而減少成單量。所以這一塊可以理解成是固定成本,很難降低。

對於原材料,目前全球通貨膨脹,原材料在上漲,而且即是是未來原材料成本降低,古茗通過規模優勢來提高與供應商的議價能力,進一步降低成本。但是這一塊的成本降低的邊際效益是遞減的,而且原材料的成本降低有可能會帶來品質的下降。

對於人力成本,目前古茗前臺加後廚,普通店大致在 6 人左右,面積大一點的店在 8 人左右,旗艦店在 12 個人左右,而且人員需要三班倒,所以人力這一塊對於門店來說成本異常的高。而通過給門店配備機器,去一點一點的讓機器去做人需要做的事情,進一步解放人力。而對於最終的情況,應該是門店的裝置都通過門店的邊緣閘道器,將門店的裝置統一連線和排程起來,進行奶茶的製作。其整體的結構如下圖所示:

最後

關注公眾號「Goodme前端團隊」,獲取更多幹貨實踐,歡迎交流分享~