自作!IOT指紋認証システム


自作!IOT指紋認証システム

(1)ESP8266の接続

ArduinoにESP8266を装着し、インターネットに無線接続して通信を行います。

ESP8266の接続の回路図

f:id:yukikoboelectronics:20200303182814p:plain



ESP-WROOM-02 (ESP8266 を内蔵)
ESP8266 は 32 bit Tensilica MCU (マイコン; MicroController Unit) を内蔵した WiFi モジュールです。更に ESP8266 を内蔵して作られたのが ESP-WROOM-02 です。ESP-WROOM-02 は日本での技適も取得済みのため安心して使用できます。SWITCH SIENCE 社から 1000 円程度で購入できます。通常の電子工作では以下のピッチ変換されたものを利用します。Amazon でもやはり SWITCH SCIENCE 社から販売されています。
ESP-WROOM-02ピッチ変換済みモジュール (シンプル版) にはピンヘッダは付属していません、別に購入してはんだ付けします。


(2)IFTTTについて

IFTTT (If This, Then That) は、もしも (if) ある入力 (this) があったならば、別のある出力処理 (that) を実行する多目的な Web サービスです。様々な入力方式 (if this) が提供されており、特にwebhooksを入力 (this) に指定して、Arduino からHTTP GET または POST でデータを送信することで IoT が実現できます。出力方式 (that) には Gmail, Twitter, スマホ通知 など様々なものが提供されています。

f:id:yukikoboelectronics:20200303182932p:plain


(3)IFTTTのアプレットの作成
まず、IFTTTのサイトにアクセスします。

f:id:yukikoboelectronics:20200303183049p:plain

 


Gmailで登録します。

f:id:yukikoboelectronics:20200303183135p:plain

 

するとさまざまな既成アルゴリズムが表示されますが、下にスクロールして、「Create your own」をクリックします。

f:id:yukikoboelectronics:20200303183332p:plain


すると、次の画面になるので、まず、「This」をクリックします。

f:id:yukikoboelectronics:20200303183427p:plain


『webhooks』と入力して検索します。

f:id:yukikoboelectronics:20200303183535p:plain



「webhooks」をクリックします。 

f:id:yukikoboelectronics:20200303183632p:plain



つぎに、このトリガー(アルゴリズムの開始合図)に名前を付けます。
このアルゴリズムに名前をつけ(ここでは『fingerprint0002』) 、下の「Create trigger」をクリックします。この名前は「Event name」とよばれ、『then that』で作成するフィールドの名称になり、また、「sheet name」にもなります。

f:id:yukikoboelectronics:20200303183721p:plain

次にこの画面になるため、【このようにする】という部分を作成するため、「that」を選択します。

f:id:yukikoboelectronics:20200303183841p:plain



Googleスプレッドシート」に書き込みため、「that」には、「Google sheets」と打ち込み、検索して選択します。

f:id:yukikoboelectronics:20200303183922p:plain



Google sheets」をクリックします。

f:id:yukikoboelectronics:20200303184005p:plain



古いバージョンのIFTTTを使っている人は、「that」の部分については、以下になります。
「ウェブリクエストを受け取る」トリガーを選択します。
検索で「Google Sheets」と入力します。
スプレッドシートに行を追加する」選択します。
ここで、スプレッドシートの名前を書き換えます。
フォルダの名前は空白のままにしておきます。

つぎに、「that」の部分について、すこし細かい設定をIFTTT側で行う必要があります。
「Formatted row」の部分を下の写真のように変えてください。名前は自分のものでお願いします。

「Drive folded path」は空白にしてください。

f:id:yukikoboelectronics:20200303184052p:plain

以上で設定は終了です。

f:id:yukikoboelectronics:20200303184133p:plain
「connect」をクリックします。
この自分の作ったアルゴリズムには、画面右上の自分のアカウントの下の、「My Applets」から入れます。

 

(4)Arduinoのプログラム
機械側のプログラムは以下の通りです。
Arduino IDEで開いて、動かしてください。
変更しなければならないところは、日本語で記載されています。
****の箇所は、自分のパスワードなどを入れてください。


