Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

SMART-Temperaturüberwachung für Schulen

Komponenten und Verbrauchsmaterialien

Pycom SiPy
× 1
Raspberry Pi 3 Model B
× 1
Arduino Nano R3
× 1
SparkFun Logic Level Converter - Bidirektional
× 1
NFC RFID-RC522
× 1
Sharp GP2Y0A41SK0F (4cm - 30cm) - Analoger Distanzsensor
× 1
MLX90614-DCI I2C - Temperatursensor
× 1
DFRobot I2C 16x2 Arduino LCD-Anzeigemodul
× 1
LED (generisch)
× 1
Widerstand 330 Ohm
× 2
Summer
× 1

Apps und Onlinedienste

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

Über dieses Projekt

PROBLEM-ERKLÄRUNG

In Asien müssen die Grund- und Sekundarschüler aufgrund des heißen Wetters und des Ausbruchs des schweren akuten Atemwegssyndroms (SARS) im Jahr 2003 in jedem Quartal Temperaturmessungen durchführen, um das Wohlbefinden der Schüler zu gewährleisten. Wenn von der Schule eine Temperaturmessungsübung geplant ist, müssen die Schüler ihr eigenes digitales Thermometer für diese Übung mitbringen. Einige Schüler können jedoch aus Gründen wie verlegtem oder beschädigtem Thermometer möglicherweise nicht an der Übung teilnehmen und vergessen, das Gerät mitzubringen. Aus Gründen der persönlichen Hygiene dürfen die Schüler ihre Thermometer nicht teilen und sie haben möglicherweise nicht genügend Geld, um ein neues Stück zu kaufen. Daher beeinflusst es die Erfolgsrate der Temperaturmessung. Nach der Temperaturmessung müssen die Mitarbeiter alle Temperaturdaten der Schüler und der Schüler in die Datenbank manuell eingeben. Die Aufgabe ist sehr mühsam und zeitaufwendig, da jeder Klassenlehrer Eingaben für etwa 40 Schüler vornehmen muss.

Was ist die Lösung?

Das Thema für unser Projekt ist Social Impact von SqwidNet und im Bereich Gesundheit und Wohlbefinden im Sustainable Development Goal (SDG). Der Grund dafür ist, dass unser System in der Lage ist, die Temperatur gültiger Benutzer automatisch zu messen, damit ihre Temperatur überwacht werden kann und eine Warnung gesendet wird, wenn sie einen bestimmten Schwellenwert überschreitet.

WIE ES FUNKTIONIERT:RaspberryPi &Arduino

Der RaspberryPi enthält ein Python-Programm und die MySQL-Datenbank.

Beim Starten des Python-Programms prüft es automatisch, ob die Datenbank bereits erstellt wurde, andernfalls wird sie automatisch erstellt. Die darin enthaltenen Tabellen werden ebenfalls überprüft und bei Bedarf automatisch erstellt. Dies reduziert die manuelle Arbeit der Lehrer/Verwaltungspersonal in der Schule.

Dann stellt es eine Abfrageverbindung her, um die Datenbank zu überprüfen, und wartet darauf, dass das Arduino relevante Informationen über den seriellen Kommunikationsanschluss sendet.

Wenn eine RFID-Karte auf den Arduino tippt, werden die Karteninformationen im Arduino gespeichert und über die serielle Kommunikation an den RaspberryPi gesendet. Danach bestätigt RaspberryPi mit der Datenbank, dass die Karte ein gültiger Benutzer ist, und wenn dies der Fall ist, sendet es zur Bestätigung an den Arduino und der Arduino gibt "Willkommen, Name" auf dem LCD-Bildschirm aus. Wenn es sich nicht um einen gültigen Benutzer handelt, wird nur "Fehler! Ungültiger Benutzer!" angezeigt.

