// Calibration factors for the sensor
float CF0=0; // [mm]: Offset at 0 reading
float CF1=0.001; // [mm/reading]: Slope
// Logging interval setting
int log_mode = 0; // 0: Every second, 1: Every 10 seconds, 2: Every 1 minute, 3: Every 10 minutes, 4: Every 1 hour
int log_num[4]={120, 108, 40, 300}; // それぞれのlog_modeでのログ回数
int log_cnt=0; // それぞれのlog_modeでの現在のカウント
bool log_fg=false;
int prev_sec;
int prev_min;
int ref_min;
int ref_sec;
// SDカードモジュールの設定
Serial.println("SD_conect...");
delay(10);
if (!SD.begin(5))
Serial.println("Card failed, or not present");
else
Serial.println("card initialized.");
// Displacement sensor reading: Convert to [mm] by CF0 and CF1
float sensor1=CF0+channel1.read_average(10)*CF1;
char disp[10];
snprintf(disp, 10, "%6.3f", sensor1);
// Display to PC via serial
Serial.print(now.year()); Serial.print("/"); Serial.print(now.month()); Serial.print("/"); Serial.print(now.day());Serial.print(" ");
Serial.print(now.hour()); Serial.print(":"); Serial.print(now.minute()); Serial.print(":"); Serial.print(now.second());Serial.print(" ");
Serial.print(sensor1); Serial.print(" log_cnt="); Serial.print(log_cnt); Serial.print(" log_mode="); Serial.println(log_mode);
// log_modeごとのSDカードへの記録判定
switch(log_mode)
{
case 0: // Every second
if(now.second()!=prev_sec)
log_fg=true;
break;
case 1: // Every 10 seconds
if((abs(now.second()-ref_sec)%10==0)&&(now.second()!=prev_sec))
log_fg=true;
break;
case 2: // Every 1 minute
if((ref_sec==now.second())&&(now.minute()!=prev_min))
log_fg=true;
break;
case 3: // Every 10 minutes
if((abs(now.minute()-ref_min)%10==0)&&(now.second()==ref_sec)&&(now.minute()!=prev_min))
log_fg=true;
break;
case 4: // Every 1 hour
if((now.minute()==ref_min)&&(now.second()==ref_sec)&&(now.minute()!=prev_min))
log_fg=true;
break;
}
HX711ブレークアウトモジュールの形状に応じて2種示します(第19回参照)。ディップスイッチは3極(D6~D4)しか使わないのですが、3極のDIPスイッチというのはあまり売っていないようで、将来の拡張を見越して4極接続しています。スケッチではD6~D4しか使っていません(D6をLSB、D4をHSBとして扱っています。LSB: Least Significant Bitとは2進数の一番下の桁(ここでは1の桁)で、MSB: Most Significant Bitとは一番上の桁(ここでは4の桁)のことです)。
データをフィールドからクラウド(インターネット)まで無線で飛ばし、オフィスからデータにアクセスできれば、これ以上のことはありません。これまで、この無線通信には3G(少し前の携帯電話回線)を使うことが多かったのですが、近年はLPWA(Low Power Wide Area)ネットワークというものが注目されています。もちろん4Gや5Gを使うことも技術的に可能でしょうが、我々がフィールドから送りたいデータは、たとえば間隙水圧や変位の値など、データ量としてはごく小さいものです。LPWAの長所は、名前が示す通り非常に省電力であり、また第三者のサービスを利用する場合、通信料が非常に安いということです。
第31回で紹介したESP32を使うと、WiFiによる通信を簡単に行うことができます。ESP32は上海のEspressifという会社が開発したマイコンであり、1つのチップ上にプロセッサの他、WiFiやBluetooth機能を加えたSoP(System on Chip)として実装されたものです。ESP32と呼ばれているものにはいくつかバージョンがあり、ESP-WROOM-02が主なものです。これはESP8266というものの後継機にあたり、700円くらいで買うことができます。ESP-WROOM-02単体を動かすのは、電源周りやピンアウトなどなかなか手間がかかるので、抵抗やコンデンサが載った開発ボードを使うのが手軽です。第31回で紹介した通り、NodeMCU-32SとESP32-DevKitCの二種類(二規格)が主流になっています。後者のほうが改良版といえるようです。後述の通り、スケッチの書き込みが少し楽になっています。いずれも1000円くらいから買えます。
まずはArduino IDEの設定方法です。いろいろなウェブサイトにやり方が書いてあるのですが、いくかのサイトでは古い情報が載っており、うまくいきません。ここに書くやり方も古くなる可能性はあるのですが、2020/10/1現在動いていることを確認しています(Arduino IDE 1.8.13)。まず、「ファイル」→「環境設定」より「追加のボードマネージャのURL」のテキストボックスに以下のURLを書き込みます(多くのウェブサイトでコピー&ペーストせよ、と書いてありますが、私の持っているどのPCでもこのテキストボックスではペースト機能が動作しませんでした:手で打ち込む必要があります)。
この後、「ツール」→「ボード」→「ボードマネージャ」で現れるウィンドウの検索フォームに「ESP32」と入力すると現れるものを「インストール」します。これで、「ボード」から「ESP32 Dev Module」を選べるようになります。これとは別に「NodeMCU-32S」も選べるのですが、ここまで試したところ、どちらを選んでも同じスケッチが同じように動きました。ここでは「ESP32 Dev Module」を選ぶものとします。
ESP32開発ボードはmicro USB Type-BでPCにつなぎます。PCにつなぎ、ボードとして上記の通り「ESP32 Dev Module」を選び、シリアルポートを選択してやると、後はArduinoと同じように使えます。つまり、スケッチをコンパイルして書き込みます。この際、注意が必要なのですが、ESP32-DevKitCはArduinoと同じようにArduino IDE上の書き込みアイコンをクリックするだけでこのままスケッチが書き込まれるのですが、NodeMCU-S32については以下の手順が必要になります。
① ボード上のIO0ボタンを押し続け(まだ離さない)、後からENボタンを押し、ENボタンを離す
② スケッチの転送を始める。Arduino IDEの下部のメッセージ欄で書き込みが始まったらすぐにIO0ボタンを離す
Megaよりもさらに強力なボードで、Arduinoシリーズの中では珍しく、AVRではなくARMのマイコンを搭載しています。アナログピン12、デジタルピン54に加え、アナログ出力(DAC)ピンが2本あるのが特徴です(このブログではパルス幅変調:PWMについて説明していませんが、この2本はPWMではなく真のDACです)。また、他のほとんどのArduinoのアナログ入力は10bitですが、このモデルのみ12bitです。この分解能にひかれて、最初はデータロガーとしての使用を検討しましたが、マイコンのアーキテクチャが他のArduinoと異なることもあり、例えばenergy.hなどの一部のライブラリに互換性がなかったりするうえに、第8回で紹介した通り、外付けのADCモジュールを取り付ければアナログ分解能は解決する問題なので、結局のところ、このボードにそれほど大きなメリットを見出しませんでした。また、消費電力が格段に大きいです。一般に、あまり広く使われているという印象を持ちません(Arduino IDE 1.8.13をダウンロードしたら、もはやDueはデフォルトではボードマネージャにインストールされていませんでした)。
何ができるかというと、PCでキーボードやマウスと同じようなHID(Human Interface Device)として認識させることができるので、このArduino Pro Microに入れたプログラムに基づいて、例えばWindows PC上でクリックや文字タイプを実行させることができます(例えば、10秒ごとに「R」キーを打つというプログラムを書いたPro MicroをPCに接続すると、PC上でアクティベートされているウィンドウに10秒ごとにRの文字が現れます)など。最初は、だから何、と思っていましたが、よく考えれば究極の自動化が可能で、既成のPCソフトウェアに対して、このArduino Pro Microにマウスの操作をさせて自動で使うなどできるようになります。これを用いたトリックを後の回で紹介したいと思います。その他の性能はUnoとほぼ同等です。