こんにちは、IoT技術に興味のある皆さん!今回は、ESP32を使用して、ボタン一つで簡単に在庫管理ができるシステムの作成方法をご紹介します。プログラミング初心者でも簡単にできるこのプロジェクトは、効率的な在庫管理を実現し、日常業務を大幅に簡素化します。
ChatGPTを使用するとこういったシステムが簡単に作れるので是非見てください。最後にYouTubeでどのようにChat GPTで指示をしているか記載しています。
・在庫管理がうまくできない
・どうにかしたいけど、お金がかかる
・電子工作で解決したい
こんな悩みに答えます。
・在庫管理の自動化したい
・IoTデバイス(ESP32)を使った基本的なプログラミングスキル習得したい
・初心者だけどプロジェクトの実現したい
・ChatGPTでプログラムを作りたい
こういうものが作れるようになります。
なぜこのシステムが便利か
ボタン一つで在庫情報を更新し、メールを通じて管理者や関係者に自動通知します。これにより、時間と労力を大幅に節約でき、在庫管理の効率が向上します。今回はこのプログラムをChatGPTを使用して作成しました。
- 簡単な操作: ChatGPTの指導により、複雑なプログラミング知識がなくても開発に取り組めます。
- 分かりやすい説明: ステップバイステップのガイドで、初心者でも理解しやすいです。
- カスタマイズの容易さ: 特定のニーズに合わせてシステムを調整することが可能です。何回でも聞くことができます。
必要なもの
- ・ESP32開発ボード
- ・プッシュボタン
- ・ジャンパーワイヤー
- ・USBケーブル
上記部品を準備してください。スターターキットがあればすべてそろっているので便利です。
電子工作をしていくと、プログラミングにも興味が出てきます。未経験からでもプログラムを学び、ITエンジニアになりたい人は、無料のカウンセリングを受けることをお勧めします。私も、無料で一度カウンセリングを受けどのように勉強すればスキルを身にられるかがわかりました。この経験が現在の大手メーカでの経験に生きていると考えています。
プログラムの概要
プログラムの概要としては、今k内Wifi接続を行い、ボタンを押して、ESP32に信号が入ったときに、メールを送信するようにしました。
- WiFi接続: ESP32をインターネットに接続します。
- ボタン操作: ボタンの状態を監視し、押されたときに在庫更新の信号を生成します。
- メール送信: 在庫情報をメールで自動送信します。
プロジェクトに対してESP32の事前準備
在庫管理システムのプロジェクトでは、ESP32からのメール送信機能を使用するために、Gmailのパスワード取得が必要です。ここでは、Gmailのパスワード(アプリパスワード)を取得する方法と、ESP32のセットアップ手順を詳細に説明します。
Gmailアプリパスワードの取得方法
- Googleアカウントにログイン: Googleアカウントにアクセスし、ログインします。
- セキュリティ設定へ移動: ナビゲーションバーから「セキュリティ」を選択します。
- 2段階認証プロセスの設定: 「2段階認証プロセス」を設定します。これが有効になっていないと、アプリパスワードを生成できません。
- アプリパスワードの生成: 「アプリパスワード」セクションを見つけ、「アプリパスワードの管理」を選択します。
- アプリとデバイスを選択: 「アプリを選択」で「メール」を、「デバイスを選択」で「その他(カスタム名)」を選択し、ESP32またはプロジェクト名を入力します。
- パスワードの生成: 「生成」をクリックし、表示される16文字のパスワードをコピーします。このパスワードはプログラム内で使用します。
下記画面に番号の画像が対応しています。
③を有効にします
④のアプリパスワードを選択して、パスワードを生成します。16桁のパスワードが一度表示されるので、忘れないようにメモしてください。
パスワードが取得できたら、こちらの準備は完了です。ESP32のセットアップにうつりましょう。
ESP32のセットアップ
- 必要な材料: ESP32ボード、USBケーブル、コンピュータ。
- Arduino IDEのインストール: Arduinoの公式サイトからArduino IDEをダウンロードしてインストールします。
- ESP32のボードマネージャーの追加: Arduino IDEを開き、「ファイル」→「環境設定」で「追加のボードマネージャーのURL」にESP32のURLを追加します。
- ボードマネージャーからESP32をインストール: 「ツール」→「ボード」→「ボードマネージャー」で「ESP32」を検索し、インストールします。
- ESP32ボードの選択: 「ツール」→「ボード」で「ESP32 Dev Module」を選択します。
- プログラムのアップロード: 提供された在庫管理システムのコードにGmailのアプリパスワードを含め、ESP32にアップロードします。
上記のセットアップを実施してください。
プログラムの概要
このプログラムは、ESP32ボードに接続されたボタンを押すと、指定されたSMTPサーバーを使用してメールを送信します。具体的には、ESP32のGPIOピン25に接続されたボタンが押されると、設定されたメールが指定の受信者に送信されます
プログラムの設定
プログラム内で、以下の設定を行います。
- WiFiの設定(SSIDとパスワード):自宅のSSID/Passwordを入力
- SMTPサーバーの設定(サーバーアドレス、ポート、送信元メールアドレス、パスワード、受信者メールアドレス) Gmailアプリパスワードを入力(先ほど設定したパスワードを記載します)
- ボタンピンの設定(GPIOピン25を使用し、Pull Down接続方式を使用
これらの設定を適切に行うことで、プログラムが正しく動作します。
ChatGPTでプログラム作成・解説
以下は、ESP32のArduinoプログラムです。このプログラムは、WiFi経由でGmailサーバーに接続し、ボタンが押されると指定されたメールアドレスにメールを送信します。
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <Base64.h>
const char* ssid = "Your ssid";
const char* password = "Your Password";
const char* smtpServer = "smtp.gmail.com";
const int smtpServerPort = 465;
const char* emailSenderAccount = "Your mail@gmail.com"; // Gmailアドレス
const char* emailSenderPassword = "Password"; // Gmailパスワード
const char* emailRecipient = "recipient address@gmail.com"; // 受信者のメールアドレス
const int buttonPin = 25; // ボタンが接続されているピン
WiFiClientSecure client;
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
client.setInsecure();
}
void loop() {
if (digitalRead(buttonPin) == LOW) {
if (sendEmail()) {
Serial.println("Email sent successfully");
} else {
Serial.println("Email sending failed");
}
delay(10000);
}
}
bool sendEmail() {
if (!client.connect(smtpServer, smtpServerPort)) {
Serial.println("Could not connect to mail server");
return false;
}
if (!awaitSMTPResponse("220")) return false; // 接続応答
client.println("HELO itisme");
if (!awaitSMTPResponse("250")) return false; // HELO応答
client.println("AUTH LOGIN");
if (!awaitSMTPResponse("334")) return false; // AUTH LOGIN応答
client.println(base64Encode(emailSenderAccount));
if (!awaitSMTPResponse("334")) return false; // ユーザー名応答
client.println(base64Encode(emailSenderPassword));
if (!awaitSMTPResponse("235")) return false; // パスワード応答
client.println("MAIL FROM: <" + String(emailSenderAccount) + ">");
if (!awaitSMTPResponse("250")) return false; // MAIL FROM応答
client.println("RCPT TO: <" + String(emailRecipient) + ">");
if (!awaitSMTPResponse("250")) return false; // RCPT TO応答
client.println("DATA");
if (!awaitSMTPResponse("354")) return false; // DATA応答
client.println("Subject: 部品発注");
client.println("To: " + String(emailRecipient));
client.println("Content-Type: text/plain; charset=\"UTF-8\"");
client.println();
client.println("○○の納入をお願いします。");
client.println(".");
if (!awaitSMTPResponse("250")) return false; // メール本文送信応答
client.println("QUIT");
if (!awaitSMTPResponse("221")) return false; // QUIT応答
return true;
}
bool awaitSMTPResponse(const char* responseCode) {
long int time = millis();
while ((millis() - time) < 5000) { // 5秒以内に応答があるか確認
if (client.available()) {
String line = client.readStringUntil('\n');
Serial.println(line); // レスポンスを表示
if (line.indexOf(responseCode) == 0) {
return true;
}
}
}
Serial.println("SMTP Response Timeout or Error");
return false;
}
String base64Encode(const char* input) {
// Base64エンコードを行う関数。Base64ライブラリを使用
return base64::encode(input);
}
ライブラリのインクルード:
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <Base64.h>
この部分では、プログラムで使用するライブラリをインクルードしています。WiFi.h
はWiFiモジュールを操作するためのライブラリ、WiFiClientSecure.h
は安全なSSL通信を提供するためのライブラリ、Base64.h
はBase64エンコードを行うためのライブラリです。
定数の定義
const char* ssid = "Buffalo-G-5200";
const char* password = "x5vavndfsc36a";
const char* smtpServer = "smtp.gmail.com";
const int smtpServerPort = 465;
const char* emailSenderAccount = "@gmail.com"; // Gmailアドレス
const char* emailSenderPassword = "t"; // Gmailパスワード
const char* emailRecipient = "@gmail.com"; // 受信者のメールアドレス
const int buttonPin = 25; // ボタンが接続されているピン
ここでは、WiFi接続情報、SMTPサーバーの設定、Gmailの送信者アカウント情報、受信者のメールアドレス、およびボタンの接続ピンを定義しています。
WiFiClientSecureオブジェクトの宣言
WiFiClientSecure client;
WiFiClientSecure
は、WiFiを介してセキュアな接続を確立するためのクラスであり、これをclient
という名前でインスタンス化しています。
setup()
関数
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
client.setInsecure();
}
この関数は、プログラムの初期設定を行います。
pinMode()
関数は、ボタンピンを入力モードに設定し、内部プルアップ抵抗を有効にします。Serial.begin()
関数はシリアル通信を開始し、通信速度を115200ボーに設定します。WiFi.begin()
関数を使用してWiFiに接続を試み、接続が確立するまで待機します。接続が確立すると「Connected to WiFi」というメッセージをシリアルモニターに表示します。client.setInsecure()
関数は、SSL証明書の検証を無効にし、安全な通信を確立します。
loop()
関数
void loop() {
if (digitalRead(buttonPin) == LOW) {
if (sendEmail()) {
Serial.println("Email sent successfully");
} else {
Serial.println("Email sending failed");
}
delay(10000);
}
}
この関数は、メインのループです。
digitalRead()
関数は、ボタンが押されたかどうかを検出し、押されている場合は以下の処理を実行します。sendEmail()
関数を呼び出し、メールの送信を試みます。メールの送信が成功した場合、「Email sent successfully」を、失敗した場合は「Email sending failed」をシリアルモニターに表示します。- その後、10秒間のディレイを挿入します。
sendEmail()
関数
bool sendEmail() {
if (!client.connect(smtpServer, smtpServerPort)) {
Serial.println("Could not connect to mail server");
return false;
}
if (!awaitSMTPResponse("220")) return false; // 接続応答
client.println("HELO itisme");
if (!awaitSMTPResponse("250")) return false; // HELO応答
client.println("AUTH LOGIN");
if (!awaitSMTPResponse("334")) return false; // AUTH LOGIN応答
client.println(base64Encode(emailSenderAccount));
if (!awaitSMTPResponse("334")) return false; // ユーザー名応答
client.println(base64Encode(emailSenderPassword));
if (!awaitSMTPResponse("235")) return false; // パスワード応答
// 以下省略...
}
この関数は、メールを送信するためのSMTPサーバーとの通信を行います。
client.connect()
関数を使用してSMTPサーバーに接続を試みます。接続に失敗した場合は「Could not connect to mail server」を表示し、false
を返します。- SMTPサーバーとの各ステップで、
awaitSMTPResponse()
関数を使用して応答を待機し、応答が期待通りでない場合は通信を中止してfalse
を返します。
SMTPサーバーとの通信の詳細な部分はコメントで省略されていますが、それぞれのステップで行われる操作は、SMTPプロトコルに従っており、メールの送信プロセスを制御します。
awaitSMTPResponse()
関数
bool awaitSMTPResponse(const char* responseCode) {
long int time = millis();
while ((millis() - time) < 5000) { // 5秒以内に応答があるか確認
if (client.available()) {
String line = client.readStringUntil('\n');
Serial.println(line); // レスポンスを表示
if (line.indexOf(responseCode) == 0) {
return true;
}
}
}
Serial.println("SMTP Response Timeout or Error");
return false;
}
この関数は以下のように動作します:
responseCode
パラメーターは、待っているSMTPサーバーの応答コードを表します。たとえば、SMTPサーバーからの正常な接続応答は “220” です。millis()
関数を使用して、関数が呼び出された時点からの経過時間を取得し、5秒以内に応答があるかを確認します。5秒を超える場合はタイムアウトとみなします。client.available()
を使用して、SMTPサーバーからのデータが利用可能かどうかを確認します。データが利用可能であれば、それを文字列としてline
変数に読み込みます。Serial.println(line)
は、受信した応答をシリアルモニターに表示します。これはデバッグ目的で使用されます。- 受信した応答に指定された
responseCode
が含まれているかを確認します。もし含まれていれば、SMTPサーバーからの正しい応答とみなし、true
を返します。指定された応答コードが見つからない場合、タイムアウトとみなし、”SMTP Response Timeout or Error” メッセージをシリアルモニターに表示し、false
を返します。
この関数はSMTPプロトコルの通信において、各ステップでの応答を確認するために使用され、通信の正常性を確保するのに役立ちます。SMTPサーバーとの通信において、正確な応答コードの確認は重要です。
動画に実際の様子を記載しているので見てください。
終わりに
ESP32を使用してGmailを介してメールを送信するプロジェクトは、IoTデバイスや通知システムの構築に非常に役立ちます。このプログラムを通じて、ESP32のWiFi機能を活用し、SMTPプロトコルを使用してメールを送信する方法を学びました。ESP32を使用することで、デバイスが特定の条件を満たしたときに自動的にメールを送信するアプリケーションを開発できます。初めてのプロジェクトでも、このガイドを参考にして、ESP32を使用したメール送信プロジェクトを楽しんでください。