Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Surveillance SMART de la température pour les écoles

Composants et fournitures

Pycom SiPy
× 1
Raspberry Pi 3 Modèle B
× 1
Arduino Nano R3
× 1
Convertisseur de niveau logique SparkFun - Bidirectionnel
× 1
NFC RFID-RC522
× 1
Sharp GP2Y0A41SK0F (4cm - 30cm) - Capteur de distance analogique
× 1
MLX90614-DCI I2C - Capteur de température
× 1
Module d'affichage LCD Arduino DFRobot I2C 16x2
× 1
LED (générique)
× 1
Résistance 330 ohm
× 2
Sonnerie
× 1

Applications et services en ligne

Arduino IDE
Code Visual Studio (Pymakr)
API ThingSpeak
IFTTT
Mastic
IDLE IDE

À propos de ce projet

ÉNONCÉ DU PROBLÈME

En Asie, en raison du temps chaud et de l'épidémie de syndrome respiratoire aigu sévère (SRAS) en 2003, les élèves du primaire et du secondaire doivent effectuer des mesures de température chaque trimestre pour assurer le bien-être des élèves. Chaque fois qu'un exercice de prise de température est prévu par l'école, les élèves doivent apporter leur propre thermomètre numérique pour cet exercice. Cependant, certains étudiants peuvent ne pas être en mesure de participer pendant l'exercice pour des raisons telles qu'un thermomètre égaré ou endommagé et oublient d'apporter l'appareil. Pour des raisons d'hygiène personnelle, les étudiants ne sont pas autorisés à partager leurs thermomètres et ils pourraient ne pas avoir suffisamment d'argent pour acheter une nouvelle pièce. Par conséquent, cela affecte le taux de réussite de l'exercice de prise de température. Après l'exercice de mesure de la température, le personnel devra saisir manuellement toutes les données de température des étudiants et les étudiants particuliers à la base de données. La tâche est très fastidieuse et prend beaucoup de temps car chaque enseignant devra effectuer des saisies pour environ 40 élèves.

Quelle est la solution ?

Le thème de notre projet est l'impact social par SqwidNet, et dans le domaine de la bonne santé et du bien-être dans l'objectif de développement durable (ODD). La raison en est que notre système est capable de se déployer pour mesurer automatiquement la température des utilisateurs valides afin que leur température puisse être surveillée et qu'une alerte soit envoyée chaque fois qu'elle dépasse un certain niveau de seuil.

COMMENT ÇA FONCTIONNE :RaspberryPi et Arduino

Le RaspberryPi contient un programme Python et la base de données MySQL.

Au lancement du programme Python, il vérifie automatiquement si la base de données est déjà créée, sinon, elle sera créée automatiquement. Les tables à l'intérieur seront également vérifiées et créées automatiquement si nécessaire. Cela réduit le travail manuel des enseignants/du personnel administratif de l'école.

Ensuite, il établit une connexion de requête pour vérifier la base de données et attend que l'Arduino envoie les informations pertinentes via le port de communication série.

Après avoir tapé une carte RFID sur l'Arduino, les informations de la carte sont stockées dans l'Arduino, envoyées au RaspberryPi via la communication série. Ensuite, RaspberryPi confirme avec la base de données que ladite carte est un utilisateur valide, et si c'est le cas, elle l'envoie à l'Arduino pour la confirmer et l'Arduino affiche "Bienvenue, nom" sur l'écran LCD. S'il ne s'agit pas d'un utilisateur valide, il dira simplement "Erreur ! Utilisateur non valide !".

Disons que maintenant, nous avons un utilisateur valide qui vient d'appuyer. Ensuite, l'Arduino demandera à l'utilisateur de prendre sa température. Un capteur de distance détectera alors si un utilisateur est prêt à prendre sa température. S'ils le sont, il prendra leur température et affichera leur température sur l'écran LCD. S'il s'agit d'une température valide (28*C - 42*C), cette information sera envoyée à la fois au RaspberryPi (MySQL) et au Sigfox (ThingSpeak) pour le stockage des données. La base de données MySQL stockerait l'ID utilisateur, la date, l'horodatage et la température de chaque prise.

Lors de la réception des données de température de l'Arduino, le RaspberryPi vérifierait en permanence si la température est correctement fournie avant de procéder à autre chose. En effet, si le programme Python ne vérifie qu'une seule fois les données de température, il se peut qu'elles n'aient pas encore été envoyées par l'Arduino, car les deux codes s'exécutent à des moments différents. Donc, pour synchroniser, nous vérifions constamment les données de température sur le code Python avant de poursuivre le reste du programme.

REMARQUE : Le code Python et le code Arduino du RaspberryPi utilisent une méthode de synchronisation appelée Handshaking. Si le RaspberryPi n'est pas prêt à recevoir d'autres informations de température/utilisateur, l'Arduino ne permettrait pas à l'utilisateur d'appuyer sur la carte, vice versa .

Un moyen simple que j'ai fait est d'envoyer constamment un signal "PRÊT" jusqu'à ce que l'autre partie renvoie un signal "RECEPTION" afin qu'ils sachent qu'ils sont tous les deux prêts.

Arduino -

booléen readySignal =Serial.readString() =="READY" ;


if(readySignal)
{

appuyé =true ;

Serial.println("RECEIVED");

}

Python -

while(readySignal ==True) :

ser.write(b'' + "READY")



receiveSignal =ser.readline().strip() =="RECEIVED"


if(receivedSignal ==True):

readySignal =False

