Устройство для подсчета количества находящихся в помещении людей
Назначение этого устройства — подсчет находящихся в помещении людей. Устройство устанавливается на входе в помещение и считает, как зашедших в помещение, так и вышедших из него. Мастер сделал его в связи с коронавирусными ограничениями, что бы в магазине не было людей больше ограниченного числа.
В этом проекте не требуется пайка, поскольку все компоненты подключаются непосредственно к Arduino Uno.
Инструменты и материалы:
— Arduino Uno;
-HC-SR04 ультразвуковой датчик — 2 шт;
-Два резистора 560 Ом;*
-5 мм красный светодиод;
-5 мм зеленый светодиод;
-Источник питания;**
-Компьютер;
-3D-принтер (опция);
*Значение резистора будет зависеть от падения напряжения на используемых светодиодах. Скорее всего, подойдет что-нибудь от 150 до 750 Ом.
** Для регулярного использования подключите Arduino к зарядному устройству от телефона USB 5 В, блоку питания USB или соответствующему источнику питания 6–12 В постоянного тока. Для краткосрочного использования (менее 1 дня) можно использовать перезаряжаемую батарею PP3 на 9 В с защелкивающимся соединением с цилиндрическим разъемом постоянного тока 2,1 мм.
Шаг первый: монтаж
Мастер соединяет анода светодиода (положительный вывод) и ножку резистора с помощью скрутки. Такая техника создает механически прочное электрическое соединение между проводами без необходимости пайки.
Затем компоненты должны быть установлены следующим образом:
Катод красного светодиода к GND.
Резистор красного светодиода (соединенный с анодом) подключается к выводу 12 Ардуино.
Катод зеленого светодиода подключается к контакту 11 (позже он будет установлен как GND).
Резистор зеленого светодиода (соединенный с анодом) подключается к выводу 9.
Первый датчик HC-SR04: Vcc к контакту A0, TRIG к A1, ECHO к A2 и GND к A3
Второй датчик HC-SR04: Vcc к контакту 2, TRIG к 3, ECHO к 4 и GND к 5
Шаг второй: код
Счетчик должен откалиброваться в соответствии с окружающей обстановкой в функции setup (), а затем обнаруживать и подсчитывать людей в функции loop ().
Калибровка берет пять показаний с каждого датчика и усредняет их. Пороговое значение для обнаружения кого-либо затем устанавливается равным 75% от этого значения — это позволяет избежать срабатывания датчика при небольшом ударе по устройству. Если калибровка дает неверные значения, например 0 см или 300 см, то устанавливается порог по умолчанию 45 см. Во время калибровки горят оба светодиода на устройстве. Изделие можно повторно откалибровать в любое время, нажав кнопку сброса на Arduino, это также сбрасывает счетчик на ноль.
Устройство снимает показания с каждого датчика. Затем, на основании подсчета количества срабатываний от каждого из датчиков, происходит подсчет посетителей и сравнение их количества с заданным пороговым.
Например, лимит установлен на 5 человек. Если в помещение зашли четыре человека, то светодиод будет гореть — зеленый. Если зайдет еще один, то загорится красный светодиод. Если один человек выйдет, то снова загорится зеленый светодиод.
Код для загрузки можно скачать ниже. Помимо кода также нужно установить библиотеку NewPing.
Показать / Скрыть текст/* This project was developed by the Design and Manufacturing Futures Lab at the University of Bristol as part of Project Clean Access More information about the lab and the project can be found here: <a href="https://dmf-lab.co.uk/project-clean-access/" rel="nofollow"> https://dmf-lab.co.uk/project-clean-access/</a> This code is for a counter to be placed in a shop entrance with separate entry and exit channels There are detailed instructions for this project on the Instructables website: The hardware required for this product: 2 x HC-SR04 Ultrasonic sensor 2 x 560 Ohm resistor 1 x Red LED 1 x Green LED 1 x Arduino Uno Power supply Correct USB cable for uploading sketch to Arduino board Credit goes to Tim Eckel for developing the NewPing library and example sketches. More information here: <a href="https://www.arduino.cc/reference/en/libraries/newping/" rel="nofollow"> https://dmf-lab.co.uk/project-clean-access/ </a> */ #include <NewPing.h> //Defining where the components are attached #define TRIG_IN A1 #define TRIG_OUT 3 #define ECHO_IN A2 #define ECHO_OUT 4 #define LED_WAIT 12 #define LED_ENTER 9 #define iterations 5 //Number of readings in the calibration stage #define MAX_DISTANCE 150 // Maximum distance (in cm) for the sensors to try to read. #define DEFAULT_DISTANCE 45 // Default distance (in cm) is only used if calibration fails. #define MIN_DISTANCE 15 // Minimum distance (in cm) for calibrated threshold. float calibrate_in = 0, calibrate_out = 0; // The calibration in the setup() function will set these to appropriate values. float distance_in, distance_out; // These are the distances (in cm) that each of the Ultrasonic sensors read. int count = 0, limit = 5; //Occupancy limit should be set here: e.g. for maximum 8 people in the shop set 'limit = 8'. bool prev_inblocked = false, prev_outblocked = false; //These booleans record whether the entry/exit was blocked on the previous reading of the sensor. NewPing sonar[2] = { // Sensor object array. NewPing(TRIG_IN, ECHO_IN, MAX_DISTANCE), // Each sensor's trigger pin, echo pin, and max distance to ping. NewPing(TRIG_OUT, ECHO_OUT, MAX_DISTANCE) }; /* A quick note that the sonar.ping_cm() function returns 0 (cm) if the object is out of range / nothing is detected. We will include a test to remove these erroneous zero readings later. */ void setup() { Serial.begin(115200); // Open serial monitor at 115200 baud to see ping results. pinMode(2, OUTPUT); pinMode(5, OUTPUT); pinMode(A0, OUTPUT); pinMode(A3, OUTPUT); pinMode(11, OUTPUT); digitalWrite(2, HIGH); digitalWrite(5, LOW); digitalWrite(A0, HIGH); digitalWrite(A3, LOW); digitalWrite(11, LOW); pinMode(LED_WAIT, OUTPUT), pinMode(LED_ENTER, OUTPUT); digitalWrite(LED_WAIT, HIGH); digitalWrite(LED_ENTER, HIGH); //Both LEDs are lit to alert user to ongoing calibration. Serial.println("Calibrating…"); delay(1500); for (int a = 0; a < iterations; a++) { delay(50); calibrate_in += sonar[0].ping_cm(); delay(50); calibrate_out += sonar[1].ping_cm(); delay(200); } calibrate_in = 0.75 * calibrate_in / iterations; //The threshold is set at 75% of the average of these readings. This should prevent the system counting people if it is knocked. calibrate_out = 0.75 * calibrate_out / iterations; if (calibrate_in > MAX_DISTANCE || calibrate_in < MIN_DISTANCE) { //If the calibration gave a reading outside of sensible bounds, then the default is used calibrate_in = DEFAULT_DISTANCE; } if (calibrate_out > MAX_DISTANCE || calibrate_out < MIN_DISTANCE) { calibrate_out = DEFAULT_DISTANCE; } Serial.print("Entry threshold set to: "); Serial.println(calibrate_in); Serial.print("Exit threshold set to: "); Serial.println(calibrate_out); digitalWrite(LED_WAIT, LOW); digitalWrite(LED_ENTER, LOW); //Both LEDs are off to alert user that calibration has finished. delay(1000); } void loop() { // Serial.print("Count: "); // Serial.println(count); distance_in = sonar[0].ping_cm(); delay(40); // Wait 40 milliseconds between pings. 29ms should be the shortest delay between pings. distance_out = sonar[1].ping_cm(); delay(40); if (distance_in < calibrate_in && distance_in > 0) { // If closer than wall/calibrated object (person is present) && throw out zero readings if (prev_inblocked == false) { count++; // Increase count by one Serial.print("Count: "); Serial.println(count); } prev_inblocked = true; } else { prev_inblocked = false; } if (distance_out < calibrate_out && distance_out > 0) { if (prev_outblocked == false) { count—; // Decrease count by one Serial.print("Count: "); Serial.println(count); } prev_outblocked = true; } else { prev_outblocked = false; } // //If there are fewer people in the shop than the limit, light is green, else it is red if (count < limit) { digitalWrite(LED_WAIT, LOW); digitalWrite(LED_ENTER, HIGH); } else { digitalWrite(LED_WAIT, HIGH); digitalWrite(LED_ENTER, LOW); } } <br>
Шаг третий: настройка, калибровка и использование
Установка счетчика наиболее надежна при размещении на уровне бедер / талии. Такое размещение также удобно тем, что входящий сразу видит какой светодиод горит.
Чтобы откалибровать продукт, нужно включить его, или, для повторной калибровки, нажать Reset на Arduino. Оба светодиода загорятся, информируя, что идет калибровка. По завершении они оба выключатся, затем загорится зеленый светодиод. Калибровку желательно производить, когда в магазине нет покупателей. Если устройство калибруется при покупателях, то можно «внести» их в базу, медленно проведя рукой мимо сенсора — один раз на каждого покупателя.
Ограничение по умолчанию — пять человек. Можно изменить эту настройку в коде или можно сделать это после калибровки. Для увеличения лимита до 8 человек нужно медленно провести рукой мимо датчика выхода три раза. Это действие установит счет на -3, значит, 8 человек смогут войти в магазин, прежде чем загорится красный.
Иногда устройство пропускает кого-нибудь, входящего или выходящего из магазина. Ультразвук не всегда отражается — это, скорее всего, происходит если у человека одежда из мягких материалов, таких как шерсть. Пользователь (владелец магазина) должен регулярно проверять счетчик и при необходимости корректировать его.
Шаг четвертый: корпус
Поскольку все компоненты плотно закреплены в Arduino, для устройства нет особой необходимости в корпусе. Однако он защитит электронику и придаст изделию более презентабельный вид.
Мастер разработал корпус в Fusion 360, и затем напечатал на 3D-принтере. Скачать файлы для печати, в формате STEP или STL, можно ниже.
В качестве альтернативы может быть использована любая подходящая коробка.
Lid.step
Base.step
US counter box bottom.stl
US counter box top.stl
Все готово. Процесс калибровки и работы устройства можно посмотреть на видео ниже.
Источник (Source)
Источник: