Ультразвуковой дальномер
- Войдите на сайт для отправки комментариев
Вс, 31/01/2016 - 14:46
Всем привет, помогите плиз, есть такой код, он работает прекрасно, но вот возник вопрос, как при первом взмахе на расстоянии 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);
}
}
Что мешает определить переменную byte MASHEM=0 и инвентировать ее при вледующем взмахе?
Переменную добавил, взял часть кода из соседней ветки, но что-то неправильно я сделал, что исправить?
#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" } }попробовал другой код, он заработал, но вопрос: при удержании руки на расстоянии от 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" } }попробовал другой код, он заработал, но вопрос: при удержании руки на расстоянии от 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" } }Я так и не понял(
Помогите плиз
Сделал код, только странность какая появилась, например я включил перые три светодиода, а когда взмах происходит между первым и вторым, то все светодиоды, которые сверху отключаются, т.е. ВТОРОЙ И ТРЕТИЙ, что делать, как это исправить?
#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); } }Когда Вы зафтксировали первый взмах, Вам нужно сначала дождаться, пока рука уйдет из зоны обнаружения, и только потом ловить второй взмах.