IoT

Internet of Things (IoT) – Das Internet der Dinge

Auch für den Hobbyelektroniker ein neues, interessantes Gebiet.

Am Anfang hat man die Qual der Wahl. Für welches „Ding“ (Entwicklungsboard) entscheidet man sich.
Ich habe mich für den WEMOS entschieden. Die Baugröße und der Preis sind gute Argumente (ca. 1,50€ für No-Name und 3€ für Lolin sind in Fernost fällig).
Er verwendet den ESP8266 welcher sich in der Arduino-Entwicklungsumgebung programmieren bzw. flashen lässt.

Hier im Vergleich zur Rev 3 (rechts im Bild),
der mit ca. 1,80€ etwa 30 Cent teurer ist wie der R1 (links im Bild)

Es gibt ihn noch in der Proversion. Mit bis zu 16MB Speicher und einer WLAN-Antennenbuchse auf dem Board.


Das erste Projekt – ein Feinstaubsensor

Angefangen habe ich mit einem Feinstaubsensor. Ich habe diesen einfach nachgebaut. In der Bauanleitung des Sensors wird ein anderes Board verwendet (NodeMCU). Der WEMOS würde aber auch funktionieren, da beide den ESP8266 verwenden.


Das zweite Projekt – ein CO2 Sensor

Nicht gerade anspruchsvoll, wie man sieht.

Die Software (ESP Easy Mega) für den Sensor gibt es fertig im Internet.
Mit dieser lassen sich viele Sensoren auslesen und ins WLAN einbinden.
Nach dem Flashen erzeugt der WEMOS einen eigenen Access-Point (AP), über welchen sich man z.B. mit dem Smartphone anmelden kann und in der Weboberfläche seine eigenen WLAN Zugangs Daten eintragen kann. Nach einem Klick auf OK, bootet der WEMOS und ist ab sofort im eigenen WLAN sichtbar und bei Eingabe der IP-Adresse im Browser erreicht man das Webinterface des Sensors bzw. das von ESP Easy Mega.
Mit ein paar zusätzlichen Drähten, lässt sich auch ein OLED-Display anschließen, welches die Sensorwerte direkt ausgibt.
Ich habe den Sensor in FHEM (Heimautomatisierung) eingebunden und eine Multicolor-LED übernimmt eine Art Ampelfunktion
(blau=sehr gut, grün=gut, gelb=geht noch, rot=bedenklich, violett=mief)


Das war die Einarbeitung. Jetzt musste etwas selbst gebautes her.

Mir viel nichts anderes ein, als wieder ein Uhr zu bauen :-). Diesmal sollte es eine WLAN-Uhr bzw. NPT-Uhr werden. NPT-Zeitserver gibt es genug im Internet, aber auch die eigene FritzBox kann man als Zeitserver verwenden.
Wenn schon Internet, warum nicht auch Emails mit der Uhr empfangen und den Betreff als Laufschrift anzeigen. Dazu ein Kalender, der die Geburtstage und andere Jubiläen anzeigt. Als Gimmick kann der „Sekundenzeiger“ verrückte Dinge machen. z.B. am Freitag dem 13. rückwärts laufen.

Dank NEOPIXEL reichen paar Drähte, um all das zu realisieren.

Die Einkaufsliste ist kurz
• 1 WEMOS D1 mini => 1,50€
• 1 MAX7219 Dot Matrix Modul (4-stellig) => Rot 2,30€ oder Grün 3,30€
• 1 WS2812B LED-Ring 60er => 9,60€ (aufpassen, es gibt sie preiswerter, aber dann kommen 4 Teile, die man zum Ring löten muss)
• 1 Fotowiderstand LDR 5516 => (aus der Bastelkiste oder 50 Teile mit 5 verschiedenen Typen für 1,21€)
• 1 Widerstand 10K => je nach LDR-Typ andere Werte möglich (aus der Bastelkiste oder kleines Sortiment kaufen)

Also mit 15-20€ muss man rechnen. Die Preise können sich aber ändern.

