работа лазеров от двух ультразвуковых датчиков

tupoi
Offline
Зарегистрирован: 10.11.2018

Всем привет

Нужно чтобы при обнаружении объекта одним из двух или сразу двух датчиков на определенной дистанции срабатывали 4 лазера.  При включении все лазеры горят,и перестают если поставить обе дистанции на 0. Что не так с кодом?

int laser1 = 5;
int laser2 = 7;
int laser3 = 6;
int laser4 = 8;
int trig1 = 12;
int echo1 = 13;
int trig2 = 3;
int echo2 = 2;

void setup()
{
  pinMode(trig1, OUTPUT);
  pinMode(trig2, OUTPUT);
  pinMode(echo1, INPUT);
  pinMode(echo2, INPUT);
  pinMode(laser1, OUTPUT);
  pinMode(laser2, OUTPUT);
  pinMode(laser3, OUTPUT);
  pinMode(laser4, OUTPUT);
}

void loop()
{
long duration1,distance1;
long duration2,distance2;
  digitalWrite(trig1, LOW);
delayMicroseconds(5);
digitalWrite(trig1, HIGH);
delayMicroseconds(10);
digitalWrite(trig1, LOW);
digitalWrite(trig2, LOW);
delayMicroseconds(5);
digitalWrite(trig2, HIGH);
delayMicroseconds(10);
digitalWrite(trig2, LOW);
  duration1 = pulseIn(echo1, HIGH);
  duration2 = pulseIn(echo2,HIGH);
  distance1 = duration1/ 58.2;
  distance2 = duration2/ 58.2;
  if ((distance1 < 10) or (distance2 < 10)) {
    digitalWrite (laser1,HIGH);
    digitalWrite (laser2,HIGH);
    digitalWrite (laser3,HIGH);
    digitalWrite (laser4,HIGH);
}
  else {
    digitalWrite (laser1, LOW);
    digitalWrite (laser2, LOW);
    digitalWrite (laser3, LOW);
    digitalWrite (laser4, LOW);
  }
}
DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

комаров будешь испепелять на даче? 

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Надо начать с того, что бы дистанцию правильно измерять. Нужно работать с датчиками по очереди, а не сразу с обоими. Дал сигнал на первый, померял эхо с него. Потом тоже самое со вторым. А рассчитанные дистанции, для начала, выводи в Serial, что бы было видно правильно ли все сделано. А уж потом лазеры включать будешь, когда с дистанцией все нормально будет

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

tupoi пишет:
Что не так с кодом?
Всё так.

Нет так с автором, который не может объяснить словами что именно должен делать код. А когда не можешь объяснить словами, то программу написать невозможно.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015
if ((distance1 < 10) or (distance2 < 10)) 

я что-то проспал? давно так можно в С писать, или это особенность Wiring? 

rkit
Offline
Зарегистрирован: 23.11.2016

tupoi пишет:

long duration1,distance1;
long duration2,distance2;
  digitalWrite(trig1, LOW);
delayMicroseconds(5);
digitalWrite(trig1, HIGH);
delayMicroseconds(10);
digitalWrite(trig1, LOW);
digitalWrite(trig2, LOW);
delayMicroseconds(5);
digitalWrite(trig2, HIGH);
delayMicroseconds(10);
digitalWrite(trig2, LOW);
  duration1 = pulseIn(echo1, HIGH);
  duration2 = pulseIn(echo2,HIGH);
  distance1 = duration1/ 58.2;
  distance2 = duration2/ 58.2;

Эко ты хитро решил параллельно считывать оба дальномера без корректировки данных.

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

В С++ - точно можно. В С ... склероз ... щас гляну ... можно и в Си, если включить <iso646.h>.

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

ЕвгенийП пишет:

В С++ - точно можно. В С ... склероз ... щас гляну ... можно и в Си, если включить <iso646.h>.

спасибо Евгений, в вики почитал подробно, че творится, какая то паскализация С 

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

rkit пишет:

tupoi пишет:

long duration1,distance1;
long duration2,distance2;
  digitalWrite(trig1, LOW);
delayMicroseconds(5);
digitalWrite(trig1, HIGH);
delayMicroseconds(10);
digitalWrite(trig1, LOW);
digitalWrite(trig2, LOW);
delayMicroseconds(5);
digitalWrite(trig2, HIGH);
delayMicroseconds(10);
digitalWrite(trig2, LOW);
  duration1 = pulseIn(echo1, HIGH);
  duration2 = pulseIn(echo2,HIGH);
  distance1 = duration1/ 58.2;
  distance2 = duration2/ 58.2;

Эко ты хитро решил параллельно считывать оба дальномера без корректировки данных.

Угу.

При этом второй дает "0" в duration2, каковой ноль в строке 80 врубает лазеры.