Nehmen wir an, wir haben jetzt einen gültigen Benutzer, der gerade getippt hat. Als nächstes fordert das Arduino den Benutzer auf, seine Temperatur zu messen. Ein Distanzsensor erkennt dann, ob ein Benutzer bereit ist, seine Temperatur zu messen. Wenn dies der Fall ist, misst es ihre Temperatur und gibt ihre Temperatur auf dem LCD-Bildschirm aus. Wenn es sich um eine gültige Temperatur (28 * C - 42 * C) handelt, werden diese Informationen zur Datenspeicherung sowohl an den RaspberryPi (MySQL) als auch an Sigfox (ThingSpeak) gesendet. Die MySQL-Datenbank würde die Benutzer-ID, das Datum, den Zeitstempel und die Temperatur jeder Einnahme speichern.

Beim Empfang der Temperaturdaten vom Arduino würde der RaspberryPi ständig prüfen, ob die Temperatur richtig geliefert wird, bevor er mit etwas anderem fortfährt. Dies liegt daran, dass, wenn das Python-Programm nur einmal nach den Temperaturdaten sucht, diese möglicherweise noch nicht vom Arduino gesendet wurden, da beide Codes zu unterschiedlichen Zeitpunkten ausgeführt werden. Zur Synchronisierung prüfen wir daher ständig die Temperaturdaten im Python-Code, bevor wir mit dem Rest des Programms fortfahren.

HINWEIS: Sowohl der Python-Code als auch der Arduino-Code des RaspberryPi verwenden eine Synchronisierungsmethode namens Handshaking. Wenn der RaspberryPi nicht bereit ist, andere Temperatur-/Benutzerinformationen zu empfangen, würde der Arduino dem Benutzer nicht erlauben, auf die Karte zu tippen, umgekehrt .

Eine einfache Möglichkeit, dies zu tun, besteht darin, ständig ein "BEREIT"-Signal zu senden, bis die andere Partei ein "EMPFANGEN"-Signal zurücksendet, damit sie wissen, dass sie beide bereit sind.

Arduino -

boolean readySignal =Serial.readString() =="READY";


if(readySignal)
{

tapped =true;

Serial.println("RECEIVED");

}

Python -

while(readySignal ==True):

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



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


if(receivedSignal ==True):

readySignal =False

Denken Sie daran, Ihre Abfrageverbindung jedes Mal zu schließen, wenn Sie mit einer Abfrage fertig sind! Dies dient dazu, mögliche Speicherverluste zu beseitigen, und es ist insgesamt eine gute Vorgehensweise.

WIE ES FUNKTIONIERT:Sigfox (SiPy)

Nach dem Empfang der Temperaturdaten vom Arduino trennt der SiPy die Benutzer-ID und die Temperatur in ganze Zahlen und Dezimalstellen. Danach werden alle Daten per Byte an das Sigfox-Backend gesendet (so dass sie sowohl an Ubidots als auch an ThingSpeak gesendet werden können) und sollten in etwa wie das folgende Bild aussehen.

Nach Erhalt dieser Daten wird das Sigfox-Backend diese Daten neu codieren, um sie an ThingSpeak zu senden und zu speichern. Im Folgenden erfahren Sie, wie Sie das Backend zum Senden von Daten an Thingspeak codieren.

Im Sigfox-Backend unter Gerätetyp> Gerätename> RÜCKRUFE müssen Sie die benutzerdefinierte Nutzlast genau so einfügen ist es sei denn, Sie haben die Codierung im SiPy geändert, da die benutzerdefinierte Nutzlast festlegt, was zuerst als Benutzer-ID empfangen wird. Wenn Sie also beispielsweise zuerst die Temperatur senden, wird diese Temperatur im Backend in die Benutzer-ID anstatt in die Temperatur umgewandelt. Im Hauptteil muss der Schreib-API-Schlüssel oben stehen, während die Felder mit allen benutzerdefinierten Daten platziert werden können, die Sie in der benutzerdefinierten Nutzlast erstellt haben.

WIE ES FUNKTIONIERT:Die Cloud

