Added new sketch and edit Readme
This commit is contained in:
		
							
								
								
									
										298
									
								
								CO2-Ampel-MQTT-BME680-SCD30-7Segement.ino
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										298
									
								
								CO2-Ampel-MQTT-BME680-SCD30-7Segement.ino
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,298 @@ | |||||||
|  | /* Disclaimer IoT-Werkstatt CC 4.0 BY NC SA  | ||||||
|  |  This program is distributed in the hope that it will be useful, | ||||||
|  |  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For Ardublock see the | ||||||
|  |  GNU General Public License for more details. */ | ||||||
|  | #include <ESP8266WiFi.h> | ||||||
|  | #include <PubSubClient.h> | ||||||
|  | #include <SparkFun_SCD30_Arduino_Library.h> | ||||||
|  | #include <Wire.h> | ||||||
|  | #include <bsec.h> | ||||||
|  | #include <Ticker.h> | ||||||
|  | #include <Adafruit_GFX.h> | ||||||
|  | #include <Adafruit_LEDBackpack.h> | ||||||
|  | #include <Adafruit_NeoPixel.h> | ||||||
|  |  | ||||||
|  | String matrixausgabe_text  = " "; // Ausgabetext als globale Variable | ||||||
|  |  | ||||||
|  | volatile int matrixausgabe_index = 0;// aktuelle Position in Matrix | ||||||
|  |  | ||||||
|  | IPAddress myOwnIP; // ownIP for mDNS  | ||||||
|  |  | ||||||
|  | //-------------- definition mqtt-object ueber WiFi | ||||||
|  | WiFiClient   espClient;  | ||||||
|  | PubSubClient mqttclient(espClient); | ||||||
|  |  | ||||||
|  | //--------- list of mqtt callback functions  | ||||||
|  | #define MAX_MQTT_SUB 10 // maximal 10 subscriptions erlaubt | ||||||
|  | typedef void (*mqtthandle) (byte*,unsigned int); | ||||||
|  | typedef struct {       // Typdeklaration Callback | ||||||
|  |   String topic;        // mqtt-topic | ||||||
|  |   mqtthandle fun;      // callback function  | ||||||
|  | } | ||||||
|  | subscribe_type;  | ||||||
|  | subscribe_type mqtt_sub[MAX_MQTT_SUB]; | ||||||
|  | int mqtt_sub_count=0; | ||||||
|  |  | ||||||
|  | String MQTT_Rx_Payload = "" ; | ||||||
|  | //--------- mqtt callback function  | ||||||
|  | void mqttcallback(char* to, byte* pay, unsigned int len) { | ||||||
|  |   String topic   = String(to); | ||||||
|  |   String payload = String((char*)pay); | ||||||
|  |   MQTT_Rx_Payload=payload.substring(0,len); | ||||||
|  |   Serial.println("\ncallback topic:" + topic + ", payload:" + MQTT_Rx_Payload); | ||||||
|  |   for (int i=0;i<mqtt_sub_count;i++) { // durchsuche alle subscriptions, bis topic passt  | ||||||
|  |     if (topic==mqtt_sub[i].topic)  | ||||||
|  |       mqtt_sub[i].fun(pay,len);         // Aufruf der richtigen callback-Funktion | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | //------------ reconnect mqtt-client | ||||||
|  | void mqttreconnect() { // Loop until we're reconnected  | ||||||
|  |   if (!mqttclient.connected()) {  | ||||||
|  |     while (!mqttclient.connected()) {  | ||||||
|  |       Serial.print("Attempting MQTT connection..."); | ||||||
|  |       if (mqttclient.connect("IoTHackathon" , "xxxxx", "xxxxxx" )) { | ||||||
|  |         Serial.println("connected"); | ||||||
|  |         for (int i=0;i<mqtt_sub_count;i++) { // subscribe topic | ||||||
|  |           mqttclient.subscribe(mqtt_sub[i].topic.c_str()); | ||||||
|  |           Serial.println("\nsubscribe"); | ||||||
|  |           Serial.print(mqtt_sub[i].topic); | ||||||
|  |         } | ||||||
|  |       }  | ||||||
|  |       else {  | ||||||
|  |         Serial.print("failed, rc="); | ||||||
|  |         Serial.print(mqttclient.state()); | ||||||
|  |         Serial.println(" try again in 5 seconds"); | ||||||
|  |         delay(5000); | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   }  | ||||||
|  |   else {  | ||||||
|  |     mqttclient.loop();  | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int CO2 = 0 ; | ||||||
|  | //Reading CO2, humidity and temperature from the SCD30 By: Nathan Seidle SparkFun Electronics  | ||||||
|  |  | ||||||
|  | //https://github.com/sparkfun/SparkFun_SCD30_Arduino_Library | ||||||
|  |  | ||||||
|  | SCD30 airSensorSCD30; // Objekt SDC30 Umweltsensor | ||||||
|  | int TEMP = 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  | ||||||
|  | const uint8_t bsec_config_iaq[] = { | ||||||
|  | #include "config/generic_33v_3s_28d_2d_iaq_50_200/bsec_iaq.txt" | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | // ------------------------   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(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int LUFTDRUCK = 0 ; | ||||||
|  | int FEUCHTE = 0 ; | ||||||
|  | // Adafruit Feather 7 Segment https://learn.adafruit.com/adafruit-7-segment-led-featherwings/overview | ||||||
|  | Adafruit_7segment matrix7Seg = Adafruit_7segment(); // 7Segment Feather | ||||||
|  | Adafruit_NeoPixel pixels = Adafruit_NeoPixel(2,13,NEO_GRBW + NEO_KHZ800); | ||||||
|  |  | ||||||
|  | void setup(){ // Einmalige Initialisierung | ||||||
|  |   Serial.begin(115200); | ||||||
|  |   //----------------------------------MQTT-Client  | ||||||
|  |   mqttclient.setServer("mqtt.unixweb.eu", 1883); | ||||||
|  |   mqttclient.setCallback(mqttcallback); | ||||||
|  |  | ||||||
|  |   Wire.begin(); // ---- Initialisiere den I2C-Bus  | ||||||
|  |  | ||||||
|  |   if (Wire.status() != I2C_OK) Serial.println("Something wrong with I2C"); | ||||||
|  |  | ||||||
|  |   if (airSensorSCD30.begin() == false) { | ||||||
|  |     Serial.println("The SCD30 did not respond. Please check wiring.");  | ||||||
|  |     while(1) { | ||||||
|  |       yield();  | ||||||
|  |       delay(1); | ||||||
|  |     }  | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   airSensorSCD30.setAutoSelfCalibration(false); // Sensirion no auto calibration | ||||||
|  |  | ||||||
|  |   airSensorSCD30.setMeasurementInterval(2);     // CO2-Messung alle 2 s | ||||||
|  |  | ||||||
|  |   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); | ||||||
|  |   iaqSensor.setConfig(bsec_config_iaq); | ||||||
|  |   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(); | ||||||
|  |   matrix7Seg.begin(0x70); // ---- Initialisiere 7Segment Matrix | ||||||
|  |   matrix7Seg.clear();     //  | ||||||
|  |   matrix7Seg.writeDisplay(); | ||||||
|  |  | ||||||
|  |   pixels.begin();//-------------- Initialisierung Neopixel | ||||||
|  |   delay(1); | ||||||
|  |   pixels.show(); | ||||||
|  |   pixels.setPixelColor(0,0,0,0,0); // alle aus | ||||||
|  |   pixels.setPixelColor(1,0,0,0,0); | ||||||
|  |   pixels.show();                 // und anzeigen | ||||||
|  |  | ||||||
|  |   //------------ WLAN initialisieren  | ||||||
|  |   WiFi.disconnect(); | ||||||
|  |   WiFi.persistent(false); | ||||||
|  |   WiFi.mode(WIFI_STA); | ||||||
|  |   delay(100); | ||||||
|  |   Serial.print ("\nWLAN connect to:"); | ||||||
|  |   Serial.print("WLAN-24"); | ||||||
|  |   WiFi.begin("WLAN-24","111111111"); | ||||||
|  |   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; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |   Wire.setClock(100000L);            // 100 kHz SCD30  | ||||||
|  |   Wire.setClockStretchLimit(200000L);// CO2-SCD30 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void loop() { // Kontinuierliche Wiederholung  | ||||||
|  |   CO2 = airSensorSCD30.getCO2() ; | ||||||
|  |   TEMP = iaqSensor.temperature ; | ||||||
|  |   LUFTDRUCK = (iaqSensor.pressure/100.) ; | ||||||
|  |   FEUCHTE = iaqSensor.humidity ; | ||||||
|  |   mqttreconnect(); | ||||||
|  |   { | ||||||
|  |     String pay=String(String(CO2)); | ||||||
|  |     mqttclient.publish("Octopus/CO2",pay.c_str()); | ||||||
|  |     Serial.print("\nmqtt publish: ");  | ||||||
|  |     Serial.print(pay); | ||||||
|  |   }; | ||||||
|  |   mqttreconnect(); | ||||||
|  |   { | ||||||
|  |     String pay=String(String(TEMP)); | ||||||
|  |     mqttclient.publish("Octopus/Temp",pay.c_str()); | ||||||
|  |     Serial.print("\nmqtt publish: ");  | ||||||
|  |     Serial.print(pay); | ||||||
|  |   }; | ||||||
|  |   mqttreconnect(); | ||||||
|  |   { | ||||||
|  |     String pay=String(String(LUFTDRUCK)); | ||||||
|  |     mqttclient.publish("Octopus/Luftdruck",pay.c_str()); | ||||||
|  |     Serial.print("\nmqtt publish: ");  | ||||||
|  |     Serial.print(pay); | ||||||
|  |   }; | ||||||
|  |   mqttreconnect(); | ||||||
|  |   { | ||||||
|  |     String pay=String(String(FEUCHTE)); | ||||||
|  |     mqttclient.publish("Octopus/Feuchte",pay.c_str()); | ||||||
|  |     Serial.print("\nmqtt publish: ");  | ||||||
|  |     Serial.print(pay); | ||||||
|  |   }; | ||||||
|  |   Serial.print("CO2:"+String(String(CO2))); | ||||||
|  |   Serial.println(); | ||||||
|  |   matrix7Seg.print(TEMP); | ||||||
|  |   matrix7Seg.writeDigitNum(0,1,true); | ||||||
|  |   matrix7Seg.writeDisplay(); | ||||||
|  |   delay( 2000 ); | ||||||
|  |   matrix7Seg.print(LUFTDRUCK); | ||||||
|  |   matrix7Seg.writeDigitNum(0,2,true); | ||||||
|  |   matrix7Seg.writeDisplay(); | ||||||
|  |   delay( 2000 ); | ||||||
|  |   matrix7Seg.print(FEUCHTE); | ||||||
|  |   matrix7Seg.writeDigitNum(0,3,true); | ||||||
|  |   matrix7Seg.writeDisplay(); | ||||||
|  |   delay( 2000 ); | ||||||
|  |   matrix7Seg.print(CO2); | ||||||
|  |   matrix7Seg.writeDisplay(); | ||||||
|  |   if (( ( CO2 ) < ( 1000 ) )) | ||||||
|  |   { | ||||||
|  |     Serial.print("green"); | ||||||
|  |     Serial.println(); | ||||||
|  |     pixels.setPixelColor(0,0,30,0,0); | ||||||
|  |     pixels.show(); | ||||||
|  |     pixels.setPixelColor(1,0,30,0,0); | ||||||
|  |     pixels.show(); | ||||||
|  |   } | ||||||
|  |   else | ||||||
|  |   { | ||||||
|  |     if (( ( CO2 ) < ( 1400 ) )) | ||||||
|  |     { | ||||||
|  |       pixels.setPixelColor(0,30,30,0,0); | ||||||
|  |       pixels.show(); | ||||||
|  |       pixels.setPixelColor(1,30,30,0,0); | ||||||
|  |       pixels.show(); | ||||||
|  |       Serial.print("yellow"); | ||||||
|  |       Serial.println(); | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |       pixels.setPixelColor(0,40,0,0,0); | ||||||
|  |       pixels.show(); | ||||||
|  |       pixels.setPixelColor(1,40,0,0,0); | ||||||
|  |       pixels.show(); | ||||||
|  |       Serial.print("red"); | ||||||
|  |       Serial.println(); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |   delay( 6000 ); | ||||||
|  | } //end loop | ||||||
| @@ -23,10 +23,10 @@ | |||||||
| * https://www.umwelt-campus.de/forschung/projekte/iot-werkstatt/ideen-zur-corona-krise | * https://www.umwelt-campus.de/forschung/projekte/iot-werkstatt/ideen-zur-corona-krise | ||||||
| * WICHTIG Kalibrierung des Sensor https://www.youtube.com/watch?v=od_XsBE6hU4 | * WICHTIG Kalibrierung des Sensor https://www.youtube.com/watch?v=od_XsBE6hU4 | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Joachim Hummel
					Joachim Hummel