Сработка LED по значению с датчика

DVJ FRESH
Offline
Зарегистрирован: 28.01.2020

Добрый день.

Есть датчик HC-SR04. Он считывает расстояние до стены (110см) При условии что расстояние менее 100см включать led, если более 100см выключать Led.

Вот что есть пока, никак не могу одолеть условия, не пойму какое значение нужно проверять на > или <:

const int trigPin = 9; // Trigger Pin датчика приближения
const int echoPin = 8; // Echo Pin of датчика приближения
const int led = 5;

void setup() {
   Serial.begin(9600); // Инициирует последовательное соединение и задаёт скорость передачи данных 9600 бит/с
}

void loop() {
   long duration, cm;
   pinMode(trigPin, OUTPUT); //trigpin установлен как выход
   digitalWrite(led, LOW); //светодиод выключен
   delay(2);
   digitalWrite(trigPin, HIGH);
   delay(10);
   digitalWrite(trigPin, LOW);
   pinMode(echoPin, INPUT);
   duration = pulseIn(echoPin, HIGH);
   pinMode(led, OUTPUT);
   digitalWrite(led, LOW);
/*   inches = microsecondsToInches(duration);*/
   cm = microsecondsToCentimeters(duration);
/*   Serial.print(inches);*/
/*   Serial.print("in, ");*/
   Serial.print("Distance: ");
   Serial.print(cm);
   Serial.print (" cm");
   Serial.println();
   delay(5000);
}

P.S. С программированием не знаком, пытаюсь научиться по ходу этой задачи, но времени на её выполнение не много. Заранее благодарю за помощь.

DVJ FRESH
Offline
Зарегистрирован: 28.01.2020

Пробовал писать:

if (cm < 100) {
digitalWrite(led, HIGH);
}

Но тогда выдаёт ошибку на 22 строку - 'microsecondsToCentimeters' was not declared in this scope - не пойму почему? cm не объявлена?

sadman41
Offline
Зарегистрирован: 19.10.2016

А какие значения есть в наличии?

b707
Offline
Зарегистрирован: 26.05.2017

DVJ FRESH пишет:

Но тогда выдаёт ошибку на 22 строку - 'microsecondsToCentimeters' was not declared in this scope - не пойму почему? cm не объявлена?

я тоже "не пойму почему" вы спрашиваете про cm,  если компилятор пишет вам. что не обьявлена  'microsecondsToCentimeters'

'microsecondsToCentimeters' - есть такая функция в библиотеке? - может она чуть по другому пишется?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

DVJ FRESH пишет:

Пробовал писать:

if (cm < 100) {
digitalWrite(led, HIGH);
}

Но тогда выдаёт ошибку на 22 строку - 'microsecondsToCentimeters' was not declared in this scope - не пойму почему? cm не объявлена?

А Вы не могли бы показать именно этот скетч - как Вы пробуете? И заодно выложить точно (копи-пастом) сообщение об ошибке? А то хрустальные шары здесь запрещены.

sudo-serj
sudo-serj аватар
Offline
Зарегистрирован: 27.01.2020

pinMode принято задавать в setup
объявлять переменные нужно до их использования (я бы все выносил в начало скетча) и следите за типами данных.

microsecondsToCentimeters - если это функция библиотеки, то вначале нужно подключить библиотеку

а что касается условий, то:
если расстояние (см) < x -> led HIGH

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

все разжевано, дальше некуда

https://arduinomaster.ru/datchiki-arduino/ultrazvukovoj-dalnomer-hc-sr04/

DVJ FRESH
Offline
Зарегистрирован: 28.01.2020

Да, спасибо! Целый день сижу на этом сайте. Не всё понятно к сожалению. Я с ардуино знаком 2 день только ))) Разбираюсь ))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

DVJ FRESH пишет:

Да, спасибо! Целый день сижу на этом сайте. Не всё понятно к сожалению. 

Что именно Вам непонятно в моём посте #4 ?

DVJ FRESH
Offline
Зарегистрирован: 28.01.2020

