2019年7月31日水曜日

ESP32とBME280によるIoT気象計のスケッチ

今日は猛烈に暑かったですね。昼間、IoT気象計を置いたリビングが35度を越えていました。まあ、先日書いたように使っているセンサBME280は温度が高めにでるので、それほどではないと思いますが。

Machinistの気温グラフです。所々データが抜けているのは、データがうまくアップできなかったようです。21:00前後に抜けているのは、電源をオフ/オンしていたからです。


ThingSpeakの方は、昨日から今日にかけてごっそりとデータが抜けています。処理的には、WiFiをオンしてMachinistにアップしてWiFiをオフし、再度WiFiをオンしてThingSpeakにアップしていますが、WiFiオフからオンの時間を少し空けた方が安定するのかもしれません。


スケッチはバグがあるかもしれません、無保証です。著作権は留保しますが、改変などご自由にどうぞ。もしお気づきの点があればコメント頂けると幸いです。回路図は簡単なので省略します。 写真を参考にしてください。


今回試したIoTプラットフォームは、どちらも無料で試せます(それなりに制限あり)。

ThingSpeakは以下のページがわかりやすくて参考にさせて頂きました。
 http://iwathi3.hatenablog.com/entry/Data-to-Graph-ThingSpeak

MachinistはIIJがやっていて日本語なので判りやすかったです。
https://machinist.iij.jp/getting-started/


//--------------------------------------------------------------------
//  IoT気象計                                          2019.07.31 naka
//     気圧・気温・湿度をクラウド(IoTプラットフォーム)にアップする                                              //
//  Device
//    ・WiFiマイコン ESP32
//    ・気圧・気温・湿度センサ BME280 (I2C)
//    ・小型LCD AQM1602XA-RN-GBW (I2C)
//    ・モニタ用LED (pin2)
//
//  IoTプラットフォーム
//    ・ThingSpeak https://thingspeak.com/
//    ・Machinist  https://machinist.iij.jp/
//
//  処理
//    ・1分毎に測定しLCDに測定値を表示(更新間隔1分)
//    ・5分毎に過去5回の平均を出してIoTプラットフォームにアップ
//
//--------------------------------------------------------------------
#include <Wire.h>
#include <FaBoLCDmini_AQM0802A.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include <SparkFunBME280.h>
#include <ThingSpeak.h>

// WiFiアクセスポイント情報
const char *ssid = "******";
const char *pass = "********";

// Machinist情報
const String MachinistApi_key  = "****************";
const String MachinistURL = "https://gw.machinist.iij.jp/endpoint";

// ThingSpeak情報
unsigned long myChannelNumber = ******;
const char* myWriteAPIKey = "****************";
int   ThingSpeak_DelayCount;  // ポスト間隔を15秒以上あける必要があり、そのためのカウンタ

WiFiClient client;
FaBoLCDmini_AQM0802A lcd;
BME280 sensor;

#define LED_PIN  2
int LedBlink = 0;

// タイマー割り込み用
volatile int interruptCounter;
hw_timer_t  *timer = NULL;
portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED;

int  secCount = -1;
int  minCount = -1;
int  nCount;
float temp, hum, pres;
float avetemp,avehum,avepres;

void IRAM_ATTR secEvent() {  //1000ms=1s毎に呼び出される
  portENTER_CRITICAL_ISR(&timerMux);
  interruptCounter++;
  portEXIT_CRITICAL_ISR(&timerMux);
}

