大家好,我是编程小6,很高兴遇见你,有问题可以及时留言哦。
作为程序猿大佬的你,工位也许是这样的
也有可能是这样的
但是不管怎么样,作为大佬的你肯定会想要有一个温度适宜,不被打搅的工位,所以就开始干起来吧!
我要有一个温度适宜的工位
方案概述:通过温湿度传感器,获取工位的温湿度的信息,树莓派网关定时轮训去拉取温湿度传感器的数据,并对数据进行处理,处理完成之后将数据传输到 sls 平台进行存储。通过阿里云的定时任务,去对日志进行定时的统计分析。
树莓派:
温湿度传感器:
// 引入温湿度传感器的库
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)的警告产品!!!
树莓派:
超声波传感器:
// 引入 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、蓝牙等通信模组,与后端进行通信,设备计算环境是对各个模组进行控制和数据处理,在上面的示例中就是树莓派。传感器数据采集是对环境中的数据进行处理。
物联网的四层模型分为:感知 && 设备层、网络层、平台层、应用层。其中每一层的功能如下:
Node 中使用应用二进制接口(Application Binary Interface )来实现与 C 和 C ++ 的通信的,特指应用去访问编译好的二进制程序,是 Node 与 C、C+ + 通信的桥梁。而在 ABI 上层,是使用 Native Addon 进行加载二进制的文件,让二进制文件的内容可以通过 require 的方式导入,因为他会在暴露出 module.exports 或 exports 对象。类似于如下所示:
// greet.node 是编译好的二进制文件
const addon = require('./build/Release/greet.node')
而在 C++ 代码中,实现如下:
#include <napi.h>
#include <string>
#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)
我们在使用温湿度传感器的项目中,使用的是这种方式:
github.com/momenso/nod…
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
};
GPIO (General-purpose input/output),通用型输入输出,用于电信号在模组中的输入输出,在树莓派中的 GPIO 接口如下所示:
从左到右,从上到下,左边奇数,右边偶数:1-40,GPIO 中的接口分为以下几类:
我们在进行开发中,只需要将模组的电源接口、编程接口、接地接口接上,然后使用添加 pigpio 依赖, yarn add pigpio
便可以进行 GPIO 编程:
github.com/fivdi/pigpi…
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);
github.com/jerryscript… 是三星开发一个开源的物联网运行引擎,采用了 V8 进行裁剪,并针对低内存消耗进行了优化,支持 160k 的内存,让 Node 真正的跑在嵌入式设备中。但是这个方式也有问题:
国内也有一家厂商使用 javascript 作为设备的运行时:ruff.io/zh-cn/,由周爱民(《JavaScript 语言精髓与编程实践》作者)大佬创办,但是可能是因为硬件成本高,在商业化层面不太成功。
国外对于 Node 转义成别的平台开源的方案较多,而且有些方案也挺成熟,比如:johnny-five.io/,从 2012 年开始深耕物联网平台,开源的仓库有 12 k start,而且该开源项目还支持机器人,实例特别丰富,对于新手来说很友好,建议从这个方面入坑。
传感器相当于人的耳朵和皮肤,负责感知外界的数据和信息,MCU 相当于人的大脑,负责针对信息的处理,通信模组相当于人的嘴巴和手,负责对外进行通信。
古茗的主营业务是在餐饮行业做奶茶,对于餐饮行业,成本主要来自于三个方面:
对于店租,跟位置和人流量强相关,所以如果选择店租便宜的位置,会带来人流量的减少,进而减少成单量。所以这一块可以理解成是固定成本,很难降低。
对于原材料,目前全球通货膨胀,原材料在上涨,而且即是是未来原材料成本降低,古茗通过规模优势来提高与供应商的议价能力,进一步降低成本。但是这一块的成本降低的边际效益是递减的,而且原材料的成本降低有可能会带来品质的下降。
对于人力成本,目前古茗前台加后厨,普通店大致在 6 人左右,面积大一点的店在 8 人左右,旗舰店在 12 个人左右,而且人员需要三班倒,所以人力这一块对于门店来说成本异常的高。而通过给门店配备机器,去一点一点的让机器去做人需要做的事情,进一步解放人力。而对于最终的情况,应该是门店的设备都通过门店的边缘网关,将门店的设备统一连接和调度起来,进行奶茶的制作。其整体的结构如下图所示:
关注公众号「Goodme前端团队」,获取更多干货实践,欢迎交流分享~