ESP32

​​ESP32で簡単在庫管理!ChatGPTで作るボタン一つで完了する自動化システムの作り方

こんにちは、IoT技術に興味のある皆さん!今回は、ESP32を使用して、ボタン一つで簡単に在庫管理ができるシステムの作成方法をご紹介します。プログラミング初心者でも簡単にできるこのプロジェクトは、効率的な在庫管理を実現し、日常業務を大幅に簡素化します。

ChatGPTを使用するとこういったシステムが簡単に作れるので是非見てください。最後にYouTubeでどのようにChat GPTで指示をしているか記載しています。

アイコン名を入力

・在庫管理がうまくできない
・どうにかしたいけど、お金がかかる
・電子工作で解決したい

こんな悩みに答えます。

この記事が解決すること

・在庫管理の自動化したい
・IoTデバイス(ESP32)を使った基本的なプログラミングスキル習得したい
・初心者だけどプロジェクトの実現したい
・ChatGPTでプログラムを作りたい

こういうものが作れるようになります。

🚀 0円で現役エンジニアから学べる【Techスクールオンライン】のお申込みをお勧めします。 このオンラインスクールでは、現役のエンジニアから直接学ぶことができ、プログラミングの基礎から高度なスキルまでを習得できます。しかも、今なら 0円 で受講できるチャンスです。 エンジニア転職を考えている方やプログラミングに興味がある方、新しいスキルを習得したい方に特におすすめです。

なぜこのシステムが便利か

ボタン一つで在庫情報を更新し、メールを通じて管理者や関係者に自動通知します。これにより、時間と労力を大幅に節約でき、在庫管理の効率が向上します。今回はこのプログラムをChatGPTを使用して作成しました。

ChatGPTを使用した理由
  1. 簡単な操作: ChatGPTの指導により、複雑なプログラミング知識がなくても開発に取り組めます。
  2. 分かりやすい説明: ステップバイステップのガイドで、初心者でも理解しやすいです。
  3. カスタマイズの容易さ: 特定のニーズに合わせてシステムを調整することが可能です。何回でも聞くことができます。

必要なもの

  • ・ESP32開発ボード
  • ・プッシュボタン
  • ・ジャンパーワイヤー
  • ・USBケーブル

上記部品を準備してください。スターターキットがあればすべてそろっているので便利です。

電子工作をしていくと、プログラミングにも興味が出てきます。未経験からでもプログラムを学び、ITエンジニアになりたい人は、無料のカウンセリングを受けることをお勧めします。私も、無料で一度カウンセリングを受けどのように勉強すればスキルを身にられるかがわかりました。この経験が現在の大手メーカでの経験に生きていると考えています。

プログラムの概要

プログラムの概要としては、今k内Wifi接続を行い、ボタンを押して、ESP32に信号が入ったときに、メールを送信するようにしました。

プロジェクトに対してESP32の事前準備

在庫管理システムのプロジェクトでは、ESP32からのメール送信機能を使用するために、Gmailのパスワード取得が必要です。ここでは、Gmailのパスワード(アプリパスワード)を取得する方法と、ESP32のセットアップ手順を詳細に説明します。

Gmailアプリパスワードの取得方法

下記画面に番号の画像が対応しています。

③を有効にします

④のアプリパスワードを選択して、パスワードを生成します。16桁のパスワードが一度表示されるので、忘れないようにメモしてください。

パスワードが取得できたら、こちらの準備は完了です。ESP32のセットアップにうつりましょう。

ESP32のセットアップ

上記のセットアップを実施してください。

プログラムの概要

このプログラムは、ESP32ボードに接続されたボタンを押すと、指定されたSMTPサーバーを使用してメールを送信します。具体的には、ESP32のGPIOピン25に接続されたボタンが押されると、設定されたメールが指定の受信者に送信されます

プログラムの設定

プログラム内で、以下の設定を行います。

  1. WiFiの設定(SSIDとパスワード):自宅のSSID/Passwordを入力
  2. SMTPサーバーの設定(サーバーアドレス、ポート、送信元メールアドレス、パスワード、受信者メールアドレス) Gmailアプリパスワードを入力(先ほど設定したパスワードを記載します)
  3. ボタンピンの設定(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();
}

この関数は、プログラムの初期設定を行います。

  1. pinMode() 関数は、ボタンピンを入力モードに設定し、内部プルアップ抵抗を有効にします。
  2. Serial.begin() 関数はシリアル通信を開始し、通信速度を115200ボーに設定します。
  3. WiFi.begin() 関数を使用してWiFiに接続を試み、接続が確立するまで待機します。接続が確立すると「Connected to WiFi」というメッセージをシリアルモニターに表示します。
  4. 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);
  }
}

この関数は、メインのループです。

  1. digitalRead() 関数は、ボタンが押されたかどうかを検出し、押されている場合は以下の処理を実行します。
  2. sendEmail() 関数を呼び出し、メールの送信を試みます。メールの送信が成功した場合、「Email sent successfully」を、失敗した場合は「Email sending failed」をシリアルモニターに表示します。
  3. その後、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サーバーとの通信を行います。

  1. client.connect() 関数を使用してSMTPサーバーに接続を試みます。接続に失敗した場合は「Could not connect to mail server」を表示し、falseを返します。
  2. 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;
}

この関数は以下のように動作します:

  1. responseCode パラメーターは、待っているSMTPサーバーの応答コードを表します。たとえば、SMTPサーバーからの正常な接続応答は “220” です。
  2. millis() 関数を使用して、関数が呼び出された時点からの経過時間を取得し、5秒以内に応答があるかを確認します。5秒を超える場合はタイムアウトとみなします。
  3. client.available() を使用して、SMTPサーバーからのデータが利用可能かどうかを確認します。データが利用可能であれば、それを文字列として line 変数に読み込みます。
  4. Serial.println(line) は、受信した応答をシリアルモニターに表示します。これはデバッグ目的で使用されます。
  5. 受信した応答に指定された responseCode が含まれているかを確認します。もし含まれていれば、SMTPサーバーからの正しい応答とみなし、true を返します。指定された応答コードが見つからない場合、タイムアウトとみなし、”SMTP Response Timeout or Error” メッセージをシリアルモニターに表示し、false を返します。

この関数はSMTPプロトコルの通信において、各ステップでの応答を確認するために使用され、通信の正常性を確保するのに役立ちます。SMTPサーバーとの通信において、正確な応答コードの確認は重要です。

動画に実際の様子を記載しているので見てください。

終わりに

ESP32を使用してGmailを介してメールを送信するプロジェクトは、IoTデバイスや通知システムの構築に非常に役立ちます。このプログラムを通じて、ESP32のWiFi機能を活用し、SMTPプロトコルを使用してメールを送信する方法を学びました。ESP32を使用することで、デバイスが特定の条件を満たしたときに自動的にメールを送信するアプリケーションを開発できます。初めてのプロジェクトでも、このガイドを参考にして、ESP32を使用したメール送信プロジェクトを楽しんでください。

🚀 0円で現役エンジニアから学べる【Techスクールオンライン】のお申込みをお勧めします。 このオンラインスクールでは、現役のエンジニアから直接学ぶことができ、プログラミングの基礎から高度なスキルまでを習得できます。しかも、今なら 0円 で受講できるチャンス。
私がツナグバに登録してから、求人情報が豊富に届き、自分に合った仕事を見つけることができました。特に、第二新卒向けの求人情報が多いので、自分のスキルや経験を活かしながら新たなキャリアに挑戦することができました。転職活動は不安も多いですが、ツナグバのサポートがあれば、成功への道が明るく感じました。