あれこれ手こずりましたが,ESP32への移植完了しました。おまけに,手元にあったSSD1306OLEを
ディスプレイにくわえました。当初,BLEも加えようかと思いましたが,BLEをいれるとメモリーが足りな
なるので断念。ESP32への接続は次のようにしました。
SSD1306OLE SCL→→→→GPIO22
SDA→→→→GPIO21
A0221AT RX(コネクター3)→→→→GPIO17
TX(コネクター4)→→→→GPIO16
LED 赤(WIFY接続 OFF)→→→→GPIO2
緑(WIFY接続 ON)→→→→GPIO4
ESP32をブレッドボードで使うに当たって,通常の使い方では,端子が使えなくなってしまうので,秋月電子
から購入したブレッドボード BB-01P を二つ組み合わせて使ってます。
OLEは,I2Cのものですが,表示をいれると,通信に時間がかかるのか,WEB に反映されるのに,タイムラ
グがあるようです。実際の運用には,外した方がいいかもですね。
下記が今回使ったスケッチです,といっても,諸兄のものをちょっと改変しただけす。また,WEB用のhtml
ファイルは,ESP32編(3) のものを使ってます。本当は,WEB に距離を反映させたかったのですが,
javascript が手強くて,そのままにしてあります。
// 必要なライブラリのインクルード
#include <wifi.h>
#include <spi.hamp>
#include <webserver.h>
#include <spiffs.h>
#include <adafruit_gfx.h>
#include <adafruit_ssd1306.h>
byte hdr, data_h, data_l, chksum;
String inputString = "";
float distance=0;
float new_distance=0;
float val=0.00f;
// ピンの定義
#define wifyOn 4 // wify 接続OK
#define wifyOff 2 // wify 未接続
//OLE
#define OLED_RESET -1
#define SCREEN_ADDRESS 0x3C //< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// WiFi接続情報(固定IP)
const char* ssid = "*************";
const char* password = "**********";
const IPAddress ip(192, 168, 2, 30);
const IPAddress gateway(192, 168, 2, 2);
const IPAddress subnet(255, 255, 255, 0);
const IPAddress dns1(192, 168, 2, 2);
// WebServerオブジェクトの初期化
WebServer server(80);
// セットアップ関数
void setup() {
Serial.begin(115200); // シリアル通信の開始
Serial2.begin(9600,SERIAL_8N1,16,17);
//OLE開始
if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
display.display();
delay(2000); // Pause for 2 seconds
// Clear the buffer
display.clearDisplay();
//OLE初期設定
display.setTextSize(2); // Draw 2X-scale text
display.setTextColor(SSD1306_WHITE);
display.print(F("wify-set"));
display.display();
pinMode(wifyOn, OUTPUT);
pinMode(wifyOff, OUTPUT);
digitalWrite(wifyOn, LOW);
digitalWrite(wifyOff, HIGH);
// SPIFFSの初期化
if(!SPIFFS.begin(true)){
Serial.println("SPIFFSのマウントに失敗しました");
return;
}
// WiFi接続
if (!WiFi.config(ip,gateway,subnet,dns1)){
Serial.println("Failed to configure!");
}
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
digitalWrite(wifyOn, HIGH);
digitalWrite(wifyOff, LOW);
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
// Webサーバーのルート設定
server.on("/", HTTP_GET, []() {
server.send(200, "text/html", SPIFFS.open("/index.html", "r").readString());
});
// '/distance'で距離を返す設定
server.on("/distance", HTTP_GET, []() {
server.send(200, "text/plain", String(measureDistance()));
});
server.begin(); // サーバーの開始
}
// メインループ
void loop() {
server.handleClient(); // クライアントのリクエストを処理
}
// 距離測定関数
float measureDistance() {
char m[50];
Serial2.write("S");
if (Serial2.available())
{
hdr = (byte)Serial2.read();
if (hdr == 255){
data_h = (byte)Serial2.read();
data_l = (byte)Serial2.read();
chksum = (byte)Serial2.read();
if (chksum == ((hdr + data_h + data_l)&0x00FF)){
distance = data_h * 256 + data_l;
//if(distance!=new_distance){
display.clearDisplay();
new_distance=distance;
dtostrf(new_distance, 6, 1, m);
Serial.print(m);
Serial.println(" mm");
display.setCursor(0, 0);
display.println("distance= ");
display.print(m);
display.println(" mm");
display.display();
// delay(100);
//return new_distance;
//}
}
}
}
delay(100);
return distance;
}