void setup() {
  char buff[17];
  IPAddress IP;

//  Serial.begin(115200);
//  Serial.print("started\n");

  // タイマー割り込み設定
  timer = timerBegin(0, 80, true);
  timerAttachInterrupt(timer, &secEvent, true);
  timerAlarmWrite(timer, 1000000, true);  // 1sec (us単位)

  // モニタLED設定
  pinMode(LED_PIN, OUTPUT);

  // モニタLCD設定
  SetupLCD();
  lcd.clear();
  lcd.print("hello!");  // 起動メッセージ

  // 温湿度センサ
  SetupSensor();

  // WiFi接続(起動時に確認のために一旦繋いでみる)
  WiFi.begin(ssid, pass);
  while (WiFi.status() != WL_CONNECTED) {
    delay(100);
  }

  lcd.clear();
  lcd.print("WiFi connected");
  IP = WiFi.localIP();
  WiFi.disconnect(WIFI_OFF);  // 省電力のために切断

  sprintf(buff, "IP=%d:%d:%d:%d", IP[0], IP[1], IP[2], IP[3]);
  lcd.setCursor(0, 1); // Col,Raw
  lcd.print(buff);

  ThingSpeak_DelayCount = -1;
  
  delay(5000);  // 5秒待ち(IPアドレスを目視確認のため)
  lcd.clear();

  nCount = 0;  // センサー値の平均用変数初期化
  temp = hum = pres = 0.0;

  timerAlarmEnable(timer);  // 割り込みタイマー開始
}

void loop() {
  float ftemp,fhum,fpres;
  char buff[17];

  if (interruptCounter > 0) { // タイマー割り込み処理(1秒毎に割り込み)
    portENTER_CRITICAL(&timerMux);  // ここから3行は決まり文句らしい
    interruptCounter--;
    portEXIT_CRITICAL(&timerMux);

    // 以下、1秒ごとに実行する処理
    secCount++;
    LedBlink ^= 1;  // トグル操作
    digitalWrite(LED_PIN, LedBlink);

    if (secCount == 60 || secCount==0) {
      minCount++;
      secCount = 0;
      // センサーから値を取り出す
      ftemp = sensor.readTempC();
      fhum  = sensor.readFloatHumidity();
      fpres = sensor.readFloatPressure() / 100.0;

      DispLCD(ftemp,fhum,fpres); // LCDに表示
      
      temp += ftemp; // 平均を出すためにΣ
      hum  += fhum;
      pres += fpres;
      nCount++;
      
      if (minCount == 5) { // 5分毎に平均してIoTプラットフォームへポストする
        minCount = 0;
        avetemp = temp / nCount;
        avehum  = hum  / nCount;
        avepres = pres / nCount;
        temp = hum = pres = 0.0;
        nCount = 0;

        // IoTプラットフォームにポストする
        PostMachinist(avetemp,avehum,avepres);
        PostThingSpeak('T', avetemp);
        ThingSpeak_DelayCount = 0;  // カウントスタート
      }
    }
    
    sprintf(buff, "%02d:%02d", minCount, secCount);
    lcd.setCursor(11, 0); // Col,Raw
    lcd.print(buff);

    if (ThingSpeak_DelayCount>=0) {  // ThingSpeakはポスト間隔を15秒以上開ける必要があり、
      ThingSpeak_DelayCount++;       // 一応20秒経ったら湿度、さらに20秒経ったら気圧をポスト
      if (ThingSpeak_DelayCount==20) {
        PostThingSpeak('H',avehum);
      }
      else if (ThingSpeak_DelayCount==40) {
        PostThingSpeak('P',avepres);
        ThingSpeak_DelayCount = -1; // カウントストップ
      }
    }

  }
}

void SetupSensor() {
  sensor.setI2CAddress(0x76); // 0x77(default) or 0x76
  sensor.beginI2C();
  // 以降は省略可(室内の状況を測定するには以下がよいらしい)
  sensor.setFilter(4); //0 to 4 is valid. Filter coefficient. See 3.4.4
  sensor.setStandbyTime(0); //0 to 7 valid. Time between readings. See table 27.
  sensor.setTempOverSample(2); //0 to 16 are valid. 0 disables temp sensing. See table 24.
  sensor.setPressureOverSample(5); //0 to 16 are valid. 0 disables pressure sensing. See table 23.
  sensor.setHumidityOverSample(1); //0 to 16 are valid. 0 disables humidity sensing. See table 19.
  sensor.setMode(MODE_NORMAL); //MODE_SLEEP, MODE_FORCED, MODE_NORMAL is valid. See 3.3
}

