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を使うために、ライブラリを使用します。
LCD with i2c:https://github.com/johnrickman/LiquidCrystal_I2C
#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);
}



コメント
コメントを投稿