Nachdem die Daten erfolgreich an ThingSpeak gesendet wurden, empfängt es sie zuerst in einem privaten Anzeigekanal, wo ein MATLAB Analysis-Skript die Daten analysiert und die Temperaturdaten zu einem Wert kombiniert, anstatt einen Ganzzahlwert und einen Dezimalwert zu trennen.

Der Tabellencode wurde einem Open-Source-Projekt entnommen und an unsere Bedürfnisse angepasst. Es ist sehr nützlich, da die Tabelle jedes Mal automatisch aktualisiert wird, wenn neue Daten gesendet werden, perfekt für unsere Verwendung.

Gleichzeitig wird überprüft, ob die Temperatur auf einem gefährlichen Niveau (Fieber) liegt. Wenn dies der Fall ist, wird eine E-Mail gesendet, um die Mitarbeiter/Lehrer zu benachrichtigen.

Zusammenfassend ist der erste Kanal, bei dem der Temperaturwert in Ganzzahl und Dezimalzahl getrennt ist, ein Backend-Kanal, nicht wirklich zum Anzeigen. Für den zweiten Kanal wurden die Temperaturwerte kombiniert und für Mitarbeiter/Management/Administratoren übersichtlich gestaltet und verfügt über eine Excel-ähnliche Tabelle zur einfachen Datenanalyse.

1. Arduino Nano-Verbindungen einrichten

Für den Arduino Nano sind hier die Verbindungen, die wir mit unseren Modulen hergestellt haben.

Nano und Uno haben dieselbe Pinbelegung.

RFID - RC522

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

So testen Sie RFID

LCD

SDA A4
SCL A5
GND GND
5V 5V

So testen Sie I2C-LCD

Entfernungssensor

5V 5V
GND GND
Eingang A0

So testen Sie den Sharp IR-Distanzsensor

Summer

GND GND
Ausgang D6

So testen Sie Summer

IR-Temperatursensor

SDA A4
SCL A5
GND GND
5V 5V

So testen Sie den IR-Temperatursensor,

LED

Flache Seite (Kathode) GND
Nicht flache Seite (Anode) D7

Gut! Für die Arduino-Verbindungen sollten Sie jetzt bereit sein.

2. RaspberryPi-Setup

Es gibt hauptsächlich zwei Dinge, die auf Ihrem Raspberry Pi 3-Rechner installiert werden müssen,

1. Raspbian-Betrieb System -

Die Installation des Raspbian-Betriebssystems wird als relativ unkompliziert angesehen.

Eine kurze Antwort, wie es geht, wäre das Flashen (Schreiben) einer Image-Datei auf eine SD-Karte und das Stecken dieser SD-Karte in den Raspberry Pi 3.

Wenn Sie jedoch nach einem Schritt-für-Schritt-Tutorial mit langen Antworten suchen, gehen Sie wie folgt vor -

Zuerst müssen Sie eine Software herunterladen, mit der Sie.img-Dateien auf ein Speicherlaufwerk flashen können. Sie können die Software balenaEtcher verwenden.

Rufen Sie anschließend die Seite Raspberry Pi - Raspbian auf und wählen Sie eine Seite aus, die Ihren Anforderungen entspricht. Ich habe mich für "Raspbian Buster mit Desktop und empfohlener Software" entschieden, weil es, wie der Name schon sagt, mit empfohlener Software geliefert wird und Ihnen das zusätzliche Herunterladen von Software erspart bleibt.

Sobald du fertig bist Starten Sie mit den oben genannten Schritten einfach die balenaEtcher-Software. Dieser Schritt ist ziemlich selbsterklärend:Wählen Sie das Bild (Ihre.img Raspbian-Datei), dann Ihre SD-Karte aus und drücken Sie Flash. Jetzt müssen Sie nur noch warten. Sobald es fertig ist, sollte es Sie auffordern und Sie können nun die neu geflashte SD-Karte in Ihren Raspberry Pi einlegen.

Verbinden Sie anschließend Ihren Raspberry Pi-Rechner über HDMI mit einem Monitor und führen Sie Ihre Ersteinrichtung durch. Gehen Sie schließlich zu Einstellungen -> Raspberry Pi-Konfiguration und Sie sollten in diesem Menü sein -

Folgen Sie den Optionen, dieser Schritt aktiviert Schnittstellen wie SSH, VNC, mit denen Sie über eth0 oder wlan0 eine Verbindung zu IP-Adressen herstellen können (Sie benötigen also kein HDMI-Kabel mehr, Sie können alles über SSH tun).

(optionaler Schritt) - Ich öffne das Terminal und bearbeite die Datei dhcpcd.conf (sudo nano /etc/dhcpcd.conf) und füge diese Befehlszeilen hinzu,

Schnittstelle eth0
statische IP-Adresse=192.168.0.11/24

Das obige ermöglicht es mir, mich über ein Ethernet-Kabel mit der statischen Adresse 192.168.0.11 mit dem Raspberry Pi zu verbinden, sodass ich jedes Mal weiß, dass dies die Adresse meines Raspberry Pi ist.

Dies ist ein optionaler Schritt, da Sie, sobald Sie mit WiFi verbunden sind, eine wlan0-IP-Adresse erhalten, mit der Sie sich ohne Ethernet-Kabel und überall am Standort mit dem Raspberry Pi verbinden können, solange Sie mit demselben verbunden sind W-lan. Um zu sehen, was Ihre wlan0-IP-ADRESSE ist, fahren Sie einfach mit der Maus über das WiFI-Symbol oben rechts und es wird angezeigt.

Schön! Sie sind mit der Ersteinrichtung Ihres Raspberry Pi fertig!

3. Einrichtung der MySQL-Datenbank

Ich würde diesen Schritt als etwas schwierig erachten, insbesondere den Teil, in dem Sie den MySQL-Root-Benutzer einrichten müssen. Befolgen Sie ihn sorgfältig, da es sehr schwierig ist, Fehler zu beheben.

Zuerst müssen Sie sicherstellen, dass Ihr System aktualisiert und auf die neueste Firmware aktualisiert wurde. Sie können sicherstellen, dass Sie diese Befehle eingeben,

Sudo-Apt-Update
Sudo-Apt-Upgrade

Danach installieren Sie Apache2.

sudo apt install apache2 

Mit Apache2 können Sie einen Webserver erstellen, damit Sie später auf die von Ihnen erstellten Websites zugreifen können.

Sobald Apache2 installiert ist, müssen Sie PHP installieren.

sudo apt install php php-mbstring 

Mit PHP können Sie Ihre eigenen PHP-Websites erstellen und anzeigen.

Lassen Sie uns anhalten und sehen, ob alles, was Sie gerade installiert haben, funktioniert. Geben Sie einfach die IP Ihres Raspberry Pi in Ihren Webbrowser oder "localhost" ein, wenn Sie noch über HDMI verbunden sind, und Sie sollten eine Apache-Indexseite sehen.

Jetzt müssen Sie die Datenbank installieren. Dazu verwenden Sie MySQL und mariadb.

sudo apt install mariadb-server php-mysql 

WICHTIG - Bitte stellen Sie sicher, dass Sie die folgenden Informationen sehr sorgfältig lesen.

Jetzt erstellen Sie Ihren MySQL-Root-Benutzer, damit Sie damit auf die Datenbank zugreifen können.

sudo mysql --user=root 

Sie werden nun eine MySQL-Sitzung betreten, in der Sie MySQL-Codes eingeben können, geben Sie diese Zeile für Zeile ein (Sie können das Passwort durch Ihr eigenes Passwort ersetzen)

DROP USER 'root'@'localhost';
CREATE USER 'root'@'localhost' IDENTIFIED BY 'password';
GEWÄHREN SIE ALLE PRIVILEGIEN AUF *.* TO 'root' @'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
exit;

Sie können jetzt Ihren MySQL-Root-Benutzer testen, indem Sie sich anmelden;

