Реклама ⓘ
Главная » Arduino
Призовой фонд
на май 2024 г.

Реклама ⓘ

Бесконтактный контроль температуры при RFID-доступе сотрудников с отправкой данных в облако LORAWAN

В статье было рассмотрена отправка данных по сети 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;
?>

Прикрепленные файлы:

Теги:

Опубликована: Изменена: 10.08.2020 0 0
Я собрал 0 0
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (6) | Я собрал (0) | Подписаться

0
Публикатор #
На форуме автоматически создана тема для обсуждения статьи.
Ответить
0
Pauk #
Почему не компилируется? Выходит ошибка 'class LiquidCrystal_I2C' has no member named 'init'
Прикрепленный файл: src.png
Ответить
+1

[Автор]
victoruni #
Есть 2 библиотеки LiquidCrystal_I2C, в одной функция init(), в другой begin(). Сейчас в командировке, как появлюсь на работе, отправлю ссылку
Ответить
0
Pauk #
А как будет работать в этом случае родная библиотека Wire?
Ответить
+1

[Автор]
victoruni #
В программе поменяйте init на begin. Думаю, все будет нормально
Ответить
0
Pauk #
Изменил, компилирование завершилось успешно, благодарю!
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическая мощность?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Arduino UNO
Arduino UNO
Автомобильный GPS-трекер с GSM/GPRS и дистанционным управлением Мини гравер 125 Ватт
вверх