■介绍

初学者努力创建一种物联网设备,该设备可以在不实际访问邮箱的情况下检查邮件的存在与否。
我正在尝试编写它,以便即使对于 IoT 初学者也很容易阅读,但它是初学者的文档,所以如果您以温暖的眼光阅读它,我会很高兴。

■ 我做了这样的东西

通过在邮箱底部放置一个重量传感器(称重传感器)并运行程序,我们制作了一个在 LINE BOT 确认邮件时响应邮件是否已发送的东西。
如果在小于0g的时候查看邮件,会回复“没有邮件”,
当我查看邮件是0g或更多时,他回答说:“有一个邮件。”

郵便受けと会話するためにobnizとLINE BOTでIoT装置を作ってみた

视频将按以下顺序确认。
① 确认无投递项目
② 确认投递项目
③ 删除投稿后的确认

■ 你需要什么

◆ 硬
・obniz
・称重传感器(重量传感器)
・AD转换器

・obniz
郵便受けと会話するためにobnizとLINE BOTでIoT装置を作ってみた
使用 Node.js 执行环境的开发过程见下文。
如何使用 Node.js 运行 - obniz Docs

・重量传感器(称重传感器、AD转换器)
郵便受けと会話するためにobnizとLINE BOTでIoT装置を作ってみた郵便受けと会話するためにobnizとLINE BOTでIoT装置を作ってみた
有关使用称重传感器准备称重仪器的信息,请参见下文。
重量传感器的存在确认 - Qiita

◆提前准备
・ LINE官方账号

・LINE消息API(LINE BOT)
LINE官方账号的创建方法和消息API的设置方法见下文。
使用 Line Messaging API 轻松创建 Line Bot(适合初学者) - Qiita
*本文未使用列出的 AWS 服务。

■ 详情

1.邮箱制作
我用纸板做了一个简单的邮箱。
郵便受けと会話するためにobnizとLINE BOTでIoT装置を作ってみた

2.在重量传感器部件上工作
郵便受けと会話するためにobnizとLINE BOTでIoT装置を作ってみた
① 焊接作业
连接称重传感器和 AD 转换器。

② 将称重传感器放在两块板之间。
从以下两点来看,准备了两块与邮箱底部大小相同的板,并固定好,以便在板和称重传感器之间留出空间。
(在照片中,空间用上侧的螺栓和下侧的垫圈固定。)
・不受投稿大小的影响
・用称重传感器准确测量重量(使其更容易弯曲)
郵便受けと会話するためにobnizとLINE BOTでIoT装置を作ってみた

3.重量传感器初始化和调整(传感器和obniz之间的协调)
◆ 重量传感器调整
由于称重传感器测量变化量(弯曲程度),因此无法按原样测量克数。因此,需要校准(调整)。
校准方法见下文。
我想用一个重量传感器-Qiita

4. LINE BOT(链接obniz和LINE,链接私有环境和外部服务器)
◆ 使用隧道通信的机制
中间一排左边是邮箱和电脑的示意图,这里可以运行一个程序,通过物联网工具查看邮箱的投递状态。
但是,由于程序是在本地环境中运行的,所以无法原样实现外部联动(与LINE联动)。
因此,我们将使用幻灯片中心描述的隧道技术连接本地环境和外部服务器,使其看起来好像本地程序正在外部服务器上运行。
之后,如果您在LINE中设置外部服务器的URL,则从LINE到邮箱的路由将完成。
您将能够通过从您上次创建的 LINE BOT 中抛出对话来相互互动。
有关使用 ngrok 的隧道通信方法,请参见下文。
在 Node 学校节 2017 #nodefest - Qiita 1 小时内动手制作 LINE BOT(文档 + 报告)

郵便受けと会話するためにobnizとLINE BOTでIoT装置を作ってみた

5.确认邮寄物品的存在(LINE和智能手机之间的链接)
以下画面将出现在智能手机上的 LINE 上。
在这里,创建了丰富的菜单以提高可用性。
郵便受けと会話するためにobnizとLINE BOTでIoT装置を作ってみた

■ 酱汁

应用程序.js
'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

相关文章: