Ein weitere Möglichkeit, neben Thingsspeak, Daten zu verschicken und visuell sichtbar zu machen, ist Blynk. Wir brauchen dazu immer die Blynk App für das Smartphone (iOs, Android), dort müßen wir uns anmelden, mit einer E-Mail Adresse.
Danke für den Blogbeitrag. Für mich ist die Anzeige der CO2-Ampel mit Blynk die beste Lösung. Habe mit drei Blynk-LEDs dort eine echte Ampel nachempfunden. . pic.twitter.com/fUhSAeF7uq
— Horst Sievert (@hosi1709) September 28, 2020
Blynk einrichten
Wir gehen in der App auf „new project“, by „choose device“ wählen wir „esp8266“. Wenn wir dann auf „create project“ drücken, bekommen wir den „Auth Token“ per E-Mail zugeschickt. Das ist ganz praktisch, denn so können wir ihn einfach per copy and paste in die Ardublocks Umgebung überführen.

Über den „Pin“ im Blynk Block können wir unterschiedliche Werte in die App übermitteln. Wir setzen als Pin = 1 für den ersten Wert, etwa IAQ und dann Pin = 2, für den nächsten.
Noch ein Hinweis für diesen Sketch. Anstelle jedes mal den Sensorwert neu messen zu lassen, setze ich den Messwert als „Zahl Variable“ und verwende pro Durchgang (Schleife) immer diesen Wert. Dann muss der Sensor nicht immer neu messen und es geht auch schneller, bzw. es würde auch immer der Wert der angezeigt wird, auch seriell ausgegeben und weitergemeldet.
„Zahl Variable“ ist übrigens eine coole Sache. Damit kann man einmal eine Variable definieren und an zentraler Stelle ändern. Dazu sollte sie immer weit oben stehen (und als erstes gesetzt werden), das kann man auch etwa bei Wartezeit nutzten, anstelle eine feste Wartezeit einzugeben, die etwa ein Wert angezeigt werden soll, einfach eine „Zahl-Variable“ Wartezeit definieren und dann bei Bedarf zentral ändern.
Auf dem Octopus und im Ardublockly ist es also relativ einfach. In der App wird es ein wenig schwieriger.

In der App gehen wir auf „New Project“ und drücken lange auf die schwarze Fläche – um das rauszufinden habe ich ein wenig gebraucht – da werden uns gleich eine ganze Reihe von Anzeigemöglichkeiten angeboten und da kommt der nun der Pferdefuß in dieser App: man hat recht wenig „Akkupunkte“ und muss die ggf. hinzukaufen.

Da ich also sparsam bin, nehme ich das „Value Display. Das wird oben links eingefügt. Einmal drauf tatschen und findet man die Einstellungen. Also etwa einen Titel setzen, hier IAQ. Bei „input“ gehen wir auf „select pin“, drehen das Rächen auf „Virtual“ und den virtuellen Pin auf V1.

„Refresh Interval“ lasse ich bei „push“. Dann gibt es noch zwei Zahlen neben dem Pin: Null und eine Kurve nach 1023. Da sich IAQ irgendwo zwischen 0 und 200 bewegen kann, setze ich die einfach auf 200. Das ist hier bei einem Feld das Zahlen anzeigt nicht so wichtig. Aber es gibt auch Balken- oder Gebirgsgrafiken oder Tachometer. Da sollte man die Skala dann konfigurieren.

Mit dem Druck auf das Dreieck oben rechts bringt man die Anwendung zum laufen.