#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
#include <Adafruit_Fingerprint.h>
// On Leonardo/Micro or others with hardware serial, use those! #0 is green wire, #1 is white
// uncomment this line:
// #define mySerial Serial1
// For UNO and others without hardware serial, we must use software serial...
// pin #2 is IN from sensor (GREEN wire)
// pin #3 is OUT from arduino (WHITE wire)
// comment these two lines if using hardware serial
SoftwareSerial mySerial(2, 3);
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);
#include <HttpClient_ESP8266_AT.h>
int a = 0;
void setup(){
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("ready ");
delay(3000);
Serial.begin(9600);
delay(100);
Serial.println("\n\nAdafruit finger detect test");
// set the data rate for the sensor serial port
finger.begin(57600);
if (finger.verifyPassword()) {
Serial.println("Found fingerprint sensor!");
} else {
Serial.println("Did not find fingerprint sensor :(");
while (1) { delay(1); }
}
finger.getTemplateCount();
Serial.print("Sensor contains "); Serial.print(finger.templateCount); Serial.println(" templates");
Serial.println("Waiting for valid finger...");
lcd.print("go go go ");
}
void loop() // run over and over again
{
SoftwareSerial mySerial(2, 3);
getFingerprintIDez();
delay(50); //don't ned to run this at full speed.
}
uint8_t getFingerprintID() {
uint8_t p = finger.getImage();
switch (p) {
case FINGERPRINT_OK:
Serial.println("Image taken");
break;
case FINGERPRINT_NOFINGER:
Serial.println("No finger detected");
return p;
case FINGERPRINT_PACKETRECIEVEERR:
Serial.println("Communication error");
return p;
case FINGERPRINT_IMAGEFAIL:
Serial.println("Imaging error");
return p;
default:
Serial.println("Unknown error");
return p;
}
// OK success!
p = finger.image2Tz();
switch (p) {
case FINGERPRINT_OK:
Serial.println("Image converted");
break;
case FINGERPRINT_IMAGEMESS:
Serial.println("Image too messy");
return p;
case FINGERPRINT_PACKETRECIEVEERR:
Serial.println("Communication error");
return p;
case FINGERPRINT_FEATUREFAIL:
Serial.println("Could not find fingerprint features");
return p;
case FINGERPRINT_INVALIDIMAGE:
Serial.println("Could not find fingerprint features");
return p;
default:
Serial.println("Unknown error");
return p;
}
// OK converted!
p = finger.fingerFastSearch();
if (p == FINGERPRINT_OK) {
Serial.println("Found a print match!");
} else if (p == FINGERPRINT_PACKETRECIEVEERR) {
Serial.println("Communication error");
return p;
} else if (p == FINGERPRINT_NOTFOUND) {
Serial.println("Did not find a match");
return p;
} else {
Serial.println("Unknown error");
return p;
}
// found a match!
Serial.print("Found ID #"); Serial.print(finger.fingerID);
Serial.print(" with confidence of "); Serial.println(finger.confidence);
// Arduino UNO の場合は、例えばデジタル入出力の 2 番, 3 番ピンを利用して→4,5に変更
// ESP-WROOM-02 とシリアル通信するように設定します。
const byte rxPin = 4; // Wire this to Tx Pin of ESP8266 TXD端子をデジタル4番に
const byte txPin = 5; // Wire this to Rx Pin of ESP8266 RXD端子をデジタル5番に
HttpClient_ESP8266_AT httpClient(rxPin, txPin);
// PC と通信する HardwareSerial の baudrate を設定します。
// ESP-WROOM-02 の baudrate とは関係ありません。
delay(1000);
Serial.begin(9600);
// SSID と PASSWORD でアクセスポイントに接続します。
// シリアル接続確認と WiFi 接続確認を行い、設定不備があれば出力します。
while(true) {
if(httpClient.statusAT()) {
Serial.println("AT status OK");
break;
}
else {
Serial.println("AT status NOT OK");
}
delay(1000);
}
while(true) { // 書き換えてください↓
if(httpClient.connectAP("401HWa-BF5A22", "1957874a")) { Serial.println("Successfully connected to an AP"); break; }
else Serial.println("Failed to connected to an AP. retrying...");
delay(1000);
}
while(true) {
if(httpClient.statusWiFi()) { Serial.println("WiFi status OK"); break; }
else Serial.println("WiFi status NOT OK");
delay(1000);
}
// ノイズの影響でリクエストに失敗することがあるため while ループで囲います。
while(true) {
// IFTTT への HTTP POST リクエストを実行します。SSL/TLS 通信である必要はなく 80 番ポートを利用できます。
// 以下の二つの項目は、お使いのアカウントで表示されているものに書き換えてください。
// - Event Name: arduino_esp8266_gmail
// - Key: sw8UBoTxxKAykBbG7y_8H
a = finger.fingerID;
httpClient.post("maker.ifttt.com", // IFTTT のホスト名
"/trigger/peach/with/key/dt3OOb3pA-LQoaKniDylK", // <- 書き換えてください。
"{\"value1\":\"" + String(a) + "\",\"value2\":\"123\",\"value3\":\"456\"}", // JSON データ
"application/json");
// レスポンス status code が 0 以上であればリクエスト成功です。
// -1: ノイズ等でシリアル通信ができず、そもそもデータ送信ができなかった。
// 0: データ送信はできたが、受信データがノイズで壊れてしまっていた。
// else (>0): 受信データから正常に HTTP レスポンス status code が得られた。
if(httpClient.responseStatusCode() >= 0) {
// 本ページでは電圧レベルシフタを用意していない想定のため、
// 受信データが壊れている可能性が高く、したがって 200 が 100 になっていたりするため、
// 値には興味をもたず、0 以上の値が得られることが重要であると考えてコーディングします。
Serial.println("SUCCESS1");
lcd.print(" ID ");
lcd.print(finger.fingerID);
lcd.print(" confirmed");
break; // 成功したので while を抜けます。
}
else {
Serial.println("FAILURE, retrying...");
}
}
return finger.fingerID;
}
// returns -1 if failed, otherwise returns ID #
int getFingerprintIDez() {
uint8_t p = finger.getImage();
if (p != FINGERPRINT_OK) return -1;
p = finger.image2Tz();
if (p != FINGERPRINT_OK) return -1;
p = finger.fingerFastSearch();
if (p != FINGERPRINT_OK) return -1;
// found a match!
Serial.print("Found ID #"); Serial.print(finger.fingerID);
Serial.print(" with confidence of "); Serial.println(finger.confidence);
// Arduino UNO の場合は、例えばデジタル入出力の 2 番, 3 番ピンを利用して→4,5に変更
// ESP-WROOM-02 とシリアル通信するように設定します。
const byte rxPin = 4; // Wire this to Tx Pin of ESP8266
const byte txPin = 5; // Wire this to Rx Pin of ESP8266
HttpClient_ESP8266_AT httpClient(rxPin, txPin);
// PC と通信する HardwareSerial の baudrate を設定します。
// ESP-WROOM-02 の baudrate とは関係ありません。
delay(1000);
Serial.begin(9600);
// SSID と PASSWORD でアクセスポイントに接続します。
// シリアル接続確認と WiFi 接続確認を行い、設定不備があれば出力します。
while(true) {
if(httpClient.statusAT()) {
Serial.println("AT status OK");
break;
}
else {
Serial.println("AT status NOT OK");
}
delay(1000);
}
while(true) { // 書き換えてください↓
if(httpClient.connectAP("401HWa-BF5A22", "1957874a")) { Serial.println("Successfully connected to an AP"); break; }
else Serial.println("Failed to connected to an AP. retrying...");
delay(1000);
}
while(true) {
if(httpClient.statusWiFi()) { Serial.println("WiFi status OK"); break; }
else Serial.println("WiFi status NOT OK");
delay(1000);
}
// ノイズの影響でリクエストに失敗することがあるため while ループで囲います。
while(true) {
// IFTTT への HTTP POST リクエストを実行します。SSL/TLS 通信である必要はなく 80 番ポートを利用できます。
// 以下の二つの項目は、お使いのアカウントで表示されているものに書き換えてください。
// - Event Name: arduino_esp8266_gmail
// - Key: sw8UBoTxxKAykBbG7y_8H
a = finger.fingerID;
httpClient.post("maker.ifttt.com", // IFTTT のホスト名
"/trigger/peach/with/key/dt3OOb3pA-LQoaKniDylK", // <- 書き換えてください。
"{\"value1\":\"" + String(a) + "\",\"value2\":\"A\",\"value3\":\"1\"}", // JSON データ
"application/json");
// レスポンス status code が 0 以上であればリクエスト成功です。
// -1: ノイズ等でシリアル通信ができず、そもそもデータ送信ができなかった。
// 0: データ送信はできたが、受信データがノイズで壊れてしまっていた。
// else (>0): 受信データから正常に HTTP レスポンス status code が得られた。

if(httpClient.responseStatusCode() >= 0) {
// 本ページでは電圧レベルシフタを用意していない想定のため、
// 受信データが壊れている可能性が高く、したがって 200 が 100 になっていたりするため、
// 値には興味をもたず、0 以上の値が得られることが重要であると考えてコーディングします。
Serial.println("SUCCESS2");
lcd.print(" ID ");
lcd.print(finger.fingerID);
lcd.print(" confirmed");
void(* resetFunc) (void) = 0;
break; // 成功したので while を抜けます。
}
else {
Serial.println("FAILURE, retrying...");
}
}
return finger.fingerID;
}


ライブラリが足りないと言われたら、「スケッチ」から「ライブラリをインクルード」を選択します。
なければ、GitHubからダウンロードしたものを、インストールします。

(5)参考ウェブサイト

プログラムとライブラリのインストール方法について
https://www.qoosky.io/techs/14bfffdc82
グーグルスプレッドシートへの書き込みについて
https://raspberry-pi.nomad-life.net/1914277/memo/ifttt