Arduinoで超音波センサーを使う。(ESP32対応)

 こんにちは、こんばんは
Arduinoと超音波距離センサーを使ってArduinoで距離を測ってみたいと思います。

必要なもの

・Arduino、またはESP32
・超音波センサー(HC-SR04)
・オスメスのジャンパ線
・ブレッドボード
 あれば
・温湿度計(DHT11)
・i2c搭載のLCD20x4,16x2

回路

Arduino




ESP32



プログラム

LCD20x4,16x2を使わない場合はシリアル通信で行います

Arduino&ESP32

#define ECHO_PIN 2 // Echo Pin
#define TRIG_PIN 3 // Trigger Pin
#define SOUND_SPEED 340 //[m/s]
#define MAX_WAIT 20000
 
double rate = 0; //受信間隔
double distance = 0; //距離

void setup() {
Serial.begin(115200);
  pinMode(ECHO_PIN, INPUT);
  pinMode(TRIG_PIN, OUTPUT);
}

void loop(){
  digitalWrite(TRIG_PIN, LOW);
  delayMicroseconds(2);

  digitalWrite(TRIG_PIN, HIGH); //超音波を出力
  delayMicroseconds(10);

  digitalWrite(TRIG_PIN, LOW);
  rate = pulseIn(ECHO_PIN, HIGH, MAX_WAIT); //センサからの入力

  if(rate > 0){
    rate = rate/2;
    distance = rate*SOUND_SPEED/1000000;

    Serial.print("Distance:");
    Serial.print(distance);
    Serial.println(" m");
  }

  delay(500);
}

発展プログラム

LCDに値を表示します。
また温湿度計を使って流体力学の式より正確な音速を計算し、距離を測定します。
ESP32は割愛します。 

プログラム

wikipediaの音速に関する記事を参考に、式を作ります。
https://ja.wikipedia.org/wiki/%E9%9F%B3%E9%80%9F 
またセンサとLCDを使うために、ライブラリを使用します。
#include <LiquidCrystal_I2C.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>
#include <math.h>

#define ECHO_PIN 2 
#define TRIG_PIN 3
double rate = 0; //受信した間隔
double distance = 0; //距離

#define DHT11_PIN 4
#define DHT_TYPE DHT11
DHT_Unified dht(DHT11_PIN, DHT_TYPE);
double temper = 0; //温度
double humid = 0; //湿度

#define LCD_LINE 2
#define LCD_COLUMN 16
#define LCD_ADDRESS 0x27
LiquidCrystal_I2C lcd(LCD_ADDRESS,LCD_COLUMN,LCD_LINE);

int i=0;

void setup() {
  Serial.begin(115200);
  pinMode(ECHO_PIN, INPUT);
  pinMode(TRIG_PIN, OUTPUT);

  dht.begin();
  
  lcd.init();
  lcd.backlight();
  delay(100);
  lcd.clear();
}

void loop(){
  if(i<100){//100回に1回だけ温度と湿度を測る
    sensors_event_t event;
    dht.temperature().getEvent(&event);
    if(isnan(event.temperature)){}else{temper=event.temperature;}
    dht.humidity().getEvent(&event);
    if(isnan(event.relative_humidity)){}else{humid=event.relative_humidity;}
    lcd.setCursor(0, 1);
    lcd.print("T:");
    lcd.setCursor(2, 1);
    lcd.print(temper);
    lcd.setCursor(7, 1);
    lcd.print("℃");
    lcd.setCursor(8, 1);
    lcd.print("H:");
    lcd.setCursor(10, 1);
    lcd.print(humid);
    lcd.setCursor(15, 1);
    lcd.print("%");
    i=0;
  }
  i++;
  
  digitalWrite(TRIG_PIN, LOW);
  delayMicroseconds(2);

  digitalWrite(TRIG_PIN, HIGH); //超音波を出力
  delayMicroseconds(10);

  digitalWrite(TRIG_PIN, LOW);
  rate = pulseIn(ECHO_PIN, HIGH); //センサからの入力

  if(Duration > 0){
    rate = rate/2;
    //distance = 331.5f+0.61f*temper; //近似の式
    distance = 20.055f*sqrt(temper+273.15f); //テイラー展開による近似の式
    lcd.setCursor(0, 0);
    lcd.print("Distance:");
    lcd.setCursor(9, 0);
    lcd.print(distance);
    lcd.setCursor(15, 0);
    lcd.print("m");
  }else{
    lcd.setCursor(0, 0);
    lcd.print("Distance:");
    lcd.setCursor(9, 0);
    lcd.print("=<0");
  }
  delay(500);
}

コメント

このブログの人気の投稿

DockerのNextcloudでエラーが出た SQLSTATE[08006] [7]

Arduinoで電流を測定する