Quellcode
Den Quellcode findet ihr hier:
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <bsec.h>
#include <Wire.h>
#include <Ticker.h>
String matrixausgabe_text = " "; // Ausgabetext als globale Variable
volatile int matrixausgabe_index = 0;// aktuelle Position in Matrix
IPAddress myOwnIP; // ownIP for mDNS
int IAQ = 0 ;
/*
Bosch BSEC Lib, https://github.com/BoschSensortec/BSEC-Arduino-library
The BSEC software is only available for download or use after accepting the software license agreement.
By using this library, you have agreed to the terms of the license agreement:
https://ae-bst.resource.bosch.com/media/_tech/media/bsec/2017-07-17_ClickThrough_License_Terms_Environmentalib_SW_CLEAN.pdf */
Bsec iaqSensor; // Create an object of the class Bsec
Ticker Bsec_Ticker; // schedule cyclic update via Ticker
// ------------------------ Helper functions Bosch Bsec - Lib
void checkIaqSensorStatus(void)
{
String output;
if (iaqSensor.status != BSEC_OK) {
if (iaqSensor.status < BSEC_OK) {
output = "BSEC error code : " + String(iaqSensor.status);
for (;;) {
Serial.println(output);
delay(500);
} // Halt in case of failure
}
else {
output = "BSEC warning code : " + String(iaqSensor.status);
Serial.println(output);
}
}
if (iaqSensor.bme680Status != BME680_OK) {
if (iaqSensor.bme680Status < BME680_OK) {
output = "BME680 error code : " + String(iaqSensor.bme680Status);
for (;;){
Serial.println(output);
delay(500);
} // Halt in case of failure
}
else {
output = "BME680 warning code : " + String(iaqSensor.bme680Status);
Serial.println(output);
}
}
}
// Housekeeping: scheduled update using ticker-lib
void iaqSensor_Housekeeping(){ // get new data
iaqSensor.run();
}
void setup(){ // Einmalige Initialisierung
Serial.begin(115200);
Wire.begin(); // ---- Initialisiere den I2C-Bus
iaqSensor.begin(BME680_I2C_ADDR_PRIMARY, Wire);
String output = "\nBSEC library version " + String(iaqSensor.version.major) + "." + String(iaqSensor.version.minor) + "." + String(iaqSensor.version.major_bugfix) + "." + String(iaqSensor.version.minor_bugfix);
Serial.println(output);
checkIaqSensorStatus();
bsec_virtual_sensor_t sensorList[10] = {
BSEC_OUTPUT_RAW_TEMPERATURE,
BSEC_OUTPUT_RAW_PRESSURE,
BSEC_OUTPUT_RAW_HUMIDITY,
BSEC_OUTPUT_RAW_GAS,
BSEC_OUTPUT_IAQ,
BSEC_OUTPUT_STATIC_IAQ,
BSEC_OUTPUT_CO2_EQUIVALENT,
BSEC_OUTPUT_BREATH_VOC_EQUIVALENT,
BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE,
BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY,
};
iaqSensor.updateSubscription(sensorList, 10, BSEC_SAMPLE_RATE_LP);
checkIaqSensorStatus();
iaqSensor_Housekeeping();
Bsec_Ticker.attach_ms(3000, iaqSensor_Housekeeping);
Serial.println();
//------------ WLAN initialisieren
WiFi.persistent(false);
WiFi.mode(WIFI_STA);
delay(100);
Serial.print ("\nWLAN connect to:");
Serial.print("BIG-RUCKUS");
WiFi.begin("BIG-RUCKUS","prestige999%!");
while (WiFi.status() != WL_CONNECTED) { // Warte bis Verbindung steht
delay(500);
Serial.print(".");
};
Serial.println ("\nconnected, meine IP:"+ WiFi.localIP().toString());
matrixausgabe_text = " Meine IP:" + WiFi.localIP().toString();
myOwnIP = WiFi.localIP();
matrixausgabe_index=0;
Blynk.config("SZ2mHs8Dk3poz6mbxC3BBeh4cgIH7DLb","blynk-cloud.com",80);// Downloads, docs, tutorials: http://www.blynk.cc
int BlynkCon = 0;
while (BlynkCon == 0) {
Serial.print ("\nBlynk connect ... ");
BlynkCon=Blynk.connect();
if (BlynkCon == 0) {
Serial.println("failed, try again");
delay(1000);
}
}
Serial.println("connected");
}
void loop() { // Kontinuierliche Wiederholung
Blynk.run();// Blynk Housekeeping
IAQ = iaqSensor.iaq ;
Serial.print(":"+String(String(IAQ)));
Serial.println();
Blynk.virtualWrite(1,IAQ);// Wert an Blynk-Server übermitteln
Blynk.run();// Blynk Housekeeping
delay( 5000 );
}
Weitere Octopus Basteleien:
- Ocotopus mit dem Internet verbinden und Daten empfangen
- Ocotopus un MacOS
- Daten versenden mit dem Octopus und Thingsspeak
Auf der Website von Umweltcampus Birkenfeld gibt es eine gute Übersicht zum Octopus allgemein, mit Anleitungen für unterschiedliche Betriebssysteme und die Programmblöcke. Sowie auch die Anleitung zur CO2 Ampel.