mysql --user=root --password=yourmysqlpassword 

Wenn alles funktioniert, können Sie jetzt PHPMyAdmin installieren, das Administrator Control Panel, damit Sie auf die MySQL-Datenbank zugreifen (sie anzeigen) und ändern können.

sudo apt install phpmyadmin

(nach der Installation)
sudo phpenmod mysqli
sudo /etc/init.d/apache2 restart

Herzlichen Glückwunsch! Sie können jetzt über http://your_raspberrypi_ip_address/phpmyadmin auf Ihre neu erstellte Datenbank zugreifen.

4. SiPy Expansion Board 2.0 Setup- und Softwarehandbuch

Zuerst müssen Sie das SiPy-Modul so auf das Erweiterungsboard stecken, dass der Reset-Knopf zum USB-Anschluss zeigt und fest einrasten sollte, sodass die Stifte nicht mehr sichtbar sind.

Quelle:Pycom-Dokumentation

Danach müssen Sie die Firmware auf dem SiPy aktualisieren, damit Sie Programme hochladen und ausführen können sowie die Sigfox-Geräte-ID und die PAC-Nummer erhalten, die zur Registrierung für das Sigfox-Backend verwendet werden. Laden Sie den Firmware-Updater entsprechend dem von Ihnen verwendeten Betriebssystem (Betriebssystem) herunter.

  • Fenster
  • macOS (10.11 oder höher)
  • Linux (erfordert Dialog und python-seriell Paket)

Nach dem Herunterladen des pycom-Firmware-Upgrades erscheinen beim ersten Start des Updaters die folgenden Bilder nur einmal Stellen Sie also sicher, dass Sie die richtige Sigfox-Region, das richtige Board auswählen.

Befolgen Sie die Anweisungen des Firmware-Updates sorgfältig, da dies dazu führen kann, dass Ihr Sigfox nicht richtig funktioniert, da die Sigfox-Geräte-ID und die PAC-Nummer alle "F" (wie unten) sind, anstatt eine Mischung aus Zahlen und Alphabeten.

b 'FFFFFFFF'
b 'FFFFFFFFFFFFFFFF'

Nachdem die Firmware aktualisiert wurde, müssen Sie Visual Studio Code herunterladen und die Erweiterung Pymkr sowie nodejs installieren, bevor Sie mit dem Hochladen und Ausführen von Programmen auf dem SiPy beginnen können.

Zuerst müssen Sie einen neuen Ordner erstellen, um alle Dateien zu speichern, die Sie später in den SiPy hochladen möchten, oder um alle Programme zu speichern, die Sie ausführen möchten. Drücken Sie oben links auf Datei und drücken Sie Ordner öffnen oder Strg+K+O, Wählen Sie dann aus, wo Sie diesen Ordner ablegen möchten, und klicken Sie mit der rechten Maustaste, um einen neuen Ordner zu erstellen. Erstellen Sie danach eine neue Datei oder Strg+N um eine neue Datei zu öffnen. Nachdem Sie eine neue Datei erstellt haben, müssen Sie die neue Datei als Python speichern und den Speichertyp in Python-Datei ändern, damit der Code später auf dem SiPy ausgeführt und in dem von Ihnen neu erstellten Ordner gespeichert werden kann.

Hinweis: Dateiname kann alles sein wie Test, Trial, etc.. Aber wenn das Hochladen in den SiPy Dateiname muss main . genannt werden .

Um Ihren Code einfach auszuführen, ohne ihn in das Sipy-Modul hochzuladen, müssen Sie nur die Schaltfläche Ausführen unten im Programm drücken. Der Upload daneben lädt den aktuellen Ordner in das SiPy-Modul hoch. Seien Sie vorsichtig, wenn Sie while-1-Schleifen verwenden, denn sobald diese in das SiPy-Modul hochgeladen wurden, besteht die einzige Möglichkeit, wieder auf das SiPy-Modul zuzugreifen, darin, per FTP in den Flash zu gehen und die main.py-Datei aus dem SiPy zu entfernen Modul.

