2020年6月7日日曜日

宅配ボックス開閉通知 IFTTT

Amazonが置き配をデフォにして、しかもそれがAmazon使うのやめようかと思うほどユーザー無視の仕様><;

なにが問題かと言うとおき配指定した場合ヤマトや佐川はピンポンしてくれるんだけど日本郵政やAmazon配送となっているわけわからない配送業者はピンポンしてくれない><;いてもいなくてもピンポンせずに強制おき配。

頼んだものが2便に分かれてしまった場合あとから届いたものは宅配ボックスにすでに鍵がかかっているということで持ち帰られてしまう><;

ということで、宅配ボックスにものが入ったらピンポンがなるIoTを作ろうとしたわけです^^;

1年ほどArduinoから離れていたせいかなにをやってもうまくゆかない><;現象としては途中で暴走リセットしている模様…

Serial.print() しただけで USB 接続が切断され /dev/ttyUSB0 と /dev/ttyUSB1 が交互に切り替わるって、意味が分からない><;この問題に悩まされること3ヶ月!やっと原因を見つけた!原因は「USB3.0ハブ」アマゾンで買ったんだけどこいつ経由だと駄目。本体のUSBポートに直接繋ぐと正常に動くようになった><;

いやはや、実際こいつを買って以降、Arduino関連では書き込みできなかったり散々な目にあっていました><;

愚痴はここまで

正常に制御できるようになったレ簡単なプログラムすぐできた\(^_^)/

ESP-WROOM-02 にマグネットスイッチを付けただけ、超簡単。


さてと、基盤むき出しは信頼性低すぎなんで3Dプリンターでケース作ります。^^;

参考になるかわかりませんがソースも置いておきます。

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>

const char* ssid = "SSID";
const char* password = "password";
const char* IFTTT_KEY = "KEY";

#define TIMEOUT (5 * 1000 * 1000)

const char* eventOpen = "open_box";
const char* eventClose = "close_box";

int last = -1;
int count = 0;

void setup()
{
  Serial.begin(115200);
  Serial.println("Start 115200");

  pinMode(D3, INPUT_PULLUP);  // magnetic switch
  pinMode(D4, OUTPUT);        // built in LED
  last = digitalRead(D3);

  // 再起動サイン
  for (int i = 0; i < 20; ++i) {
    digitalWrite(D4, i & 1);
    delay(200);
  }

  // WiFi
    delay(500);
  Serial.print(F("\n\nConnecting to "));
  Serial.println(ssid);
  int error_count = 0;
  WiFi.begin(ssid, password);
  // Wifi接続成功 待ち
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(F("."));
  }
  Serial.print(F("\nWiFi connected\n"));
  Serial.println(WiFi.localIP());
}

void loop()
{
  // 内蔵LED点滅
  digitalWrite(D4, count & 1);
  delay(10);

  // 磁気スイッチ読み取り
  int val = digitalRead(D3);
//  Serial.printf("cnt: %d, switch: %d, value: %d\n", count, count & 1, val);

  // 変化した?
  if (last != val) {
    // 変化したのでIFTTTのWebトリガーを呼ぶ
    if (val) {
      triggerIfttt(eventOpen, "open", "", "");
    } else {
      triggerIfttt(eventClose, "close", "", "");
    }
  }

  last = val;
  ++count;
  delay(1000);
}

/**
 * IFTTT へ WebTrigger
 * @param const char* event
 * @param char* value1
 * @param char* value2
 * @param char* value3
 */
boolean triggerIfttt(const char* event, char* value1, char* value2, char* value3)
{
  BearSSL::WiFiClientSecure client;
  client.setTimeout(500);
  client.setInsecure();

  // 接続
  if (!client.connect("maker.ifttt.com", 443)) {  // IFTTTへ接続確認
    Serial.println(F("ERROR: https connect"));    // エラー出力
    error();
    return false;
  }
  Serial.printf("https connected\n");    // エラー出力

  // リクエスト送信
  char* format =
    "GET /trigger/%s/with/key/%s?"
    "value1=%s&value2=%s&value3=%s HTTP/1.1\r\n"
    "Host: maker.ifttt.com\r\n"
    "User-Agent: ESP8266\r\n"
    "Connection: close\r\n\r\n";
  client.printf(format, event, IFTTT_KEY, value1, value2, value3);
  Serial.printf("Send web trigger");

  // 応答待ち
  unsigned long start = micros();
  while (client.available() == 0) {
      if ((micros() - start) > TIMEOUT) {
          Serial.println(">>> Client Timeout !");
          client.stop();
          error();
          return false;
      }
  }
  Serial.printf("Recive responce");

  // レザルトの受け取り
  while(client.available()) {
      String line = client.readStringUntil('\r');
      Serial.print(line);
  }
  return true;
}

void error()
{
  for (int i = 0; i < 40; ++i) {
    digitalWrite(D4, i & 1);
    delay(50);
  }
}

2020年5月14日木曜日

次亜塩素酸水、次亜塩素酸ナトリウムから超簡単に作れた!

次亜塩素酸水絡みのゴタゴタをまとめてみました。

※このページに書かれている内容は、あくまで私の体験談であり次亜塩素酸水の作り方を示しているものでありません。私が勝手にそう思っているだけで科学的な根拠に乏しいものですので、真似をされてトラブルになっても自己責任でお願いします。

発端

2020年3月中旬、コロナウィルスが騒ぎになり自衛手段が必要だなぁと思っていたところ空間除菌という言葉を目にしました。次亜塩素酸水というものを超音波噴霧器で散布して除菌するんだそうです。なんか効果ありそうなので早速検索、Amazonにて『電興社 Dew(デュウ)・空間除菌・消臭剤水(次亜塩素含有水)次亜塩素酸水専用加湿器 6,651円送料込み』と『次亜塩素酸水「パーフェクトクリーン」除菌消臭 大容量2000ml 濃度500ppm 3,590円』を注文しました。

さてここで問題になったのがランニングコスト!購入した噴霧器の吐出量は300ml/h、1日8時間つけたとして2.4L。購入した500mlの次亜塩素酸水は500ppmなので10倍に薄めて使うわけですが、5Lは約2日分。1本3,780円でしたので1日あたり1,890円!!高すぎます!

そこで更に調べてみたところ「次亜塩素酸水500ppm そっクリン 20L 5,930円送料込み」というものを発見。83日分になるので1日あたり65円許容範囲です。

さらに「次亜塩素酸水生成パウダー 80g 1,881円送料込み」というものを発見。このパウダー(ジクロロイソシアヌル酸ナトリウム)1gに水1000mlを加えると500ppmの次亜塩素酸水が作れます。1袋で50ppmを800L作れますので1日あたり5.6円!安くなりました\(^_^)/
ただこいつはちょっと曲者で液体のものに比べると塩素臭がかなり強いです><;

最初に次亜塩素酸水を購入して1ヶ月ほどした頃に総務部の女性から次亜塩素酸水が手に入らないと相談を受けます。え?と思い調べてみるとたしかに軒並み売り切れ…まぁ、パウダー買ってあるのでなんとかなるだろうとは思ったのですが、もう少し調べてみると「IMILLET 電解次亜水メーカー 2,980円送料込み」というものを見つけ、精製塩と次亜塩素酸濃度試験紙とともに購入。

この生成器の販売者はちとたちの悪い業者のようで注文したその日に発送済みとなったのですが送り状番号を佐川のサイトで調べても追跡不可…到着予定の10日後になっても届きません。今どきの宅配便が10日以上かかるわけがないのでキャンセルさせないために発送前にステータスだけ発送済みにするのでしょう><;

最終到着日を2日ほど過ぎて商品が到着、早速精製塩7.5gと水300mlをよく混ぜて投入、スイッチオンで電気分解開始。説明書には8分と書かれていますが5分ぐらいで終了。塩7.5gだと300〜500ppmとのことなので10倍に薄めて試験紙を浸けてみると…標本の最大値50ppmより全然濃いぞ!匂いを嗅ぐと鼻の奥がツンと来た!痛って〜!メッチャ塩素出てるじゃん!これで手を洗うとなんか手の甲がヒリヒリする!こりゃヤバそうだなとpH計るとなんと8.51とアルカリ性…
 

ということで、いろいろと調べてみたところページ記載されている化学式はデタラメ、生成しているのは次亜塩素酸水ではなく次亜塩素酸ナトリウム!要するにハイターを薄めたものが出来ているわけです。

いやはや…いろんなページに次亜塩素酸と次亜塩素酸ナトリウムは全くの別物なんて書いてある…

食品衛生法における次亜塩素酸水の成分規格の定義:微酸性次亜塩素酸水には
2~6%塩酸及び必要に応じ塩化ナトリウム水溶液を加え適切な濃度に調整した水溶液を無隔膜電解槽(隔膜で隔てられていない陽極及び陰極で構成されたものをいう。)内で電解して得られる水溶液をいう。
と書かれているので製法はあっていますが、その後の純度試験:(1)液性に
微酸性次亜塩素酸水 pH5.0~6.5
と書かれているのでpH8.51では次亜塩素酸水とは呼べないと思います。

もっともよく調べてみると「次亜塩素酸水」という名称は厚生労働省が食品添加物として「次亜塩素酸水」を定義する前からあり『商品名』として使われていた経緯があるのでフェイク商品とは呼べないのかもしれません。

使えないとわかりこれで一件落着なのですが、次亜塩素酸水の製造方法が気になって更に調べてゆくと、電解法と混合法という2種類があるということを発見。この混合法というやつをよくよく見てみると次亜塩素酸ナトリウムを薄めて次亜塩素酸水を作ると書かれている!

あれ?次亜塩素酸水について書かれたページの多くに次亜塩素酸水と次亜塩素酸ナトリウムは別物ってヒステリックなくらい書かれていたんだけどなぁ…

ということで更に調べてゆくと、混合法は次亜塩素酸ナトリウム水溶液に炭酸水を混ぜて中和しpHを下げてから、水で薄めるのだそうです。炭酸による中和の際に次亜塩素酸ナトリウムが次亜塩素酸になるそうです。

「次亜塩素酸水と次亜塩素酸ナトリウムは別物」というのは「次亜塩素酸水と次亜塩素酸水を薄めただけのものは別物」という説明を、早とちりしたか、「だけの」を脳内省略したか、あと、酸性電解水を販売する業者がライバルを貶め相対的良く自分を見せようとするフォーク准将のような小賢しい業者のページなのかもしれません。

あと、次亜塩素酸ナトリウムを中和するのは非常に難しいので素人は手を出さないほうが良いと記述しているページがありました。どのくらい難しいのかと調べてみると、問題になるのは塩酸を使った中和で、濃度の調整が非常に難しいそうです。炭酸水を使った中和の場合は入れすぎても炭酸ガスが抜ければ問題ないそうでpH5.0以下になることはないそうです。

次亜塩素酸ナトリウムを炭酸水で中和すると
NaCLO(次亜塩素酸ナトリウム) + H2CO3(炭酸)
         ↓
HCLO(次亜塩素酸) + NaHCO3(重曹)
となります。このときできる重曹がどのような影響をおよぼすのかが気になって調べているのですがいまいちよくわからないんですよねぇ…

ということで早速実験開始

まず、次亜塩素酸生成器に精製塩7.5gと水300mlを入れて蓋を締めよく振ります。電源オンで電気分解開始。出来上がると自動的に電源が切れます。出来上がったもののpHを測定してみます。pH9.16のアルカリ性でした。