void SetupLCD() {
  lcd.begin();
  lcd.command(0x38);
  lcd.command(0x39);
  lcd.command(0x14);
  lcd.command(0x73);
  // lcd.command(0x51);
  lcd.command(0x56);  // 3.3V
  delay(2);
  lcd.command(0x6c);
  delay(300);
  lcd.command(0x38);
  delay(1);
  lcd.command(0x01);
  delay(2);
  lcd.command(0x0c);
  delay(2);
}

void DispLCD(float temp, float hum, float pres) { // LCDに表示
  char tempbuff[8], humbuff[8], presbuff[8], buff[17];
  
  dtostrf(temp, 4, 1, tempbuff);
  dtostrf(hum,  4, 1, humbuff);
  dtostrf(pres, 6, 1, presbuff);
  sprintf(buff,"%shPa",presbuff);
  lcd.setCursor(0, 0); // Col,Raw
  lcd.print(buff);

  sprintf(buff,"%s%cC   %s%%",tempbuff,0xDF,humbuff);
  lcd.setCursor(2, 1); // Col,Raw
  lcd.print(buff);
}

void PostThingSpeak(char kind, float val) {
  // WiFi接続
  WiFi.begin(ssid, pass);
  while (WiFi.status() != WL_CONNECTED) { delay(100); }
  
  ThingSpeak.begin(client); // ThingSpeak初期化
  switch (kind) {
    case 'T': // 気温
      ThingSpeak.writeField(myChannelNumber, 1, val, myWriteAPIKey); // 1 は気温用
      ThingSpeak_DelayCount = 0; // 送信用カウンタ初期化
      break;
    case 'H': // 湿度
      ThingSpeak.writeField(myChannelNumber, 2, val, myWriteAPIKey); // 2 は湿度用
      break;
    case 'P': // 気圧
      ThingSpeak.writeField(myChannelNumber, 3, val, myWriteAPIKey); // 3 は気圧用
      break;
  }
  
  WiFi.disconnect(WIFI_OFF);
}

void PostMachinist(float temp, float humid, float pres) {
  const String api_key = "Bearer " + MachinistApi_key;  
  HTTPClient http;
  String Json;
  
  Json = MkJson(temp, humid, pres); // JSONフォーマット作成

  // WiFi接続
  WiFi.begin(ssid, pass);
  while (WiFi.status() != WL_CONNECTED) { delay(100); }

  http.begin(MachinistURL);
  http.addHeader("Content-Type", "application/json");
  http.addHeader("Authorization", api_key);

  int http_rc = http.POST(Json);

  if (http_rc > 0) {
    String response = http.getString();
    //     Serial.println(http_rc);
    //     Serial.println(response);
  }
  else {
    //     Serial.print("Error on sending POST Request: ");
    //     Serial.println(http_rc);
  }
  http.end();
  WiFi.disconnect(WIFI_OFF);
}

String MkJson(float temp, float humid, float pres) {
  char buff[8];
  String strbuff;
  String Json;
  
  dtostrf(temp, 4, 1, buff);
  strbuff = buff;
  Json = "{";
  Json += "\"agent\": \"Home\",";
  Json += "\"metrics\": [";
  Json += "{ ";
  Json += "\"name\" : \"temperature\",";
  Json += "\"namespace\": \"Environment Sensor\",";
  Json += "\"data_point\": { ";
  Json += "\"value\":" + strbuff;
  Json += "}";
  Json += "},";

  dtostrf(humid, 4, 1, buff);
  strbuff = buff;
  Json += "{ ";
  Json += "\"name\" : \"humidity\",";
  Json += "\"namespace\": \"Environment Sensor\",";
  Json += "\"data_point\": { ";
  Json += "\"value\":" + strbuff;
  Json += "}";
  Json += "},";

  dtostrf(pres, 6, 1, buff);
  strbuff = buff;
  Json += "{ ";
  Json += "\"name\" : \"Pressure\",";
  Json += "\"namespace\": \"Environment Sensor\",";
  Json += "\"data_point\": { ";
  Json += "\"value\":" + strbuff;
  Json += "}";
  Json += "}";

  Json += "]";
  Json += "}";

  return Json;
}