N'oubliez pas de fermer votre connexion de requête chaque fois que vous avez terminé une requête ! C'est pour éliminer toute fuite de mémoire possible et c'est une bonne pratique dans l'ensemble.

COMMENT ÇA FONCTIONNE :Sigfox (SiPy)

Après avoir reçu les données de température de l'Arduino, le SiPy séparera l'ID utilisateur et la température en nombres entiers et en décimales. Après cela, toutes les données sont envoyées au backend Sigfox via des octets (afin qu'elles puissent être envoyées à Ubidots ainsi qu'à ThingSpeak) et devraient ressembler à l'image suivante.

Après avoir reçu cela, le backend Sigfox recodera ces données à envoyer à ThingSpeak pour être stockées. Ce qui suit vous montrera comment coder le backend pour envoyer des données à Thingspeak.

Dans le backend Sigfox sous type d'appareil > Nom de l'appareil > RAPPELS, vous devrez saisir la charge utile personnalisée exactement telle qu'elle est est à moins que vous n'ayez modifié le codage dans le SiPy car la charge utile personnalisée définira ce qui est reçu en premier comme userID, donc par exemple si vous envoyez la température en premier, sur le backend, il convertira cette température en userID au lieu de température. Dans le corps, la clé d'écriture de l'API doit être placée en haut, tandis que les champs peuvent être placés avec l'une des données personnalisées que vous avez créées dans la charge utile personnalisée.

COMMENT ÇA FONCTIONNE :Le Cloud

Une fois les données envoyées avec succès à ThingSpeak, il les reçoit d'abord dans un canal de visualisation privé où un script d'analyse MATLAB analyse les données et combine les données de température en une seule valeur au lieu de la séparation d'une valeur entière et d'une valeur décimale.

Le code de la table a été extrait d'un projet open source et modifié pour répondre à nos besoins. C'est très utile car la table se met à jour automatiquement à chaque fois qu'une nouvelle donnée est envoyée, ce qui est parfait pour notre utilisation.

Dans le même temps, il vérifie si la température est à un niveau dangereux (fièvre), si c'est le cas, un email sera envoyé pour avertir les personnels/enseignants.

En résumé, le premier canal dont la valeur de température est séparée en nombre entier et en nombre décimal est un canal principal, pas vraiment pour la visualisation. Pour le deuxième canal, les valeurs de température ont été combinées et rendues agréables à visualiser pour le personnel/la direction/les administrateurs et dispose d'un tableau de type Excel pour une analyse facile des données.

1. Configuration des connexions Arduino Nano

Pour l'Arduino Nano, voici les connexions que nous avons faites avec nos modules.

Nano et Uno ont le même brochage.

RFID - RC522

SDA D10
SCK D13
MOSI D11
MISO D12
IRQ UNCONNECTED
GND GND
RST D9
3.3V 3.3V

Comment tester la RFID

LCD

SDA A4
SCL A5
GND GND
5V 5V

Comment tester l'écran LCD I2C

Capteur de Distance

5V 5V
GND GND
Entrée A0

Comment tester le capteur de distance IR Sharp

Buzzer

GND GND
Sortie D6

Comment tester le buzzer

Capteur de température IR

SDA A4
SCL A5
GND GND
5V 5V

Comment tester le capteur de température IR,

LED

Côté plat (cathode) GND
Côté non plat (anode) D7

Bien ! Pour les connexions Arduino, vous devriez être prêt à partir maintenant.

2. Configuration du RaspberryPi

Il y a principalement deux choses qui doivent être installées sur votre machine Raspberry Pi 3,

1. Fonctionnement de Raspbian Système -

L'installation du système d'exploitation Raspbian est considérée comme assez simple.

Une réponse courte sur la façon de procéder serait de flasher (écrire) un fichier image sur une carte SD et d'insérer cette carte SD dans le Raspberry Pi 3.

Cependant, si vous recherchez un didacticiel de réponse détaillée étape par étape, voici comment procéder -

Tout d'abord, vous devez télécharger un logiciel qui vous permet de stocker des fichiers flash.img sur un lecteur de stockage. Vous pouvez utiliser le logiciel appelé balenaEtcher.

Ensuite, rendez-vous sur la page Raspberry Pi - Raspbian et choisissez celui qui correspond à vos besoins. J'ai choisi le "Raspbian Buster avec Desktop et le logiciel recommandé" car, comme son nom l'indique, il est livré avec un logiciel recommandé et cela vous évite les tracas supplémentaires de téléchargement de logiciels.

Une fois que vous avez terminé avec les étapes susmentionnées, lancez simplement le logiciel balenaEtcher. Cette étape est assez explicite :sélectionnez l'image (votre fichier.img Raspbian), puis sélectionnez votre carte SD et appuyez sur flash. Maintenant, vous n'avez plus qu'à attendre. Une fois cela fait, il devrait vous y inviter et vous pouvez maintenant insérer la carte SD nouvellement flashée dans votre Raspberry Pi.

Ensuite, connectez votre machine Raspberry Pi via HDMI à un moniteur et effectuez votre configuration initiale. Enfin, rendez-vous dans Préférences -> Configuration Raspberry Pi et vous devriez être sur ce menu -