これに市販の強炭酸水60mlを入れます。炭酸水の量は次亜塩素酸ナトリウム5,000ppm/mlあたり1ml程度のようですので500ppm×300ml÷5,000ppm/ml=30mlで良いようですが念のため多めに入れました。出来上がったもののpHを測定してみます。pH5.11でした。

マニュアルには塩7.5gにて300〜500ppmができると書かれていたので10倍に薄めてみます。出来上がったものを塩素濃度ペーパーにて測ります。50ppmを遥かに超えています…

塩の濃度を変えて出来上がったものを10倍に薄めて次亜塩素酸濃度を調べたことがあります。その際は1.5gまで減らしたものがようやく50ppmと同じくらいの色に…ということで、塩1.5gで作ったのの次亜塩素酸濃度を測ってみます。

ということで、次亜塩素酸水生成器ようやく使い物になるようになりました\(^_^)/

ん?待てよ!次亜塩素酸ナトリウムから次亜塩素酸水が作れるということはハイターから作れるじゃん!スーパーで見るとハイター600ml入り143円!ハイターは6%水溶液なので60,000ppm。これを中和するには炭酸水7.2L必要になります。まぁ多めに入れて12L、500mlペットボトル24本入り1ケース1400円弱。約1500円で500ppmが72L作れます。300mlで割ると240回分…

ちなみに花王のHPによるとキッチンハイターはハイターに洗浄成分を加えてあるそうなのでハイターのほうが良さそうです。
Q、「ハイター」と「キッチンハイター」の違いは?代わりに使えるの?

おまけ その1

次亜塩素酸水は50ppmのものを加湿器にて噴霧して空間除菌に使う他、手洗いには100〜150ppmが良いようです。この手洗いの際は成分がタンパク質と反応して除菌しにくいことがあるので流水で使うことが推奨されています。水道水で手を洗う際の流量を調べてみたところハンドルの開閉度30度でも7L/分だそうです。コロナ対策の手洗いは最低10秒なんてTVで言っていましたので1L以上は必要そうです。

厚生労働省によると100ppm以上の次亜塩素酸水にてコロナウィルスの死滅を確認したそうなので手洗いには120ppmくらいが適切でしょうか?ハイター1本で120ppmの次亜塩素酸水300Lつくれます。1回あたり5円程度のコストならば気にならない気がします。

ウォータジャグにでも入れて手洗いに使うことします。

おまけ その2

ウェットティッシュが無くなったのでホームセンターやらドラッグストアなどをはしごして探し回りましたがどこにも売っていません。商品棚にポケットタイプなどが僅かに残っている店もありましが大抵の店が売り場ごと無くなっています><;う〜ん、困った!ということで自作することに…

実は以前乾燥してしまったポケットウェットティッシュを復活させるための液を作ったことがありまして、それをペーパータオルに含ませるか…と安易に考えていましたが…

必要な材料

  • ペーパータオル
  • アルコール 20ml
  • オスバンS 0.2ml
  • 水 30ml
確か消毒用アルコールがまだあったよなと在庫を確認してみると…ない!いまは消毒用アルコール手に入らないんだよなぁ…更に調べてみるとオスバンS(塩化ベンザルコニウム)はSARSなどエンベロープありのコロナウィルスには効果が十分得られない場合があるとのこと…

ということで、次亜塩素酸水の登場!100ppm次亜塩素酸水をペーパータオルに染み込ませてやるだけ。ただし、次亜塩素酸水の特徴として塩素が飛びやすいというのがあり、2週間以内に使ってくださいなんて記述も見ますので大量には作らず、少しずつまめに作ったほうが良さそうです。

さて、ここでまた悩みが増えました。まぁるい筒状のウェットティッシュのボトルに入っている紙、あれが欲しい!さすがに紙だけの個人需要はないようでいくら検索しても出てきません。同様に紙だけ探している人はいましたが「ウェットティッシュを乾燥させろ!」なんて頓珍漢な回答ばかり…