//--------------------------------------------------------------------

2019年7月30日火曜日

Bloggerにソースを貼るテスト

bloggerにソースを貼るテストです。
google / code-prettiy というものが簡単そうだったので試しています。

void setup() {
  // put your setup code here, to run once:
}

void loop() {
  // put your main code here, to run repeatedly:
}
行数が多い場合にスクロールバーを出すこともできた。
しかし、枠の縦幅を強制的に指定しているので、短いソースの時に上のような冗長な枠になる。う~ん、イマイチ。 の最大値を指定する方法が分かったので、短い場合にはちゃんとフィットする(2019.07.31)。

void setup() {
  // put your setup code here, to run once:

}

...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...

void loop() {
  // put your main code here, to run repeatedly:

}

それにHTML編集しなければならず、一度でも通常のWYSIWYG編集にするとグダグダに乱れてしまうのが難点か。

2019年7月29日月曜日

ESP32の発熱対策

IoT気象計に使っているESP32ですが、シールドケースに触ってみたら結構発熱していることに気付きました。

setup()で無線LANのアクセスポイントに繋いで、そのままloop()で処理しているので、無線LANがずっとオンのままでした。きっとアクセスポイントの定期的な通信が続いていたのだと思います。

IoTプラットフォームに測定データをアップするのは5分毎なので、その時だけWiFiをオンにするようにしてみました。WIFI.disconnect(WIFI_OFF)です。


かなり改善されましたが、まだほんのり温かいです。ESP32は結構電力を喰うようですね。1分毎の測定時以外はスリープさせた方がよいのか。

今は動きがわかるように毎秒時間表示をしてます。LCDの右上に表示されている02:06がそうです。1分毎に測定した時に測定値が変わります(変化があれば)。5分毎にIoTプラットフォームにデータをアップすると00:00にリセットされます。

BME280の温度湿度センサがイマイチなので、専用のセンサモジュールを注文しました。SHT31です。国内だと高かったので、AliExpressで注文してみました。先日、安物BME280で失敗したのに懲りてないです。届くまで2〜3週間でしょうか。

一日の気温推移がこんな感じで見られます。

2019年7月28日日曜日

ESP32とBME280でIoT気象計

ようやく夏らしい暑さと日差しになりました。しかし、暑いです。午前中ちょっと庭の草取りをしたら大汗をかきました。

午前中に昨日注文したBoschの気圧センサBME280モジュールが届きましたが、なんと5V専用でした。トホホ。アマゾンにはArduino対応5Vと書いてありましたが、3.3Vでも使えると思ってポチったらちゃんとArduino専用でした。

届いたモジュールの裏側が見てみると、ご丁寧に電源レギュレータとレベル変換ICが載ってます。その割には安かったです。870円。




ESP32は信号レベルが3.3Vなのでダメ元で繋いでみたところ一応動きました。気圧、気温、湿度が測れるようになったので、毎分測定してLCDモニタに表示。5回分(5分)で平均をとってIoTプラットフォームに送るようにしてます。ThingSpeakMachinistの両方に送ってます。どちらもグラフの表示方法に一長一短があるのでとりあえず両方です。


しかし、このセンサは気温が高めで湿度が低めにでます。左の大きな温度湿度計は、他と比べても大体適切な値を表示します。これに対して、BME280センサは温度が1.5〜2度位高く、湿度は9%位低くなります。温度と湿度は飽和水蒸気量の関係で負の相関があるのですがが、湿度がこんなには低くならないと思う。計算すれば求まるが端折ります。そもそも気温が高く出過ぎ。


アマゾンのコメントにもその旨が書かれていましたが、個体差じゃないのか? と信じなかったのが敗因です。気圧は、以前PICと超小型グラフィック液晶で作ったデジタル気象ロガーとほぼ同じで1hPa程度の差でした。

--2019.07.28 追記
BME280について色々調べたところ、このセンサは気圧と湿度測定の際に自らが発熱してしまうため、その補正を行うために温度を測っているようです。オマケ的な感じ。このため気温測定には不向きらしいですが、室温測定のための設定があったので設定してみました。

