続いて、ESPAsyncWebServerを利用した GPIOの切り替えを行なってみる。参考ページは以下だが、今回は ESP32自体をルーターにはせず、家庭内のルーターにぶら下げる形に一部改造している。
- WebページからESP32のGPIO出力を切り替える
- sLab学習サイト - Webサーバ機能 (WayBackMachine)
[ スケッチ:Esp32_AsyncWebServer_3 ]
// https://it-evo.jp/blog/blog-1483/ + https://kit.socinno.com/3_2_e/
#include <WiFi.h>
#include "ESPAsyncWebServer.h"
#include "SPIFFS.h"
#include <ArduinoJson.h>
const char ssid[] = "********";
const char pass[] = "********";
const IPAddress ip(192,168,3,17);
const IPAddress gateway(192,168,1,1); // デフォルトゲートウェイ
const IPAddress subnet(255,255,255,0);
AsyncWebServer server(80); // ポート設定
// Jsonオブジェクトの初期化
StaticJsonDocument<512> doc;
#define LED_PIN 33
uint8_t led_status; //LEDの状態制御用変数
void setup()
{
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT); // GPIO25を出力設定に
// SPIFFSのセットアップ
if(!SPIFFS.begin(true)){
Serial.println("An Error has occurred while mounting SPIFFS");
return;
}
WiFi.config(ip, gateway, subnet);
WiFi.begin (ssid, pass);
while ( WiFi.status() != WL_CONNECTED ) {
delay ( 1000 );
Serial.print ( "." );
}
// 各種情報を表示
Serial.print("SSID: ");
Serial.println(ssid);
Serial.print("AP IP address: ");
Serial.println(ip);
// GETリクエストに対するハンドラーを登録
// rootにアクセスされた時のレスポンス
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
request->send(SPIFFS, "/index.html");
});
// style.cssにアクセスされた時のレスポンス
server.on("/style.css", HTTP_GET, [](AsyncWebServerRequest *request){
request->send(SPIFFS, "/style.css", "text/css");
});
// LED の制御変数の変更リクエスト
server.on(
"/post_test",
HTTP_POST,
[](AsyncWebServerRequest * request){},
NULL,
[](AsyncWebServerRequest * request, uint8_t *data, size_t len, size_t index, size_t total) {
String resjson = "";
for (size_t i = 0; i < len; i++) {
//Serial.write(data[i]);
resjson.concat(char(data[i]));
}
Serial.println(resjson);
DeserializationError error = deserializeJson(doc, resjson);
if(error){
Serial.println("deserializeJson() faild");
request->send(400);
}
else{
led_status = doc["LED_STATUS"]; //zz Tilt Motor Default SPEED
request->send(200);
}
});
led_status = 0;
// サーバースタート
server.begin();
Serial.println("Server start!");
}
void loop() {
// LED状態変更
if(led_status == 0){
digitalWrite(LED_PIN, LOW);
}
else{
digitalWrite(LED_PIN, HIGH);
}
delay(100);
}