开始使用ESP32进行IoT开发的实操指南材料

最初

这份资料是用于实施于2022/04/29举办的ESP32入门物联网开发实践的内容。它与本次实践的资料相对应。

使用中文的东西

ESP32
光敏电阻传感器
湿度传感器
Micro USB电缆
用于开发的个人电脑

开发环境

Arduino集成开发环境
Node-RED可视化编程工具

准备开发环境

安装Arduino IDE
image.png

当您执行下载的文件时,可以按照向导形式进行安装。如果没有特别指定,将直接进行安装。也会批准额外的驱动程序安装。

接下来,我们将通过Arduino IDE实现对ESP32的开发。

image.png

从工具中选择板子,ESP32 Arduino,ESP32 Dev模块。
这样,就可以在Arduino IDE中准备好使用ESP32了。

准备Node-RED环境

这次我们将使用一个名为enebular的SaaS服务。
请前往enebular的官方网站。
如果您是第一次使用,请先创建一个账户。
点击右上角的登录按钮,进入登录页面。
在那里您会找到创建账户的按钮,请输入所需的信息并完成注册。
您现在也可以使用Gmail邮箱进行注册。
一旦完成注册,准备工作就算完成了。
关于如何使用我们将会在操作过程中解释。
关于enebular的使用时间限制是从打开开始的一个小时,超过一小时后需要重新打开,请注意。

亲身体验

切换闪烁

首先,从L闪开始尝试。
这类似于Web开发中的Hello World,旨在验证开发环境和设备是否按预期工作。

将LED的阳极(长脚)连接到ESP32开发板的GPIO 4引脚。
将电阻连接到LED的阴极一侧。然后将电阻从GND接地。
连接时,请使用跳线插针进行连线。

L闪烁代码示例

#define LED_PIN 12   //ピンの番号を指定する
void setup() {
  Serial.begin(115200);               //シリアル通信のスタート
  Serial.println("LED Brynk start");  //コンソールに表示する
  pinMode(LED_PIN, OUTPUT);           //ピンを出力モードにする
}

void loop() {     //この中に書いた指示が繰り返される
  
  digitalWrite(LED_PIN, HIGH);    //点灯
  Serial.println("light on");     //表示して確認
  delay(1000);                    //指定した時間待つ
  
  digitalWrite(LED_PIN, LOW);     //消灯
  Serial.println("light off");
  delay(1000);                      
}

使用微型USB电缆将ESP32开发板与开发用PC连接。
在Arduino IDE的工具菜单中选择ESP32Dev模块作为开发板。
选择与连接ESP32的端口。
如果不知道端口在哪里,请在设备管理器中查看。(Windows)

按下按钮进行编译并进行写入。
若自动写入未能完成,同时按下EN按钮和Boot按钮,先松开EN按钮。
如果无法成功写入,请告诉我。

只需一个选项:如果成功地进行了写入操作,LED灯将在预定的时间内闪烁。
为了查看串行控制台,将通信速率(波特率)设置为115200。
一旦LED开始闪烁,就可以按下IDE上的放大镜图标以打开串行控制台。
确认消息可以显示出来。

光敏感应器

将3.3V和10kΩ电阻连接到光敏传感器上。将电阻的另一端连接到GND。将光敏传感器和电阻连接的位置连接到D32引脚上。

光敏感应器读取代码示例

#define LIGHT_PIN 35    //ピン番号を指定

void setup() {
  Serial.begin(115200);
  Serial.println("CdS start");
  pinMode(LIGHT_PIN, INPUT);    //センサーピンのセット
}

void loop() {
  int Measurevalue;   //センサーの値を読み取るための変数を用意
  Measurevalue = analogRead(LIGHT_PIN);   //測定値を読みとる
  
  Serial.print("Mesure value is : ");   //表示して確認
  Serial.println(Measurevalue);
  
  delay(500);                           //遅延を入れて読み取り頻度を調整
}

