← zpět na zápisky z Arduino projektů
Ultrazvukové měření vzdálenosti
Jednoduchý ultrazvukový měřič vzdálenosti se zobrazováním hodnot na OLED displeji.
Co je potřeba umět
- ovládání OLED displeje
Foto
Hardware
- OLED displej s I2C, např. SSD1306 (Aliexpress)
- ultrazvukové čidlo HC-SR04 (Aliexpress, specifikace)
Jak to funguje
Měření vzdálenosti ultrazvukem
Sensor HC-SR04 má tyto parametry:
- Napájení: +5 V DC
- Klidový proud: < 2 mA
- Pracovní proud: 15 mA
- Pracovní frekvence: 40 kHz
- Měřící rozsah: 2 cm – 400 cm
- Rozlišení : 0,3 cm
- Měřící úhel: 15°
2 piny sensoru jsou napájení (VCC, GND), jeden je vstupní (Trigger) a jeden výstupní (Echo).
Rychlost zvuku je asi 340 m/s = 34 000 cm/s = 34 cm/ms = 0,034 cm/µs (0,034 cm za mikrosekundu).
Na trigger pin sensoru nastavíme na 10 µs 5 V, čímž vypustíme 8 ultrazvukových 40 kHz vln, následně nám echo pin prozradí, kolik mikrosekund čekal na jejich odraz. Výsledná vzdálenost v cm se následně spočítá
s = t * v
s = t * 0,034
Nesmíme ji ale zapomenout vydělit 2, protože zvuk letěl samozřejmě k překážce a zpět.
OLED
Pro ovládání displeje mrkněte na OLED.
Schéma zapojení
Program
#include <SPI.h>
#include <Wire.h>
#include "U8glib.h"
// nastaveni pinu
#define trigPin 13
#define echoPin 12
// inicializace OLED
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE);
void setup() {
// seriova konzole pro testy
// Serial.begin (9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
}
// vypise vysledek na displeji
void vypis(int vzdalenost) {
if (vzdalenost > 400) {
u8g.setFont(u8g_font_fur20);
u8g.drawStr(10, 40, "Daleko");
} else {
u8g.setFont(u8g_font_fub25n);
char buf[4];
sprintf(buf, "%03i", vzdalenost);
u8g.drawStr(40, 30, buf);
u8g.setFont(u8g_font_unifont);
u8g.drawStr(45, 50, "cm");
}
}
void loop() {
long doba, vzdalenost;
// PULSE ___|---|___
// vycisti trigger pin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// posli 8 cyklu za 10 mikrosekund
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
// vypni posilani
digitalWrite(trigPin, LOW);
// precteme echo pin
doba = pulseIn(echoPin, HIGH);
//prepocet na vzdalenost
//-----------------------------
// rychlost zvuku = 340 m/s = 0,034 cm/us (mikrosekund)
// t = s/v => s = t * v
// s = cas * 0,034
// na konci musime vzdalenost vydelit 2, protoze zvuk leti tam a zpet
vzdalenost = (doba * 0.034) / 2;
u8g.firstPage();
do {
vypis(vzdalenost);
} while (u8g.nextPage());
// Serial.println(distance);
delay(500);
}
Možná vylepšení
- Při hodnotě vyšší než 4 m zobrazit hlášení, že jsme mimo rozsah.
- Při vzdálenosti nad 1 m zobrazovat hodnotu v metrech.
Poznatky
Měření nám fungovalo celkem spolehlivě do jednoho metru, hodně záleží, od čeho se ultrazvuk odráží. Pokud se zapojení udělá rozumně kompaktní, může s ním dítě oběhnout celý dům.