Wenn Sie versehentlich eine unendliche while-Schleife hinzugefügt haben, müssen Sie sich keine Sorgen machen, da Sie Ihr Programm weiterhin über FTP hochladen oder das vorherige entfernen können. Laden Sie zunächst die kostenlose Filezilla-Version herunter und installieren Sie sie.

Nach der Installation müssen Sie die Verbindung einrichten. Öffnen Sie zunächst filezilla und gehen Sie zum Site-Manager, der sich unter Datei befindet, oder drücken Sie Strg+S und drücken Sie auf Neue Site.

Sie können die Site in SiPy oder wie auch immer Sie diese Verbindung nennen umbenennen und die Einstellungen für die Verschlüsselung ändern auf Nur normales FTP verwenden (unsicher) und übertragen Sie die Einstellungen auf passiv und begrenzen Sie die Anzahl der aktiven Verbindungen auf 1

Sie können den Host (Adresse), den Benutzer und das Kennwort über Visual Studio Code finden, indem Sie alle Befehle drücken und die globale Einstellung auswählen. Dies zeigt Ihnen die Standardeinstellungen für Host (Adresse), Benutzer (Benutzername) und Passwort. Dies kann durch Drücken der Projekteinstellungen . geändert werden in allen Befehlen.

Als nächstes müssen Sie die SSID des SiPy-Moduls kennen, die Sie mit allen Befehlen und Drücken von Get WiFI AP SSID finden können. Jede SSID des SiPy-Moduls ist einzigartig, aber das Passwort ist überall gleich und kann nicht geändert werden. Passwort für die SSID des SiPy-Moduls ist www.pycom.io

Hinweis: Desktop-Benutzer benötigen einen WLAN-Adapter

Jetzt können Sie filezilla verwenden, um auf SiPy Flash zuzugreifen! Verbinden Sie sich zuerst mit der SiPy-SSID, gehen Sie dann zum Filezilla-Site-Manager und verbinden Sie sich mit der neuen Site, die Sie erstellt haben, und geben Sie das Passwort ein. Öffnen Sie nun den Flash-Ordner und löschen Sie main.py NUR! Nachdem Sie die main.py gelöscht haben, starten Sie den SiPy neu und Sie können mit dem Ausführen/Hochladen Ihrer Programme beginnen.

Hinweis: Vielleicht möchten Sie den Flash-Ordner auf Ihr Betriebssystem (Betriebssystem) kopieren, falls Sie alles löschen.

5. Registrierung beim Sigfox-Backend

Schließen Sie nach der Installation von Visual Studio Code das pycom-Erweiterungsboard an den Computer an und es erkennt die Verbindung automatisch, wenn Sie Visual Studio Code öffnen. Kopieren Sie den folgenden Code und fügen Sie ihn entweder in das Terminal oder in eine Datei ein und führen Sie ihn aus. Beide Methoden reichen aus.

Sigfox aus dem Netzwerk importieren
binascii importieren

# Sigfox für RCZ initialisieren* (Sie benötigen möglicherweise eine andere RCZ-Region)
sigfox =Sigfox(mode=Sigfox .SIGFOX, rcz=Sigfox.RCZ*)

# print Sigfox Device ID
print(binascii.hexlify(sigfox.id()))

# print Sigfox PAC-Nummer
print(binascii.hexlify(sigfox.pac()))

Hinweis :Ersetzen Sie * durch Ihre RCZ-Regionsnummer.

Terminalmethode zum Abrufen der Sigfox-Geräte-ID und der PAC-Nummer

So rufen Sie das Terminal in Visual Studio Code auf Drücken Sie Strg+~. Fügen Sie dann den Code ein und er wird wie im folgenden Bild angezeigt.

Dateimethode zum Abrufen der Sigfox-Geräte-ID und der PAC-Nummer

