На практическом примере рассмотрим обработку данных и отправку их по нужному нам адресу в сети Интернет.
Коронавирус COVID-19.
1.1. Организация ежедневного перед началом рабочей смены «входного фильтра» с проведением бесконтактного контроля температуры тела работника и обязательным отстранением от нахождения на рабочем месте лиц с повышенной температурой тела …..
- В рамках профилактических мер по предотвращению заноса инфекции на предприятие (в организацию) рекомендуется осуществлять следующие меры:
Работа по профилактике распространения новой коронавирусной инфекции (COVID-19) должна быть реализована работодателями по следующим направлениям:
На данный момент на многих предприятиях данный процесс происходит следующим образом: Медсестра на входе измеряет температуру, вручную записывает в журнал данные сотрудника. Полное отсутствие автоматизации.
Проект-предложение по некоторой автоматизации данного процесса.
Вход сотрудников по 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;
?>
Источник: https://cxem.net/arduino/arduino255.php
🔗 Бесконтактный контроль температуры при RFID-доступе сотрудников с отправкой данных в облако LORAWAN