Suivez les options, cette étape active des interfaces comme SSH, VNC qui vous permettent de vous connecter aux adresses IP via eth0 ou wlan0 (vous n'avez donc plus besoin du câble HDMI, vous pouvez tout faire via SSH).

(étape facultative) - j'ouvre le terminal et édite le fichier dhcpcd.conf (sudo nano /etc/dhcpcd.conf) et j'ajoute ces lignes de commandes,

interface eth0
adresse_ip statique=192.168.0.11/24

Ce qui précède me permet de me connecter au Raspberry Pi via un câble Ethernet avec l'adresse statique 192.168.0.11, donc je sais à chaque fois que c'est l'adresse de mon Raspberry Pi.

Il s'agit d'une étape optionnelle car, une fois connecté au WiFi, vous obtiendrez une adresse IP wlan0 qui vous permettra de vous connecter au Raspberry Pi sans câble Ethernet et n'importe où dans l'emplacement tant que vous êtes connecté au même Wifi. Pour voir quelle est votre ADRESSE IP wlan0, passez simplement votre souris sur le symbole WiFI situé en haut à droite et cela l'indiquera.

Bien ! Vous avez terminé la configuration initiale de votre Raspberry Pi !

3. Configuration de la base de données MySQL

Je considérerais cette étape un peu difficile, en particulier la partie où vous devez configurer l'utilisateur root MySQL, suivez-la attentivement car il est très difficile de rectifier les erreurs.

Tout d'abord, vous devez vous assurer que votre système est mis à niveau et mis à jour avec le dernier firmware. Vous pouvez vous en assurer en entrant ces commandes,

mise à jour sudo apt
mise à jour sudo apt

Une fois cela fait, vous installerez apache2.

sudo apt install apache2 

Apache2 vous permettra de créer un serveur Web afin que vous puissiez accéder aux sites Web que vous créez plus tard.

Une fois apache2 installé, vous devez installer PHP.

sudo apt install php php-mbstring 

PHP vous permettra de créer et de voir vos propres sites Web PHP.

Arrêtons-nous et voyons si tout ce que vous venez d'installer fonctionne, tapez simplement l'adresse IP de votre Raspberry Pi dans votre navigateur Web ou "localhost" si vous êtes toujours connecté via HDMI, et vous devriez voir une page d'index Apache.

Maintenant, vous devez installer la base de données. Pour cela, vous utiliserez MySQL et mariadb.

sudo apt install mariadb-server php-mysql 

IMPORTANT - Veuillez vous assurer de lire très attentivement ce qui est ci-dessous.

Maintenant, vous allez créer votre utilisateur root MySQL afin que vous puissiez l'utiliser pour accéder à la base de données.

sudo mysql --user=root 

Vous allez maintenant entrer dans une session MySQL où vous pouvez taper des codes MySQL, tapez-les ligne par ligne, (Vous pouvez remplacer le mot de passe par votre propre mot de passe)

SUPPRIMER L'UTILISATEUR 'root'@'localhost' ;
CRÉER L'UTILISATEUR 'root'@'localhost' IDENTIFIÉ PAR 'password' ;
ATTRIBUER TOUS LES PRIVILÈGES SUR *.* À 'root' @'localhost' AVEC OPTION GRANT ;
PRIVILÈGES DE FLUSH ;
exit ;

Vous pouvez maintenant tester votre utilisateur root MySQL en vous connectant ;

mysql --user=root --password=yourmysqlpassword 

Si tout fonctionne, vous pouvez maintenant installer PHPMyAdmin, le panneau de configuration de l'administrateur pour accéder (afficher) et modifier la base de données MySQL.

sudo apt install phpmyadmin

(après l'installation)
sudo phpenmod mysqli
sudo /etc/init.d/apache2 restart

Félicitations ! Vous pouvez maintenant accéder à votre nouvelle base de données en utilisant http://your_raspberrypi_ip_address/phpmyadmin.

4. Guide d'installation et du logiciel de la carte d'extension SiPy 2.0

Tout d'abord, vous devrez insérer le module SiPy sur la carte d'extension avec le bouton de réinitialisation face au connecteur USB et devez fermement cliquer en place avec les broches ne sont plus visibles.

Source : Documentation Pycom

Après cela, vous devrez mettre à jour le micrologiciel sur le SiPy, afin de pouvoir télécharger et exécuter des programmes ainsi que d'obtenir l'ID de périphérique Sigfox et le numéro PAC qui seront utilisés pour vous inscrire au backend Sigfox. Téléchargez le programme de mise à jour du micrologiciel en fonction du système d'exploitation (système d'exploitation) que vous utilisez.

  • Windows
  • macOS (10.11 ou supérieur)
  • Linux (nécessite dialogue et python-serial paquet)

Après avoir téléchargé la mise à niveau du micrologiciel pycom, lorsque vous démarrez le programme de mise à jour pour la première fois, les images suivantes ne se produisent qu'une seule fois alors assurez-vous de sélectionner la bonne région Sigfox, carte.

Suivez attentivement les instructions de la mise à jour du micrologiciel car cela peut empêcher votre Sigfox de fonctionner correctement, comme l'ID de l'appareil Sigfox et le numéro PAC étant tous "F" (comme ci-dessous) au lieu d'un mélange de chiffres et d'alphabets.

b 'FFFFFFFF'
b 'FFFFFFFFFFFFFFFF'

Une fois le firmware mis à jour, vous devrez télécharger Visual Studio Code et installer l'extension Pymkr ainsi que nodejs avant de pouvoir commencer à télécharger et exécuter des programmes sur le SiPy.

Tout d'abord, vous devrez créer un nouveau dossier pour enregistrer tous les fichiers que vous allez télécharger dans le SiPy plus tard ou simplement pour stocker tous les programmes que vous allez exécuter. Appuyez sur fichier dans le coin supérieur gauche et appuyez sur Ouvrir le dossier ou Ctrl+K+O, puis sélectionnez où vous voulez mettre ce dossier et faites un clic droit pour créer un nouveau dossier. Après cela, créez un nouveau fichier ou Ctrl+N pour ouvrir un nouveau fichier. Après avoir créé un nouveau fichier, vous devrez enregistrer le nouveau fichier au format python et modifier le type d'enregistrement en fichier python afin que le code puisse être exécuté ultérieurement sur le SiPy et l'enregistrer dans le nouveau dossier que vous avez créé.

Remarque : Le nom du fichier peut être n'importe quoi comme Test, Trial, Etc. Mais si le téléchargement dans le fichier SiPy doit être appelé main .

Pour simplement exécuter votre code sans le télécharger dans le module Sipy, il vous suffit d'appuyer sur le bouton d'exécution situé en bas du programme. Le téléchargement à côté télécharge le dossier actuel sur le module SiPy. Soyez prudent lorsque vous utilisez des boucles while 1 car une fois celles-ci téléchargées dans le module SiPy, le seul moyen d'accéder à nouveau au module SiPy est de FTP dans le flash et de supprimer le fichier main.py du SiPy Module.

Si vous avez accidentellement ajouté une boucle while infinie, ne vous inquiétez pas car vous pouvez toujours télécharger votre programme ou supprimer le précédent via FTP. Tout d'abord, téléchargez la version gratuite de filezilla et installez-la.

Après l'installation, vous devrez configurer la connexion. Tout d'abord, ouvrez filezilla et accédez au gestionnaire de site qui se trouve sous fichier ou appuyez sur Ctrl+S et appuyez sur nouveau site.

Vous pouvez renommer le site en SiPy ou comme vous voulez appeler cette connexion et modifier les paramètres de cryptage en N'utiliser que le FTP simple (non sécurisé) et transférez les paramètres en passif et limitez le nombre de connexions actives à 1

Vous pouvez trouver l'hôte (adresse), l'utilisateur et le mot de passe via Visual Studio Code en appuyant sur toutes les commandes et en sélectionnant le paramètre global. Cela vous montrera les paramètres par défaut pour l'hôte (adresse), l'utilisateur (nom d'utilisateur) et le mot de passe. Cela peut être modifié en appuyant sur les paramètres du projet dans toutes les commandes.

Ensuite, vous aurez besoin de connaître le SSID du module SiPy qui peut être trouvé en utilisant toutes les commandes et en appuyant sur get WiFI AP SSID. Chaque SSID du module SiPy sera unique mais le mot de passe est le même partout et ne peut pas être modifié. Le mot de passe du SSID du module SiPy est www.pycom.io

Remarque : Les utilisateurs de bureau devront se procurer un adaptateur WiFi

Vous pouvez maintenant commencer à utiliser filezilla pour accéder à SiPy Flash ! Connectez-vous d'abord au SSID SiPy, puis accédez au gestionnaire de site filezilla et connectez-vous au nouveau site que vous avez créé et saisissez le mot de passe. Ouvrez maintenant le dossier flash et supprimez main.py UNIQUEMENT ! Après avoir supprimé le main.py, redémarrez le SiPy et vous pouvez commencer à exécuter/télécharger vos programmes.

Remarque : Vous voudrez peut-être copier le dossier flash sur votre système d'exploitation (système d'exploitation) au cas où vous supprimeriez tout.

5. Inscription avec Sigfox Backend

Après avoir installé Visual Studio Code, connectez la carte d'extension pycom à l'ordinateur et elle détectera automatiquement la connexion lorsque vous ouvrirez Visual Studio Code. Copiez le code ci-dessous et collez-le dans le terminal ou dans un fichier et exécutez-le. L'une ou l'autre méthode fera l'affaire.

depuis le réseau importer Sigfox
importer binascii

# initialiser Sigfox pour RCZ* (vous aurez peut-être besoin d'une autre région RCZ)
sigfox =Sigfox(mode=Sigfox .SIGFOX, rcz=Sigfox.RCZ*)

# print ID de l'appareil Sigfox
print(binascii.hexlify(sigfox.id()))

# print Numéro PAC Sigfox
print(binascii.hexlify(sigfox.pac())))

