Ультразвуковой дальномер

_A_r_d_u_i_n_o
Offline
Зарегистрирован: 02.08.2015

Всем привет, помогите плиз, есть такой код, он работает прекрасно, но вот возник вопрос, как при первом взмахе на расстоянии 30 см включить светодиод, а при втором взмахе на расстоянии 30 см светодиод выключить?!


#define led1 12
int echoPin = 9;
int trigPin = 8;
 
void setup() {
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(led1, OUTPUT);
  pinMode(11, OUTPUT);
   Serial.begin(9600);
}
 
void loop() {
   digitalWrite(11, HIGH); 
  int duration, cm, inch, mm;
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  cm = duration / 58;
  inch = duration / 148;
  mm = duration / 5.8;
  Serial.println(cm);
  delay(100);

if (cm>20,cm<40)
{
  digitalWrite(led1, HIGH);
   }
if (cm<20)
{
  digitalWrite(led1,LOW);
   }
}
at0mix
at0mix аватар
Offline
Зарегистрирован: 23.11.2015

Что мешает определить переменную byte MASHEM=0 и инвентировать ее при вледующем взмахе?

_A_r_d_u_i_n_o
Offline
Зарегистрирован: 02.08.2015

Переменную добавил, взял часть кода из соседней ветки, но что-то неправильно я сделал, что исправить?

#define led1 12
int echoPin = 9;
int trigPin = 8;
int MASHEM=0;
int x=0;
void setup() {
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(led1, OUTPUT);
  pinMode(11, OUTPUT);
   Serial.begin(9600);
}
 
void loop() {
   digitalWrite(11, HIGH); 
  int duration, cm, inch, mm;
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  cm = duration / 58;
  inch = duration / 148;
  mm = duration / 5.8;
  Serial.println(cm);
  delay(100);
  
if (cm>20,cm<40)
{
x=1;  
   }
if(x=1&&MASHEM==0)//если кнопка нажата
// и перемення "MASHEM" равна 0 , то ...
{
delay(50);//защита от дребезга
MASHEM++;//пишем 1 в переменную кнопка
//это нужно для того что бы с каждым нажатием кнопки
//происходило только одно действие

digitalWrite(12, !digitalRead(12));//меняем значение порта на противоположное

}


  if(x=1&&MASHEM==1)//если кнопка НЕ нажата
//и переменная knopka равна - 1 ,то ...
{

MASHEM=0;//обнуляем переменную "knopka"
}
}

 

_A_r_d_u_i_n_o
Offline
Зарегистрирован: 02.08.2015

попробовал другой код, он заработал, но вопрос: при удержании руки на расстоянии от 20 до 40 см происходит вот что, реле начинает очень быстро щёлкать, как это исправить?

#define led1 12
int echoPin = 9;
int trigPin = 8;
int MASHEM=0;

void setup() {
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(led1, OUTPUT);
  pinMode(11, OUTPUT);
   
Serial.begin(9600);
}
 
void loop() {
   digitalWrite(11, HIGH); 
  int duration, cm, inch, mm;
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  cm = duration / 58;
  inch = duration / 148;
  mm = duration / 5.8;
  Serial.println(cm);
  delay(100);
  

if(cm>20&&cm<40&&MASHEM==0)//если кнопка нажата
// и переменная "knopka" равна 0 , то ...
{
delay(50);//защита от дребезга
MASHEM++;//пишем 1 в переменную кнопка
//это нужно для того что бы с каждым нажатием кнопки
//происходило только одно действие

digitalWrite(12, !digitalRead(12));//меняем значение порта на противоположное

}

  if(cm>20&&cm<40&&MASHEM==1)//если кнопка НЕ нажата
//и переменная knopka равна - 1 ,то ...
{

MASHEM=0;//обнуляем переменную "MASHEM"
}
 } 

 

_A_r_d_u_i_n_o
Offline
Зарегистрирован: 02.08.2015

попробовал другой код, он заработал, но вопрос: при удержании руки на расстоянии от 20 до 40 см происходит вот что, реле начинает очень быстро щёлкать, как это исправить?

#define led1 12
int echoPin = 9;
int trigPin = 8;
int MASHEM=0;

void setup() {
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(led1, OUTPUT);
  pinMode(11, OUTPUT);
   
Serial.begin(9600);
}
 
void loop() {
   digitalWrite(11, HIGH); 
  int duration, cm, inch, mm;
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  cm = duration / 58;
  inch = duration / 148;
  mm = duration / 5.8;
  Serial.println(cm);
  delay(100);
  

if(cm>20&&cm<40&&MASHEM==0)//если кнопка нажата
// и переменная "knopka" равна 0 , то ...
{
delay(50);//защита от дребезга
MASHEM++;//пишем 1 в переменную кнопка
//это нужно для того что бы с каждым нажатием кнопки
//происходило только одно действие

digitalWrite(12, !digitalRead(12));//меняем значение порта на противоположное

}

  if(cm>20&&cm<40&&MASHEM==1)//если кнопка НЕ нажата
//и переменная knopka равна - 1 ,то ...
{

MASHEM=0;//обнуляем переменную "MASHEM"
}
 } 

 

_A_r_d_u_i_n_o
Offline
Зарегистрирован: 02.08.2015

Я так и не понял(

Помогите плиз

_A_r_d_u_i_n_o
Offline
Зарегистрирован: 02.08.2015

Сделал код, только странность какая появилась, например я включил перые три светодиода, а когда взмах происходит между первым и вторым, то все светодиоды, которые сверху отключаются, т.е. ВТОРОЙ И ТРЕТИЙ, что делать, как это исправить?

#define led1 12
#define led2 7
#define led3 6
#define led4 5
#define led5 4
#define led6 3
#define led7 11
#define led8 13
int echoPin = 9;
int trigPin = 8;
int x=0;
int y=1;
void setup() {
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
   pinMode(led8, OUTPUT);
    pinMode(led1, OUTPUT);
    pinMode(led2, OUTPUT);
    pinMode(led3, OUTPUT);
    pinMode(led4, OUTPUT);
    pinMode(led5, OUTPUT);
    pinMode(led6, OUTPUT);
    pinMode(led7, OUTPUT);
     pinMode(10, OUTPUT);
       Serial.begin(9600);
}
 
void loop() { 
 digitalWrite(10,HIGH);
  int duration, cm, inch, mm;
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  cm = duration / 58;
  inch = duration / 148;
  mm = duration / 5.8;
  Serial.println(cm);
  delay(100);
  if (cm>70,cm<80)
{
  digitalWrite(led3, x);
   }
if (cm>60,cm<70)
{
  digitalWrite(led3,y);
   }
if (cm>50,cm<60)
{
  digitalWrite(led2, x);
   }
if (cm>40,cm<50)
{
  digitalWrite(led2,y);
   }
if (cm>20,cm<40)
{
  digitalWrite(led1, x);
   }
if (cm>10,cm<20)
{
  digitalWrite(led1,y);
   }
}

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Когда Вы зафтксировали первый взмах, Вам нужно сначала дождаться, пока рука уйдет из зоны обнаружения, и только потом ловить второй взмах.