Maße in mm
LED-Ring: ⌀ Innen 156, ⌀ Außen 172, Höhe Platine 1,7 + LED 1,7 = 3,4 dazu 4 Bohrungen ⌀ 2 im Abstand von 15 LEDs
Dotmatrix: 132 x 32, 14,5 hoch, Bohrung ⌀ 3,5
WEMOS: 34,5 x 25,6, 5,3 hoch, Bohrung ⌀ 2,5
Wenn man von den 14,5 mm Höhe der Dotmatrix die rund 3,5 mm des LED-Rings abzieht, kommt man auf 11 mm Abstandshalter zu befestigen des LED-Rings. Für den WEMOS reichen 3 mm (Auf der Unterseite ist noch ein Chip) oder besser 6 mm, da ist mehr Platz für die Verdrahtung auf der Unterseite.

© 3/2021


Die NTP-Uhr wird zur Wetterstation

Ich konnte es mir nicht verkneifen und habe noch einen BME280 hinzugefügt. Damit wird die Uhr zur Wetterstation, denn es stehen Temperatur, Luftfeuchte und Luftdruck zur Verfügung.
Um den Luftdruck auf Meereshöhe (DruckNN=NormalNull) zu erhalten, addiert man einfach 1 hPa je 8m Höhe dazu oder verwendet die etwas genauere Formel:
DruckNN = ((Druck) / pow((1 - ((float)(alititude in m)) / 44330), 5.255));
Mit einer zusätzlichen Variable im Programmcode merkt man sich jede halbe Stunde den Luftdruck und vergleicht ihn mit dem aktuellen Luftdruck.
if(min % 30 == 0) merkeDruck = (merkeDruck + aktuellerDruck) / 2;
Somit kann man zusätzliche Infos wie steigend↑, fallend↓ und gleichbleibend→ ausgeben.
© 4/2021


Der erste Prototyp

Zum BME280 (ca. 4,50€) kam noch ein SGP30 (Luftgütesensor ca. 5,50€).
Beide Sensoren werden über den I2C-Bus ausgelesen. Damit sind die Sensoren im Grunde parallel geschalten.
Man kann dem SGP30 die Werte vom BME280 (Temperatur, Luftfeuchte) zuführen.
Damit erzielt man eine höhere Genauigkeit bei der Berechnung der Luftgüte.
Der SGP30 färbt mittels seiner Werte den Sekundenzeiger entsprechend der Luftgüte von grün über gelb zu rot.



Leider werden die Farben des Sekundenzeigers im Video nicht so optimal dargestellt, wie sie in Wirklichkeit sind.
Ich habe aller 15s eine rote LED, aller 5 s eine blaue LED. Alle anderen sind grün.
Da man dies per Software einstellen kann, kann man beliebige Farben verwenden.

Der direkt auf der WEMOS-Platine verlötete Fotowiderstand regelt die Helligkeit der Dot-Matrix und des Sekundenkranzes.

Auch die Art und Weise des Sekundenzeigers kann man per Software ändern. So füllt sich beispielsweise von 22 Uhr bis 6 Uhr der Sekundenkreis nicht mehr, sondern es leuchtet immer nur die aktuelle Sekunde. Damit verringert sich die Helligkeit in den Nachtstunden zusätzlich.

In der Soft- bzw. Firmware habe ich ein Webinterface integriert, welches man über die IP-Adresse der Uhr erreichen kann.
Dort sind detaillierte Infos und Sensorwerte enthalten.

Weiteres folgt wahrscheinlich nicht mehr, da dazu weitere Hardwareänderungen notwendig wären.
Da man Softwareänderungen über die OTA-Schnittstelle (Over The Air) übertragen kann, wird es in Zukunft sicher noch ein bisschen Codeoptimierung geben.

Am Ende mein Dank an alle Entwickler, die auf GitHub all die Bibliotheken zur Verfügung stellen und damit vielen bei der Entwicklung eigener Ideen unterstützen.
© 5/2021


Update Preise: Seit 1. Juli 2021 wird in Fernost die deutsche Einfuhrumsatzsteuer während des Bestellprozesses angezeigt und mit berechnet. Auf die obigen Preise sind also jeweils 19% aufzuschlagen. Des Weiteren werden immer öfter Versandkosten verlangt bzw. im Artikelpreis versteckt. Was am Ende nicht relevant ist, da auch Versandkosten steuerpflichtig sind.
© 7/2021


