Senzor HC-SR04, pohrajte si !

Tvoříte zajímavý projekt? Pochlubte se s ním.
Pravidla fóra
Vkládejte prosím jen HOTOVÉ projekty, které chcete představit ostatním.
Odpovědět
jankop
Příspěvky: 1029
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Senzor HC-SR04, pohrajte si !

Příspěvek od jankop » 10 led 2022, 13:23

zapojeni.png
Program ECHO-03 pro Arduino NANO (UNO) a ultrazvukový senzor HC-SR04
Program pomocí ultrasonického senzoru HC-SR04 měří vzdálenost v rozsahu 2 cm až 400 cm v časovém intervalu 500 ms a tento údaj odesílá na seriový port rychlostí 115 200 baudů. Zároveň podle zjištěné vzdálenosti zapíná jednotlivě svítící diody připojené ke vstupům. Zapínání těchto LED je dáno tabulkovou funkcí, kterou lze v programu velmi snadno změnit. Při zapnutí se provede krátké, testovací, postupné rozsvícení všech připojených diod.
Podle změřené vzdálenosti se postupně rozsvěcují jednotlivé LED ve sloupci. Každá LED svítí v určitém intervalu. Například LED 50 cm svítí od 50cm do 59 cm a navazující LED 60 cm svítí od 60 cm do 69 cm. V případě, že je vzdálenost větší než 400 cm nebo se signál od překážky dostatečně neodráží, začne blikat poslední LED-D12 ve sloupci. Pochopitelně je možné deklarované LED libovolně vypustit a do obvodu je neosadit. LED je nutné na výstupy Arduina zapojit s odpovídajícími rezistory proti GND, hodnota 470ohmů vyhovuje. LED se připojují anodou na výstupy Arduina. Protože program ve sloupci rozsvěcuje vždy pouze jednu LED, je možné spojit všechny katody těchto diod na jediný rezistor a ten pak zapojit na GND. To dovoluje velmi jednoduché zapojení obvodu na kontaktním poli pro experimenty. Na použitou knihovnu pro obvod HC-SR04 je odkaz přímo v programu. Ta počítá i s případnou teplotní kompenzaci měřené vzdálenosti.

Zapojení senzoru:
Arduino - HC-SR04
5V - Vcc
GND - GND
D14(A0) - TRIG
D15(A1 )- ECHO


Arduino - Interval svitu LED
D2 - LED 0cm až 9cm
D3 - LED 10cm až 19cm
D4 - LED 20cm až 29 cm
D5 - LED 30cm až 39cm
D6 - LED 40cm až 49cm
D7 - LED 50cm až 59cm
D8 - LED 60cm až 69cm
D9 - LED 70cm až 79cm
D10 - LED 80cm až 80cm
D11 - LED 90cm až 99cm
D12 - LED 100cm až 400cm
A vlastní program :

Kód: Vybrat vše

// Arduino UNO, NANO, MINI + ultrasonic sensor HC-SR04
// Tested with Arduino IDE 1.8.16 and Arduino AVR boards v.1.8.3
// 01/2022 Pavel Janko, www.fancon.cz
// This software is under the MIT license,
// http://opensource.org/licenses/MIT
//*************************************
#include <HCSR04.h> //https://github.com/Martinsos/arduino-lib-hc-sr04
//------------ Connection -------------
// Arduino NANO     HC - SR04
//-------------------------------------
//      5V             Vcc
//      GND            GND
//      D14(A0)        Trig
//      D15(A1)        Echo
//-------------------------------------
// Arduino NANO         +LED
//-------------------------------------
//      D2             LED 1
//      D3             LED 2
//      D4             LED 3
//      D5             LED 4
//      D6             LED 5
//      D7             LED 6
//      D8             LED 7
//      D9             LED 8
//      D10            LED 9
//      D11            LED 10
//      D12            LED 11
//-------------------------------------
const uint8_t LedNumber = 11;
const uint8_t  PinMapping[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
// V poli LedInterval je mozne nastavit libovolne intervaly svitu
// jednotlivych led. Musi to byt 12 libovolnych ale navazujicich hodnot
// vzdalenosti v centimetrech do 401cm.
const uint16_t LedInterval[] = {0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 401};
const uint8_t TRIG = 14;
const uint8_t ECHO = 15;
const uint8_t LedLast = PinMapping[LedNumber - 1];
const uint32_t SensorReadPeriod = 500;
uint32_t TimeSensorTemp;
bool LedChange;
int distance;
// UltraSonicDistanceSensor (triggerPin, echoPin, maxDistanceCm);
UltraSonicDistanceSensor distanceSensor(TRIG, ECHO);
void setup () {
  Serial.begin(115200);
  for (int8_t i = 0; i < LedNumber; i++)pinMode(PinMapping[i], OUTPUT);
  pinMode(TRIG, OUTPUT);         // Trigger
  pinMode(ECHO, INPUT);          // Echo
  LedTest();
}
void loop () {
  // periodic sensor reading
  if (millis() - TimeSensorTemp > SensorReadPeriod) {
    TimeSensorTemp = millis();
    distance = distanceSensor.measureDistanceCm();
    LedOutput();
    SerialOutput();
  }
}
void LedTest(void) {
  Serial.println("LED test !");
  for (int8_t i = 0; i < LedNumber; i++) {
    digitalWrite(PinMapping[i], HIGH);
    delay(100);
    digitalWrite(PinMapping[i], LOW);
  }
  for (int8_t i = LedNumber - 1; i >= 0 ; i--) {
    digitalWrite(PinMapping[i], HIGH);
    delay(100);
    digitalWrite(PinMapping[i], LOW);
  }
}
void LedOutput(void) {
  for (int8_t i = 0; i < LedNumber; i++) {
    if (distance >= LedInterval[i] & distance < LedInterval[i + 1])digitalWrite(PinMapping[i], HIGH);
    else digitalWrite(PinMapping[i], LOW);
  }
  if (distance < 0) {
    LedChange = !LedChange;
    digitalWrite(LedLast, LedChange);
  }
}
void SerialOutput(void) {
  if (distance < 0)Serial.println("Vzdalenost > 400cm");
  else {
    Serial.print("Vzdalenost : ");
    Serial.print(distance);
    Serial.println("cm");
  }
}

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 9 hostů