フォーラムへの返信
-
投稿者返信
-
返信先: プラファンオフ会 in IPF2023
IPF29日行きます 朝早い便で関空から飛びますので
終日 会場には居てる予定です お声がけしに行きますね
他の皆様にもお会いできればお会いしたいです
29日は宿泊して翌日 ビックサイトで開催されている「国際ロボット展2023」も観に行く予定にしています(IPF観きれない場合は2日もIPF延長戦もありで考えています)29日夜 オフ会できればしたいですね よろしくお願いします
こんにちは 前回の予告とうり グラフの作成の説明をしたいと思います
スプレッドシートに「グラフ」のシートを作ります
概要としてプラファンロボから送られてきた データーを保存する「log」のシートから
データーを読み取って 直近 72行分を グラフ表示します
72行は 1時間=60分 ÷ 5分 = 12行 12行X6時間 = 72行となります以下が GASのコードになります
1回実行すると 「グラフ」のシートにアクセスするたびに 「log」シートからデーターを読んできて
グラフの更新がかかるようになります
スマホなどから このシートを 読み込むだけでも 現在の状況がわかりますが 次は WEBページを
作って もう少し見やすくしてみようと思いますfunction createChart() {
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var logSheet = spreadsheet.getSheetByName(“log”);
var graphSheet = spreadsheet.getSheetByName(“グラフ”);// 既存のグラフを削除
var charts = graphSheet.getCharts();
for (var i = 0; i < charts.length; i++) {
graphSheet.removeChart(charts[i]);
}// ログシートの最終行を取得
var lastRow = logSheet.getLastRow();// グラフのデータ範囲を設定(最終行から上方向に72行分=6時間、または最大行数まで)
var startRow = Math.max(1, lastRow – 72); // 最小値を1とする
var endRow = lastRow;var range = logSheet.getRange(startRow, 1, endRow – startRow + 1, logSheet.getLastColumn());
// グラフを作成する前にデータを四捨五入
var data = range.getValues();
for (var i = 0; i < data.length; i++) {
data[i][1] = Math.round(data[i][1] * 10) / 10; // 温度データ
data[i][2] = Math.round(data[i][2] * 10) / 10; // 湿度データ
}
range.setValues(data);// グラフを作成
var chart = graphSheet.newChart()
.setChartType(Charts.ChartType.LINE)
.addRange(range)
.setPosition(2, 2, 0, 0)
.setOption(‘title’, ‘作業エリア’)
.setOption(‘hAxis.title’, ‘時間’)
.setOption(‘vAxis.title’, ‘値’)
.setOption(‘series.0’, {labelInLegend: ‘温度’})
.setOption(‘series.1’, {labelInLegend: ‘湿度’})
.build();// シートにグラフを追加
graphSheet.insertChart(chart);
}Attachments:
続いて ウエブアプリを動くようにします
⑥「デプロイ」→「新しいデプロイ」→「ウエブアプリ」
⑦「ウエブアプリの実行」は自分
⑧「アクセスできるユーザ」は全員
⑨最後にウエブアプリの実行設定これで、マイコンから送られたデータを スプレッドシートの「log」のシートに書き込んでいくようになります
次回は グラフの作成を説明したいと思います
Attachments:
GASについて
GASはGoogle Apps Scriptの略で、Googleのサービスの拡張・自動化や、
サービス間連携などをJavaScriptで記述することができるプラットフォームです
ググれば 色々な諸先輩方が説明してくれていますが 今回実行したいことをふまえて GASの説明です①新しいスプレッドシートを作成
スプレッドシートを 作成した時に このとき、URLが https://docs.google.com/spreadsheets/d/ユニークなID/edit#gid=0 」
となっていると思いますので、コピーしておきます
②スプレッドシート名を変更(今回は「プラファン温度計」)
③「シート1」を「log」に変更
④拡張機能 の中で AppsScript を選択
⑤「コード.gs」の中身を書き換えてくださいvar SS = SpreadsheetApp.openById(‘コピーしておいたユニークID’);
var sheet = SS.getSheetByName(‘log’);
var str = “”;
function doPost(e) {
var parsedData;
var result = {};try {
parsedData = JSON.parse(e.postData.contents);
}
catch(f){
return ContentService.createTextOutput(“Error in parsing request body: ” + f.message);
}if (parsedData !== undefined){
switch (parsedData.command) {
case “appendRow”:
var dataArr = parsedData.values.split(“,”);
var now = Utilities.formatDate(new Date(), “JST”, “yyyy/MM/dd HH:mm”);
dataArr.unshift(now);
SHEET.appendRow(dataArr);str = “Success(appendRow)”;
SpreadsheetApp.flush();
break;
}return ContentService.createTextOutput(str);
}else{
return ContentService.createTextOutput(“Error! Request body empty or in incorrect format.”);
}}
Attachments:
GASについて
GASはGoogle Apps Scriptの略で、Googleのサービスの拡張・自動化や、
サービス間連携などをJavaScriptで記述することができるプラットフォームです
ググれば 色々な諸先輩方が説明してくれていますが 今回実行したいことをふまえて GASの説明ですAttachments:
プログラムは下記に置いておきます
https://drive.google.com/file/d/1rASCg21tY7NnIa00joz8UrwdAx38ZyR4/view?usp=sharing
次回は スプレッドシート側の説明をする予定にしていますAttachments:
マイコン側のプログラムの動きは こんな感じです
Wifi接続時に時計を合わせて 5分毎に 温度、湿度を測定して スプレッドシートにデーターを送るようにしています
WBGTの値の計算はマイコン側で計算した値でLEDを制御
メールをするための計算はスプレッドシート上でGAS(google apps script)で制御してみますAttachments:
前回のポストで実現したい機能が大体形になってきたので プログラムについて 公開します
LINEで情報を開示していたロジックと似通っています
違うのは、スプレッドシートに5分毎に温度・湿度情報を残していくのでスマホやパソコンで状態の変化が分かるようになります後はスプレッドシートのセルを監視して WBGTの値でスマホ(メールで送信)に情報を発信します
Attachments:
NoRITEC。です
前回のポストから 間が空いてしまいました
最終 プラモデルに組み込む って 事で 油断していた部分もありますが
プログラムを 公開できていませんでした すみません一旦 これまでの プログラムを公開させていただきます
https://drive.google.com/file/d/1dTsW5nBZud-vg6WH7N1OlG2U4hRNDZAZ/view?usp=sharing
で、今までのポストを踏まえて 下記に進んでみます
最初の目的は達成出来きましたが テスト運用していると 以下の問題(改善案?)が出てきました①アラーム発報しっぱなし問題
本来 作業エリアの問題検知(熱中症対策)の為なので 改善するまでアラートが発報して当然ですがLINEのバッチが多すぎても注意喚起の意味が薄れるのでは?
②業務時間外(管理しなくてよい時間帯)にも情報発信問題
週末など休業日や盆暮れ正月など情報発信が不要な時にも環境温度で発報します(電源OFFするだけで良いといえば良いですが)
③温度・湿度の変化を改善に繋げたい
成形現場とゆうも少なからず 環境温度で製品品質に影響を受けると考えます
せっかく 温度、湿度を計測するだから 変化を知ることは改善に繋げれるでのは?(問題発生時の調査に有効では?)主に③に有効活用できないかと考え ロジック構成を見直してみようと思います(プログラムの置き換えでいつでも元に戻せるのがマイコンの良いところ)
本来ならば Raspberry Pi とかでローカルサーバーを構えて温度、湿度ログを細かく取る事がデーターとしても有効ですが、
今回は 下記の様な構成で実現できないか検討していきます情報を集めながら実現できる部分を共有していきたいと思います
「1」 データーを測定する間隔は5分毎(何分毎が適正か悩ましいですが)
「2」 データーをgoogle spreadsheetに記録する
「3」 保存したデーターを用い 熱中症の閾値を用いてアラート(メールもしくはLINE)
「4」 アラートのON/OFFを指定出来る様にする
「5」 データーをグラフ化しで参照できるようにする
「6」 データの保存期間は 3か月を目途に繰り越し(googleサービスの容量確保のため)興味のある方は もうしばらく お付き合いください。
前回のポストから時間開いてしまいました
今回は 時間の制御の説明です
今回のプログラムは 定期的に「温度」「湿度」「WBGT」をLINEに通知しています
プログラムの内容は こんな感じtime_t t = time(NULL); として、現在の時刻を取得します
struct tm *tm = localtime(&t); で取得した時刻をローカル時間に変換します
int konkai = tm->tm_min; で現在の分を取得します
(konkai % 30) == 0 と tm->tm_sec == 0 の条件を使用して、30分ごとの00秒のみ処理を実行します
message の文字列結合には String() 関数を使用し、浮動小数点数を文字列に変換しましたsend_line() を呼び出して、LINE Notifyで通知を送信します
これにより、毎時0分と30分の00秒になった時に警戒レベルとセンサーの測定値を含むメッセージが作成され、LINE Notifyで通知が送信されます
情報の送信が頻度すぎるような気もしますね
先日 書いたとおりですが、この時期 週末とかの工場は容赦なく温度が上がるので時間制限や1日当たりの送信回数の制御の検討した方が良いかもですねAttachments:
前回の告知どうり LINEへ通知する 機能を説明
最初にも書きましたが そもそも IoTの通知機能としてLINEが適正かとゆうのもありますが
今回はLINEが提供してくれている プラットフォームを利用します
↓(サービスの紹介)
https://notify-bot.line.me/ja/
LINEのトークンの取得は参考にさせていただきました
↓(この記事ではAruduinoIDE以外でプログラムしてます)
https://zenn.dev/iot101/articles/d8e26ac7be133bここで取得したトークンをプログラムの「トークン」の部分にコピペします
これをキーにして 先に設定した 「個人」もしくは「グループ」にメッセージを送ります
工場のIoT目線では 「個人」⇒ライン長などの監督者に通知 「グループ」⇒チーム員などに通知に利用できます
この辺が LINE への通知が良いのか?考える部分でもあります 小さい会社なら良いんでしょうけどね
休日なども容赦なく通知が来ますし。。。
そう考えると 会社用メールに送信するってのが良いかもですAttachments:
色々 試作はしてるのですが 少しづつ形になってきてるのでパート毎に説明していきます
今回は IoTてことで インターネットに接続して情報を発信するとゆう事をチャレンジしてみたので、NTPCより時刻情報を取得する仕組みを採用してみました
マイコンで時間を基準にして動くプログラムを作成する場合
RTC(リアルタイムクロック)モジュール 時計機能を持ったユニットで時間を設定する事もありますNTPとは「Network Time Protocol」の略です
インターネットの世界で提供されている 原子時計を元に正確な時間を取得する仕組みです
まぁ 通信する過程で遅延が有るのですけど下記ページで公開されているNTPClientライブラリを使います
GitHub – arduino-libraries/NTPClient: Connect to a NTP server今回はここまで 次回は LINEへ通知する機能の予定です
Attachments:
プログラムを作成するにあたり 動きを整理してみます
フローチャートはこんな感じです(自己流なので少し変ですが)
これを 元にプログラムを作成していきます熱中症警戒指数の計算式(レベル判定のIF)は以下を組み込んでます
wbgt = (温度 *0.725 + 湿度 *0.0368 + 0.00364* 温度 * 湿度 – 3.246)wbgt >= 25 ⇒ 緑色
wbgt =28以上31未満の場合 ⇒ 黄色
level = “警戒レベル2”
wbgt >= 31以上の場合 ⇒赤
level = “警戒レベル3”警戒レベル 2/3 に達すると LINEへ通知する
LINEへ通知後 5分処理を止める
※環境を改善しないと 5分毎にメッセージAttachments:
先ずはブレッドボードにて動作検証
LEDは A-BRIGHTのフルカラーLEDをチョイス
これは 赤/緑/青3色のLEDコアが入っていて 原理上は光の三原色の表現ができます黄色は 赤と緑の同時点灯で表現する事とします
赤のLEDの抵抗は本来は値を変えないといけないのですが今回は200Ωでテストしてみます※XIAO ESP32C3の端子図解は公式サイトより借用
https://wiki.seeedstudio.com/XIAO_ESP32C3_Getting_Started/Attachments:
最終ロボットの形で成立させたいので、電源ケーブルについては ロボの後ろ側に出るサイズ感のマイコンを物色したところ、Seeed Studio XIAO ESP32C3 がHit!!!
使うのは初めてですが何とかなるでしょうッテことで、これにて進める事としました
いやぁ ほんと小さい このサイズで WiFi + Bluetooth が使えて 極めつけは 外部アンテナが使えます(今回も内蔵できそう)
以前作ったシステムでは Wifiが工場内のノイズで到達が厳しいとか経験しているので外部アンテナが使えるのは 工場 IoTの為のデイバイスみたいです
Attachments:
プラ太郎さん コメントありがとうございます
少しでも お役に立てるよう 私も勉強しながら 情報提供しますねそれでは 少しづつ紹介していきます
先ずは射出成形機ロボットプ・ラモデルに入るサイズのマイコンの選定から
モデリングデーターを頂き とりあえず 3Dプリンターで出力してみました
温度・湿度を測定するセンサーは sht30 向かって右側
この時点のマイコンは esp8266D1mini 向かって左側内蔵できるサイズではありますが 電源の接続を考えると NG な感じでした
Attachments:
-
投稿者返信