Serienfertigung für den
Die erste Kleinserie ist fertig und wird vom Weihnachtsmann ausgeliefert 🙂
Jede Uhr hat einen anderen Geburtstags/Terminkalender so das die Berechnungszeit der nächsten Termine unterschiedlich lang dauert. Deshalb der etwas asynchrone Bootvorgang.
Falls die Beschenkten die Bedienungsanleitung mal nicht zur Hand haben sollten, könnt ihr auch hier nachlesen.

Mittlerweile sind die Chip- und Versandkosten stark gestiegen. Die Beschaffungskosten des Luftgütesensors (SGP30) haben sich fast verdoppelt. Er kostet jetzt fast 10€.  Auch der Preis für den Temperatursensor (BME280) ist stark gestiegen. Beide Sensor-Chips werden von Bosch hergestellt. Andere Bauteile, wie der Sekundenkranz sind nur moderat gestiegen.
© 12/2021


Source code snippet:
Es gibt nur zwei bewegliche Tage/Feiertage, die man mit etwas höheren Aufwand berechnen muss.

#define secDay 86400 // 1 Tag = 86.400,003 Atomsekunden, auf Grund ständiger Schwankungen der Erdrotation alle 2-5 Jahre eine Schaltsekunde

// Ostersonntag
int getOstern(int jahr) {
  int k, m, s, a, d, r, og, sz, oe, os, tag;
  k = jahr / 100;
  m = 15 + (3 * k + 3) / 4 - (8 * k + 13) / 25;
  s = 2 - (3 * k + 3) / 4;
  a = jahr % 19;
  d = (19 * a + m) % 30;
  r = d / 29 + (d / 28 - d / 29) * a / 11;
  og = 21 + d - r;
  sz = 7 - ((jahr + jahr / 4 + s) % 7);
  oe = 7 - ((og - sz) % 7);
  os = og + oe;
  if (os <= 31) {
    tag = time2sek(jahr, 3, os, 0, 0, 0, 0);
  } else {
    tag = time2sek(jahr, 4, os - 31, 0, 0, 0, 0);
  }
  if (debug) {
    Serial.print(F("getOstern: ")); Serial.println(DateFormatter::format("%A %d.%m.%Y", tag));
  }
  return tag;
}

// Erster Advent
int getErsterAdvent(int jahr) {
  int heiligabend = time2sek(jahr, 12, 24);
  int wt = DateFormatter::format("%w", heiligabend).toInt();
  int tage = wt + 21;
  int tag = heiligabend - (tage * secDay);
  if (debug) {
    Serial.print(F("getErsterAdvent: ")); Serial.println(DateFormatter::format("%A %d.%m.%Y", tag));
  }
  return tag;
}

// Umrechnung Zeit in Sekunden
uint64_t time2sek(int i_year, byte b_month, byte b_day, byte b_hour = 0, byte b_min = 0, byte b_sec = 0, byte b_dst = 0) {
  struct tm zeit;
  zeit.tm_year = i_year - 1900;
  zeit.tm_mon = b_month - 1;
  zeit.tm_mday = b_day;
  zeit.tm_hour = b_hour;
  zeit.tm_min = b_min;
  zeit.tm_sec = b_sec;
  zeit.tm_isdst = b_dst;
  return mktime(&zeit);
}

Weitere bewegliche Feiertage orientieren sich alle an Ostersonntag oder dem 1. Advent.
Fastnacht = Ostersonntag – 47
Himmelfahrt = Ostersonntag + 39
Pfingstsonntag = Ostersonntag + 49
Buß- und Bettag = 1. Advent – 11

Schaltjahrberechnung:
Der Perfektion geschuldet, hier die Berechnung der Schaltjahre, obwohl für dieses Jahrhundert eigentlich nur noch die Regel gilt, alle Jahre die durch vier teilbar sind, sind Schaltjahre.

bool isSchaltjahr(int jahr) {
  // Alle Jahre, die durch 4 teilbar sind, sind ein Schaltjahr.
  // Es sei denn, das Jahr ist durch 100 teilbar, dann ist es kein Schaltjahr.
  // Aber, wenn das Jahr durch 400 teilbar ist, dann ist es doch wieder ein Schaltjahr.

  if ((jahr % 400) == 0) {
    return true;
  } else if ((jahr % 100) == 0) {
    return false;
  } else if ((jahr % 4) == 0) {
    return true;
  } else {
    return false;
  }
  //return (jahr % 4 == 0 && jahr % 100 != 0 || jahr % 400 == 0); // Kurzform
}

© 3/2024