■介绍
初学者努力创建一种物联网设备,该设备可以在不实际访问邮箱的情况下检查邮件的存在与否。
我正在尝试编写它,以便即使对于 IoT 初学者也很容易阅读,但它是初学者的文档,所以如果您以温暖的眼光阅读它,我会很高兴。
■ 我做了这样的东西
通过在邮箱底部放置一个重量传感器(称重传感器)并运行程序,我们制作了一个在 LINE BOT 确认邮件时响应邮件是否已发送的东西。
如果在小于0g的时候查看邮件,会回复“没有邮件”,
当我查看邮件是0g或更多时,他回答说:“有一个邮件。”
视频将按以下顺序确认。
① 确认无投递项目
② 确认投递项目
③ 删除投稿后的确认
■ 你需要什么
◆ 硬
・obniz
・称重传感器(重量传感器)
・AD转换器
・obniz
使用 Node.js 执行环境的开发过程见下文。
如何使用 Node.js 运行 - obniz Docs
・重量传感器(称重传感器、AD转换器)
有关使用称重传感器准备称重仪器的信息,请参见下文。
重量传感器的存在确认 - Qiita
◆提前准备
・ LINE官方账号
・LINE消息API(LINE BOT)
LINE官方账号的创建方法和消息API的设置方法见下文。
使用 Line Messaging API 轻松创建 Line Bot(适合初学者) - Qiita
*本文未使用列出的 AWS 服务。
■ 详情
1.邮箱制作
我用纸板做了一个简单的邮箱。
2.在重量传感器部件上工作
① 焊接作业
连接称重传感器和 AD 转换器。
② 将称重传感器放在两块板之间。
从以下两点来看,准备了两块与邮箱底部大小相同的板,并固定好,以便在板和称重传感器之间留出空间。
(在照片中,空间用上侧的螺栓和下侧的垫圈固定。)
・不受投稿大小的影响
・用称重传感器准确测量重量(使其更容易弯曲)
3.重量传感器初始化和调整(传感器和obniz之间的协调)
◆ 重量传感器调整
由于称重传感器测量变化量(弯曲程度),因此无法按原样测量克数。因此,需要校准(调整)。
校准方法见下文。
我想用一个重量传感器-Qiita
4. LINE BOT(链接obniz和LINE,链接私有环境和外部服务器)
◆ 使用隧道通信的机制
中间一排左边是邮箱和电脑的示意图,这里可以运行一个程序,通过物联网工具查看邮箱的投递状态。
但是,由于程序是在本地环境中运行的,所以无法原样实现外部联动(与LINE联动)。
因此,我们将使用幻灯片中心描述的隧道技术连接本地环境和外部服务器,使其看起来好像本地程序正在外部服务器上运行。
之后,如果您在LINE中设置外部服务器的URL,则从LINE到邮箱的路由将完成。
您将能够通过从您上次创建的 LINE BOT 中抛出对话来相互互动。
有关使用 ngrok 的隧道通信方法,请参见下文。
在 Node 学校节 2017 #nodefest - Qiita 1 小时内动手制作 LINE BOT(文档 + 报告)
5.确认邮寄物品的存在(LINE和智能手机之间的链接)
以下画面将出现在智能手机上的 LINE 上。
在这里,创建了丰富的菜单以提高可用性。
■ 酱汁
'use strict';
// ########################################
// Initialize Section
// ########################################
// パッケージを使用します
const express = require('express');
const line = require('@line/bot-sdk');
const Obniz = require('obniz');
// ngrokを介してローカル(自分のPC)でサーバーを公開するときのポート番号です
const PORT = process.env.PORT || 3000;
const config = {
channelSecret: '[secret]',
channelAccessToken: '[AccessToken]'
};
//obniz APIを利用
const obniz = new Obniz("[obniz ID]");
//変数
var strValue = 0; //センサーからの取得値
var conv = 0; //取得値をグラム単位に変換用
// ########################################
// obniz Section
// ########################################
obniz.onconnect = async function () {
console.log('重量センサー接続開始');
const hcsr04 = obniz.wired("hx711", { gnd: 0, dout: 1, sck: 2, vcc: 3 });
console.log('重量センサー接続完了');
//ここの値でキャリブレーションする
await hcsr04.zeroAdjustWait();
hcsr04.offset = 266200;
hcsr04.scale = 1000;
while (true) {
const val = await hcsr04.getValueWait(1);
conv = Math.floor(val / 1000);
console.log('weight:' + conv + 'g');
await obniz.wait(1000);
}
}
// ########################################
// LINE Messaging API Section
// ########################################
const sampleFunction = async (event) => {
// ユーザーメッセージが「投函確認」かどうか
if (event.message.text !== '投函確認') {
return client.replyMessage(event.replyToken, {
type: 'text',
text: '「投函確認」と話しかけてね'
});
} else {
// 「リプライ」を使って先に返事しておきます
await client.replyMessage(event.replyToken, {
type: 'text',
text: '調べています……'
});
let pushText = '';
var strWeight = '';
if (conv >= 0) {
strWeight = '投函物があります。'
} else {
strWeight = '投函物はありません。'
}
try {
//返信用のテキストを作成
pushText = `${strWeight}`;
} catch (error) {
pushText = '検索中にエラーが発生しました。ごめんね。';
// APIからエラーが返ってきたらターミナルに表示する
console.error(error);
}
// 「プッシュ」で後からユーザーに通知します
return client.pushMessage(event.source.userId, {
type: 'text',
text: pushText
});
}
};
// ########################################
// LINEサーバーからのWebhookデータを処理する部分
// ########################################
// LINE SDKを初期化します
const client = new line.Client(config);
// LINEサーバーからWebhookがあると「サーバー部分」から以下の "handleEvent" という関数が呼び出されます
async function handleEvent(event) {
// 受信したWebhookが「テキストメッセージ以外」であればnullを返すことで無視します
if (event.type !== 'message' || event.message.type !== 'text') {
return Promise.resolve(null);
}
// サンプル関数を実行します
return sampleFunction(event);
}
// ########################################
// Express Section
// ########################################
// expressを初期化します
const app = express();
// HTTP POSTによって '/webhook' のパスにアクセスがあったら、POSTされた内容に応じて様々な処理をします
app.post('/webhook', line.middleware(config), (req, res) => {
// 検証ボタンをクリックしたときに飛んできたWebhookを受信したときのみ以下のif文内を実行
if (req.body.events.length === 0) {
res.send('Hello LINE BOT! (HTTP POST)'); // LINEサーバーに返答します(なくてもよい)
console.log('検証イベントを受信しました!'); // ターミナルに表示します
return; // これより下は実行されません
} else {
// 通常のメッセージなど … Webhookの中身を確認用にターミナルに表示します
console.log('受信しました:', req.body.events);
}
// あらかじめ宣言しておいた "handleEvent" 関数にWebhookの中身を渡して処理してもらい、
// 関数から戻ってきたデータをそのままLINEサーバーに「レスポンス」として返します
Promise.all(req.body.events.map(handleEvent)).then((result) => res.json(result));
});
// 最初に決めたポート番号でサーバーをPC内だけに公開します
// (環境によってはローカルネットワーク内にも公開されます)
app.listen(PORT);
console.log(`ポート${PORT}番でExpressサーバーを実行中です…`);
■终于
网上提供的源代码不能正常工作,所以我搜索了各种文章并设法让它工作。
我想实现一个功能,让您可以使用相机模块检查内容,但这次我放弃了。下次我想挑战一下自己。
原创声明:本文系作者授权爱码网发表,未经许可,不得转载;
原文地址:https://www.likecs.com/show-308627625.html