その結果かどうか少し改善した感じです。気温の差は1度ちょっと、湿度は5%差ほどになりました。
--

ThingSpeakのグラフです。Y軸のMin/Maxを指定できるのがよいです。X軸は送信したデータ数で指定なので、5分毎に送って一日分見ようと思うと、60mim/5min*24h = 288個と指定します。無料利用だと一度に3データを送れないので20秒毎の時間差で送るのが面倒です。まあ、一度ソースを書いてしまえば問題ないのですが。



Machinistの折れ線グラフです。Y軸は送ったデータのmin/maxが収まるように自動調整されるので、でこぼこが目立ちます。棒グラフだと0基準のようですが、そうすると気圧の変化は殆どわかりません。また、X軸を1日とか1週間で指定できるのですが、1日とは0時から24時で切られてしまい、深夜1時頃には1時間分しか見られません。最近の24時間分とかあればよいのですが。あと、スマホで細長くて狭いグラフでしか見えないのが難点です。

ThingSpeakは以下のページがわかりやすくて参考にさせて頂きました。
 http://iwathi3.hatenablog.com/entry/Data-to-Graph-ThingSpeak

MachinistはIIJがやっていて日本語なので判りやすかったです。
https://machinist.iij.jp/getting-started/

スケッチは、少しキレイに見直しますのでもう少しお待ちください。
あとblog内にソースを貼る方法を調べたいと思います。

2019年7月26日金曜日

気圧センサが届きましたが、、、

今日はようやく夏の日差しになりましたが、週末は台風接近でまたも雨予報。7月の週末はず〜っと天候不順でした。

さて、アマゾンでポチった気圧センサBME280が届いたので早速試してみましたが、どうもイケマセン。アクセスできません。Arduinoの色々なライブラリで試しましたがいずれも初期化でエラーになります。アドレスも0x76,0x77両方試しましたがダメです。




ちょっとピンボケですが、元々のシルクも滲んでます。アマゾンで一番安い300円台を買ったので、ハズレを引いたのでしょうか?

アマゾン経由でショップに連絡しましたが、どうなるでしょうか?

--
2019.7.27追記
ショップから返金すると連絡がありました。
別のショップで新たに注文したので、明日には届くと思います。今度は国内発送で、値段は2倍です。

2019年7月21日日曜日

IoT温湿度計をIIJのMachinistに繋いでみた

昨日今日も天候はすぐれず蒸し暑い週末でした。こんな週末が続くと観光地やプールは大打撃ですね。選挙の投票率はどうだったのでしょうか。

さて、IIJがMachinistというIoTプラットフォームを7月11日にサービスインしたというニュースを見たので、IoT温湿度計で早速使ってみました。まさにサンプルが温度や湿度を可視化するというものでした。

ThingSpeakによく似ていますが、データの送信方法がHTTPSでJSONフォーマットのデータをPOSTするというもので拡張性がありそうです。以下のグラフが実際に送ったデータですが、温度・湿度があまり変化してないのでフラットなグラフとなっています(クリックで拡大)。


グラフをカスタマイズして温度と湿度を同じグラフに載せてみました。縦軸を2軸のグラフにできないようなので縦軸が湿度に引っ張られて伸びてます。横軸も直近の3時間くらい、1日、1週間、1ヶ月が選べます。以下は1日表示ですが、今日の14時頃からデータをアップし始めたので、それ以前はありません。


無料だとデータ保管は1ヶ月のみ、またメトリクスという管理単位も10個しか作れません。ThingSpeakのようにポスト間隔が15秒以上という制限は無いようです(ドキュメントにはそのあたりの記載がありません)。

Machinistはポストしたデータを監視していて、例えば気温が35度を越えたらメール通知することができます。試しに設定してみました。南向きのリビングなのでよく晴れれば昼間は35度を越えるかもしれません。

ThingSpeak, Machinistなど個人が無料で使えるプラットフォームがこれからも増えていくのでしょうね。データの利用許諾など見てないのですが、無料で使える代わりに見られちゃうのかな? ビッグデータ集め? まあ、どんな素性のデータか判らなければ使い道がありませんが。