う〜ん、とりあえず、箱に入れるタイプを作ります。
※つづくかも^^;

2020年3月27日金曜日

VSCode エクスプローラーとエディタの連動を停止

VSCode 設定の備忘録

VSCode 標準設定ではエディターを切り替えるとエクスプローラーのカーソル位置がそのファイルに移動します。これはこれで便利なんですが、ファイルが多いプロジェクトの場合、いくつもファイルを開いた後はディレクトリがみんな添加されてしまって、リストから目的のファイルを探しにくてしかないです。

workbench.files.action.collapseExplorerFolders で折りたたみを閉じてから workbench.files.action.focusFilesExplorer にてエクスプローラーにフォーカスを移動するようにして、少しはマシになったのですが、結局、避けないことさせないほうが楽ということで^^;

設定
~/.config/Code/User/settings.jsonsettings.json
"explorer.autoReveal": false,  // 追加


~/.config/Code/User/keybindings.json
{"key": "ctrl+shift+numpad5", "command": "revealInExplorer"},  // 追加

2019年9月5日木曜日

マルチファンクションシールドで時間計測

Arduinoで遊んでいるといつも電源で悩みます。だいたいモバイルバッテリーをつないで済ますのですが、結構大きくて邪魔だったりします。で、なにかいいものないかなと思っていたのですが、部品箱を漁っていたらLIR2032を2個入れる電池ボックスを発掘しました。
 
お!これは行けそうだということでVINにつないでみるとちゃんと動作\(^_^)/でもどのくらいの時間もつかなぁと調べようとしたのですが、じっと見張っているのも馬鹿らしい…
 
ちょうどマルティファンクションシールドというのが余っていたので、信号がHIGHになってからLOWになるまでの秒数を7セグLEDに表示するのを作りましたw(写真右)
 
計測してみると5分程度しかもたないみたいです…ただ、ボタン電池が購入してから1年以上放置していたものなので劣化してしまっている、あるいは、中華なので最初から不良なんて可能性もあります^^;
 
ちなみに動作させた左側のArduinoは孫の夏休みの自由研究用にと用意したFMラジオです。元は宿題用にバラックだったのですが、興味を示さなかったのでボツ。ジィジの記念用にケースというかワーキンベースというかを3Dプリンターで印刷しました^^;

時間計測しかできませんが意外と便利だったのでソースを公開します。

/**
 * 時間計測器
 * 
 * filename:  Uno-Timer.ino
 * 
 * @version   1.0.0
 * @copyright Copyright (C) 2019 Yoshio Kiya All rights reserved.
 * @date      2019-09-01
 * @author    木屋 善夫
 */
#include <TimerOne.h>
#include <Wire.h>
#include <MultiFuncShield.h>

enum
{
  WAITING,
  STARTED,
  STOPED,
};

uint8_t mode;
unsigned long startTime;
unsigned long offTime;
unsigned long stopTime;

#define PIN_INPUT 5

void setup() {
  Timer1.initialize();
  MFS.initialize(&Timer1);    // initialize multi-function shield library

  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(PIN_INPUT, INPUT);

  int pin = digitalRead(PIN_INPUT);
  digitalWrite(LED_BUILTIN, !pin);
  MFS.write(-1);

  mode = WAITING;
}

