ESP32 にHCSR04くっつけて距離計にしてみた
Arduinoのキットで転がってたパッシブブザーもくっつけて近づいたら音が高くなるようにしてみた

 

最初距離計の値が出ないので??? なんで?

こんなにシンプルなのにと再度接続確認したら、HCSR04のVCCを3.3Vに接続してました。

5V側に接続して無事動作しました



 

接続はこちら fritzing 使い始めたけどまだよく使い方がわからないよ

 

 

 

スケッチはこちら

/*
   HCSR04 超音波距離計

*/

#include <Wire.h>

#include "SSD1306.h"    //ディスプレイ用ライブラリを読み込み
SSD1306  display(0x3c, 21, 22); //SSD1306インスタンスの作成(I2Cアドレス,SDA,SCL)

#define PIN_BUZZER 15
int portno = 5; // デジタルポート番号
const int TrigPin = 16;
const int EchoPin = 17;

float cm;
int V = 340;//音速

uint8_t segment[128][8] = { 0 };


void setup() {
  Serial.begin(115200);

  display.init();    //ディスプレイを初期化 SSD1306.h

 

  pinMode(TrigPin, OUTPUT);
  pinMode(EchoPin, INPUT);

  Serial.println("ledc setup");
  ledcSetup(1, 12000, 8);
  ledcAttachPin(PIN_BUZZER, 1);
}

void loop() {
  digitalWrite(TrigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(TrigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(TrigPin, LOW);
  // Serial.println("EchoPin Read");
  cm = pulseIn(EchoPin, HIGH) / 58.0; //The echo time is converted into cm
  cm = (int(cm * 100.0)) / 100.0;     //Keep two decimal places

  Serial.print(cm);
  Serial.print("cm");

  display.clear();
  display.setFont(ArialMT_Plain_10);          //フォントを設定 10,16,24
  display.drawString(107, 0, "T22");
  display.setFont(ArialMT_Plain_16);          //フォントを設定 10,16,24
  display.drawString(0, 0, "Dist:" + String(cm, 1)+" cm");
  for (int i = 0; i < cm; i += 4) {
    display.drawString( i, 50, String("*"));
  }

  int dac;
  dac = analogRead(Cds);

  if (cm < 70) {    //70cmより近くで音を出す
    float tone = ledcWriteTone(1, 2500 - 30 * cm);
    Serial.print(" tone:" + String(tone));
    display.drawString(0, 20
    , "Tone:" + String(tone, 1)+" Hz"); 

    delay(100);
    ledcWriteTone(1, 0);
    delay(100);
  } else {
    delay(500);
  }
    Serial.println("");
    display.display();
}


 

先月「Arduinoの出力値をExcelに取り込む」Excelを作ったけどもっと汎用的に、マクロ書き換えないでいいようにってことで

その2です。

ArduinoやESP32でのSerial.Printでの出力をExcelで読込んでセルに書き出します。

利用想定場面は、Arduinoからの出力は1000ms程度の間隔で出力されるものを全部はいらないので、Excelでは1分間隔で読込んで記録するみたいな状況を想定しています。

各種試験機器などでも接続の速度設定合わせれば同じだと思うので。

 

Serial.Printでの出力は カンマ区切りで出力するようにしてください。

TAB区切りやスペースの場合はマクロの

    B = Split(Rcv, ",")

の部分を書き換えればいいだけです。

 

ComPortRead2.xlsm

 

全開のものと中身は同じで「EasyComm」を使ってます

 

今回は、良く変更する ComPort番号や、接続速度などの設定文字列をマクロの定数ではなく

Excelシートから読み込むように変更しているだけです。

 

 

ESP32だとledcWriteToneって便利な関数があったのでCdSセルをつないで遊んでみた




参考:

 

スケッチ
---------------------------------------------
#define PIN_BUZZER 15
void setup() {
  Serial.begin(115200);
  ledcSetup(1, 12000, 8);
  ledcAttachPin(PIN_BUZZER, 1);
  pinMode(35, INPUT);
}
void loop() {
  int dac;
  dac = analogRead(35);
  int tone=ledcWriteTone(1, dac/2);
  Serial.println(String(dac)+" "+String(tone));
  delay(50);
  ledcWriteTone(1, 0);
  delay(50);
}

 

全開「ESP-WROOM-32にSSD1306ディスプレイをつなぐ」でOLEDディスプレイ接続できたのはいいのですが上下逆。まあ取り付け方さかさまにすればいいだけなので。とりあえずそのまま使って、いろいろ試して遊んでたのですが

 さっき風呂に入ってるときなんとなくググってたら、おおおおHit ありました。ドンピシャこれいけるのでは!!

あわてて風呂出て早速テスト

ライブラリーの確認、ありましたありました。

「C:\Users\LoginID\Documents\Arduino\libraries\ESP8266_and_ESP32_OLED_driver_for_SSD1306_displays\src\OLEDDisplay.h」

  書いてあるように4か所の値を入れ替えて

//#define COMSCANDEC 0xC8
//#define COMSCANINC 0xC0
#define COMSCANDEC 0xC0        // 上下逆に正転
#define COMSCANINC 0xC8        //  上下逆に正転
      :

//#define SETCOMPINS 0xDA
#define SETCOMPINS 0xA1        // 上下逆に正転
     :

//#define SETSEGMENTREMAP 0xA1
#define SETSEGMENTREMAP 0xA0        //上下逆に正転

 

再度コンパイルして書込み

画面が一旦消えて、おおお逆転(普通に戻って)表示されました。



 

めでたしめでたし

さてさて、ボード上の配置も変えよう。

ああスッキリ解決

image

おやすみなさい。