今回のスケッチも公開予定ですが、圧力センサが届いて気圧・気温・湿度が測れるようになってから。それまでにソースを綺麗にします。

ちなみにmachinistとは、英語で機械工・ミシン工ですが、このMachinistはどこから来ているのでしょうか? IoTで機械の様子を監視する人かな?

2019年7月17日水曜日

IoT温湿度計で除湿機の効果を確認

昨夜から除湿器を湿度70%で自動運転始めました。湿度のグラフが波打っているのがその結果です。

夜から今朝までの間は、運転/停止を繰り返して湿度70%を維持してくれています。昼間もそうですが、気温が上がり飽和水蒸気量が多くなったためか、部屋の湿度が夜間ほどは上がらなくなって、波の振幅が小さくなっています。除湿の運転時間が短くなっているようです。除湿機の水タンクも昨夜からで半分くらいしか溜まっていません。


除湿機がちゃんと仕事をしてくれているのが見られて面白いです。

2019年7月16日火曜日

IoT温湿度計(1日経過後)

昨日作った、ESP32でIoT温湿度計を作ってみた は、昨夜一晩と今日一日リビングで動かし続けてみましたまだ1日ですが、ちゃんと動き続けているのが偉い。

リビングは南向きですが、一日中雨だったので気温が上がりませんでした。気温・湿度ともにほぼ一定で、面白みのないグラフとなりました。グラフにマウスカーソルを乗せると詳細が見えます。浮動小数点データを送っているので小数点以下が細かいですね。こんなに精度はありません。


湿度は昨夜除湿機を止めてから徐々に上昇し、75%程度でほぼ一定になりました。

温湿度だけではあまり変化がなくて面白くないので、部屋の明るさも測定しようかと思っています。以前(もう15年も前)に PICNICで遊ぶ という記事を書きましたが、そのときは温度と明るさをネットワーク経由で得ていました。気圧センサが届いたら一緒に組み込んで、IoT気象計としてみようかと思っています。とりあえず、もうしばらくはこのまま動かし続けてみます。

ちなみにThingSpeakにアップしたデータはダウンロードすることができるのであとでExcelなどで加工することも簡単です。

2019年7月15日月曜日

ESP32でIoT温湿度計を作ってみた

昨日、除湿機の記事のおしまいに湿度ロガーを作ってみようかと書きましたが、 ESP32を使ってデータをクラウドにアップするものを作ってみました。約半日でなんとかなったのは、先人の皆様が記事をアップしてくれていたおかげです。感謝。

以前購入したはずと書いたセンサ(温度、湿度、気圧が測れるBME280)は結局見つからず、現在知人から借りているセンサSHT-35(温度、湿度のみ)を使ってみました。I2C接続です。BME280はアマゾンで安かったので注文しました。おそらく中国発送なので2~3週間くらいかかると思います。

ESP32の開発環境はArduinoIDEを使いました。Arduinoと微妙に違うところがあって最初は簡単なところで躓きましたが、小型液晶に表示できたあたりからはまずまず順調。と思っていたらWiFiのアクセスポイントに繋がらず悩みました。「ESP32 WiFi接続できない」などでググって同様の現象がおきている人がいないか探し、ライブラリが違うのか?など悩みまくった末、結局、アクセスポイントのパスワードを打ち間違えていたというオチでした。



データをアップするIoTプラットフォームは、MathWorks社のThingSpeakというところを借りることにしました。個人が小規模で使う分には無料で使えるのと、データをグラフで表示できるというのがよさそうだったので選びました。先人が使い方の記事をアップしてくれていたというのも大きな理由のひとつです。



気温と湿度データをアップしますが、無料利用だとアップの間隔を15秒以上開けないといけません。このため気温をアップしたら30秒待ってから湿度をアップします。当初、これに気付かず湿度データがアップされないのに悩みました。なお、温度と湿度の測定は一緒に行っています。また、データ量などにも制限があるので5分おきにアップするようにしました。