请尝试使用if语句编写一个程序,当光敏传感器的值发生变化时,LED会点亮。

水分感知器

将水分传感器和ESP32开发板进行连接。
VCC连接到3.3V,GND连接到GND。信号线连接到D32。

请参考光敏传感器的代码,将其与源代码类比,使用analogRead函数。关于引脚的命名,建议将其设为”MOIST_PIN”。

MQTT通信

需要使用MQTT通信库。
请从库的包含中安装PubSubClient。
你也可以从这里下载并安装。
如果你感兴趣,可以尝试一下。

以下是用于MQTT发布的示例代码。代码有点长,基本上建议复制粘贴后使用。如果您对代码内容感兴趣,可以提问,我会在我了解的范围内回答。

/*ESP32でMQTTを送信するシンプルなプログラム
 * @author S.Nakamura 2022-04-23
*/


//送信関係のライブラリの読み込み
#include <WiFi.h>
#include <PubSubClient.h>

//接続するアクセスポイントの情報
const char *ssid = "your_ssid";
const char *password = "your_pass";

// Pub/Subの設定
// Pub/Sub
const char* mqttHost = "your_server_domain";                  //ipアドレスかドメインで指定する
const int mqttPort = 1883;                                    //通常は1883か8883

//mqttのユーザー認証を使用する際に使用する ハンズオンでは使用しない
//const char* mqtt_username = "your name";                //ユーザーネーム
//const char* mqtt_password = "your publish password";    //mqttのパスワード

const char* topic = "your_topic_name";                         // 送信するトピック名(変更)

WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
//ここまで通信関係の設定--------------------------------------------------------------


//プロトタイプ宣言
void connectWiFi();
void connectMqtt();
void MqttPublish(const char *payload);


void setup() {

  Serial.begin(115200);   //シリアル通信の開始
  connectWiFi();    //Wi-Fiの接続確認 
  connectMqtt();    //mQTTサーバーへの接続確認
  
  MqttPublish("start");   //MQTT送信確認
}

//1秒ごとにカウントアップするためのカウンター
int timer;
int old_time =0;
int timeCounter = 0;  

void loop() {
  
    //テストとして実行しておく処理
    //1秒ごとにカウントアップする
    timer = millis();
    if((timer - old_time) >= 1000){
      timeCounter = timeCounter +1;
      Serial.print("count is ");
      Serial.println(timeCounter);
      
      //計測時間の基準作成
      old_time = timer; 
    }
    
    //フラグを確認してMQTTの送信 
    if (timeCounter > 9) {
      timeCounter = 0;
      
      MqttPublish("test");    //mqtを送信する
     
    }
}


//通信関係の処理
//--------------------------------------------------------
//Wi-Fiを接続する
void connectWiFi(){

  //Wi-Fiのアクセスポイントに接続
  //第一引数:ssid
  //第二引数:パスワード      
  WiFi.begin(ssid, password);
  Serial.print("WiFi connecting...");

  int i = 0 ;   //接続確認の時間
  //Wi-Fiの接続確認
  while(WiFi.status() != WL_CONNECTED) {
  i += 1;
  Serial.print(".");
  delay(1000);
  //10秒間Wi-Fiが接続できないときは接続をやり直す
  if (i == 10){
    Serial.println("WiFi reset");
    connectWiFi();
      }
  }
  //Wi-Fiの接続が確認出来たらコンソールに表示して確認する      
  Serial.print(" connected. ");
  Serial.println(WiFi.localIP());

}

