HC-SR04 + Relay
- Войдите на сайт для отправки комментариев
Вс, 27/01/2013 - 02:12
#include <NewPing.h> #define TRIGGER_PIN 12 // Arduino pin tied to trigger pin on the ultrasonic sensor. #define ECHO_PIN 11 // Arduino pin tied to echo pin on the ultrasonic sensor. #define MAX_DISTANCE 200 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm. NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance. ********************* void loop() { delay(50); // Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings. unsigned int uS = sonar.ping(); // Send ping, get ping time in microseconds (uS). if (uS / US_ROUNDTRIP_CM < 150 and uS / US_ROUNDTRIP_CM > 15) { digitalWrite(Relay_1, LOW);// on } if (uS / US_ROUNDTRIP_CM < 15 and uS / US_ROUNDTRIP_CM > 1) { digitalWrite(Relay_1, HIGH);// on }
Написал простенький код, который включается и выключает ночник. Тоесть если махнуть рукой от 150 до 15 сантиметров от HC-SR04 ночник включится, если от 1 до 15 выключится.
Все работает, но все таки неудобно. Помогите пожалуйста реализовать условие,
Если махнуть рукой (на любом расстояние) ночник включится, но если же он уже включен, он должен выключится. И помогите пожалуйста избавиться от delay(50), т.к. это тормозит другие мои функции.
Просто инвертируйте состояние пина.
Так же введите переменную - флаг.
Примерно вот так.
Мне не понятно зачем в программе нужен delay. Да и скорее всего не он тормозит программу а библиотека работы с датчиком.
Можно конечно как и nestandert сделал.
digitalWrite(1,!digitalRead(1));
Более того, в таком маленьком скетче так и нужно делать. Но если он планируется как "часть чего-то большего", то лучше все-таки в отдельную переменную сохранять текущие значение. Оно может и в других частях логики пригодится.
Вообще я бы примерно так это делал
К сожалению вы не дали ссылку на свою библиотеку NewPing так что проверить даже что "компилируется" я не могу (а самому гугилить-искать ее - я не хочу, раз вы не озаботились предоставить). Да и скетч вы дали "не целиком", так что и его проверить у себя, без дополнительной работы - никто не может. Вот, к примеру US_ROUNDTRIP_CM что за зверь? Только догадыватся.
И еще, как верно подметил nestandard, проблема у вас может быть не только в delay(50), но и на sonar.ping() дуплить может.
Что-бы узнать это можно сделать Serial.println(millis()); перед его вызовом и после. И посмотреть "сколкьо времени он занимает". Если что-то "слишком долго", то ... нужно будет что-то мудрить (и вот не факт что "тривиально будет", вплоть до "писать свою библиотеку, не блокирующую").
v.01 Arduino бесконтактный выключатель proximity Switch HC-SR04 Distance Measuring
Version 0.1-2013/08/04
подносим руку к дальномеру на расстояние не боле 9 сантиметров (параметр можно изменять),
сразу включится timer_led (жёлтый светодиод) информируя нас что мы "дотянулись до дальномера",
и сразу убираем руку (у нас полторы секунды чтоб успеть убрать руку )
timer_led отключается и включится led5 светодиод.
повторяя это телодвижение включаем led6 и led7
если удерживать руку перед дальномером больше 2 секунд все светодиоды led выключатся
------------------------------------------
скетч sketch:
v.01 Arduino бесконтактный выключатель proximity Switch HC-SR04 Distance Measuring
http://yadi.sk/d/MDGctp9B7Zz7y
================================
изчего состоит;
1.ARDUINO, или ATMEGA328P-PU Microcontrolle?r ARDUINO UNO Bootloader и 16MHz Crystal
2. дальномер HC-SR04 Distance Measuring
3. Breadboard макетная плата
не обязательно;
4. USB To RS232 TTL PL2303HX Auto Converter Module Converter Adapter для питания и заливки скетча + кнопка
5. Светодиоды нужны только для визуального контроля за процессом.