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 | ||||
| * WICHTIG Kalibrierung des Sensor https://www.youtube.com/watch?v=od_XsBE6hU4 | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Joachim Hummel
					Joachim Hummel