Уроки по Ардуино, Raspberry Pi и радиоэлектронике

Счетчик посещений комнаты с использованием Arduino Nano

Нет комментариев

Создадим устройство, которое отслеживает, сколько людей входит и выходит из комнаты, и предупреждает если людей слишком много.

Компоненты

Для создания счетчика посетителей или посещений комнаты или помещения нам понадобится следующий набор компонентов:

  1. Arduino Nano Every × 1
  2. Макет (универсальный) × 1
  3. Ультразвуковой датчик HC-SR04 × 2
  4. TM1637 4-значный дисплей × 1
  5. Зуммер × 1
  6. Перемычки × 1
  7. Кабель USB-A к Micro-USB × 1
  8. Гайка и болтик диаметром 5 мм × 2

Чтобы сэкономить место, можно отсоединить шину питания и использовать только её вместо всего макета.

Программные приложения и онлайн-сервисы:

Ручные инструменты:

  • Горячий клеевой пистолет
  • 3D-принтер

Вы можете создать корпус из легко доступных материалов, таких как, например, картон. Это не принципиально.

Описание

В условиях, когда пандемия коронавируса все еще остается большой проблемой, особенно важно практиковать социальное дистанцирование и держаться подальше от других. Однако это трудно сделать в закрытых и переполненных помещениях.

Здесь может помочь счетчик занятости помещения. Он отслеживает количество людей в помещении или здании, увеличивая счетчик, когда люди входят, и уменьшая счетчик, когда люди выходят.

Как только количество людей в помещении превысит максимальное разрешенное количество (которое может быть установлено пользователем), сигнал тревоги будет срабатывать до тех пор, пока количество людей снова не окажется в пределах нормы.

Это может предотвратить переполненность зданий и комнат, что может помочь ограничить распространение вируса, упростив практику социального дистанцирования.

Схема соединения

Все наши комплектующие и компоненты для нашего устройства отслеживания количества посетителей соединяем согласно схеме ниже:

Код проекта

С помощью IDE Arduino мы загружаем наш код ниже на плату:

int maxPeople = 5; // максимальное количество людей, разрешенных до срабатывания сигнализации
int sensitivity = 5; // более низкие значения сделают его более чувствительным, а более высокие - менее чувствительным.
//---------------------------------------------------

#include <TM1637.h>

int currentPeople = 0;
int buzzer = 8;

TM1637 tm(2,3);

int sensor1[] = {4,5};
int sensor2[] = {6,7};
int sensor1Initial;
int sensor2Initial;

String sequence = "";

int timeoutCounter = 0;

void setup() {
  // настройки
  Serial.begin(9600);
  pinMode(buzzer, OUTPUT);
  tm.init();
  tm.set(2);

  delay(500);
  sensor1Initial = measureDistance(sensor1);
  sensor2Initial = measureDistance(sensor2);
}

void loop() {
  // Считывание ультразвуковых датчиков
  int sensor1Val = measureDistance(sensor1);
  int sensor2Val = measureDistance(sensor2);
  
  // Обработка данных
  if(sensor1Val < sensor1Initial - 30 && sequence.charAt(0) != '1'){
    sequence += "1";
  }else if(sensor2Val < sensor2Initial - 30 && sequence.charAt(0) != '2'){
    sequence += "2";
  }
  
  if(sequence.equals("12")){
    currentPeople++;  
    sequence="";
    delay(550);
  }else if(sequence.equals("21") && currentPeople > 0){
    currentPeople--;  
    sequence="";
    delay(550);
  }

  // Сбрасываем последовательность, если она недействительна или таймауты
  if(sequence.length() > 2 || sequence.equals("11") || sequence.equals("22") || timeoutCounter > 200){
    sequence="";  
  }

  if(sequence.length() == 1){ //
    timeoutCounter++;
  }else{
    timeoutCounter=0;
  }

  // Вывести значения на последовательный монитор
  Serial.print("Seq: ");
  Serial.print(sequence);
  Serial.print(" S1: ");
  Serial.print(sensor1Val);
  Serial.print(" S2: ");
  Serial.println(sensor2Val);
  
  // Отображение текущего количества людей на 4-значном дисплее
  tm.display(3, currentPeople % 10);
  int pos2 = currentPeople / 10;
  tm.display(2, pos2 % 10);
  int pos1 = pos2 / 10;
  tm.display(1, pos1 % 10);
  int pos0 = pos1 / 10;
  tm.display(0, pos0 % 10);

  // Если количество людей слишком велико, включить зуммер
  if(currentPeople > maxPeople){
    tone(buzzer, 1700);  
  }else{
    noTone(buzzer);  
  }
}

// Возвращает расстояние ультразвукового датчика, которое передается
//a[0] = echo, a[1] = trig
int measureDistance(int a[]) {
  pinMode(a[1], OUTPUT);
  digitalWrite(a[1], LOW);
  delayMicroseconds(2);
  digitalWrite(a[1], HIGH);
  delayMicroseconds(10);
  digitalWrite(a[1], LOW);
  pinMode(a[0], INPUT);
  long duration = pulseIn(a[0], HIGH, 100000);
  return duration / 29 / 2;
}

Собираем устройство

1. Соберите устройство на основе схемы выше. Чтобы сэкономить место, отсоедините шину питания от макетной платы и используйте ее вместо всей макетной платы. Также подключите USB-кабель на данном этапе.

2. Распечатайте на 3D-принтере файлы корпуса, которые можно скачать ниже:

Скачать STL-файлы .zip

В качестве альтернативы можно сделать аналогичный корпус из легкодоступных материалов, например, из картона.

3. Горячим способом приклейте ультразвуковые датчики к той части корпуса, которая выходит наружу. Между датчиками должно быть расстояние примерно 40 мм.

4. Горячим способом приклейте дисплей и зуммер к крышке. Затем поместите оставшуюся часть устройства в корпус и закрутите крышку.

Чтобы помочь сэкономить место, поместите макетную плату под Arduino и между пинами:

Программное обеспечение

1. Скопируйте код, представленный выше в Arduino IDE.

2. В Arduino IDE измените переменную maxPeople в строке 1 на максимальное количество людей, которым вы хотите разрешить находиться в помещении одновременно, прежде чем сработает сигнал о переполнении.

2. Установите библиотеку TM1637 в Arduino IDE.

Вы можете её скачать с нашего сайта по этой ссылке. Либо перейдите в раздел "Эскиз/Скетч -> Включить библиотеку -> Управление библиотеками" (англ. - Sketch -> Include Library -> Manage Libraries).

Введите "TM1637" в строке поиска, затем установите первый появившийся результат.

4. Загрузите код на устройство.

Видео

На этом всё. Будьте здоровы и оптимистичны.

Оригинал

Поделиться
14 июля 2020 в 17:13
Обновлено 28 июля 2020 в 15:17 (редакция)
Опубликовано:
Уроки по Ардуино, Raspberry Pi и радиоэлектронике,

Добавить комментарий

Ваш E-mail не будет никому виден. Обязательные поля отмечены *