В этом уроке сделаем бесконтактный переключатель с датчиком расстояния на основе Ардуино для дома или гаража.
Автор идеи - студент, который делает проект о «Пассивном доме», и ему понадобился специальный переключатель.
Шаг 1. Что нам нужно
Что нам нужно, чтобы сделать переключатель:
- Ардуино (Arduino)
- Датчик расстояния (HC-SR04 или HC-SR05)
- Провода
- Макетная плата
- Светодиод для тестирования
Шаг 2. Подключение
Схема всех соединений ниже на изображении:
Сенсор расстояния имеет 4 контакта:
- VCC
- TRIG
- ECHO
- GND (земля)
Соединяем:
- VCC к 5В Ардуино
- TRIG на цифровой контакт (в нашем случае контакт 3)
- ECHO на другой цифровой контакт (в нашем случае контакт 4)
- GND к GND
Подключите светодиод к цифровому выходу, он должен отличаться от других контактов.
Шаг 3. Код программы
Для тех, кто не понимает код - в нашем коде есть две части (void loop):
- первая часть касается датчика расстояния. Для измерения расстояния датчик посылает и получает эхо (вид звука). Я использовал длину листа A4 (29,7 см - 11,69 дюйма) для калибровки. В этом расчете «расстояние = (длительность / 2) / 29.7». Я разделил продолжительность на 2, потому что время, когда эхо должно пройти с этой стороны листа на другую сторону того же листа, это то же самое, что эхо проходит с другой стороны на датчик (он помещается на этой стороне листа).
- вторая часть - основная часть этого кода.
Структура кода:
While(...){ ...; While(...){ ...; While(...){ ...; While(...){ ...; } } } }
Если ваша рука (или объект) находится между 2 и 10 см (0.79" - 3.94"), программа войдет в первое while (условие "пока") и светодиод (или что-то еще) включится.
Вы можете изменить этот диапазон расстояний в программе.
Когда вы будете снова двигать рукой но на расстоянии более 10 см (второе «пока» - while) светодиод все равно должен включаться (как обычный переключатель). Если ваша рука составляет 2-10 см во второй раз (третий «пока» - while) светодиод должен выключиться. И когда вы отводите руку от датчика (> 10 см, четвертый while «пока») светодиод должен отключиться, пока вы снова не подвинете руку ближе, чем на 10 см.
Программный код вы можете взять ниже или скачать по ссылке:
int trigPin = 3; int echoPin = 4; float duration; float distance; void setup() { Serial.begin (9600); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); pinMode(9, OUTPUT); pinMode(10, INPUT); } void(* resetFunc) (void) = 0; //declare reset function at address 0 void loop() { // long duration, distance; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(100); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); //Serial.print(duration); distance = (duration / 2) / 29.1; //microsecond //---------------------------------------------------------------- this part above is for the distance sensor HC-SR04 if (distance >= 400 || distance <= 2) { //range of the sensor Serial.println("Out of range"); } else { Serial.print(distance); Serial.println(" cm "); } digitalWrite(9, LOW); while (distance > 2 && distance < 10) { //if your hand/an object is less than 10cm from the sensor, led will turn on. You can change the range. digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(100); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = (duration / 2) / 29.1; //microsecond digitalWrite(9, HIGH); delay(50);// prevent the bouncing // delay( millisecconds ); while (distance > 10) { //if you move your hand from the sensor, led still have to turn on. digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(100); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = (duration / 2) / 29.1; //microsecond digitalWrite(9, HIGH); delay(50);// prevent the bouncing while (distance > 2 && distance < 10) { //the next time that you move your hand/object closer than 10cm from the sensor, led will turn off digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(100); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = (duration / 2) / 29.1; //microsecond digitalWrite(9, LOW); delay(50);// prevent the bouncing while (distance > 10) { digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(100); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = (duration / 2) / 29.1; //microsecond digitalWrite(9, LOW); delay(50);// prevent the bouncing resetFunc(); } } } } }
Шаг 4. Результат
Весь процесс создания бесконтактного переключателя и финальный результат вы можете посмотреть на видео ниже.
Дальше будет больше. Не переключайтесь.