Remarque :Remplacez * par votre numéro de région RCZ.

Méthode de terminal pour obtenir l'ID de l'appareil Sigfox et le numéro PAC

Pour afficher le terminal dans Visual Studio Code, appuyez sur Ctrl+~. Collez ensuite le code à l'intérieur et il apparaîtra comme l'image suivante.

Méthode de fichier pour obtenir l'ID de l'appareil Sigfox et le numéro PAC

Une fois que le nouveau fichier est enregistré en appuyant sur Ctrl+S ou en allant dans fichier puis enregistrez, collez le code dans le fichier et enregistrez le fichier puis vous pouvez exécuter le fichier en appuyant sur le bouton Exécuter en bas de l'écran et devrait ressembler à l'image ci-dessous.

Après avoir obtenu votre identifiant de périphérique Sigfox et votre numéro PAC, vous devrez enregistrer votre Sigfox dans le backend Sigfox avant de pouvoir commencer à lui transmettre. La première page que vous verrez indiquera où est basée votre entreprise sigfox. Vous devez choisir le pays dans lequel cet appareil Sigfox sera utilisé car chacune des zones Sigfox est configurée différemment.

Après avoir choisi le bon pays, la page suivante vous demandera votre ID d'appareil Sigfox et le numéro PAC que vous avez obtenus au début de ce chapitre. Collez-les dans le champ approprié et la page devrait ressembler à l'image. Pour le reste, remplissez en conséquence.

