2025-11-1002 Software Error bei I2C beseitig

This commit is contained in:
2025-11-10 16:04:20 +01:00
parent c831a1fe72
commit d21a0c0192
3 changed files with 250 additions and 117 deletions

View File

@@ -1,25 +1,16 @@
#include "Wire.h"
//#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#define Anzahl_Sensoren_BME280 2 // Mögliche Werte: '0','1','2'
//#define Korrektur_Luftdruck KorrekturLuftdruck // Korrekturwert um Abweichungen zu offiziellen Wetterstationen auszugleichen
//----------------------------------------------------------------
// Konfiguration BME280 - Temperatur und Luftfeuchte
//----------------------------------------------------------------
#include "Adafruit_Sensor.h"
#include "Adafruit_BME280.h"
uint8_t BME280_adresse[2] = {0x76, 0x77};
#define I2C_SDA 33
#define I2C_SCL 32
#define SEALEVELPRESSURE_HPA (1013.25f)
//----------------------------------------------------------------
#define SEALEVELPRESSURE_HPA (1013.25)
const float No_Val = 999.99;
float Temp[2] = {No_Val, No_Val};
float Feuchte[2] = {No_Val, No_Val};
float L_Druck[2] = {No_Val, No_Val};
float Temp = No_Val;
float Feuchte = No_Val;
float L_Druck = No_Val;
struct {
char temperature[15] = {0};
@@ -28,55 +19,33 @@ struct {
char humity[15] = {0};
} BME280Data;
TwoWire I2CBME = TwoWire(0);
Adafruit_BME280 my_bme;
void Sensor_BME280() {
if (Anzahl_Sensoren_BME280 > 0) {
float Temperatur_BME;
float Luftfeuchte_BME;
float Luftdruck_BME;
boolean check;
TwoWire I2CBME = TwoWire(1);
Adafruit_BME280 bme;
I2CBME.begin(I2C_SDA, I2C_SCL, 100000);
unsigned long delayTime;
for (byte i = 0; i < Anzahl_Sensoren_BME280; i++) {
Serial.println(BME280_adresse[i]);
delay(5000);
check = my_bme.begin(BME280_adresse[i], &I2CBME); // I2C Adresse
delay (100); // time to get system ready
if (check) { // if bme ok
Temperatur_BME = my_bme.readTemperature();
Luftfeuchte_BME = my_bme.readHumidity();
Luftdruck_BME = my_bme.readPressure();
Luftdruck_BME = (Luftdruck_BME/100) + KorrekturLuftdruck;
//Luftdruck_BME = 220;
Serial.print("Temperature (BME280):\t\t");
Serial.print(Temperatur_BME);
Serial.println(" °C");
Serial.print("Luftfeuchtigkeit (BME280):\t");
Serial.print(Luftfeuchte_BME);
Serial.println(" %");
Serial.print("Luftdruck (BME280):\t\t");
Serial.print(Luftdruck_BME);
Serial.println(" hPa");
}
else {
Temperatur_BME = No_Val;
Luftfeuchte_BME = No_Val;
Luftdruck_BME = No_Val;
Serial.println(" KEIN BME 280 Gefunden !!!!");
void Init_BME280() {
Serial.begin(115200);
Serial.println(F("BME280 test"));
I2CBME.begin(I2C_SDA, I2C_SCL, 100000);
bool status;
// default settings
// (you can also pass in a Wire library object like &Wire2)
status = bme.begin(0x76, &I2CBME);
if (!status) {
Serial.println("Could not find a valid BME280 sensor, check wiring!");
} else {Serial.println("BME280 Ok");
}
if (i == 0) { // erster BME
Temp[0] = Temperatur_BME; // Hier kann die Zuordnung der Sensoren geändert werden
Feuchte[0] = Luftfeuchte_BME; // Hier kann die Zuordnung der Sensoren geändert werden
L_Druck[0] = Luftdruck_BME;
}
if (i == 1) { // zweiter BME
Temp[1] = Temperatur_BME; // Hier kann die Zuordnung der Sensoren geändert werden
Feuchte[1] = Luftfeuchte_BME; // Hier kann die Zuordnung der Sensoren geändert werden
L_Druck[1] = Luftdruck_BME;
}
}
}
}
void Read_BME280(){
Temp = bme.readTemperature();
Temp = Temp + BME_Korrectur;
L_Druck = bme.readPressure();
L_Druck = L_Druck + KorrekturLuftdruck;
Feuchte = bme.readHumidity();
}

View File

@@ -8,7 +8,7 @@
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html
[env:nodemcu-32s]
[env]
platform = espressif32
board = nodemcu-32s
framework = arduino
@@ -21,8 +21,6 @@ build_flags =
-DDEBUG
-DHELLIGKEIT
-DNoDebugCO2
-DHTU_Korrectur=-3.15
-DKorrekturLuftdruck=0.00
lib_deps =
knolleary/PubSubClient @ 2.8
;adafruit/Adafruit GFX Library @ 1.10.4
@@ -30,10 +28,41 @@ lib_deps =
2dom/PxMatrix LED MATRIX library @ 1.8.2
;adafruit/Adafruit BusIO @ 1.7.2
adafruit/Adafruit BusIO @ 1.16.1
;adafruit/Adafruit HTU21DF Library @ 1.0.5
adafruit/Adafruit HTU21DF Library @ 1.0.5
adafruit/Adafruit BME280 Library @ 2.2.4
adafruit/Adafruit Unified Sensor @ 1.1.14
[env:debug] ; Entwicklungssystem
build_flags = ${env.build_flags}
-DDEBUG=1
-DGRENZWERT=3.70
-DSTASSID=\"MagentaWLAN-RGDO\"
-DSTAPSK=\"93329248424922704583\"
-DGATEWAY=\"192.168.127.1\"
-DCO2Wert=\"hjk/devices/257923/telemetry/co2\"
-DAKKU=\"hjk/devices/WETTERSTATION/telemetry/battery\"
-DWETTER=\"hjk/devices/WETTERSTATION/telemetry/temperature_Htu_21\"
-DLUFTDRUCK=\"hjk/devices/WETTERSTATION/telemetry/pressure\"
-DFEUCHTIGKEIT=\"hjk/devices/WETTERSTATION/telemetry/humity\"
-DHELL=\"hjk/devices/WETTERSTATION/telemetry/Lux\"
-DHTU_Korrectur=0.00
-DBME_Korrectur=-2.30
-DKorrekturLuftdruck=0.00
[env:hjk] ; Sulzfeld
build_flags = ${env.build_flags}
-DCO2Wert=\"hjk/devices/257923/telemetry/co2\"
-DAKKU=\"hjk/devices/WETTERSTATION/telemetry/battery\"
-DWETTER=\"hjk/devices/WETTERSTATION/telemetry/temperature_Htu_21\"
-DLUFTDRUCK=\"hjk/devices/WETTERSTATION/telemetry/pressure\"
-DFEUCHTIGKEIT=\"hjk/devices/WETTERSTATION/telemetry/humity\"
-DHELL=\"hjk/devices/WETTERSTATION/telemetry/Lux\"
-DHTU_Korrectur=0.00
-DBME_Korrectur=-1.55
-DKorrekturLuftdruck=0.00

View File

@@ -17,9 +17,10 @@
#include <Fonts/Picopixel.h>
#include <PxMatrix.h>
#include <Adafruit_HTU21DF.h>
#include <mess_BME280.h>
#include <CO2.h>
// Pins for LED MATRIX
#ifdef ESP32
@@ -51,6 +52,19 @@ Ticker display_ticker;
#endif
/* #define SDA 21
#define SCL 22
#define RX1 9
#define TX1 10 */
#define CO2_WARN_1 800
#define CO2_WARN_2 1000
#define CO2_WARN_3 1400
#define CO2_WARN_4 1500
#define CO2_WARN_5 2000
#define CO2_CRITICAL_PPM 1850
#define MaxErrCount 30
unsigned long startTime;
@@ -61,6 +75,8 @@ unsigned long endTime;
#define mqtt_port 61883
WiFiClient espClient;
PubSubClient client(espClient);
Adafruit_HTU21DF htu = Adafruit_HTU21DF();
#define matrix_width 64
@@ -101,7 +117,7 @@ u_int16_t EndederAbdunklung = 7;
// Wifi
char ssid[] = "MagentaWLAN-RGDO"; // your network SSID (name)
char pass[] = "93329248424922704583"; // your network password
IPAddress ip( 192, 168, 127, 53);
IPAddress ip( 192, 168, 127, 52);
IPAddress gateway( 192, 168, 127, 1 );
IPAddress subnet( 255, 255, 255, 0 );
IPAddress dns1(192, 168, 127, 1); // DNS-Server 1
@@ -158,22 +174,14 @@ const char* mqtt_server = "hjkmqtt.dedyn.io";
char topic_0[50];
char msg[20];
char clientName[30];
/* const char* topic_1 = "hjk/devices/WETTERSTATIONMARCEL/telemetry/temperature"; // Wohnzimmer 3933178
const char* topic_Flur = "hjk/devices/267014/telemetry/temperature"; // Flur
const char* topic_3 = "hjk/devices/11277819/telemetry/temperature"; // Büro 11277819 */
/* const char* topic_ZeitStart = "hjk/devices/DisplayMarcel/telemetry/Start";
const char* topic_ZeitEnde = "hjk/devices/DisplayMarcel/telemetry/Ende";
const char* topic_Hell = "hjk/devices/DisplayMarcel/telemetry/Hell";
const char* topic_Dunkel = "hjk/devices/DisplayMarcel/telemetry/Dunkel"; */
//const char* topic_Co2 = "hjk/devices/257923/telemetry/co2"; // Co2 Sensor
const char* topic_Hell = "hjk/devices/DisplayMarcel/telemetry/Lux";
const char* topic_Covid = "hjk/devices/Covid19/telemetry/Covid19";
const char* topic_Wetter = "hjk/devices/WETTERSTATIONMARCEL/telemetry/temperature_Htu_21";
const char* topic_Pressure = "hjk/devices/WETTERSTATIONMARCEL/telemetry/pressure";
const char* topic_Luftfeuchtigkeit = "hjk/devices/WETTERSTATIONMARCEL/telemetry/humity";
const char* topic_Akku = "hjk/devices/WETTERSTATIONMARCEL/telemetry/battery";
const char* topic_Wetter = WETTER;
const char* topic_Pressure = LUFTDRUCK;
const char* topic_Luftfeuchtigkeit = FEUCHTIGKEIT;
const char* topic_Akku = AKKU;
const char* topic_Co2 = CO2Wert;
const char* topic_Helligkeit = "hjk/devices/DisplayMarcel/telemetry/Lux";
const char* topic_Helligkeit = HELL;
void callback(char* topic1, byte* payload, unsigned int length);
//void ZeigeZeit(int xPos);
@@ -316,6 +324,16 @@ void callback(char* topic1, byte* payload, unsigned int length) {
#endif
akku = atof(msg);
}
#ifdef CO2Wert
// CO2 Wert vom Sensor
if(strcmp(topic1, topic_Co2)== 0){
Serial.print("Co2 Sensor !!!: ");
Serial.print(msg);
Serial.println();
Co2 = atoi(msg);
}
#endif
}
void reconnect() {
sprintf(clientName, "%s%s", "Uhr", "_Zentrale" );
@@ -325,15 +343,12 @@ void reconnect() {
if (client.connect(clientName)) {
/* MQTTStatus.setPic(3); */
Serial.println("connected");
/* client.subscribe(topic_Co2); */
client.subscribe(topic_Co2);
client.subscribe(topic_Covid);
client.subscribe(topic_Wetter);
client.subscribe(topic_Pressure);
client.subscribe(topic_Luftfeuchtigkeit);
client.subscribe(topic_Helligkeit);
/* client.subscribe(topic_Dunkel);
client.subscribe(topic_ZeitEnde);
client.subscribe(topic_ZeitStart); */
client.subscribe(topic_Akku);
} else {
Serial.print("failed, rc=");
@@ -398,9 +413,9 @@ void ZeigeCO(int xPos = 1, int yPos = 19)
if (yPos < 19) yPos = 19;
if (Co2 > 300.00){
char szCO[10];
sprintf(szCO, "%4d", CO2Wert);
/* sprintf(szCO, "%4d", CO2Wert);
Serial.print("CO = "); Serial.println(szCO);
display.setCursor(xPos, yPos);
display.setCursor(xPos, yPos); */
display.setFont();
switch (Co2){
case 0 ... CO2_WARN_1 -1: {
@@ -531,13 +546,14 @@ void ZeigeInnenFeuchtigkeit(float Luftfeuchtigkeit){
void ZeigeInnenCO(int Co2){
char szWetter[15];
display.fillRect(0, 34-10, 64, 8, myBLACK);
Serial.println(Co2);
if (Co2 > 0)
{
sprintf(szWetter, "%5d", CO2Wert);
//Serial.print("CO = "); Serial.println(Co2);
sprintf(szWetter, "%5d", Co2);
Serial.print("CO = "); Serial.println(Co2);
display.setFont();
display.setCursor(1, 35-10);
switch (CO2Wert){
switch (Co2){
case 400 ... CO2_WARN_1: {
display.setTextColor(myGREEN);
break;
@@ -571,7 +587,7 @@ void ZeigeInnenCO(int Co2){
display.setFont(0);
display.print(szWetter);
display.setFont(&Picopixel);
display.setCursor(45, 35-10+5);
display.setCursor(47, 35-10+5);
display.print("ppm");
display.setFont(0);
}
@@ -633,7 +649,7 @@ void BlinkSec(bool blink){
}
}
/* void readHtu(){
void readHtu(){
if (!NOHTU){
FeuchteInnen = htu.readHumidity();
TemparaturInnen = htu.readTemperature();
@@ -643,7 +659,7 @@ void BlinkSec(bool blink){
FeuchteInnen = 20.00;
TemparaturInnen = 30.00;
}
} */
}
void Test()
{
@@ -657,14 +673,15 @@ void Test()
void setup() {
startTime = millis();
Serial.begin(115200);
Sensor_BME280();
;
Serial.println(Temp[0]);
if (!htu.begin()) {
Serial.println("Couldn't find sensor!");
NOHTU = true;
delay(500);
delay(10000);
beginC02();
}
readHtu();
Init_BME280();
delay(5000);
WiFi.mode( WIFI_OFF );
// WiFi.forceSleepBegin();
delay( 10 );
@@ -674,21 +691,59 @@ void setup() {
// Define your display layout here, e.g. 1/8 step, and optional SPI pins begin(row_pattern, CLK, MOSI, MISO, SS)
display.begin(16); // Rows-scan pattern 1/32
//display.begin(8, 14, 13, 12, 4);
// Define multiplex implemention here {BINARY, STRAIGHT} (default is BINARY)
//display.setMuxPattern(BINARY);
// Set the multiplex pattern {LINE, ZIGZAG,ZZAGG, ZAGGIZ, WZAGZIG, VZAG, ZAGZIG} (default is LINE)
// display.setScanPattern(LINE);
// Rotate display
//display.setRotate(true);
// Flip display
//display.setFlip(true);
// Control the minimum color values that result in an active pixel
//display.setColorOffset(5, 5,5);
// Set the multiplex implemention {BINARY, STRAIGHT} (default is BINARY)
//display.setMuxPattern(BINARY);
// Set the color order {RRGGBB, RRBBGG, GGRRBB, GGBBRR, BBRRGG, BBGGRR} (default is RRGGBB)
display.setColorOrder(RRBBGG);
// Set the time in microseconds that we pause after selecting each mux channel
// (May help if some rows are missing / the mux chip is too slow)
//display.setMuxDelay(0,1,0,0,0);
// Set the number of panels that make up the display area width (default is 1)
//display.setPanelsWidth(2);
// Set the brightness of the panels (default is 255)
//display.setBrightness(50);
display.setBrightness(255);
display.clearDisplay();
// Set driver chip type
//display.setDriverChip(FM6124);
/* display.setTextColor(myRED);
display.setTextColor(myRED);
display.setCursor(0,0);
display.print("Pixel");
display.setTextColor(myGREEN);
display.setCursor(30,0);
display.print("Time");
//----------------------
/* display.setTextColor(myBLUE);
display.setCursor(2,50);
display.print("Pixel");
display.setTextColor(myYELLOW);
display.setCursor(30,50);
display.print("Time"); */
display_update_enable(true);
delay(5000);
//delay(5000);
//--------------------------------------------------
//--------------------------------------------------
@@ -862,6 +917,20 @@ static void setup_wifi() {
client.setCallback(callback);
Serial.print("IP address: \t");
Serial.println(WiFi.localIP());
/* Serial.begin(115200);
Serial.print("Connecting to: ");
Serial.println(ssid);
WiFi.begin(ssid, pass);
while(WiFi.status() != WL_CONNECTED){
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.print("IP-Address of ESP8266 module: ");
Serial.println(WiFi.localIP()); */
}
@@ -879,6 +948,7 @@ void loop() {
{
lastTime = millis();
blinkSek = !blinkSek;
//ZeigeTestTime(timeinfo);
ZeigeZeit(timeinfo,1,8);
if (akku < 2.85)
@@ -886,19 +956,19 @@ void loop() {
AkkuAlarm();
}
if ((timeinfo.tm_sec % 30) == 0)
/* if ((timeinfo.tm_sec % 30) == 0)
{
if (readCo2Flag == true) //eadCo2Flag
{
CO2Wert = readCO2();
CO2Wert = Co2;
Serial.print("CO = \t"); Serial.println(CO2Wert);
readCo2Flag = false;
}
}else{
readCo2Flag = true;
}
} */
/* if ((timeinfo.tm_min % 2) == 0)
if ((timeinfo.tm_min % 2) == 0)
{
if (readHtuFlag == true)
{
@@ -907,15 +977,26 @@ void loop() {
}
}else{
readHtuFlag = true;
}
Read_BME280();
/* if ((timeinfo.tm_hour >= StartderAbdunklung) && timeinfo.tm_hour < EndederAbdunklung)
{
display.setBrightness(dunkel);
#ifdef HELLIGKEIT
Serial.printf("Die Helligkeit wird von %0d Uhr bis %0d Uhr auf %00d reduziert\n", StartderAbdunklung, EndederAbdunklung, dunkel);
#endif
} else
{
display.setBrightness(hell);
} */
switch (timeinfo.tm_sec)
{
case 0 ... 14:
{
//ZeigeInnenTemp(TemparaturInnen);
ZeigeTemperatur(TemparaturInnen, myGREEN);
ZeigeInnenFeuchtigkeit(FeuchteInnen);
ZeigeInnenCO(CO2Wert);
ZeigeTemperatur(Temp, myGREEN);
ZeigeInnenFeuchtigkeit(Feuchte);
ZeigeInnenCO(Co2);
break;
}
case 15 ... 29:
@@ -928,10 +1009,9 @@ void loop() {
}
case 30 ... 44:
{
//ZeigeInnenTemp(TemparaturInnen);
ZeigeTemperatur(TemparaturInnen, myGREEN);
ZeigeInnenFeuchtigkeit(FeuchteInnen);
ZeigeInnenCO(CO2Wert);
ZeigeTemperatur(Temp, myGREEN);
ZeigeInnenFeuchtigkeit(Feuchte);
ZeigeInnenCO(Co2);
break;
}
case 45 ... 59:
@@ -943,12 +1023,61 @@ void loop() {
break;
}
}
//ZeigeLuftdruck(Pressure);
/* if (Aussentemp > -99.9){
scroll_text(matrix_height-8,30,"Luftdruck: " + String(Pressure) + " hPa", 30,30,30, true);
char szWetter[10];
dtostrf(Aussentemp, 4, 1, szWetter);
//Serial.print(Aussentemp); Serial.print(" "); Serial.println(szWetter);
scroll_Grad(matrix_height-8,30,"Aussentemperatur: " + String(szWetter), 64,64,64, true);
dtostrf(Luftfeuchtigkeit, 4, 1, szWetter);
scroll_text(matrix_height-8,30,"Luftfeuchtigkeit: " + String(szWetter) + " %", 48,48,48, true);
} */
//ZeigeZeit(timeinfo, TimeX, TimeY);
//ZeigeZeit(timeinfo, 1,40);
/* ZeigeCO(1,CoY);
if ((timeinfo.tm_min % 10) == 0){
if (Covid19 != 0){
scroll_text(matrix_height-8,20,"Landkreis Heilbronn", 30,30,30, true);
if (Covid19 <= 500){
// ------------------------------------ \204 für ä
scroll_text(matrix_height-8,25,"Covid 19 F\204lle in den letzte 7 Tage pro 100000 EW: " + String(Covid19, 1), 40,40,40, true);
} else if (Covid19 <= 1000){
// ------------------------------------ \204 für ä
scroll_text(matrix_height-8,25,"Covid 19 F\204lle in den letzte 7 Tage pro 100000 EW: " + String(Covid19, 1), 64,64,0, true);
} else {
// ------------------------------------ \204 für ä
scroll_text(matrix_height-8,25,"Covid 19 F\204lle in den letzte 7 Tage pro 100000 EW: " + String(Covid19, 1), 64,0,0, true);
}
}
} else {
if (Aussentemp > -99.9){
scroll_text(matrix_height-8,30,"Luftdruck: " + String(Pressure) + " hPa", 30,30,30, true);
char szWetter[10];
dtostrf(Aussentemp, 4, 1, szWetter);
//Serial.print(Aussentemp); Serial.print(" "); Serial.println(szWetter);
scroll_Grad(matrix_height-8,30,"Aussentemperatur: " + String(szWetter), 64,64,64, true);
dtostrf(Luftfeuchtigkeit, 4, 1, szWetter);
scroll_text(matrix_height-8,30,"Luftfeuchtigkeit: " + String(szWetter) + " %", 48,48,48, true);
}
}
//scroll_text(matrix_height-16,20,"Temperatur: " + String(Wetter,1) +" °C", 128,30,30, true);
/* scroll_text2(matrix_height-24,20,"Liebe Frunde, liebe Nachbarn,", 128,128,0, true);
scroll_text2(matrix_height-24,20,"ich w\201nsche Euch allen ein", 128,128,0, true);
scroll_text2(matrix_height-24,20,"Frohes neues Jahr 2022.", 128,255,0, true); */
//ZeigeWetter(double(FlurTemp), WetterY,WetterX);
}
client.loop();
}
bool getNTPtime(int sec) {
{
uint32_t start = millis();
do {
time(&now);
@@ -957,6 +1086,12 @@ bool getNTPtime(int sec) {
delay(10);
} while (((millis() - start) <= (1000 * sec)) && (timeinfo.tm_year < (2016 - 1900)));
if (timeinfo.tm_year <= (2016 - 1900)) return false; // the NTP call was not successful
//Serial.print("now "); Serial.println(now);
/* char time_output[30];
strftime(time_output, 30, "%a %d-%m-%y %T", localtime(&now));
Serial.println(time_output);
Serial.println(); */
}
return true;
}