开始使用ESP32进行IoT开发的实操指南材料
最初
这份资料是用于实施于2022/04/29举办的ESP32入门物联网开发实践的内容。它与本次实践的资料相对应。
使用中文的东西
ESP32
光敏电阻传感器
湿度传感器
Micro USB电缆
用于开发的个人电脑
开发环境
Arduino集成开发环境
Node-RED可视化编程工具
准备开发环境
安装Arduino IDE
当您执行下载的文件时,可以按照向导形式进行安装。如果没有特别指定,将直接进行安装。也会批准额外的驱动程序安装。
接下来,我们将通过Arduino IDE实现对ESP32的开发。
从工具中选择板子,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的属性也需要用双引号包围,但是如果直接使用,计算机无法判断哪一部分是字符串,因此我们用双引号来表示。反斜杠(\)被称为转义序列,具有特殊意义。
(例如)
接下来我将写下一个发送实际数据的代码示例。
/*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流程。
安装Kafka节点
请提供有关此事的情报。
在GitHub上与关于ESP32手把手开发相关的项目,可以参考shinrinakamura/esp32handson。
一起开始ESP32的物联网开发手把手体验吧!同时也提供ESP32物联网开发手把手体验的服务器端指南。