В статье было рассмотрена отправка данных по сети LORAWAN с платы The Things Uno в сервис The Things Network необработанные данные RAW. Здесь на практическом примере рассмотрим обработку данных и отправку их по нужному нам адресу в сети Интернет.
Коронавирус COVID-19.
Работа по профилактике распространения новой коронавирусной инфекции (COVID-19) должна быть реализована работодателями по следующим направлениям:
1. В рамках профилактических мер по предотвращению заноса инфекции на предприятие (в организацию) рекомендуется осуществлять следующие меры:
1.1. Организация ежедневного перед началом рабочей смены «входного фильтра» с проведением бесконтактного контроля температуры тела работника и обязательным отстранением от нахождения на рабочем месте лиц с повышенной температурой тела .....
На данный момент на многих предприятиях данный процесс происходит следующим образом: Медсестра на входе измеряет температуру, вручную записывает в журнал данные сотрудника. Полное отсутствие автоматизации.
Проект-предложение по некоторой автоматизации данного процесса.
Вход сотрудников по RFID-меткам, проверка метки в базе на сервере, бесконтактное измерение температуры, в зависимости от данных температуры сигнал на реле для допуска/недопуска на предприятие и отправка данных на сервер для сохранения в базе данных.
В качестве контроллера будем использовать The Things Uno (см. статью статью)
Бесконтактное измерение температуры
Для бесконтактного измерения температуры - инфракрасный датчик MLX90614. Он может измерять температуру в диапазоне от -70 до 380 градусов по Цельсию с точностью около 0,5 ° C. У меня был MLX90614DAA в наличии
Датчик использует протокол I2C. Назначение контактов
Схема подключения к The Things Uno (подключается к Arduino IDE как Arduino Leonardo)
Для программирования мы используем библиотеку Adafruit_MLX90614.h, которую необходимо установить через диспетчер библиотек ( Sketch> Включить библиотеку> диспетчер библиотек ). Загрузить эскиз на доску Arduino
// Connecting libraries #include <Wire.h> #include <Adafruit_MLX90614.h> // Creating an instance of an object Adafruit_MLX90614 mlx = Adafruit_MLX90614(); void setup() { Serial.begin(9600); Serial.println("start"); // starting the MLX90614 sensor mlx.begin(); } void loop() { Serial.print("Ambient = "); Serial.print(mlx.readAmbientTempC()); Serial.print("*C"); Serial.print("\tObject = "); Serial.print(mlx.readObjectTempC()); Serial.print("*C"); Serial.print("\tObject = "); Serial.print(mlx.readObjectTempF()); Serial.println("*F"); delay(3000); }
И откройте монитор последовательного порта. Температура окружающей среды и температура объекта выводятся на последовательный порт каждые 3 секунды.
Подключение модуля считывателя RFID rc522 к The Things Uno
Существует большое разнообразие меток RFID. Метки являются активными и пассивными (без встроенного источника питания, питаемого от тока, индуцированного в антенне сигналом от считывателя). Метки работают на разных частотах: LF (125 - 134 кГц), HF (13,56 МГц), UHF (860 - 960 МГц). Устройства, которые считывают информацию из тегов и записывают в них данные, называются считывателями. В проектах Arduino модуль RFID-RC522 очень часто используется в качестве считывателя. Модуль выполнен на микросхеме MFRC522 компании NSP, которая обеспечивает работу с метками RA (на частоте 13,56 МГц).
Подключение модуля RFID-считывателя rc522 к The Things Uno по протоколу SPI
Скетч определения UID для RFID-карты и измерения температуры
// Connecting libraries #include <SPI.h> #include <MFRC522.h> #include <Wire.h> #include <Adafruit_MLX90614.h> MFRC522 mfrc522(10, 9); Adafruit_MLX90614 mlx = Adafruit_MLX90614(); byte cardUID[4] = {0,0,0,0}; float mytemp=0.0; void setup() { // Serial.begin(9600); // SPI SPI.begin(); // MFRC522 mfrc522.PCD_Init(); // starting the MLX90614 sensor mlx.begin(); // Wait a maximum of 10s for Serial Monitor while (!Serial && millis() < 10000) ; } void loop() { if ( mfrc522.PICC_IsNewCardPresent()) { // . if ( mfrc522.PICC_ReadCardSerial()) { // UID Serial.print(F("Card UID:")); for (byte i = 0; i < 4; i++) { cardUID[i]=mfrc522.uid.uidByte[i]; Serial.print(cardUID[i],HEX); } Serial.println(); // Print a message to the LCD. get_temperature(); Serial.print("t="); Serial.println(mytemp); delay(2000); } mfrc522.PICC_HaltA(); mfrc522.PCD_StopCrypto1(); } } // get temperature boolean get_temperature() { int count=0; float sumtemp=0.0; unsigned long millist=millis(); do { float t=mlx.readObjectTempC(); if(t>34.0 && t<42.0) { count++; sumtemp=sumtemp+t; } }while(millis()-millist<5000 || count<5); if(count<5) { mytemp=0.0; return false; } else { mytemp=sumtemp/count; return true; } }
Подключение дисплея и реле WH1602 I2C к The Things Uno
Теперь вам нужно подключить дисплей и реле, которое выдаст команду , позволяющую сотруднику войти в компанию. Мы используем WH1602 I2C в качестве дисплея. Схема подключения дисплея и реле
Отправка данных из Things Uno от LORAWAN в службу The Things Network
Чтобы отправить данные по сети LORAWAN, добавьте библиотеку в эскиз подключения и введите данные из нашего приложения,
#include <TheThingsNetwork.h> // Set your AppEUI and AppKey const char *appEui = "70B3D57ED00313E5"; const char *appKey = "FAFA472FB54FFE967CE63F5EE056F6D7"; #define loraSerial Serial1 #define debugSerial Serial // Replace REPLACE_ME with TTN_FP_EU868 or TTN_FP_US915 #define freqPlan TTN_FP_EU868 TheThingsNetwork ttn(loraSerial, debugSerial, freqPlan);
И весь скетч с отправкой неформатированных данных на сервис The Things Network
// Connecting libraries #include <SPI.h> #include <MFRC522.h> #include <TheThingsNetwork.h> #include <Wire.h> #include <Adafruit_MLX90614.h> #include <LiquidCrystal_I2C.h> // Set your AppEUI and AppKey const char *appEui = "70B3D57ED00313E5"; const char *appKey = "FAFA472FB54FFE967CE63F5EE056F6D7"; #define loraSerial Serial1 #define debugSerial Serial // Replace REPLACE_ME with TTN_FP_EU868 or TTN_FP_US915 #define freqPlan TTN_FP_EU868 TheThingsNetwork ttn(loraSerial, debugSerial, freqPlan); MFRC522 mfrc522(10, 9); Adafruit_MLX90614 mlx = Adafruit_MLX90614(); LiquidCrystal_I2C lcd(0x27,16,2); byte cardUID[4] = {0,0,0,0}; byte payload[6] = {0,0,0,0,0,0}; float mytemp=0.0; int pin_relay=12; void setup() { // loraSerial.begin(57600); debugSerial.begin(9600); // display lcd.init(); lcd.backlight(); lcd.clear(); // SPI SPI.begin(); // MFRC522 mfrc522.PCD_Init(); // starting the MLX90614 sensor mlx.begin(); // relay pinMode(pin_relay, OUTPUT); digitalWrite(pin_relay, LOW); // Wait a maximum of 10s for Serial Monitor while (!debugSerial && millis() < 10000) ; debugSerial.println("-- STATUS"); ttn.showStatus(); debugSerial.println("-- JOIN"); ttn.join(appEui, appKey); // Print a message to the LCD. lcd.setCursor(0,0); lcd.print("Wait card...."); } void loop() { if ( mfrc522.PICC_IsNewCardPresent()) { // . if ( mfrc522.PICC_ReadCardSerial()) { // UID Serial.print(F("Card UID:")); for (byte i = 0; i < 4; i++) { cardUID[i]=mfrc522.uid.uidByte[i]; debugSerial.print(cardUID[i],HEX); } debugSerial.println(); debugSerial.println("-- LOOP"); // Prepare payload of 1 byte to indicate LED status //byte payload[6]; payload[0] = cardUID[0]; payload[1] = cardUID[1]; payload[2] = cardUID[2]; payload[3] = cardUID[3]; // // Print a message to the LCD. lcd.setCursor(0,0); lcd.print("Gett temp .."); if(get_temperature()) { send_ttn(mytemp); if(mytemp>37.0) { // close digitalWrite(pin_relay, LOW); lcd.setCursor(0,0); lcd.print("CLOSE !!!!!!! .."); delay(2000); } else { // open digitalWrite(pin_relay, HIGH); lcd.setCursor(0,0); lcd.print("OPEN !!!!!!! .."); delay(5000); digitalWrite(pin_relay, LOW); } } debugSerial.print("t="); debugSerial.println(mytemp); // Print a message to the LCD. lcd.setCursor(0,0); lcd.clear(); lcd.print("Wait card...."); delay(2000); } mfrc522.PICC_HaltA(); mfrc522.PCD_StopCrypto1(); } }
В консоли Thing Network вводим функцию декодирования входящих данных.
function Decoder(bytes, port) { var decoded = {}; if (port === 1) { decoded.uid = (bytes[0]<<24)+(bytes[1]<<16)+(bytes[2]<<8)+bytes[3]; var temperatureInt = bytes[4]; var temperatureDecimal = bytes[5]; var temperature = temperatureInt + "." + temperatureDecimal; decoded.temp = parseFloat(temperature); } return decoded; }
Теперь мы видим входящие данные на вкладке Data (формат json)
Отправка данных, отправленных в службу The Things Network, на другой адрес через HTTP (интеграция HTTP)
Мы перенаправим данные по HTTP на нужный нам ресурс.
Пример поступления данных на наш сервер
{"app_id":"test_pyatigorsk_mira","dev_id":"pyatigorsk_mira_device01","hardware_serial":"0004A30B001C3FB6","port":1,"counter":0,"payload_raw":"Wk+LGSIx","payload_fields":{"temp":34.49,"uid":1515162393},"metadata":{"time":"2020-07-06T11:48:22.534496336Z","frequency":867.7,"modulation":"LORA","data_rate":"SF7BW125","coding_rate":"4/5","gateways":[{"gtw_id":"eui-58a0cbfffe80125c","timestamp":681777324,"time":"2020-07-06T11:48:22.433408975Z","channel":0,"rssi":-42,"snr":9.25,"rf_chain":0}]},"downlink_url":"https://integrations.thethingsnetwork.org/ttn-eu/api/v2/down/test_pyatigorsk_mira/test01?key=ttn-account-v2.iGsvHMLzmrCXJ1p6D9u2Tm1x-yoHo3y0feranDWkqGg"}
Создание базы данных сотрудников на сайте компании и базы данных для сбора ежедневных показаний температуры на входе
Создание базы данных на хостинге (MySQL) и две таблицы в ней:
- users - данные о сотрудниках и их UID;
- temp - для сбора данных о температуре тела, измеренной на входе.
Скрипт get_temp2.php отправляет сотруднику температуру в базу данных
Содержимое скрипта get_temp2.php
<?php // $location="localhost"; $user="************"; $pass="************"; $db_name="************"; // connect db if(! $db=mysqli_connect($location,$user,$pass,$db_name)) {echo "connect error";} else {;} $contentType = isset($_SERVER["CONTENT_TYPE"]) ? trim($_SERVER["CONTENT_TYPE"]) : ''; if(strcasecmp($contentType, 'application/json') != 0){ echo 'Content type must be: application/json'; } //Receive the RAW post data. $content = trim(file_get_contents("php://input")); //write post data to file for debug, you need to create data2.txt in the same folder as ttnpost2 file_put_contents('json', $content . PHP_EOL, FILE_APPEND); //Attempt to decode the incoming RAW post data from JSON. $decoded = json_decode($content, true); $filed = "json"; //file_put_contents($filed, " ".date('Y-m-d H:i:s').$decoded[payload_fields]['temp']." ".dechex($decoded['payload_fields']['uid'])); $query0=" SELECT * FROM users WHERE uid='".dechex($decoded['payload_fields']['uid'])."' "; $rez0=mysqli_query($db,$query0); if(mysqli_num_rows($rez0)>0) { $row0=mysqli_fetch_assoc($rez0); $query1=" INSERT INTO temp SET id_user='".$row0['id']."', temp='".$decoded[payload_fields]['temp']."', day='".date('Y-m-d H:i:s')."' "; mysqli_query($db,$query1); echo "#yes"; } else { echo "#no"; } ?>
Страница для удаленного просмотра данных о температуре сотрудников
Чтобы просмотреть данные, отправленные на сервер, откройте страницу сайта. Содержимое скрипта для вывода страницы view_temp.php
<?php // $location="localhost"; $user="********"; $pass="********"; $db_name="********"; // connect db if(! $db=mysqli_connect($location,$user,$pass,$db_name)) {echo "connect error";} else {;} $query0=" SELECT * FROM temp WHERE uid='".$_GET['uid']."' "; $rez0=mysqli_query($db,$query0); $content1.=date('Y-m-d')."<br><br>"; $content1.="<table>"; $query1="SELECT * FROM temp WHERE day >= CURDATE() "; $rez1=mysqli_query($db,$query1); $i=1; while($row1=mysqli_fetch_assoc($rez1)) { $content1.="<tr>"; $content1.="<td>".$i."</td>"; $rez2=mysqli_query($db,"SELECT name FROM users WHERE id =".$row1['id_user']." "); $row2=mysqli_fetch_assoc($rez2); $content1.="<td>".$row2['name']."</td>"; $content1.="<td>".mb_substr($row1['day'],10,9)."</td>"; if($row1['temp']>37.5) $content1.="<td style='background-color:red'>".$row1['temp']."</td>"; else $content1.="<td>".$row1['temp']."</td>"; $content1.="</tr>"; $i++; } $content1.="</table>"; echo $content1; ?>
Прикрепленные файлы:
- lorawan_01.zip (1 Кб)
Комментарии (6) | Я собрал (0) | Подписаться
Для добавления Вашей сборки необходима регистрация
[Автор]
[Автор]