//MQTTの接続
//mqttに接続する関数
void connectMqtt(){
  
  //Wi-Fiの接続確認
  while(WiFi.status() != WL_CONNECTED) {
    Serial.print("WiFi is not connect");
    connectWiFi();
  }
  
  //brokerサーバーに接続する
  //第一引数:ブローカーサーバーのドメインもしくはipアドレス
  //第二引数:接続するポート(通常は1883か8883)
  mqttClient.setServer(mqttHost, mqttPort);

  //clientIDを作成してサーバーに接続する
  while( ! mqttClient.connected() ) {

    Serial.println("Connecting to MQTT...");
    
    //MacアドレスからクライアントIDを作成する
    String clientId = "ESP32-" +  getMacAddr();
    //確認用の表示
    Serial.print("clientID : "); 
    Serial.println(clientId.c_str()); 
    
    //接続の確認
    //if ( mqttClient.connect(clientId.c_str(),mqtt_username, mqtt_password) ) {  //ユーザー認証を行う時はこちらを利用する
    if ( mqttClient.connect(clientId.c_str())) { 
      Serial.println("connected"); 

    }
  }
}

//Mqttの送信
void MqttPublish(const char *payload){

  //mqttの接続を確認
  while( ! mqttClient.connected() ) {
    Serial.println("Mqtt is not connect");
    connectMqtt();
  }
 
  //mqttの送信
  //第一引数:トピック名
  //第二引数:送信するデータ
  mqttClient.publish(topic, payload);
  //コンソールに送信するデータを表示して確認
  Serial.print("published ");
  Serial.println(payload);

}

// Macアドレスを文字列で取得する mqttのクライアントIDに利用する
String getMacAddr()
{
    byte mac[6];
    char buf[50];
    WiFi.macAddress(mac);
    sprintf(buf, "%02x%02x%02x%02x%02x%02x", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
    return String(buf);
}

请在当天会场使用指定的访问点信息、服务器信息和主题信息。

发送实际测量数据

这次我们会将测量数据以JSON的形式装入payload并发送。
首先,我们会创建用于发送的payload。
使用sprintf函数将JSON以字符串形式创建。

char payload[50];

sprintf(payload, "{\"valueID\":\"01\",\"moist\":%d,\"light\":%d}", moist, light)

我会解释一下在做什么。
首先准备一个字符串数组,并保留一个区域来存放创建的字符串。
我准备了50个字节,但为了防止溢出,我会进行适当的设置。
接下来是sprintf函数,第一个参数是输出的存储位置,第二个参数是格式化字符串,第三个参数起用于插入到字符串中的值。

%d被称为格式指示符,表示有符号整数。
另外,JSON是一个字符串,需要用双引号包围。JSON的属性也需要用双引号包围,但是如果直接使用,计算机无法判断哪一部分是字符串,因此我们用双引号来表示。反斜杠(\)被称为转义序列,具有特殊意义。
(例如)

エスケープシーケンス意味\n改行\”ダブルクォーテーション\0null文字

接下来我将写下一个发送实际数据的代码示例。

/*cdsセンサーの動きと湿度センサーで測定した値をmqttで送信するシンプルなプログラムです
 * 
 * @author S.Nakamura 2022-04-23
 */

//使用するライブラリの読み込み
#include <WiFi.h>
#include <PubSubClient.h>

//Wi-Fiのアクセスポイントの接続情報
const char ssid[] = "your_ssid";
const char passwd[] = "your_pass";

//brokerサーバーの接続情報
const char* mqttHost = "######"; // MQTTのIPかホスト名
const int mqttPort = 1883;       // MQTTのポート

WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);

const char* topic_pub = "handson0429";                         // 送信するトピック名
//const char* topic_sub = "今回は使用しません";                      // 受信するトピック名
char* payload;                   // 送信するデータ

//センサーで使用するピンを指定
#define MOIST_PIN 32
#define CDS_PIN 35

//プロトタイプ宣言
bool connectWiFi();
//espのMacアドレスを取得する
String getMacAddr();
//サーバーとの接続の確認をする
void connectMqtt();
//Mqttを送信する
//第一引数;水分センサーの測定値
//第二引数:cdsセンサーの測定値
void MqttPublish(int moist, int cds);


void setup() {
  Serial.begin(115200);
  Serial.println("CdS Moist sensor moving check start");
  pinMode(MOIST_PIN, INPUT);
  pinMode(CDS_PIN, INPUT);
  connectWiFi();      //接続確認
  connectMqtt();
}

void loop() {
  
  int MeasureMoist;                     //読み取った値を入れておく領域を確保
  int MeasureCds;
  MeasureMoist = analogRead(MOIST_PIN); //水分センサーの値を読み取る
  MeasureCds = analogRead(CDS_PIN);     //cdsセンサーの値を読み取る
  
  Serial.print("Mesure Moist is : ");   //表示して確認
  Serial.println(MeasureMoist);
  Serial.print("Mesure Cds is : ");
  Serial.println(MeasureCds);

  MqttPublish(MeasureMoist, MeasureCds);  //mqttを送信
  delay(1000);      //送信頻度を調整するために遅延を入れる
}


//Wi-Fiの接続確認
bool connectWiFi(){
        
  WiFi.begin(ssid, passwd);
  Serial.print("WiFi connecting...");
  //10秒たっても接続されていないときはリセットする
  int i = 0 ;   //接続確認のリセット用
  while(WiFi.status() != WL_CONNECTED) {
  i += 1;
  Serial.print("...");
  delay(1000);
  if (i == 10){
    Serial.println("wi-fi reset");
    connectWiFi();
      }
  }
        
  Serial.print(" connected. ");
  Serial.println(WiFi.localIP());

  return true;
}


//mqttサーバーに接続
void connectMqtt(){
  
  //Wi-Fiの接続確認
  while(WiFi.status() != WL_CONNECTED) {
    
  Serial.print("WiFi is not connect");
  connectWiFi();

  }
  
  //brokerサーバーに接続する
  //第一引数:ブローカーサーバーのドメインもしくはipアドレス
  //第二引数:接続するポート(通常は1883か8883)
  mqttClient.setServer(mqttHost, mqttPort);
  

  //clientIDを作成してサーバーに接続する
  while( ! mqttClient.connected() ) {

    Serial.println("Connecting to MQTT...");
    
    //MacアドレスからクライアントIDを作成する
    String clientId = "ESP32-" +  getMacAddr();
    //確認用の表示
    Serial.print("clientID : "); 
    Serial.println(clientId.c_str()); 
    
    //接続の確認
    //if ( mqttClient.connect(clientId.c_str(),mqtt_username, mqtt_password) ) {  //ユーザー認証を行う時はこちらを利用する
    if ( mqttClient.connect(clientId.c_str())) { 
      Serial.println("connected"); 

    }
  }
}





//mqttを送信する関数
//引数:なし
//ステータスを返すようにしたい
void MqttPublish(int moist, int cds){
  

  //第一引数:トピック名
  //第二引数:送信するデータ
  char payload[125];    //大きめに確保
  sprintf(payload,"{\"deviceId\":\"01\",\"moist\":%d,\"light\":%d}", moist, cds);
  mqttClient.publish(topic_pub, payload);
  Serial.println("published Message is ");
  Serial.println(payload);

}

// Macアドレスを文字列で取得する
String getMacAddr()
{
  byte mac[6];
  char buf[50];
  WiFi.macAddress(mac);
  sprintf(buf, "%02x%02x%02x%02x%02x%02x", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
  return String(buf);
}

完成后请写下,并确认是否发送了数据。

云端接收

请在云端进行以下操作。
请打开之前注册好的enebular流程。

image.png
安装Kafka节点
image.png
请提供有关此事的情报。

在GitHub上与关于ESP32手把手开发相关的项目,可以参考shinrinakamura/esp32handson。

一起开始ESP32的物联网开发手把手体验吧!同时也提供ESP32物联网开发手把手体验的服务器端指南。

广告
将在 10 秒后关闭
bannerAds