IOT再びーESP32編(8)ーESP32へ移植完了ーA0221AT(防水超音波センサー)+SSD1306OLE

あれこれ手こずりましたが,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;
 
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA