Abgesetzter Temperatursensor mit micro:bit radio

Micro:bit ist zwar BLE tauglich, doch unter Python reichen die Ressorcen für den BLE-Stack nicht aus und es bleibt die micro:bit radio Verbindung.

Zur abgesetzten Temperaturmessung kann ein micro:bit als Sensorknoten und eine weiterer als Empfängerknoten genutzt werden. Die Message des Sensors wir hier als Broadcast versendet.

Das Python-Programm des Sensors ist:

# Measuring chip temperature on micro:bit & output to radio
from microbit import *
import radio

# The radio won't work unless it's switched on.
radio.on()

while True:
 temp = temperature() - 3 # offset to ambient temperature
 display.scroll(str(temp)+" C")
 radio.send(str(temp))
 sleep(5000)

Das Python-Programm des Empfängers ist:

# Receiving chip temperature from a micro:bit sensor node & output to console
from microbit import *
import os
import radio

uart.init()
uart.write(os.uname().machine +" get chip temperature by radio connection\r\n")

# The radio won't work unless it's switched on.
radio.on()

while True:
 # Read any incoming messages.
 temp = radio.receive()
 display.scroll(str(temp)+" C")
 uart.write("micro:bit chip temperature = "+str(temp)+" C\r\n")
 sleep(1000)

 

 

BBC Micro:bit

Micro:bit ist ein für Ausbildungszwecke entwickelter Mikrocontroller mit Features, die diesen Controller auch für Prototypen-Entwicklungen u.a. interessant machen. Hier sind die Retails zu diesem Controller zu finden.

Die technischen Spezifikationen sind:

  • Nordic Semiconductor nRF51822 Bluetooth Low Energy & 2.4GHz Wireless SoC (32-bit ARM® Cortex™ M0 CPU mit 256kB Flash und 16kB RAM)
  • Bluetooth Smart Antenne
  • microUSB Anschluss (Programmdownload, Console)
  • LiPo-Anschluss
  • 25 LEDs, 2 Taster
  • 20 Pin Edge Connector
  • Accelerometer, Compass

Programmierbar in

  • JavaScript-Blocks-Editor (PXT)
  • microPython

MicroPython Programmbeispiel

# Measuring chip temperature on micro:bit & output to console
from microbit import *
import os

uart.init()
uart.write(os.uname().machine +" measuring chip temperature\r\n")

while True:
 temp = temperature()
 display.scroll(str(temp)+" C")
 uart.write("micro:bit chip temperature = "+str(temp)+" C\r\n")
 sleep(5000)

 

 

MAC Adresse als Node Id

In vernetzten Umgebungen ist es erforderlich, die einzelnen Knoten identifizieren zu können. Bei der Vernetzung über Ethernet oder WLAN hat man die MAC Adresse des jeweiligen Netzwerkadapters zur Verfügung. Netzwerkknoten, die über andere Medien vernetzt sind, verwenden häufig eine unverwechselbare Seriennummer.

Beim C.H.I.P. kann die Seriennr. folgendermaßen ermittelt werden:

cat /proc/cpuinfo | grep "Serial" |  awk '{print $3}'

Beim NodeMCU habe ich eine Client Id mit folgendem Aufruf erzeugt:

CLIENTID = "ESP8266-" ..  node.chipid()

Hat man eine solche Seriennr. auf dem betreffenden Chip nicht zur Verfügung, dann kann die MAC Adresse, wenn vorhanden, als Id verwendet werden.

Hierzu habe ich ein Shell Script getid.sh geschrieben:

#!/bin/bash

echo "Build Ident from MAC ID"
ID=`ifconfig | grep wlan`
echo -n "MAC ID = "
ID=`echo ${ID#*HWaddr }` # see https://goo.gl/WLR79p
echo $ID
ID=`echo $ID | /bin/sed 's/://g'`
echo -n "Ident = "
ID=`echo $((16#$ID))`
echo $ID

ID

 

 

C.H.I.P. als Sensor-Knoten

Wegen seiner Kompaktheit kann C.H.I.P.  dann sehr gut als Sensor-Knoten eingesetzt werden, wenn es nicht auf minimalen Stromverbrauch ankommt.

Für erste Tests habe ich mit dem Program chiplog.py  die CPU-Last, den verfügbaren Speicher und die Boardtemperatur abgefragt und über Thingspeak visualisiert. Ausserdem wird beim Überschreiten der Temperatur eine Push-Message versendet. Mit dem Programm stress habe ich die CPU-Last erhöht, um die Auswirkungen auf die Boardtemperatur zur verdeutlichen.

CPU_Load

Mem_avail

PMU_Temp

Um einen externen Sensor abfragen zu können, bedarf es nur noch weniger zusätzlicher Zeile Code, die für einen Temperatur- und Feuchtigkeitssensor SHT31 noch folgen.

Das Programm BatStatus.py zeigt den Status der Batterie in den ersten Minuten nach dem Anschliessen an den C.H.I.P.  Controller.

BatStatus

Die Programme chiplog.py und BatStatus.py sind auf Github abgelegt. Im Wiki sind Installationshinweise nach einem Flashen des Betriebssystems und dem erforderlichen Python-Setup aufgeführt.

 

LoRa Gateway Dragino LG01

 

Dragino LG01 ist ein Open Source Single Channel LoRa Gateway. Damit kann das LoRa Wireless Netzwerk über WiFi, Ethernet, 3G oder 4G an ein IP-Netzwerk übertragen werden.

Das LG01 hat hierzu eine WiFi-Schnittstelle, Ethernet-Port und USB-Host-Port. Diese Schnittstellen bieten flexible Methoden für die Benutzer, ihre Sensornetzwerke mit dem Internet zu verbinden.

LG01 läuft Open Source OpenWrt System, Benutzer sind frei, die Quelldatei zu ändern oder das System zu kompilieren, um ihre benutzerdefinierten Anwendungen zu unterstützen.

Beim LG01 handelt es sich um ein LoRa Gateway, nicht um eine LoRaWAN Gateway.

Hier sind die Links zu Datenblatt und Benutzerhandbuch.

Betrachtet man die LG01 Systemübersicht, dann erkennt man schnell einen Arduino Yún als Basis.

dragino-lg01p-868-03_1

Zum Einlesen in diese Thematik möchte ich in eigener Sache auf das Büchlein Arduino für die Cloud: Arduino Yún & Dragino Yún Shield hinweisen.

Bevor ich mich den eigentlichen LoRa-Tests zuwende, statte ich ein solches Linux-Device mit den beiden Shell-Scripten boardinfo.sh und monitoring_uptime.sh aus.

boardinfo.sh zeigt uns die Ausstattung des Dragino LG01, hier speziell des Dragino HE Linux Moduls.

boardinfo

monitoring_uptime.sh ruft das Kommando uptime auf und sendet die Daten als Pushover Mitteilung an mein Smartphone. Als Cronjob eingerichtet erhalte ich tagsüber (zu jeder vollen Stunde) diese Mitteilung, die mir zeigt, ob mein Gateway stabil arbeitet.

monitoring_uptime

Zeigt sich das eben in Betrieb genommene Gateway über die nächsten Tage stabil, dann werde ich die erste LoRa-Strecke einrichten und in dem speziell dafür eingerichteten Blog berichten.

Die Quelltexte der hier betrachteten Shell-Scripts sind auf Github abgelegt.