アップしたデータはこんな感じでグラフで見られます。左側が温度、右側が湿度です。温度の最初が0に近い点があるのは、テストでデータを送ったためです。部屋で除湿機を湿度70%で自動運転しているので、湿度はほぼ70%で一定です。今夜は除湿機を止めて湿度の変化を見てみようかと思います。明日にでも状況をアップします。

詳しい記事やスケッチは、折をみてアップします。まだエラー処理を行っていないなど改善の余地が沢山あるので。BME280が届いて気圧も測定できるようになったころかな。

しかし、こんなに簡単にIoTデバイスが作れるのはスバラシイですね。アイデア次第で面白いことがいくらでもできそうです。

2019年7月14日日曜日

除湿機を新調したら意外と大きかった

連日の天候に耐えかねて新しい除湿機を買ってしまいました。部屋が湿気っぽくて、素足で歩くと床がしっとりしているのがわかるほどです。今まで20年くらい前に購入したものを使っていたのですが、自動運転の湿度閾値が70%しかありませんでした。さらに湿度センサが調子悪いのか明らかに70%以上あるのに除湿しなかったので、常に連続運転していました。うるさいし、電気代も気になるし、しょっちゅう水タンクを空にしないとダメだし、ということで新しいものをポチってみました。昨日注文して今日届き、日本のロジスティックスはすばらしいです。

新しいものは、三菱電機のMJ-P180PXという機種です。約3万5千円と少し高めですが、湿度設定ができる機種で選んだらこれに落ち着きました。宅配のおじさんが運んできた箱がでかかったので、ちょっとびっくり。こんなに大きかったのか?!これまで使っていた機種と同じ位かと思っていたら、2回りくらいでかいです。これなら除湿性能も高そうです。



ということで、早速湿度65%で運転しはじめたところ、78%あった湿度が30分くらいで65%以下に下がり自動的にコンプレッサが止まりました。音も前の機種よりは静かでよい感じです。しばらく運転しっぱなしにしてみます。

以前、気圧・気温のロガーを作りましたが、湿度ロガーを作って記録を取ってみようかと思います。確かセンサーは購入してあったと思う。どこへいったか探すところからです(^_^;

2019年7月13日土曜日

水晶発振周波数カウンタテスタキット

漢字とカタカナばかりで読みにくいタイトルですね。今週中国から届いたモノはこの水晶の発振周波数をテストするテスターのキットです。アマゾンで235円でした。PIC16F628で作られています。このPICは秋月で買っても190円します。さらに基板、7セグLEDが5個、ICソケット、タクトスイッチ、抵抗・コンデンサなどが付いてこの値段です。部品取りに買ってもよいかと思うくらい。

ちなみにPICマイコンが小袋の外にむき出しでした。スポンジもついてなくて、ピンが折れていなかったのは奇跡に近いです。



実は買った目的も周波数カウンタとして作るのではなく、自分でPICのプログラムを書いて面白いものが作れないかと思ったためです。面倒な7セグLEDの配線をしなくてすむ基板が付いていてこの値段は買いです。あと数台買っておこうかな。

この商品のオリジナルは、https://www.qsl.net/dl4yhf/freq_counter/freq_counter.html らしく、回路図やソースコードも公開されています。5桁目の7セグLED表示用のピンが1本足りなくて、ダイオードとトランジスタでNANDを組んでいるところが面白いアイデアです。私ならピン数の多いPICに乗り換えてしまう。

2019年7月11日木曜日

Arduino UNOアクリルケース

長いこと青空を見ていませんね。昨日は晴れ予報でしたが、スカッとは晴れませんでした。涼しいのはよいのですが、そろそろ晴れて欲しいです。3連休も期待できそうにありませんが。

アマゾンを彷徨っていて、Arduino UNO用の安いアクリルケースを見つけました。なんと200円ちょっとです。数年前に買ったArduinoはケースに入れてなかったので今更感はあるのですが、安かったのと、ケースの構造に興味があったので自作のケース作りの参考に購入しました。

安いのでてっきり中国から届くのかと思っていたらすぐに届き、国内発送でした。これで送料無料は利益になるのかな? 在庫処分にしても手間の方がかかりそうです。


届いた商品はナットが3個不足していましたが、手元にあったのでよしとしました。アクリルは綺麗にカットされています。自分のCNCフライスではこうは行きません。


取説などは一切ありませんが、組み立ては簡単です。カッコよくなり、乱雑な机の上でもショートの心配がなくなりました。その前に机の上を整理整頓しろ、という事ですが。


2019年7月7日日曜日

4チャンネルリレーモジュール

クラウドファンディングは公開されてから1週間経過しましたが、梅雨空が続いています。皆様、よろしくお願い申し上げます。お気に入りに入れて頂くだけでも構いません。


Readyforは、ものづくりに関するファンディングが多いので見て頂けるとよいかと思います。

さて、昨日中国からリレーモジュールが届きました。リレーが4つ載っていて400円でした。基板が少し汚れていましたが、動作には問題ないです。Active Lowで基板上のLEDが点灯し、リレーがカチッと動作します。

リレーは125V 15Aの刻印がありますが、基板裏のパターンをみると幅2mm位しかなく、15Aには耐えられそうにありません。せいぜい2〜3A程度でしょうか。

先日購入したESP32でスマホからWiFi経由で家の照明などを制御してみようかと思っています。

面白いものができたら公開したいと思います。

2019年7月4日木曜日

半田吸煙器をバージョンアップ

梅雨らしい雨が続いていますね。家の中もジメジメしていて鬱陶しいです。クラウドファンディングも反応がなく梅雨空のように暗雲が立ち込め、心の中は今日の天気のように土砂降り(T_T)

さて今週中国から届いた電子部品は、PWMパワーコントローラです。アマゾンで216円(送料込)でした。こんなに小さくて5Aまでコントロールできるそうです。放熱板もないのに本当かな?


ボリウムにはスイッチが付いていて、オンすると基板上の青色LEDが点灯します。基板上にあるのでケースに入れてしまうと見えません。透明なケースなら大丈夫ですが。

これを自作の半田吸煙器に取り付けました。パソコン用の静音ファンに活性炭入りフィルタを付けたものです。それ程パワーコントロールの必要はなかったのですが、給電用の12V電源を作るために手元にあった小型の電源トランスを使ったら15V位になったので調整できるようにしました。フルパワーにすると結構な風量になります。ファンの寿命に影響しそうです。

12VのACアダプタで給電してもよかったのですが、ファン単体だと倒れることも多かったため、トランスを付けて重くしたかった。

スイッチを付けてトランスへの100Vをオンオフしてます。

 ケースはタカチのプラケースです。電源トランスや整流基板、PWMモジュールを収めるとギチギチです。トランスをビス止できなかったのでホットボンドで固定してます。ファンとケースはアルミアングルを使って繋ぎました。

裏蓋をするとこんな感じです。AC100Vのケーブルが丁度見えないですが、写真左端の方に出ています。

重くなって安定し、いちいちACアダプタを抜き差ししなくてよく、使い勝手がよくなりました。

中国からはあと2つほど荷物の到着待ちです。どちらも数百円と信じられない価格です。

2019年7月1日月曜日

ワードクロックのクラウドファンディング開始

先日予告したクラウドファンディングが公開されました。募集期間は本日7/1〜8/12迄です。

ワードクロックの量産を目指して出資して頂ける皆様を募集します。リターン(返礼品)は完成品の他、キットもあります。返礼品と云うと、ふるさと納税のようですね。まぁ似たようなものかな。

https://readyfor.jp/projects/WordClock


デスクトップのお供やプレゼントにいかがですか。パソコンデスク、リビング、お店のディスプレイ、職場など様々なシーンに。

完成品は年内にはお送りする予定です。クリスマスプレゼントに間に合わせるよう頑張ります
。キットはもっと早くお送りしますので、ご自分で作られてクリスマスプレゼントにできます。

ご質問などがあれば、お知らせ下さい。サイトは適宜更新します。