Après avoir rempli la page de l'appareil, créer un compte Sigfox ou vous être connecté à un compte Sigfox existant, vous devez enregistrer le Sigfox sur votre compte. Si vous créez un nouveau compte Sigfox, Sigfox vous enverra un e-mail à l'adresse e-mail enregistrée pour configurer le mot de passe.

Après avoir configuré votre compte backend sigfox, vous pouvez exécuter ce code pour envoyer des données pour voir si le backend peut les recevoir.

Remarque** : Connectez d'abord votre antenne sigfox avant d'exécuter un programme sigfox.

depuis le réseau import Sigfox
import socket

# initialiser Sigfox pour RCZ* (Vous aurez peut-être besoin d'une autre région RCZ)
sigfox =Sigfox(mode=Sigfox .SIGFOX, rcz=Sigfox.RCZ*)

# crée un socket Sigfox
s =socket.socket(socket.AF_SIGFOX, socket.SOCK_RAW)

# faire le blocage du socket
s.setblocking(True)

# le configurer comme liaison montante uniquement
s.setsockopt(socket.SOL_SIGFOX, socket.SO_RX, False)

# envoyer quelques octets
s.send(octets([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]))

Remarque :Remplacez * par votre numéro de région RCZ.

6. Configuration du Cloud

Tout d'abord, vous devrez configurer l'IFTTT pour l'envoi par courrier électronique, accéder au site Web IFTTT et créer un compte. Après avoir configuré le compte et vous être connecté, accédez à votre profil qui se trouve près du coin supérieur droit de l'écran sur le côté gauche de « Explorer » et appuyez sur Créer .

Click "This " and then search for Webhooks and press it. If you are unsure, the following pictures will help you with what to do.

After selecting Webhooks, press the Receive a web request box and enter an event name to fit your requirements (in this example fever is used), afterwards press Create trigger .

Press the word "That ", type email in the search box and press Email then press Send me an email box

Enter message information. You can pass data about the event that triggered your message by using ingredients. For example, including {{Event Name}} adds the event name to your text message. The Body section must include at least {{Value1}} and {{Value2}}. Click Create action to finish the new applet. Note:Value 1, value 2 and value 3 in body message are derived from MATLAB Analysis and can be modified according to your requirement

ThingSpeak is an IOT (Internet of Things) platform which can be easily setup, learned and is open source.

First, we create two channels; (SIGFOX) TEMPERATURE PRIVATE VIEWING &(SIGFOX) TEMPERATURE PUBLIC VIEWING.

For the (SIGFOX) TEMPERATURE PRIVATE VIEWING , its purpose is to obtain data from the Sigfox backend. Sigfox sends up using bytes, this is because, we have realised that Ubidots (a web service) do not really work well with decoding Strings, so to make it work and accessible with both ThingSpeak and Ubidots, we chose to use bytes as it contain numbers from 0-255.

Therefore, using bytes makes it so we have to send both the whole number and the decimal number of the temperature information separately. So, this channel is mainly for keeping these messy values, later transferring to another channel for viewing which is the (SIGFOX) TEMPERATURE PUBLIC VIEWING channel.

We use MATLAB Analysis to convert the two messy values (whole number &decimal number) into just one combined value and transfer it onto the other channel. At the same time, we also transfer the userID onto the (SIGFOX) TEMPERATURE PUBLIC VIEWING as it's used for viewing. The MATLAB script is triggered on data insertion using a ThingSpeak REACT which will be explained below.

To setup the react, first go to Apps and then select React which will open the reacts tab. Press New React to create a new react for the MATLAB Analysis to be triggered when new data arrives from the Sigfox backend. Set the condition type to string, test frequency to on data insertion, condition to field 3 (which should be your userid) of the (SIGFOX) TEMPERATURE PRIVATE VIEWING when its not equal to 0, action to MATLAB Analysis with the code for calculating the temperature and Options to Run Action only the first time condition is met.

The table code was taken from an open sourced project and modified to suit our needs. It's very useful as the table auto updates every time a new data is sent in, perfect for our usage.

Unfortunately, the MATLAB plugin for the table is only view-able in private view and not in the public view. As it's intended for administrative purposes only, we do not subject this as an issue, it's intended to be only viewed in private view.

To retrieve Webhooks information, Click on your profile logo near the top right corner of the screen on the left of the “Explore” tab. Select My Services, select Webhooks then click documentation near the top right of the web page, from there you can see your key and format for sending a request. Enter that event name. The event name for this project is fever

https://maker.ifttt.com/trigger/{event}/with/key/(example)

https://maker.ifttt.com/trigger/fever/with/key/(example)

The service can be tested to see if it works or not by pasting the URL(example of the URL are shown above) into your browser or pressing the test button upon creation of the webhooks and email applet

After all that is done, you should be able to receive an email like the following picture, after you have finished setting up the ThingSpeak React.

Contributions

Aden - RaspberryPi + Arduino + its modules + ThingSpeak (MATLAB+ Setup)

Reginald - Sigfox + ThingSpeak Data Collection + Schematics

Bo Sheng - IFTTT Setup

Code

  • [C] ARDUINO NANO
  • [PYTHON] RaspberryPi
  • [MicroPython] Sigfox (Pycom)
  • [ThingSpeak] MATLAB SCRIPT
[C] ARDUINO NANOArduino
This code is used for checking if there's a RFID card tap, if there is, there will be temperature taking and also handshaking between the Raspberry Pi to send data over like the card's ID, temperature and ready/standby signal and more.

It also uses LCD to show informative information.