Sobald die neue Datei gespeichert ist, indem Sie Strg+S drücken oder zu Datei gehen und dann speichern, fügen Sie den Code in die Datei ein und speichern Sie die Datei. Anschließend können Sie die Datei ausführen, indem Sie die Ausführen-Schaltfläche drücken unten auf dem Bildschirm und sollte das gleiche wie das Bild unten sein.

Nachdem Sie Ihre Sigfox-Geräte-ID und PAC-Nummer erhalten haben, müssen Sie Ihren Sigfox beim Sigfox-Backend registrieren, bevor Sie mit der Übertragung beginnen können. Die erste Seite, die Sie sehen, ist der Sitz Ihres sigfox-Unternehmens. Sie müssen das Land auswählen, in dem dieses Sigfox-Gerät verwendet wird, da jede der Sigfox-Zonen unterschiedlich konfiguriert ist.

Nachdem Sie das richtige Land ausgewählt haben, benötigen Sie auf der nächsten Seite Ihre Sigfox-Geräte-ID und PAC-Nummer, die Sie am Anfang dieses Kapitels erhalten haben. Fügen Sie sie in das richtige Feld ein und die Seite sollte wie auf dem Bild aussehen. Den Rest entsprechend auffüllen.

Nachdem Sie die Geräteseite ausgefüllt haben, ein Sigfox-Konto erstellen oder sich bei einem bestehenden Sigfox-Konto anmelden, müssen Sie den Sigfox in Ihrem Konto registrieren. Wenn Sie ein neues Sigfox-Konto erstellen, sendet Ihnen Sigfox eine E-Mail an die registrierte E-Mail-Adresse, um das Passwort einzurichten.

Nachdem Sie Ihr sigfox-Backend-Konto eingerichtet haben, können Sie diesen Code ausführen, um einige Daten zu senden, um zu sehen, ob das Backend sie empfangen kann.

Hinweis**: Schließen Sie zuerst Ihre Sigfox-Antenne an, bevor Sie ein Sigfox-Programm ausführen.

von Netzwerk Sigfox importieren
Socket importieren

# Sigfox für RCZ initialisieren* (Sie benötigen möglicherweise eine andere RCZ-Region)
sigfox =Sigfox(mode=Sigfox .SIGFOX, rcz=Sigfox.RCZ*)

# Sigfox-Socket erstellen
s =socket.socket(socket.AF_SIGFOX, socket.SOCK_RAW)

# Socket blockieren
s.setblocking(True)

# nur als Uplink konfigurieren
s.setsockopt(socket.SOL_SIGFOX, socket.SO_RX, False)

# sende einige Bytes
s.send(bytes([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]))

Hinweis :Ersetzen Sie * durch Ihre RCZ-Regionsnummer.

6. Einrichten der Cloud

Zuerst müssen Sie IFTTT für den E-Mail-Versand einrichten, auf die IFTTT-Website gehen und ein Konto erstellen. Nachdem Sie das Konto eingerichtet und sich angemeldet haben, gehen Sie zu Ihrem Profil, das sich in der oberen rechten Ecke des Bildschirms auf der linken Seite von "Erkunden" befindet, und drücken Sie auf Erstellen .

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! Written by Limor Fried/Ladyada for 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. Verzögerung (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

Schaltpläne

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

Herstellungsprozess

  1. Temperaturüberwachung auf dem Raspberry Pi
  2. Überwachen der Temperatur mit Raspberry Pi
  3. DIY:Temperaturüberwachung und -regulierung für HomeBrew
  4. CO2-Überwachung mit K30-Sensor
  5. Smart Blinds
  6. Kontaktloses Temperaturüberwachungstor
  7. Arduino - Temperatur über eine serielle Schnittstelle an das Web senden
  8. 8-Bit-IO-Port-Bibliothek für Arduino
  9. Health Band - Ein intelligenter Assistent für ältere Menschen
  10. Smart Farming:Eine umfassende IoT-Lösung für die Landwirtschaftsüberwachung