Archiv der Kategorie: Sensor

Mit phyWave-Modulen ins IoT

Daten von Sensoren im Netz oder zu Aktoren aus dem Netz verfügbar zu machen ist die Aufgabe von peripherienahen, meist drahtlos kommunizierenden IoT Devices.

Mit den phyWAVE© Modulen stellt Phytec mehrere solcher IoT Module her, die in eigene Anwendungen integriert werden können. Das phyWAVE-CC2650 ist eins der insgesamt drei von Phytec angebotenen phyWAVE Module. Kern ist das TI CC2650 SoC.

csm_phyWAVE-CC2650_95013e94a2

Das TI CC2650 SoC enthält einen 32-Bit-ARM Cortex-M3-Prozessor, der als Hauptprozessor mit 48 MHz betrieben wird. Der Sensor-Controller ist ideal für die Anbindung externer Sensoren und für die autonome Erfassung von analogen und digitalen Daten, während sich der Rest des Systems im Schlafmodus befinden kann.

Der BLE-Controller und der IEEE 802.15.4 MAC sind in ROM eingebettet und laufen teilweise auf einem separaten ARM Cortex-M0-Prozessor. Diese Architektur verbessert die Gesamtsystemleistung und den Stromverbrauch und stellt den Flash-Speicher für die Anwendung frei. Bluetooth- und ZigBee-Stacks sind kostenlos von TI erhältlich.

phyWAVE-CC26xx-block-diagram

Das phyNODE Sensor-Board stellt die Peripherie für den Betrieb des phyWAVE-CC2650 bereit. Am Rande des Boards sind eine Reihe von Sensoren angeordnet.

BLE hat die Möglichkeit, Daten in zwei verschiedenen Modes auszutauschen. Es werden der Advertising Mode und der Connected Mode unterschieden.

Nach einem Reset des phyWAVE Sensor-Boards befindet sich dieses im Advertising Mode und gibt seine MAC-Adresse aus. BLE Devices weisen eine einzigartige 6-Byte BLE- oder MAC-Adresse auf, die mit Hilfe des Kommandos sudo hcitool lescan vom als BLE Client dienenden Raspberry Pi abgefragt werden kann.

KommunikationNach dem Verbindungsaufbau werden alle Farben der RGB-LED nacheinander aktiviert bis schließlich am Ende die weiße LED eingeschaltet bleibt. Daran anschließend folgen Abfragen der einzelnen Sensoren bis hin zum Farbsensor und die Ausgabe der ermittelten Werte. Die Abfrage der Sensoren erfolgt in einer Endlosschleife.

Mit Hilfe eines Python-Scripts werden die übermittelten Sensordaten ausgewertet und einem Shell-Script zur Übermittlung an einen Server zur Visualisierung gesendet.

Der komplette Beitrag ist in der Design&Elektronik 10/2018 veröffentlicht. Der OnLine-Beitrag ist unter https://www.elektroniknet.de/design-elektronik/embedded/mit-phywave-modulen-ins-iot-158755.html zu finden. Die Software steht auf Github zum Download bereit.

 

enviro:bit add-on für micro:bit

enviro:bit ist eine Erweiterung für den micro:bit Mikrocontroller zur Erfassung von Temperatur, relativer Feuchte und Druck über einen BME280 Sensor, Licht und Farbe über einen TCS3472 Sensor sowie Geräuschen über ein MEMS Mikrofon. Ein Steckverbinder zum Kontaktieren eines micro:bit Mikrocontrollers ist vorhanden.

enviro-bit

Die Programmierung in MicroPython wird durch eine Library unterstützt. Unter Verwendung der Library bme280.py kann das folgende Programm zur Erfassung von Temperatur und relativer Feuchte erstellt werden. Die serielle Ausgabe zeigt der folgende Screenshot.

from microbit import *
import os
import bme280
bme = bme280.bme280()

CYCLE = 5000

uart.init(baudrate=115200)
uart.write("\r\n" + os.uname().machine + " measuring environmental data by BME280\r\n")
uart.write("Cycle time is " + str(CYCLE) + " msec\r\n\r\n")

while True:
    temp = round(bme.temperature(),1)
    display.scroll(str(temp)+" *C")
    uart.write("BME280 temperature = "+str(temp)+" *C\r\n")
    humi = round(bme.humidity())
    uart.write("BME280 humidity = "+str(humi)+" %\r\n\r\n")
    sleep(CYCLE)

BME280 Output

Im Beitrag LIGHT AND COLOR MEASUREMENTS WITH THE PIMORONI ENVIRO:BIT FOR THE MICRO:BIT werden verschiedene Auswertungen der Signale des TCS3472 Sensors beschrieben.