If you're interested in knowing more, please read the section on "HOW IT WORKS:RaspberryPi &Arduino"
/*90% is coded from scratch by Aden,http://www.astero.methe other 10% consists of open sourced libraries(Credits found below) used, like the RFID &temperature module.*//* * Initial Author:ryand1011 (https://github.com/ryand1011) * * Reads data written by a program such as "rfid_write_personal_data.ino" * * See:https://github.com/miguelbalboa/rfid/tree/master/examples/rfid_write_personal_data * * Uses MIFARE RFID card using RFID-RC522 reader * Uses MFRC522 - Library * ----------------------------------------------------------------------------------------- * MFRC522 Arduino Arduino Arduino Arduino Arduino * Reader/PCD Uno/101 Mega Nano v3 Leonardo/Micro Pro Micro * Signal Pin Pin Pin Pin Pin Pin * ----------------------------------------------------------------------------------------- * RST/Reset RST 9 5 D9 RESET/ICSP-5 RST * SPI SS SDA(SS) 10 53 D10 10 10 * SPI MOSI MOSI 11 / ICSP-4 51 D11 ICSP-4 16 * SPI MISO MISO 12 / ICSP-1 50 D12 ICSP-1 14 * SPI SCK SCK 13 / ICSP-3 52 D13 ICSP-3 15*//***************** This is a library example for the MLX90614 Temp Sensor Designed specifically to work with the MLX90614 sensors in the adafruit shop ----> https://www.adafruit.com/products/1748 ----> https://www.adafruit.com/products/1749 These sensors use I2C to communicate, 2 pins are required to interface Adafruit invests time and resources providing this open source code, please support Adafruit and open-source hardware by purchasing products from Adafruit! Écrit par Limor Fried/Ladyada pour Adafruit Industries. BSD license, all text above must be included in any redistribution ******************/ // INCLUDE NECESSARY HEADER FILES #include #include #include #include #include #include // DEFINITION OF PINS#define RST_PIN 9 // Configurable, see typical pin layout above#define SS_PIN 10 // Configurable, see typical pin layout above#define BUZZER_PIN 7 //Pin define for Buzzer#define LED_PIN 6 //Pin define for LED #define dist_sensePin A0MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.LiquidCrystal_I2C lcd(0x27,16,2); // Calls the LiquidCrystal class and creats an instance for the LCD.// set the LCD address to 0x27 with 16 chars and 2 line displayAdafruit_MLX90614 mlx =Adafruit_MLX90614(); // Calls the Adafruit MLX90614 instance.SoftwareSerial unoSerial(2, 3); // RX, TX // Calls the SoftwareSerial instance (for Pycom communication)// GLOBAL VARIABLESboolean tapped =true; boolean confirmation =false;String GetUID(){ String card_UID=""; String card_UID_no_space =""; for (byte i =0; i  200)) // Check if there is actually a valid user infront of the machine. If no, it'll keep looping what's under. { dist_senseValue =analogRead(dist_sensePin); // Keep checking until there's a person that comes in the distance sensor's range. lcd.setCursor(0,0); lcd.print("Please take"); lcd.setCursor(0,1) ; lcd.print("your temperature."); // Prompt the user to take their temperature by standing infront of the machine. } digitalWrite(BUZZER_PIN, 1); digitalWrite(LED_PIN, 1); lcd.clear(); // Turns on the Buzzer and LED, at the same time, clear the LCD too. meas_temp =(float)mlx.readObjectTempC(); temp_Hbyte =floor(meas_temp); temp_Lbyte =(meas_temp - temp_Hbyte) * 100; sMeasTemp +=userID; sMeasTemp +=","; sMeasTemp +=temp_Hbyte; sMeasTemp +=","; sMeasTemp +=temp_Lbyte; // Collect the temperature data that is taken. Serial.println("TEMP"); Serial.println(meas_temp); // Transfer the temperature data through Serial Communication to the RaspberryPi. if((meas_temp>
=28) &&(meas_temp <=42)) // Check if it's a valid temperature. unoSerial.print(sMeasTemp); // If it is, send to the sigfox module for cloud storage. lcd.setCursor(0,0); lcd.print("Temperature:"); lcd.setCursor(0,1) ; lcd.print(" " + String(meas_temp)); // Shows the temperature of the user through the LCD screen. } else // If it's an invalid user, { lcd.setCursor(0,0); lcd.print("Error!"); lcd.setCursor(0,1) ; lcd.print("Invalid User."); // Tells the user that he's not a valid user and he is unable to proceed to the temperature taking phase. } rawData =Serial.readString(); commaPos =rawData.indexOf(','); userInitial =rawData.substring(0, commaPos); // Above reads the incoming rawData again and converts into a userInitial variable. if(userInitial =="0") // If the user initial sent back is 0, it means that it's an invalid temperature because the RaspberryPi is unable to process it. { lcd.clear(); lcd.setCursor(0,0); lcd.print("Error!"); lcd.setCursor(0,1) ; lcd.print("Invalid Temperature."); // Prompts the user it's an invalid temperature range. } Serial.println("STANDBY"); // Sends Serial that the Arduino is still processing data. retard(1000); // Delay for 1 second. mfrc522.PICC_HaltA(); mfrc522.PCD_StopCrypto1(); } }
[PYTHON] RaspberryPiPython
This code is mainly used for updating the MySQL database and also to handshake with the Arduino via Serial Communication. It plays a vital role with the Arduino in this project

