ESP8266を用いて、WiFi経由Blynkに接続する場合、WiFiの設定やBlynkのAuthentication情報を、プログラム内に直接書き込む例が多く掲載されているが、多くのデバイスを接続する際など、すべてのデバイスに別々のプログラムを開発して書き込むのは大変手間であり、間違いのもとになる。ここでは、ブートのモードを切り替えることにより、設定モードで立ち上げたときは、シリアル通信経由で、SSID等を入力してEEPROMに書き込み、ノーマルモードで立ち上げたときに、その情報を用いて、WiFiやBlynkに接続して動作をするようにした。このようにすることで、多くのデバイスに同様に処理をさせる場合や、WiFi環境、Blynk設定が変わった際に、プログラムを一切修正することなく、対応ができるようになる。 ネット上では、自分自身のSoftAPでアクセスポイントにして、Web経由で設定情報を入力する例もいくつか見られるが、シリアルを使う方法は、それよりもシンプルだと思う。 ただし、設定時に、何らからのシリアルターミナルは必要になる(Arduino IDEを使っても良いし、TeraTerm等のターミナルソフトを使っても良い)
ピン設定および機能
GPIO | IO | function | 説明 |
5 |
Input Pull Up |
モード選択 |
リセット後のBoot時に一度だけ読み、Highの場合はノーマル起動、Lowの場合には、設定モードで起動する。 内蔵Pullupを使っており、何も接続しなければノーマル起動する。設定モードで起動したいときは、GNDに接続する。 |
12 |
Input Interrupt |
パルス計測入力1 | パルスカウント1の入力ピン。Pullupはなし。内部で割り込みを使って、Falling Edgeのカウントをする。1秒間に入力されたパルス数を計測してBlynkのV0に1秒毎に出力する。 |
13 |
Input No Pullup |
CdS入力 (単純なデジタル入力として) |
本来はADCで電圧を読んで、CdS(光量検出)をすべきだが、ESP8266にはADCが一つしかなく、また少し特殊なので、今回は単純に抵抗分割したCdS出力をGPIOのデジタルしきい値を用いて判別する目的で使用している。正確なしきい値は設定できないが、回路が単純なのでここはよしとする。毎秒、ポート値を読んで、BlynkのV2に出力する。 |
14 |
Input Interrupt |
パルス計測入力2 |
パルスカウント2の入力ピン。Pullupはなし。内部で割り込みを使って、Falling Edgeのカウントをする。1秒間に入力されたパルス数を計測してBlynkのV1に1秒毎に出力する。 |
EEPROMメモリ配置
本来であれば、セキュリティーのため、暗号化した上でEEPROMに保存すべきであろうが、ここでは簡易的にそのままプレーンで書き込んである。
EEPROMエリア全体としては、コード上で1024バイト確保した。(ESP8266の最大EEPROMサイズは、4096バイトらしい)
構造体として宣言し、EEPROM領域への書き込み、読み出しは確保した全体(1024バイト)に対して行い、バッファに対する構造体メンバーとしてそれぞれの値へアクセスしている。構造体の形として、EEPROMから読み書きする関数として、EEPROM.getと EEPROM.putがあるが、どちらも、特殊な記述方法(EEPROM.put<CONFIG>(0, buf)のような方法で、アドレスゼロから、bufのサイズを、構造体CONFIGの形状で、get, putすることができる。バイト列を必要な形で取り出せるので大変便利。
name |
バイト数 | タイプ | 内容 |
ssid | 64 | 文字列 | SSIDを保持 |
pass | 64 | 文字列 | WiFi パスワード |
dev | 64 | 文字列 | デバイス名 |
auth | 64 | 文字列 | Blynk Authenticationキー |
hostip | 64 | 文字列 | ソケット接続時のサーバーIPアドレス |
port | 64 | 文字列 | ソケット接続時のポート番号 |
シリアルポート設定
ESP8266はリセット時に、内部のファームウエアからシリアルポートに文字列が出力されるが、このボーレート(スピード)が74880に固定されていて変更できない。文字化けするのは気持ちが悪いので、PC側のターミナルソフトのスピードをこれに合わせることにする。そのうえで、setup()の中で行う Serial.beginも、この速度に合わせ Serial.begin(74880)で設定する。
Arduino IDEのシリアルモニタには、このスピードは選択肢にあるからそれを選べば良いが、TeraTermのスピード選択肢の中には無いため、TeraTermのシリアルポート設定の画面のスピードの項目に、直接数字で 74880と入力する必要がある。(以下参照)
パルスカウント
ピンに入力されるパルスの数を数えるために、割り込みを使用する。割り込みは、attachInterrupt関数でピンと処理関数、検出エッジ選択を紐つける。割り込み処理ルーチン内でブロッキング処理をさせると不具合のリスクが増えるので、割り込み内では最小の処理だけに留める。ここでは、カウンターのIncrementのを行う。割り込み内で変更する変数は、volatile宣言が必須。
割り込み処理ルーチンの頭に、ICACHE_RAM_ATTRと記述してあるのは、ネット情報によるとバグ対策(ボードマネジャーで登録したESP8266 by ESP8266 Communityのライブラリにおいて、バージョン2.5.1以降は、このおまじないが必要っぽい)。これを記述しないと、コンパイルは通るが実行時にエラーが発生する。
割り込みでカウントした数値を、1秒毎にBlynkへ送るが、1秒の計測は、BlynkTimerを使っている。ただ、BlynkTimerも割り込みを使っているので、その中では 1秒フラグだけを設定して、実際にBlynkに送る処理はメインループの中で行うようにしている。割り込み処理ルーチンは、「一刻も早く抜けること」が鉄則。
コード
/*
normal mode:
count the pulse using interrupts,
mode pin : 5
2019/8/4 17:20 Yoshihiro Yasuda
*/
#include <EEPROM.h>
struct CONFIG {
CONFIG buf;
volatile int ctr1 = 0;
BlynkTimer timer;
ICACHE_RAM_ATTR void isr_pulse1() {
ICACHE_RAM_ATTR void isr_pulse2() {
void everyInterval() {
void setup() {
pinMode(modePin, INPUT_PULLUP);
EEPROM.begin(1024);
if (f_bootmode) { //Normal mode
void loop() {
//—————————- |