Евгений, в вашем сообщение всё понятно. К сожалению в процессе экспериментов похерил оригинальный скетч, не готов его искать в интернете. Сейчас пытаюсь заново сваять исходя из статьи предложенной xDriver. 

DVJ FRESH
Offline
Зарегистрирован: 28.01.2020

Забудем про microsecondsToCentimeters, сделал без неё. Сейчас есть такой код:

#define pin_trig 9
#define pin_echo 8
#define LED 5
long duration, cm;

void setup () {
  Serial.begin (9600);
  pinMode(pin_trig, OUTPUT);
  pinMode(pin_echo, INPUT);
  pinMode(LED, OUTPUT);
}

void loop () {
    digitalWrite(pin_trig, LOW);
    delayMicroseconds(5);
    digitalWrite(pin_trig, HIGH);
    delayMicroseconds(10);
    digitalWrite(pin_trig, LOW);
    digitalWrite(LED, LOW);

    duration = pulseIn(pin_echo, HIGH); //Время задержки акустического сигнала на эхолокаторе
    cm = (duration / 2) / 29.1;

    Serial.print("Расстояние: ");
    Serial.print(cm);
    Serial.print(" см.");
    Serial.println(); //переносит на новую строку
    delay(1000);

    if (cm >= 30)
{
  digitalWrite(LED, HIGH);
  }
}

Почему не срабатывает LED?

sadman41
Offline
Зарегистрирован: 19.10.2016

Срабатывает.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

и тут же гаснет!

строки 31-33 перенести после строки 22.

или строку 19 удалить, а 31-33 заменить на

if (cm >= 30)
{
  digitalWrite(LED, HIGH);

} else {
  digitalWrite(LED, LOW);
}

 

b707
Offline
Зарегистрирован: 26.05.2017

xDriver пишет:

или строку 19 удалить, а 31-33 заменить на

if (cm >= 30)
{
  digitalWrite(LED, HIGH);

} else {
  digitalWrite(LED, LOW);
}

 

сдается мне, что результат будет тем же.

ТС - сколько должен гореть LED после того, как первый раз сработал?

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

b707 пишет:

сдается мне, что результат будет тем же.

на секунду моргнет точно :)

а вообще объясни, что ты имел ввиду?

SLKH
Offline
Зарегистрирован: 17.08.2015

DVJ FRESH пишет:

Забудем про microsecondsToCentimeters, сделал без неё. Сейчас есть такой код:

#define pin_trig 9
#define pin_echo 8
#define LED 5
long duration, cm;

void setup () {
  Serial.begin (9600);
  pinMode(pin_trig, OUTPUT);
  pinMode(pin_echo, INPUT);
  pinMode(LED, OUTPUT);
}

void loop () {
    digitalWrite(pin_trig, LOW);
    delayMicroseconds(5);
    digitalWrite(pin_trig, HIGH);
    delayMicroseconds(10);
    digitalWrite(pin_trig, LOW);
    digitalWrite(LED, LOW);

    duration = pulseIn(pin_echo, HIGH); //Время задержки акустического сигнала на эхолокаторе
    cm = (duration / 2) / 29.1;

    Serial.print("Расстояние: ");
    Serial.print(cm);
    Serial.print(" см.");
    Serial.println(); //переносит на новую строку
    delay(1000);

    if (cm >= 30)
{
  digitalWrite(LED, HIGH);
  }
}

Почему не срабатывает LED?

19 - погасили светодиод

21, 22 - измерили расстояние. 

28 - чего-то ждем при погашенном св.диоде целую секунду

30, 32 - возможно, зажгли светодиод. или не зажгли.

это без разницы, ибо через считанные микросекунды (<20) перепрыгнули

к строке 19 и его погасили. срабатывает он или нет - неведомо, т.к. глаз такие короткие

вспышки вряд ли фиксирует.

 

 

DVJ FRESH
Offline
Зарегистрирован: 28.01.2020

xDriver Да, сработало! Косячил с синтаксисом. Спасибо граждане за помощь!

DVJ FRESH
Offline
Зарегистрирован: 28.01.2020

b707 Пока расстояние не изменится.