void loop() {
  int pin = digitalRead(PIN_INPUT);
  digitalWrite(LED_1_PIN, !pin);
  unsigned long now = millis();

  // モードごとの動作
  switch (mode) {
    case WAITING: {
      // 起動前
      if (pin) {
        // スイッチがオンになった
        mode = STARTED;
        startTime = now;
        digitalWrite(LED_2_PIN, LOW); // 点灯
      } else {
        digitalWrite(LED_2_PIN, (now >> 9) & 1);
      }

      break;
    }
    case STARTED: {
      if (!pin)
      {
        // スイッチがオフになった
        mode = STOPED;
        stopTime = millis();
        digitalWrite(LED_3_PIN, LOW); // 点灯
      } else {
        digitalWrite(LED_3_PIN, (now >> 9) & 1);
      }

      int sec = (int)((now - startTime) / 1000);
      int min = sec / 60 * 100;
      sec = sec % 60;
      MFS.write(min + sec);
      break;
    }
    case STOPED: {
      if (pin) {
        mode = STARTED;
        digitalWrite(LED_4_PIN, HIGH);  // 消灯
      } else {
        digitalWrite(LED_4_PIN, (now >> 9) & 1);
      }
      break;
    }
  }

  delay(100);
}


使い方は、マルチファンクションシールドの右下の方にある A5 ピンに信号線をつなぎ、GND どうしを接続してください。

マルチファンクションシールドの右にあるLEDの意味は上から

  1. ウォッチドク:動作中は約0.5秒間隔で点滅します。
  2. スタンバイ:信号線が HIGH になるのを待っています。
  3. 計測中:最初に信号が HIGH になってから最後に LOW になるまでの時間を7セグLEDに「分分秒秒」で表示します。
  4. 計測終了:信号が HIGH になると 3. に戻ります。

参考資料

2019年8月9日金曜日

TPU での印刷設定

TPU でスマホケースを作りたいなと思い随分前に購入しました。ダイレクトエクストルーダの Pxmalion CoreI3 というのを持っているのでそれで試してみたのですがまともに印刷できない><;ダイレクトエクストルーダで駄目ならボーデンタイプの ANYCUBIC I3 MEGA じゃ無理だろうと放置していたのですが、ふと試してみたくなり、ドライブギアとの隙間を狭めたアッパーハンドルに交換して印刷してみるとすんなり印刷できました\(^_^)/

最初の印刷品質はあまり納得できるものではなかったのですが、あれこれと試してきれいに印刷できるようになったので備忘録。

右が最初、左が納得できた印刷です。

PLA のデフォルト設定から、下記の変更を行い印刷しました。スライサーは Cura 4.2.1 です。

最初の設定(写真右端)

  • インフィル: インフィル密度 15%
  • マテリアル: 印刷温度 210℃
  • マテリアル: ビルドプレート 50℃
  • マテリアル: フロー 120%
  • スピード: 印刷速度 20mm/S

フローが多すぎるようで穴が小さくなってしまっていますし、温度も高すぎるようで糸引きとエア噛みも激しく白っぽくなっています。

次の設定(写真中央)

  • インフィル: インフィル密度 15%
  • マテリアル: 印刷温度 195℃
  • マテリアル: ビルドプレート 50℃
  • マテリアル: フロー 100%
  • マテリアル: 引き戻し有効 チェックを外して無効に
  • スピード: 印刷速度 30mm/S
エア噛みは少なくなり透明度が出てきました。糸引きもかなり少なくなりました。印刷速度も上げてみましたが特に問題ないようです。ただ、最上部がガタガタになっています???

この最上部、よく見ていると一番最後だけなんかはみ出すくらい大きくヘッドが動いていてそのせいで変な形になってしまっています???
こいつの原因がわからずこの動きは何なんだとしばし考え込んだのですが、そういえば以前アイロンという設定を見たことがあると気づきこれを外してみました。

納得の設定(写真左端)

  • 外郭: アイロン有効 チェックを外して無効に
  • インフィル: インフィル密度 15%
  • マテリアル: 印刷温度 195℃
  • マテリアル: ビルドプレート 50℃
  • マテリアル: フロー 100%
  • マテリアル: 引き戻し有効 チェックを外して無効に
  • スピード: 印刷速度 30mm/S
ビンゴでした。最上部まできれいに整って印刷されました\(^_^)/

印刷終了後ノズルにフィラメントたまができているので、印刷終了後にアイロンがけしている際にフィラメントたれて無駄なバリを作ってしまうのではないかと思います。