Mit Hilfe von Klatschgeräuschen können Schaltvorgänge ausgelöst werden. Der Beitrag Build a clap-activated light with micro:bit! zeigt eine solche Anwendung.

 

 

 

HiGrow-Sensor: Daten erfassen und versenden

Im Post HiGrow-Sensor sorgt für das Wohl der Pflanzen hatte ich auf den HiGrow-Sensor hingewiesen, der zur Überwachung der Umweltbedingungen in Pflanzennähe eingesetzt werden kann.

Im Programm HiGrowESP32MQTT.ino werden die Sensordaten des dort eingesetzten DHT11-Sensors zur Messung von Lufttemperatur und Luftfeuchte, sowie die kapazitiv gemessene Bodenfeuchte und die Helligkeit erfasst und entsprechenden Topics von MQTT-Messages zugeordnet. Zu Kontrollzwecken werden diese Daten auch seriell ausgegeben und können durch den internen Monitor der Arduino IDE verfolgt werden. Das Programm  HiGrowESP32MQTT.ino steht auf Github zum Download zur Verfügung.

HiGrow Data

Mit einem MQTT Client können die abonnierten Mitteilungen visualisiert werden.

Screenshot_20180319-140609.png

Bei meinen Test ist mir aufgefallen, dass recht häufig nach dem Programmstart der Brownout Detector getriggert wurde und einen entsprechenden Reset ausgelöst hat.

HiGrow Brounout

Verfolgt man die Diskussion (z.B. hier https://github.com/nkolban/esp32-snippets/issues/168) dann scheint ein hoher Strombedarf während der Initialisierungsphase ein (der?) Grund für das Verhalten zu sein.

Der HiGrow-Sensor weist einen Batteriehalter für eine 18650-LiPo-Batterie auf. Bei meinen Tests war die Batterie nicht bestückt. Möglicherweise puffert eine bestückte Batterie dann diesen kurzzeitigen Strombedarf hinreichend.

 

HiGrow-Sensor sorgt für das Wohl der Pflanzen

Für das optimale Gedeihen von Pflanzen sind die Bedingungen wie Temperatur, Luft- und Bodenfeuchtigkeit, Licht u.a.m. verantwortlich.

Kommerzielle Systeme von Kärcher, Gardena, Parrot u.a. ermitteln solche Größen und steuern damit beispielsweise die Bewässerung oder stellen die ermittelten Daten einer App auf dem Smartphone zur Verfügung.

Mit dem HiGrow-Sensor kann der Maker das Thema selbst in die Hand nehmen. Der HiGrow-Sensor nutzt einen DHT11 zur Messung von Lufttemperatur und -Luftfeuchte. Die Feuchte des Bodens wird kapazitiv gemessen, da diese Variante weniger störungsanfällig als die resistive Methode ist. Außerdem wird die Helligkeit erfasst. Als CPU kommt eine ESP32-Wroom von Espressif zum Einsatz, der  in der Arduino IDE programmiert werden kann. Softwareunterstützung findet man auf Github unter https://github.com/lucafabbri/HiGrow-Arduino-Esp. In den nächsten Tagen werde ich an dieser Stelle ein Programmbeispiel zeigen, welches die ermittelten Werte über MQTT an einen MQTT-Broker übermittelt und von da bezogen werden können.

Der HiGrow-Sensor wird von Banggood zum Preis von unter € 15 angeboten.

 

 

Dezentrale Temperaturerfassung mit Calliope mini in Python

Auf Grund der abweichenden Pinbelegungen zwischen BBC micro:bit und Calliope mini ist die Programmierung in Python gerade für I/O-Operationen nicht immer ohne Probleme. Die folgende Tabelle zeigt die Unterschiede:

nRF51822 micro:bit Calliope mini
P0.00 SCL P0
P0.01 P2 P1
P0.02 P1 P2
P0.03 P0 P3 (MIC)
P0.04 COL1 P4 (LED_C1)
P0.05 COL2 P5 (LED_C2)
P0.06 COL3 P6 (LED_C3)
P0.07 COL4 P7 (LED_C4)
P0.08 COL5 P8 (LED_C5)
P0.09 COL6 P9 (LED_C6)
P0.10 COL7 P10 (LED_C7)
P0.11 COL8 P11 (LED_C8)
P0.12 COL9 P12 (LEDC_9)
P0.13 ROW1 P13 (LED_R1)
P0.14 ROW2 P14 (LED_R2)
P0.15 ROW3 P15 (LED_R3)
P0.16 P16 P16 (TAST_B)
P0.17 BTN A P17 (TAST_A)
P0.18 P18 P18 (RGB LED)
P0.19 TGT nRST P19 (SCL)
P0.20 P20 P20 (SDA)
P0.21 MOSI P21 (BMX055 INT)
P0.22 MISO P22
P0.23 SCK P23
P0.24 TGT TxD P24 (TxD)
P0.25 TGT RxD P25 (RxD)
P0.26 BTN B P26 (Rx)
P0.27 ACC INT2 P27 (Tx)
P0.28 ACC INT1 P28
P0.29 MAG INT1 P29
P0.30 SDA P30
Zur Temperaturmessung möchte ich von folgendem Setup ausgehen.
Calliope Radio

Dezentrale Temperaturerfassung mit Calliope

 

Ein abgesetzter Calliope mini wird über ein Steckernetzteil am USB-Anschluss mit Spannung versorgt. Ein Temperatursensor LM35 erfasst die Temperatur im Bereich von 0 bis 150 °C. Hat man eine LM35 nicht zur Verfügung, dann kann anfangs auch mit dem internen Temperatursensor der CPU gearbeitet werden. Der Sensor sendet über die Radio-Verbindung die erfasste Temperatur an einen zweiten Calliope mini, der über USB mit einem PC verbunden ist.

Auf dem PC läuft ein Terminalprogramm (z.B. PuTTY) und erfasst die hier mit 9600 Baud seriell übertragenen Daten und bringt diese zur Anzeige.

Die beiden Calliope mini sind mit den folgenden Programmen zu flashen.

Sender:

# Measuring chip temperature on CPU & output to console
# works unchanged for micro:bit & Calliope mini

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(60000) # sleep a minute

Bei Einsatz eines LM35 Temperatursensors ist das Erfassen der Temperatur anzupassen:

temp = pin1.read_analog() * 330 / 1024

Der Ausgang des LM35 ist, wie in der Abbildung gezeigt, mit P2 am Calliope mini zu verbinden (sh. auch in der Tabelle oben).

Empfänger:

# Receiving chip temperature from a second board & output to console
# works unchanged for micro:bit & Calliope mini

from microbit import *
import os
import radio

uart.init()
uart.write(os.uname().machine + "\r\nGet 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()
 if str(temp) != "None":
 display.scroll(str(temp)+" *C")
 uart.write("Received chip temperature = "+str(temp)+" *C\r\n")
 sleep(1000)

Die Reichweite der Radio Verbindung des Calliope mini liegt bei ca. 20 m, so dass dem Test im Wohnraum wenig Grenzen gesetzt sind.

 

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 wird 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)

 

 

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.

 

Einfache Wetterstation für € 20

sht31chip

Mit dem $ 9 C.H.I.P. und einem Grove SHT31 ($ 11.90) kann man schon für € 20 Temperatur und relative Luftfeuchtigkeit erfassen und in der Cloud visualisieren.

Vorbedingung ist die Installation der folgenden Pakete:

sudo apt-get install build-essential libi2c-dev i2c-tools python-dev libffi-dev

Drei sehr überschaubare Scripte übernehmen die Abfrage des Sensors und das Versenden der Daten.

Mit dem Python Script SHT31.py werden von dem über den I2C-Bus angeschlossene Sensor Temperatur und relative Luftfeuchtigkeit abgefragt und zwischengespeichert. Das Shell Script thingspeak.sh sendet die erhobenen Messwerte an den Thingspeak-Server, während das Shell Script mqtt.sh die gleichen Daten an einen MQTT Broker sendet. Mit dem Script weather.sh werden diese drei Scripte gekapselt und in die Crontab eingetragen.

# m h dom mon dow command
*/5 * * * * /home/weather.sh

Durch diesen Eintrag erfolgt ein Aufruf des Scripts weather.sh alle fünf Minuten.

Die Scripte stehen wieder in meinem CHIP Repository zum Download zur Verfügung. Hier können die Ergebnisse der Messungen verfolgt werden.

LoRa Gateway aktiv…

Heute habe ich zu Testzwecken ein LoRa Gateway installiert. Im TTN Mapping (TheThingsNetwork) ist es als „CK LoRa Gateway“ markiert.

Ein LoRa Concentrator iC880A ist bei IMST bestellt, dann wird das Gateway LoRaWAN kompatibel.

ck-lora-gateway

In den nächsten Tagen bekommt die eingesetzte LoRa Node (Dragino Lora Shield & Arduino Uno) noch einen Temperatursensor, dessen Daten dann übermittelt werden. Es folgen später stromsparende Varianten auf Basis des  LoRa Transceiver RFM95W & Arduino Pro Mini, Raduino32 SX1272 und LoPy.