В продаже датчики наклона обычно представлены с рабочим диапазоном 30° и 60° (точнее, от -30° до +30° по горизонтали). Датчик наклона представляет собой своеобразный переключатель. Это устройство отличается от обычных переключателей тем, что начинает проводить электричество при наклоне.
Датчик, у которого выводы направлены вверх, не проводит ток, а датчик, у которого выводы направлены вниз, является токопроводящим. Такие датчики чаще всего используются в сигнализациях, где они считывают положение автомобиля и включают сигнализацию, когда транспортное средство наклоняется, если в него кто-то сел, или авто погрузили на эвакуатор.
Подключение датчика наклона
Подключение датчика не представляет сложности. Подключается он как любой переключатель. Все, что понадобится, это цифровой PIN в Arduino. Когда PIN Arduino установлен на вход, его состояние неустойчиво (случайно), пока на него не будет подано некоторое напряжение. Подключение «GND» вызывает состояние «LOW», а подключение 5V вызывает состояние «HIGH».
Если мы подключим датчик к цифровому PIN одним выводом и к «GND» другим, мы будем знать, что когда датчик наклона начнет проводить ток, будет активировано состояние «LOW». Когда датчик не будет проводить ток, состояние будет «HIGH». В нашей ситуации это переходное состояние. Поэтому, чтобы определить состояние, когда датчик не проводит, мы будем использовать подтягивающий резистор, встроенный в процессор Arduino. Это нужно для автоматического переключения в состояние «HIGH».
Схема подключения датчика наклона
Скетч для датчика наклона
В функции «setup» установим направление работы пина на «INPUT»:
1 |
pinMode (pin_number, INPUT); |
И активируем встроенный на плате резистор:
1 |
digitalWrite (pin_number, HIGH); |
Затем в функции «петля» считываем статус пина и, следовательно, положение датчика с помощью функции «цифровое чтение».
1 |
variable = digitalRead(numer_pin); |
Пример программы свечения светодиода при наклоне:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
// Определяем пин для датчика наклона #define SENSOR_PIN 2 // Определяем пин для светодиода #define LED_PIN 13 void setup() { // Устанавливаем вход для датчика наклона pinMode(SENSOR_PIN, INPUT); // Включить встроенный подтягивающий резистор digitalWrite(SENSOR_PIN, HIGH); pinMode(LED_PIN, OUTPUT); } void loop() { // Проверяем состояние датчика if (digitalRead(SENSOR_PIN) == HIGH) { // Событие, если цифровая запись отключена digitalWrite(LED_PIN, HIGH); // Включить светодиод } else { // Событие, если включена digitalWrite(LED_PIN, LOW); // Выключаем светодиод } } |
Вот видео для наглядности:
Задача для решения
Предположим, одна женщина хранит в своей сумочке какие-то сокровища, и никто не имеет права их трогать, и вообще, на них смотреть. Чтобы защитить сумочку женщины, а точнее сокровища внутри этой сумки, от любопытных людей, нужно собрать сумочную сигнализацию.
Для сборки сигнализации нам понадобится:
- Датчик наклона для проверки положения сумки
- Пьезодинамик для информирования о краже или открытии
Соединим нужные элементы, как показано на схеме ниже. Мы использовали PIN 2 для входа датчика, PIN 3 для пьезодинамика и PIN 13 для светодиода.
Скетч для решения задачи
Программа мало чем отличается от предыдущей, кроме дополнительных звуковогенерирующих функций.
Первое — «Tone» — включить звук.
1 |
tone ( output number_dynamics , frequency ); |
Второе это «noTone» — отключение звука.
1 |
noTone ( output number_dynamics ); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
// Определяем пин для датчика наклона #define SENSOR_PIN 2 // Определяем пин для светодиода #define LED_PIN 13 // Определяем пин для пьезодинамика #define PIEZO_PIN 3 void setup() { // Устанавливаем вход для датчик наклона pinMode ( SENSOR_PIN , INPUT ); // Включить встроенный подтягивающий резистор digitalWrite(SENSOR_PIN, HIGH); pinMode(LED_PIN, OUTPUT); } void loop() { // Проверяем состояние датчика if (digitalRead(SENSOR_PIN) == HIGH) { // Событие, если цифровая запись отключена digitalWrite(LED_PIN, HIGH); // Включаем светодиод tone(PIEZO_PIN, 600); // Звук пьезодинамика } else { // Событие, если включено digitalWrite(LED_PIN, LOW); //Выключаем светодиод noTone(PIEZO_PIN); // Выключить звук пьезодинамика } } |
Вот видео сигнализации в действии:
Недостаток нашей сигнализации в том, что пьезодинамик слишком чувствителен, и любой удар (даже топание) заставляет пьезоэлемент «визжать». Владельцу сумки это может не понравиться.
Есть два момента, первый когда сумку трясется при ходьбе, второй когда в сумке кто-то роется. Как отличить эти два момента друг от друга? Какая между ними разница?
Легче всего их отличить, когда сенсор переключается быстро. Толчки переключают его каждые тысячные доли секунды, время же перемещения сумки или копания в ней длится от десятых долей секунды до нескольких секунд (включая страх и бегство нападающего). Таким образом, нужно измерить, сколько времени потребуется для включения датчика, и если это длится дольше 0,1 секунды (перемещение сумки) — включить сигнализацию.
Для мы этого используем функцию «millis», которая сообщит нам, сколько миллисекунд (сотых долей секунды) прошло с момента включения Arduino. Вы можете использовать эту функцию, чтобы запомнить время запуска датчика. Затем, когда пройдет больше времени, сработает сигнал тревоги.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
// Определение вывода датчика наклона #define SENSOR_PIN 2 // Определение вывода светодиода #define LED_PIN 13 // Определение вывода пьезодинамика #define PIEZO_PIN 3 // Определение времени чувствительности датчика #define SENSOR_TIME 100 // переменная хранит время переключения датчика unsigned long sensor_time ; // функция запускается при тревоге void alarm_on () { digitalWrite ( LED_PIN , HIGH ); // Включаем tone(PIEZO_PIN, 600); // Звук пьезодинамика } // функция запускается, когда пьезодинамик выключен void alarm_off () { digitalWrite ( LED_PIN , LOW ); // Выключаем светодиод noTone ( PIEZO_PIN ); // Отключение звука пьезодинамика } // Функция проверки состояния датчика void check_sensor () { // Проверка состояния датчика if ( digitalRead ( SENSOR_PIN ) == HIGH ) { // Событие, если отключено if ( sensor_time == 0 ) // Проверяем, изменилось ли состояние { sensor_time = millis (); // сохранение времени активации датчика } // Условие, длится ли состояние датчика определенное время else if ( millis () - sensor_time > SENSOR_TIME ) { alarm_on (); } } else { // Событие, если включено sensor_time = 0 ; alarm_off(); } } void setup () { // Настраиваем вход для датчика наклона pinMode(SENSOR_PIN, INPUT); // Включить встроенный подтягивающий резистор digitalWrite(SENSOR_PIN, HIGH); pinMode(LED_PIN, OUTPUT); } void loop() { check_sensor (); } |
Конечный скетч сигнализации
У нашей сумочной сигнализации есть еще один недостаток. Сигнализация отключается, как только сумка возвращается на свое место. Настоящие сигнализации работают не так! Мы снова будем использовать функцию синхронизации «millis».
Но, во-первых, мы измерим, сколько времени прошло с момента срабатывания сигнализации. Сигнализация сработает только по истечении установленного времени, чтобы эффективно отпугнуть грабителя, а также привлечь внимание окружающих.
Во-вторых, мы используем измерение времени для проверки продолжительности тона сигнала, чтобы он циклически менялся между двумя тонами (высоким и низким). Это поможет отличить настоящую тревогу от других шумов.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
// Определение контакта для датчика наклона #define SENSOR_PIN 2 // Определение контакта для светодиода #define LED_PIN 13 // Определение контакта для пьезодинамика #define PIEZO_PIN 3 // Определение времени чувствительности датчика [мс] #define SENSOR_TIME 100 // Определение продолжительности тревоги [мс] (5000 мс = 5 с) #define ALARM_TIME 5000 // переменная хранит время переключения датчика unsigned long sensor_time ; // переменная хранит время активации тревоги unsigned long alarm_time ; // переменная содержит время изменения высоты тона сирены unsigned long signal_time = 0; // переменная хранит высоту звука // 0 - нет звука // 1 - первый тон //> 1 - второй тон byte sound_tone = 0 ; // функция тревожной сирены void alarm_signal () { if (sound_tone != 0) // проверяем, активировать ли сирену { if (millis() - signal_time > 750) // проверяем продолжительность тона { signal_time = millis (); // сохранение времени включения тона sound_tone = ~ sound_tone ; // включить второй тон } if ( sound_tone == 1 ) // первый тон { tone ( PIEZO_PIN , 600 ); } else // второй тон { tone ( PIEZO_PIN , 1200 ); } } else { noTone ( PIEZO_PIN ); // Звук выключен } } // функция запускается при срабатывании будильника void alarm_on () { alarm_time = millis(); // сохранение времени активации тревоги digitalWrite ( LED_PIN , HIGH ); // Включить светодиод sound_tone = 1 ; // Включаем тревожную сирену } // функция при выключении будильника void alarm_off () { if ( millis () - alarm_time > ALARM_TIME ) // проверяем продолжительность будильника { digitalWrite ( LED_PIN , LOW ); // Выключаем светодиод sound_tone = 0 ; // Отключение сирены } } // Функция проверки состояния датчика void check_sensor () { // Проверка состояния датчика if ( digitalRead ( SENSOR_PIN ) == HIGH ) { // Событие, если отключено if ( sensor_time == 0 ) // Проверяем, изменилось ли состояние { sensor_time = millis (); // сохранение времени срабатывания датчика } // Условие, длится ли состояние датчика определенное время else if ( millis () - sensor_time > SENSOR_TIME ) { alarm_on (); } } else { // Событие, если включено sensor_time = 0 ; alarm_off(); } } void setup () { // Устанавливаем вход для датчика наклона pinMode ( SENSOR_PIN , INPUT ); // Включить встроенный подтягивающий резистор. digitalWrite(SENSOR_PIN, HIGH); pinMode ( LED_PIN , OUTPUT ); } void loop() { check_sensor(); alarm_signal(); } |
Вот видео проверки системы на практике:
С Уважением, МониторБанк