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); }
コメント
コメントを投稿