В этом проекте мы создадим двунаправленный счетчик посетителей с использованием NodeMCU ESPP8266, инфракрасного датчика и Ubidots MQTT. Вы можете использовать этот проект для мониторинга общего количества входящих, исходящих и текущих посетителей онлайн из любой точки мира с помощью панели инструментов Ubidots. Для подсчета входящих и исходящих посетителей лучше использовать инфракрасный (ИК) датчик. Данные о посетителях будут автоматически загружаться в облако Ubidots с помощью WiFi-модуля NodeMCU ESP8266.
Вы можете использовать этот двунаправленный счетчик посетителей NodeMCU в холле, торговом центре, офисе, а также на входных воротах для подсчета общего количества посетителей. Устройство подсчитывает общее количество людей, входящих через ворота, а также общее количество людей, выходящих через разные ворота. И, наконец, оно подсчитывает общее количество текущих людей, вычитая выходящих посетителей из входящих посетителей. Когда в комнате обнаруживается хотя бы один человек, свет в помещении автоматически включается. Когда в комнате нет людей, свет автоматически выключается.
Ранее на нашем сайте мы рассматривали аналогичные проекты на основе платы Arduino:
- автоматический счетчик посетителей и контроль света в комнате на Arduino;
- двунаправленный счетчик посетителей с автоматическим управлением освещением на Arduino.
Необходимые компоненты
- NodeMCU ESP8266 (купить на AliExpress).
- Инфракрасный датчик – 2 шт. (купить на AliExpress).
- Модуль OLED дисплея SSD1306 128×64 с интерфейсом I2C (купить на AliExpress).
- Модуль реле на 5 В (купить на AliExpress).
- Источник питания постоянного тока 5 В.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
ИК-датчик как детектор посетителей
Основным элементом этого проекта IoT является ИК-датчик, который работает как детектор препятствий. Всякий раз, когда ИК-датчик обнаруживает прерывание излучения, он подсчитывает человека и добавляет его к предыдущему значению.
Модуль ИК-датчика обладает большой адаптивной способностью к окружающему освещению. Он имеет инфракрасный передатчик и приемник. Инфракрасный излучающий диод излучает определенную частоту, которая при столкновении с препятствием отражается обратно. Отраженный сигнал затем принимается приемным фотодиодом. Другими компонентами в схеме являются операционный усилитель, переменный резистор и выходной светодиод.
Датчик состоит из следующих электронных компонентов.
1. ИК-светодиодный передатчик
ИК-светодиод излучает свет в диапазоне инфракрасных частот с длиной волны 700 нм – 1 мм. ИК-светодиоды имеют угол излучения света приблизительно 20–60 градусов и дальность действия до 5–10 см .
2. Фотодиодный приемник
Фотодиод действует как ИК-приемник, поскольку проводит ток когда на него падает свет. Фотодиод выглядит как светодиод, с черным покрытием на внешней стороне.
3. Операционный усилитель LM358
LM358 — это операционный усилитель (Op-Amp), используемый в качестве компаратора напряжения в ИК-датчике. Схема компаратора сравнивает пороговое напряжение, установленное с помощью предустановки, и напряжение последовательного резистора фотодиода. Когда падение напряжения на последовательном резисторе фотодиода больше порогового напряжения, выход операционного усилителя становится высоким и наоборот.
Когда выход операционного усилителя высокий, светодиод на выходной клемме включается. Это указывает на обнаружение объекта.
4. Переменный резистор
Переменный резистор здесь предустановлен. Он используется для калибровки диапазона расстояний, на котором должен быть обнаружен объект.
Схема проекта
Схема двунаправленного счетчика посетителей на NodeMCU ESP8266 и MQTT представлена на следующем рисунке.
Подключите выводы I2C (SDA и SCL) 0,96-дюймового OLED-дисплея к выводам NodeMCU D2 и D1. Подключите выходной вывод пары ИК-датчиков к выводам D5 и D6 NodeMCU. Один из ИК-датчиков будет действовать как счетчик входящих посетителей, а другой — как счетчик исходящих посетителей. Аналогично подключите 5-вольтовый релейный модуль к выводу D4 NodeMCU. И ИК-датчики, и релейный модуль работают при напряжении 5 В VCC. Вы можете подать 5 В с вывода Amica NodeMCU Vin или вывода Lolin NodeMCU VU .
Печатная плата для проекта
Вы можете собрать и попробовать эту схему на макетной плате. Но если вы не хотите собирать схему на макетной плате, то вы можете проверить эту схему и построить собственную печатную плату. Я предпочитаю EasyEDA, онлайн-инструмент для проектирования схем и печатных плат.
После разработки схемы двунаправленного счетчика посетителей ESP8266 вы можете преобразовать схему в печатную плату. Печатная плата выглядит примерно так, как показано на рисунке ниже.
Файл Gerber для изготовления данной печатной платы вы можете скачать по следующей ссылке.
Внешний вид изготовленной печатной платы показан на следующем рисунке.
Затем я собрал все компоненты на печатной плате. Теперь нам нужно протестировать устройство вместе с кодом.
Настройка Ubidots
Нам нужно настроить панель управления Ubidots, чтобы получать данные счетчика посетителей от ESP8266 по протоколу MQTT. Чтобы настроить Ubidots, посетите https://ubidots.com/ и создайте новую учетную запись, используя свой адрес электронной почты.
После входа в панель инструментов Ubidots нам понадобится API Key. Чтобы получить API key, нажмите в правом верхнем углу панели на опцию профиля. Вы увидите опцию под названием «API Credentials». Нажмите на опцию.
Теперь, когда вы нажимаете на Default Token и копируете API Token, вам понадобится этот API Token в коде программы для получения данных.
Исходный код программв
Исходный код для двунаправленного счетчика посетителей на esp8266 с автоматической системой управления освещением приведен ниже. Код требует библиотеки SSD1306 и GFX OLED для компиляции и библиотеку Ubidots. Сначала загрузите следующие библиотеки и добавьте их в Arduino IDE.
1. Загрузите библиотеку SSD1306: https://github.com/adafruit/Adafruit_SSD1306
2. Загрузите библиотеку Adafruit GFX: https://github.com/adafruit/Adafruit-GFX-Library
3. Загрузите библиотеку Ubidots MQTT: https://github.com/ubidots/ubidots-mqtt-esp
В следующей части кода измените Wifi SSID, пароль и токен Ubidots. Используйте тот же токен API. Некоторые WiFi сети не работают с протоколом MQTT из-за проблем с безопасностью. Вы можете попробовать другую сеть, если устройство не может подключиться к серверу MQTT .
1 2 3 |
#define TOKEN "*********************************" // Your Ubidots TOKEN #define WIFINAME "************" //Your SSID #define WIFIPASS "*************" // Your Wifi Pass |
Теперь вы можете скопировать код и загрузить его на плату NodeMCU ESP8266.
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 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 |
#include "UbidotsESPMQTT.h" #include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define TOKEN "*********************************" // Your Ubidots TOKEN #define WIFINAME "************" //Your SSID #define WIFIPASS "*************" // Your Wifi Pass #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels #define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin) Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); #define inSensor 14 #define outSensor 12 #define relay 0 int inStatus; int outStatus; int countin = 0; int countout = 0; int in; int out; int now; Ubidots client(TOKEN); void callback(char* topic, byte* payload, unsigned int length) { Serial.print("Message arrived ["); Serial.print(topic); Serial.print("] "); for (int i = 0; i < length; i++) { Serial.print((char)payload[i]); } Serial.println(); } void setup() { client.setDebug(true); // Pass a true or false bool value to activate debug messages Serial.begin(115200); client.wifiConnection(WIFINAME, WIFIPASS); client.begin(callback); display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //initialize with the I2C addr 0x3C (128x64) pinMode(inSensor, INPUT); pinMode(outSensor, INPUT); pinMode(relay, OUTPUT); digitalWrite(relay, HIGH); Serial.println("Visitor Counter Demo"); display.clearDisplay(); display.setTextSize(2); display.setTextColor(WHITE); display.setCursor(20, 20); display.print("Visitor"); display.setCursor(20, 40); display.print("Counter"); display.display(); delay(3000); } void loop() { if (!client.connected()) { client.reconnect(); } inStatus = digitalRead(inSensor); outStatus = digitalRead(outSensor); if (inStatus == 0) { in = countin++; } if (outStatus == 0) { out = countout++; } now = in - out; if (now <= 0) { digitalWrite(relay, HIGH); display.clearDisplay(); display.setTextSize(2); display.setTextColor(WHITE); display.setCursor(0, 15); display.print("No Visitor"); display.setCursor(5, 40); display.print("Light Off"); display.display(); Serial.println("No Visitors! Light Off"); delay(500); } else { digitalWrite(relay, LOW); display.clearDisplay(); display.setTextColor(WHITE); display.setTextSize(1); display.setCursor(15, 0); display.print("Current Visitor"); display.setTextSize(2); display.setCursor(50, 15); display.print(now); display.setTextSize(1); display.setCursor(0, 40); display.print("IN: "); display.print(in); display.setTextSize(1); display.setCursor(70, 40); display.print("OUT: "); display.print(out); display.display(); Serial.print("Current Visitor: "); Serial.println(now); Serial.print("IN: "); Serial.println(in); Serial.print("OUT: "); Serial.println(out); delay(500); } int relaystatus = digitalRead(relay); client.add("in", in); client.add("out", out); client.add("now", now); client.add("Light Status", relaystatus); client.ubidotsPublish("ESP8266"); client.loop(); Serial.println(); delay(100); } |
Тестирование работы проекта
Приведенный выше код для ESP8266 с MQTT Ubidots удовлетворяет всем требованиям проекта. Вы можете загрузить код в модуль WiFi ESP8266. После загрузки кода плата ESP8266 попытается подключиться к сети WiFi. После подключения к сети вы можете открыть Serial Monitor (окно монитора последовательной связи), в котором вы должны увидеть следующую картину.
Последовательный монитор отобразит статус подключения к сети WiFi вместе с IP-адресом. Если есть успешное подключение к WiFi и дальнейшее подключение к Ubidots, данные будут автоматически загружаться после каждого установленного интервала. Последовательный монитор также отобразит количество входящих посетителей, исходящих посетителей, текущих посетителей и статус индикатора.
На аппаратной части, если посетителей нет, на OLED-дисплее просто отображается сообщение «Нет посетителей, индикатор выключен».
Аналогично, когда внутри помещения кто-то находится, свет включается автоматически, а на OLED-экране отображается количество входящих, исходящих и текущих посетителей.
Мониторинг посетителей онлайн на панели инструментов Ubidots
Изначально на панели инструментов Ubidots не будет отображаться никаких устройств. Но как только устройство будет подключено к серверу MQTT, вы увидите устройство, появляющееся в разделе устройств Ubidots
Теперь нажмите на устройство, которое вы видите на панели инструментов Ubidots. В моем случае я вижу esp8266, поскольку я использую плату NodeMCU ESP8266. На этой панели инструментов вы увидите данные для посетителей. Таким образом, данные изменяются только при возникновении события.
Теперь вернитесь к панели управления. В правом верхнем углу панели управления нажмите на символ «+». Вы увидите множество виджетов. Вы можете нажать и создать виджет для отображения всех индивидуальных параметров от входящего посетителя до текущего посетителя. Например, вы можете выбрать виджет Metric для отображения посетителей.
Сделайте то же самое для всех остальных 4 переменных . Наконец, после проектирования панели с помощью виджета, вы получите красивую панель в реальном времени, как показано на изображении ниже.
Вы также можете посетить мобильную версию панели инструментов Ubidots. Даже мобильный экран будет отображать данные о количестве посетителей на дисплее виджетов.