Pro prezentaci použití ultrazvuku pro měření vzdálenosti, konkrétně v mém případě výšky hladiny toku, jsem postavil jednoduchou konstrukci s Arduinem a HC-SR04. Pro teplotní kompenzaci jsem zvolil I2C teplotní čidlo LM75, tato teplotní kompenzace je nutná pro měření větších vzdáleností, jelikož teplota vzduchu přímo ovlivňuje rychlost šíření ultrazvukových vln (https://physics.stackexchange.com/questions/177997/how-can-the-speed-of-sound-increase-with-an-increase-in-temperature).
Použité komponenty:
- Arduino Nano
- HC-SR04
- LM75
- LCD 20×4 s I2C bacpackem
Na propojení komponent není nic zákeřného a vše funguje na první pokus. Vzdálenost od čidla je přímo zobrazena na LCD(v cm i v palcích) plus jsem přidal zobrazení teploty(když už ji měřím).
#include <Wire.h> #include <LiquidCrystal_I2C.h> #include <LM75.h> #define trigPin 13 #define echoPin 12 #define measuring_freq 1000 #define LCD_lines_length 20 #define LCD_lines_count 4 LiquidCrystal_I2C lcd(0x27, LCD_lines_length, LCD_lines_count); LM75 temp_sensor(LM75_ADDRESS | 0x48); char lcd_out[20]; long previousMillis = 0; void setup() { Wire.begin(); Serial.begin(9600); lcd.begin(); lcd.backlight(); lcd.clear(); lcd.setCursor ( 0, 0 ); lcd.print(F("Vyska hladiny:")); lcd.setCursor ( 0, 2 ); lcd.print(F("Teplota vzduchu:")); Serial.println(F("Hladina,Teplota")); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); } void loop() { unsigned long currentMillis = millis(); if (currentMillis - previousMillis > measuring_freq) { float distance = get_distance(temp_sensor.temp()); float temperature = temp_sensor.temp(); clearLCDLine(1); lcd.setCursor ( 0, 1 ); lcd.print(distance, 1); lcd.print(F("cm ")); lcd.print(distance * 0.393700787, 1); lcd.print(F("inch")); clearLCDLine(3); lcd.setCursor ( 0, 3 ); lcd.print(temperature, 1); lcd.print((char)223); lcd.print(F("C ")); lcd.print(((temperature * 9) + 3) / 5 + 32, 1); //fahrenheit = ((celsius * 9) + 3) / 5 + 32 lcd.print((char)223); lcd.print(F("F")); previousMillis = currentMillis; Serial.print(distance, 1); Serial.print(F(",")); Serial.println(temperature, 1); } } float get_distance(float temp) { long duration; float distance; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(5); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = (duration / 2.0) / 29.14; float speedOfSound = 331.3 + 0.606 * temp; float compensatedDistance = (duration / 20000.0) * speedOfSound; return compensatedDistance; } void clearLCDLine(byte line) { lcd.setCursor(0, line); for (byte n = 0; n < LCD_lines_length; n++) { lcd.print(" "); } }
Použité knihovny:
LM 75 https://github.com/thefekete/LM75
I2C LCD https://github.com/marcoschwartz/LiquidCrystal_I2C