If you're interested in knowing more, please read the section on "HOW IT WORKS:RaspberryPi &Arduino".
'''Coded from scratch by Aden; for the Hackster.io Sigfox competition.http://www.astero.me'''# IMPORTSimport mysql.connectorimport serialimport osimport time# METHODSdef queryConnection():cursor =conn.cursor(buffered=True) cursor.execute("USE `" + databaseName + "`") # Use the userInfo database, return cursor # DATABASE INFORMATIONhost ="localhost"user ="root"password ="password"databaseName ="smartTemp"conn =mysql.connector.connect(host=host, user=user,passwd=password)# Serial CommunicationcomPort ='ttyUSB0'baudRate =9600ser =serial.Serial('/dev/' + comPort, baudRate, timeout=0) # Set the timeout as 0 so if it doesn't read a serial, it skips.print("Confirming USB Serial Port now, please wait") connected =False# Below, is to ensure that the RaPi receives the correct COM port of the Arduino board.for x in range(2):time.sleep(2) ser.write("RAPI") # Basically, here, we're writing to the Arduino to confirm communication. if connected ==False:serialConfirmation =ser.readline().strip() =="ARDUINO" # Check if the RaPi is reading the correct COM port, whether it can read the Arduino's serial communications. print(serialConfirmation) if(serialConfirmation ==False):comPort ='ttyUSB1' connected =True else:comPort ='ttyUSB0' connected =True print(comPort) ser =serial.Serial('/dev/' + comPort, baudRate) # Re-initiates this variable again, this time without a Serial Communication timeout. Meaning, it'll try to communicate with the Arduino w/o a timeout. print("COM PORT confirmed, using " + comPort) # Print to let you know which PORT the Arduino is on.# File CreationcountFile =open("count.txt", "a++") # Creates a count file if it doesn't exist.# GLOBAL VARIABLEStapRFID =Falsecursor =queryConnection()if(os.stat("count.txt").st_size ==0):# Checks if the count.txt is empty. print("Count has not been set, setting to 1 now.") count =1else:for countNumber in countFile:count =int(countNumber) # Set the count to the last counted count. print("Count has been restored from previous session:" + str(count)) try:# Tries to create the database if it doesn't already exists. print("Creating " + databaseName + " database now..") cursor.execute("CREATE DATABASE " + databaseName) # Create a database. print("Database has been sucessfully created.") except(mysql.connector.errors.DatabaseError):# If the database already exists, it excepts here. print(databaseName + " database is already created.") # If that database is found, run this block of code instead.cursor.execute("CREATE TABLE IF NOT EXISTS `userInfo` (id int, cardID VARCHAR(9), userID VARCHAR(4), userInitial VARCHAR(8))") # Create a userInfo table if it doesn't exist.cursor.execute("CREATE TABLE IF NOT EXISTS `tempData` (id int, userID VARCHAR(4), dateMeas date, timeMeas time, tempMeasure decimal(5,2))") # Create a tempData table if it doesn't exist.while True:# Endless loop. cursor =queryConnection() # Re-establishes the query connection using the queryConnection() method. cardID =str(ser.readline().strip()) # Reads the serial line and converts it to a String, stripping any empty spaces. cursor.execute("SELECT * FROM userInfo WHERE cardID ='" + cardID + "'") # Select the userInfo table with the inputted cardID from the Arduino. items =cursor.fetchone() # Fetch one line of the table. if(items !=None):# If it's able to fetch (valid user) print(cardID) # Print out the cardID that it's currently fetching. userID =str(items[2]) # Gets the userID from the fetched line. userDetails =str(items[3] + ", " + items[2]) # Get the userDetails from the fetched line. # Get the currentDate ¤tTime. currentDate =str(time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime()))[0:10] currentTime =str(time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime()))[11:] print(items) # Print the whole item array that was fetched. (for debugging) ser.write(b'' + userDetails) # Serial communication to the Arudino. countFile.close() # Closes the count file. countFile =open("count.txt", 'w') # Makes it so it overwrites the count file with the new saved count below. tempSignal =False while(tempSignal ==False):# Keeps looping until it gets the temperature reading from the Arduino. print("Getting Temperature") tempSignal =ser.readline().strip() =="TEMP" # Read the Arudino incoming serial. tempData =float(ser.readline().strip()) # Read the Arduino incoming serial of the temperature data. print(tempData) # Prints the retrieved temperature data from the Arduino. if(tempData>=28 and tempData <=42):# Check if the temperature is of a valid range. cursor.execute("INSERT INTO `tempData`(`id`, `userID`, `dateMeas`, `timeMeas`, `tempMeasure`) VALUES (" + str(count) + ",'" + userID + "','" + currentDate + "','" + currentTime + "','" + str(tempData) + "')") # Write into the database the necessary information. conn.commit() # Commit the INSERT changes into the database. count =count + 1 # Ups the count. countFile.write(str(count)) # Update the count file with the new count. else:# If it's not a valid temperature. ser.write(b'' + "0, 0") # Serial Communication to the Arduino informing that it's invalid temperature. else:# If it's not a valid user. ser.write(b'' + ", 0") # Serial Communication to the Arduino informing that no valid cardID is found. print("Nothing found") readySignal =ser.readline().strip() =="STANDBY" # Waits for the Arduino to tell that it's ready to do it again, to read/validate data. while(readySignal ==True):# If the Arduino is ready, loop until we're able to tell him back that we're also ready for another session. ser.write(b'' + "READY") # Serial communication basically to say we're ready too. print("sending") receivedSignal =ser.readline().strip() =="RECEIVED" if(receivedSignal ==True):readySignal =False print("received") cursor.close() # Close the query connection to prevent memory leaks. conn.close() # Closes the connection to the MySQL.
[MicroPython] Sigfox (Pycom)Python
This code is mainly used to read the serial communication from the Arduino and upload the received values to the Sigfox backend

If you're interested in knowing more, please read the section on "HOW IT WORKS:Sigfox (Pycom)"
'''100% is coded by Reginald,'''from machine import UART # Tx and Rx (``P3`` and ``P4``)from network import Sigfox # Import the sigfox library from the pycom controllerimport binascii # Import the Binary to ASCII library for converting from Binary (1,0) to ASCII (readable characters)import socket # Import socket module to enable socket connection for Sigfoximport time # Import time that can be used for delaysimport pycom # Import pycom module that contains fucntions that controls the pycom deviceimport sys # Import sys module to enable exit from the pycom running programpycom.heartbeat(False)#init Sigfox for RCZ4 (Asia)sigfox =Sigfox(mode=Sigfox.SIGFOX,rcz=Sigfox.RCZ4)uart1 =UART(1, baudrate=9600) # To set the serial communcation parametersuart1.init(9600,bits=8,parity=None, stop=1, pins =('P3', 'P4'), timeout_chars=20) # To set the serial communcation parameterswhile True:try:recv=uart1.readline() # It always reads the serial communcation for any messages if recv !=None:'''If there is a message recieved from the serial communcation, it will procced to establish the sigfox connection and process the message for sending''' #print Sigfox DeviceID print(binascii.hexlify(sigfox.id())) # print Sigfox PAC number print(binascii.hexlify(sigfox.pac())) #create Sigfox socket sk1 =socket.socket(socket.AF_SIGFOX, socket.SOCK_RAW) #make thesocket blocking sk1.setblocking(False) #configure as uplink only sk1.setsockopt(socket.SOL_SIGFOX, socket.SO_RX, False) dataList =recv.decode("utf-8") #decode the received message print("dataList :%s" %(dataList)) split_val =dataList.split(",") #split the listing based on commas # eg. if receive message is 8,35,60 -> userID =8, temperature =35.60 degree celsius userID =int(split_val[0]) # assign the 1st element in the listing to userID. temp_H =int(split_val[1]) # assign the 2nd element in the listing to the whole number of the temperature. temp_L =int(split_val[2]) # assign the 3rd element in the listing to the decimal numner of the temperature. print("userID :%d temp_H :%d temp_L :%d" % (userID, temp_H, temp_L)) bData =[userID,temp_H,temp_L] # create a list print(bData) meas_temp =temp_H + (temp_L*0.01) # merge temperature values print("measure temperature :%.2f" %(meas_temp)) sk1.send(bytes(bData)) #cast the data list to bytes and send to Sigfox backend. sk1.close() #close Sigfox socket connection. time.sleep(5) #delay for 5 seconds. except KeyboardInterrupt:sys.exit() 
[ThingSpeak] MATLAB SCRIPTMATLAB
This script focuses on combining the raw data that is sent up by the Sigfox to ThingSpeak and put them together into a presentable visual state, allowing users to properly visualize the information. It also works alongside with IFTTT by triggering a webhook URL when it reaches a fever temperature, alerting user(s) via Email.

If you're interested in learning more about this code, please read the section on "HOW IT WORKS:ThingSpeak".
%% Made from scratch by Aden; for the Hackster.io Sigfox Competition.%% http://www.astero.mereadChannelID =870479; %% Channel to read.webhookTrigger ='https://maker.ifttt.com/trigger/student_fever/with/key/h10MdSGwjSPtZQ43wH-AgoiKI0pwaljBNnGUEu4Yecn';readAPIKey ='QGHINBPNJQKULBH2'; %% Channel read API Key.writeChannelID =870482; %% Channel to write.writeAPIKey ='R6NJIM8NT5A42R9N'; %% Channel write API Key.wholeNumber =thingSpeakRead(readChannelID, 'ReadKey', readAPIKey, 'Fields', 1); %% Read the value from field 1 and save it to a variable.decimalNumber =thingSpeakRead(readChannelID, 'ReadKey', readAPIKey, 'Fields', 2)/100;%% Read the value from field 2 and save it to a variable.userID =thingSpeakRead(readChannelID, 'ReadKey', readAPIKey, 'Fields', 3);%% Read the value from field 3 and save it to a variable.display(wholeNumber, 'BEFORE') %% Display value for debugging.analyzedData =wholeNumber + decimalNumber; %% Converting the two into one whole number instead of two separate values.display(analyzedData, 'AFTER')display(userID, 'USERID')%%thingSpeakWrite(writeChannelID, analyzedData, 'Fields', 1, 'WriteKey', writeAPIKey);thingSpeakWrite(writeChannelID,'Fields',[1,2],'Values',{analyzedData,userID},'WriteKey', writeAPIKey)if(analyzedData>=38) %% Check if fever temperature. webwrite(webhookTrigger,'value1',analyzedData,'value2',userID); %% If yes, trigger the webhook and send an email of the values.end

Schémas

How everything is connected together Connections for Distance Sensor for Arduino Connections for Temperature Sensor Connections for LED for Arduino Connections for RFID for Arduino Connections for LCD for Arduino Connections for Buzzer for Arduino

Processus de fabrication

  1. Surveillance de la température sur le Raspberry Pi
  2. Contrôle de la température avec Raspberry Pi
  3. DIY :surveillance et régulation de la température pour HomeBrew
  4. Surveillance du CO2 avec le capteur K30
  5. Stores intelligents
  6. Portail de surveillance de la température sans contact
  7. Arduino - Envoyer la température au Web via série
  8. Bande de santé - Un assistant intelligent pour les personnes âgées
  9. Smart Farming :une solution IoT complète pour la surveillance de l'agriculture