19.1. Couvací senzor 1
Napište program, který bude realizovat funkci couvacího senzoru automobilu.
Pro měření vzdálenosti od překážky použijte ultrazvukový snímač (sonar)
z lekce 11.
Změřenou vzdálenost zobrazujte pomocí osmi led. Pokud je překážka ve vzdálenosti
menší než 10 cm, tak svítí všech 8 led. Pokud je ve vzdálenosti mezi 10 cm a 20 cm,
tak svítí 7 led. Za každých 10 cm vzdálenosti zhasne další 1 led. Pokud je
tedy překážka ve vzdálenosti větší než 80 cm, tak nesvítí žádná led.
Nápověda
Úlohu je vhodné si rozdělit na tři samostatné části.
Měření vzdálenosti překážky, přepočet vzdálenosti na počet led a vlastní zobrazování.
Řešení
Q07_Sonar1.ino
#define TRIG A4
#define ECHO A5
#define LED_MIN 1
#define LED_MAX 8
void setup()
{
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
for (byte i = LED_MIN; i <= LED_MAX; i++) {
pinMode(i, OUTPUT); // nastaveni pinu i jako vystup
}
}
int sonar() {
digitalWrite(TRIG, 0);
delayMicroseconds(2);
digitalWrite(TRIG, 1);
delayMicroseconds(10);
digitalWrite(TRIG, 0);
int x = pulseIn(ECHO, 1, 100000); // vraci delku pulsu v us, timeout 100ms
// Rychlost zvuku ve vzduchu ~340m/s, s = v * t, 34000/1000000/2 = 0.017 cm/us
x = x * 0.017;
return x;
}
int prepocet(int vzdalenost) {
int vysledek = 0;
if (vzdalenost > 0) { // pokud je vzdalenosti 0, pak nebylo mereni uspesne
int vysledek = 8 - vzdalenost / 10;
if (vysledek < 0) vysledek = 0;
}
return vysledek;
}
void zobraz(byte x) {
for (byte i = LED_MIN; i <= LED_MAX; i++) {
digitalWrite(i, x >= i);
}
}
void loop()
{
int vzdalenost = sonar();
int info = prepocet(vzdalenost);
zobraz(info);
delay(100);
}
19.2. Couvací senzor 2
Upravte předchozí program tak, aby byla vzdálenost překážky signalizována
nejen opticky (led), ale i zvukově. Pokud je překážka v kontrolovaném
rozsahu 0 až 80 cm, tak pípání indikuje překážku. Frekvence pípání
roste se zmenšující se vzdáleností.
Řešení