[gelöst] Über einen Arduino mit Mysensors DHT22 Werte einsammeln

Begonnen von tfriedrich85, 15 Februar 2022, 13:37:28

Vorheriges Thema - Nächstes Thema

tfriedrich85

Hallo,

ich versuche seit Tagen DHT Sensoren die sternförmig verkabelt sind mittels eines Arduino uno mit EternetShield W5100 die Sensorwerte von 5 DHT 22 Temperatursenoren einzusammeln und per MQTT an den Fhem MQTT Broker zu schicken. Aber das zusammenbauen der verschiedenen komponenten in einem Arduino Sketch will nicht gelingen.

Nach einigen versuchen ohne Framework, bin ich auf MySensors gestoßen. Allerdings ist der Plan die DHT Sensoren direkt an den Arduino anzuschließen, sodass die Sensoren "Nodes" direkt mit dem Gateway verbunden sind geht das? Ist das sinnvoll?

Im Zielzustand möchte ich das 1 Arduino Uno MQTT Nachrichten mit allen DHT Sensorwerten der 5 DHT Sensoren verschickt, die der Raspberry auf dem der Fhem MQTT Broker läuft, verschickt. Welche Lösung könnt ihr hier empfehlen?


Könnt ihr mir einen Arduino Sketch oder ähnliches empfehlen? Vielen Dank

Beta-User

Für ein Einsteigerprojekt klingt das ziemlich anspruchsvoll...

Wenn du keine externen "Satelliten" anbinden willst und auch die speziellen features (heartbeat etc.) aus dem MySensors-framework nicht nutzen willst, bist du vermutlich besser beraten, das ohne das framework zusammenzuschustern - Netzwerkanbindung und MQTT-publish sollte grade so mit dem ATMega328 zu machen sein (aber ohne user/passwort, was früher oder später zu Problemen führen wird, weil mosquitto nicht mehr ohne weiteres anonyme Publishes zulässt).

Falls es etwas einfacher gestrickt sein darf, wäre ggf. eine UDP-keyValueProtocol-Lösung vermutlich einfacher zu realisieren.

In jedem Fall müßtest du als erstes mal einen Sketch haben, der die Werte aller Sensoren mit dem passenden Timing ausliest, und dann z.B. erst mal an die serielle Schnittstelle anliefert... Klappt denn wenigstens das?
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

KarlHeinz2000

Bei mir läuft noch ein DHT22 Sensor in einem Funk-Node. Basis müsste von der MySensor Seite sein. Wie schon geschrieben, erst mal einen Sensor mit serieller Ausgabe testen. Dann ggfs weitere Sensoren dazu. Entweder jeweils über 2 eigene VCC und Data Pins, oder VCC für jeden Sensor einzeln schalten und alle Data auf einen Pin zusammen. Probieren... Und bei der Kabellänge zu den Sensoren wäre ich auch vorsichtig. Weiß nicht wie viel da störungsfrei geht.
Spannung sollte >3,6V(?) sein. Bei 3,3V hatten die Messwerte bei mir einen großen Fehler, funktionieren aber grundsätzlich. Und draußen gehen die Teile zeimlich schnell kaputt. Ich bin davon weg und verbaue nur noch SHT31. In meinen Augen das beste. Auch die BME280 sind nix für draußen.


/*
v12 RFM69 support

*/


#define sketchName "TempHum Heizoel"      //DHT22NC
#define sketchVersion "1.2"

//#define DEBUG 1
#define MY_DEBUG

#define MY_NODE_ID 103 // id of the node
//#define MY_PARENT_NODE_ID 55
//#define MY_PARENT_NODE_IS_STATIC
//#define MY_SMART_SLEEP_WAIT_DURATION_MS 500

// ++++++++++++++ NRF24 +++++++++++++++++
//#define MY_RADIO_NRF24


// ++++++++++++++ RFM69 +++++++++++++++++
#define MY_RADIO_RFM69

#define MY_OTA_FIRMWARE_FEATURE
#define MY_OTA_FLASH_SS 8               //muss D8 sein, da der BL auf D8 steht!
#define MY_OTA_FLASH_JDECID (0x1f84)

#define MY_RFM69_NEW_DRIVER
#define MY_IS_RFM69HW
//#define MY_DEBUG_VERBOSE_RFM69
//#define MY_DEBUG_VERBOSE_RFM69_REGISTERS
//#define MY_RFM69_RST_PIN (9)


#include <SPI.h>
#include <MySensors.h>
#include <DHT22NC.h>


#define CHILD_ID_HUM 0
#define CHILD_ID_TEMP 1
#define CHILD_ID_VOLT 2
#define CHILD_ID_MSG 3

#define DHT_DATA_PIN 3
#define DHT_PWR_PIN 7//8

//Massepfad für Batterie-Spannungsteiler
#define ADC_Divider 4             // Digital Out: Massepfad für Spannungsteiler D4

unsigned long SLEEP_TIME = 180000;      // Zeit zwischen Messungen (in milliseconds)
unsigned long SLEEP_TIME_REPEAT= 180000;//Zeit zw Messungen, wenn es Probleme beim Senden gab

// Send time limits
#define TIME_MAX_REPEAT 3600000 // Maximum time to send values, even if not changed

DHT22NC myDHT22(DHT_DATA_PIN); // Setup the DHT

float lastTemp, diff_Temp;
float lastHum, diff_Hum;
bool metric = true;
uint16_t SLEEP_CNT;
uint16_t LOST_CNT, LOST_CNT_last;

MyMessage msgHum(CHILD_ID_HUM, V_HUM);
MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
MyMessage msgVolt(CHILD_ID_VOLT, V_VOLTAGE);
MyMessage msgMSG_ID(CHILD_ID_MSG, V_ID);


void setup()
{
  pinMode(DHT_PWR_PIN, OUTPUT);     //DHT VCC
  digitalWrite(DHT_PWR_PIN, LOW);   //DHT aus
}


void presentation()  {
  // Send the sketch version information to the gateway and Controller
  sendSketchInfo(sketchName, sketchVersion);

  // Register all sensors to gateway (they will be created as child devices)
  present(CHILD_ID_VOLT, S_MULTIMETER);
  present(CHILD_ID_MSG, S_CUSTOM);
  present(CHILD_ID_TEMP, S_TEMP);
  present(CHILD_ID_HUM, S_HUM);

}


void loop()
{
  digitalWrite(DHT_PWR_PIN, HIGH);   //DHT ein, schon hier, da 2sec Hochlaufzeit

  /////////////////////////// Batteriespanngsmessung //////////////////////////////

  pinMode(ADC_Divider, OUTPUT); //Spannungsteiler (Massepfad) Bat Messung
  digitalWrite(ADC_Divider, LOW); // Spannungsteiler Bat Messung anschalten

  float batteryV = (readVcc());
  batteryV = batteryV / 1000;

  pinMode(ADC_Divider, INPUT); //Spannungsteiler (Massepfad) Bat Messung abschalten

  //////////////////////////////// DHT22 lesen ////////////////////////////////////


  DHT22_ERROR_t errorCode;

  wait(2000); //DHT Hochlaufzeit

  errorCode = myDHT22.readData(); // read data from sensor

  if (errorCode == DHT_ERROR_NONE) { // data is good

    float temperature = (myDHT22.getTemperatureC()); // Get temperature reading
    float humidity = (myDHT22.getHumidity());        // Get humidity reading

    digitalWrite(DHT_PWR_PIN, LOW);                //DHT vor Senden aus
    pinMode(DHT_DATA_PIN, INPUT);     //
    digitalWrite(DHT_DATA_PIN, LOW);          //interne Pullups AUS

    diff_Hum = humidity - lastHum;
    diff_Temp = temperature - lastTemp;

    if (((SLEEP_CNT * SLEEP_TIME) > TIME_MAX_REPEAT) || ((abs(diff_Hum) > 0.5) || (abs(diff_Temp) > 0.1) ))
    {
      SLEEP_CNT = 0;

      /////// SENDEN   ///////////////////


      if (!send(msgVolt.set(batteryV, 3))) {
        LOST_CNT++;
      }
      wait(50);

      if (!send(msgTemp.set(temperature, 1))) {
        LOST_CNT++;
      }
      wait(50);

      if (!send(msgHum.set(humidity, 1))) {
        LOST_CNT++;
      }
      wait(50);

      /////////////////////////// LOST_CNT /////////////////////////////

      if (!send(msgMSG_ID.set(LOST_CNT, 0))) {
        LOST_CNT++;
      }


      lastHum = humidity;
      lastTemp = temperature;

#if DEBUG>0
      Serial.print("T: ");
      Serial.println(temperature);

      Serial.print("H: ");
      Serial.println(humidity);

      Serial.print("Lost CNT: ");
      Serial.println(LOST_CNT);

      Serial.print("Bat: ");
      Serial.println(batteryV);
#endif
    }
  }

  else
  {
#if DEBUG>0
    Serial.println("DHT Fehler");
#endif
  }


  digitalWrite(DHT_PWR_PIN, LOW);                //DHT aus
  pinMode(DHT_DATA_PIN, INPUT);     //
  digitalWrite(DHT_DATA_PIN, LOW);          //interne Pullups AUS


  /////////////////////////// Schlafen /////////////////////////////

  //Bei Problmen beim Senden die Sleep Time reduzieren
  if (LOST_CNT != LOST_CNT_last) {
    LOST_CNT_last = LOST_CNT;

#if DEBUG > 0
    Serial.print("Sleep time kurz: ");
    Serial.println(SLEEP_TIME_REPEAT);
#endif

    sleep(SLEEP_TIME_REPEAT, true);
  }


  //Senden war problemlos
  else {
    LOST_CNT_last = LOST_CNT; //nur falls es Überlauf gab

#if DEBUG > 0
    Serial.print("Sleep time normal: ");
    Serial.println(SLEEP_TIME);
#endif

    sleep(SLEEP_TIME, true);
  }

  /////////////////////////////////////////////////////////////////////

  //  wieder aufgewacht
  //wird für Sendeintervall benötigt, da millis() während sleep nicht läuft
  SLEEP_CNT++;

}

//--------------------------------------------------------------------------------------------------
// Read current supply voltage
//--------------------------------------------------------------------------------------------------
#define BATTERY_NUM_MESS_ADC              16        //Anzahl Messungen für Mittelwert
#define BATTERY_DUMMY_NUM_MESS_ADC        4        //diese Anzahl Messungen zu Beginn wird verworfen
#define AVR_BANDGAP_VOLTAGE               1100UL   // Band gap reference for Atmega328p

uint16_t readVcc() {
  // uint16_t adcValue = 0;
  bitClear(PRR, PRADC); ADCSRA |= bit(ADEN); // Enable the ADC
  uint32_t result = 0;
  // Read 1.1V reference against Vcc

  //  ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);  // For ATmega328
  ADMUX = _BV(REFS1) | _BV(REFS0);  // For ATmega328 für direkte Batt Messung an ADC0 mit R-Teiler


  for (int i = 0; i < BATTERY_NUM_MESS_ADC + BATTERY_DUMMY_NUM_MESS_ADC; i++) {
    ADCSRA |= (1 << ADSC);                                   // start conversion
    while (ADCSRA & (1 << ADSC)) {}                          // wait for conversion complete

    if (i >= BATTERY_DUMMY_NUM_MESS_ADC) {                   // we discard the first dummy measurements
      result += ADCW;
    }
  }
  //result = (result * (715 + 2000) / 715 * 1100 / 1024) / BATTERY_NUM_MESS_ADC;
  result = (result * (1000 + 2000) / 1000 * 1100 / 1024) / BATTERY_NUM_MESS_ADC;

  ADCSRA &= ~ bit(ADEN); bitSet(PRR, PRADC); // Disable the ADC to save power
  return result;
}




tfriedrich85

Zitat von: Beta-User am 15 Februar 2022, 13:53:10
Für ein Einsteigerprojekt klingt das ziemlich anspruchsvoll...

Wenn du keine externen "Satelliten" anbinden willst und auch die speziellen features (heartbeat etc.) aus dem MySensors-framework nicht nutzen willst, bist du vermutlich besser beraten, das ohne das framework zusammenzuschustern - Netzwerkanbindung und MQTT-publish sollte grade so mit dem ATMega328 zu machen sein (aber ohne user/passwort, was früher oder später zu Problemen führen wird, weil mosquitto nicht mehr ohne weiteres anonyme Publishes zulässt).

Falls es etwas einfacher gestrickt sein darf, wäre ggf. eine UDP-keyValueProtocol-Lösung vermutlich einfacher zu realisieren.

In jedem Fall müßtest du als erstes mal einen Sketch haben, der die Werte aller Sensoren mit dem passenden Timing ausliest, und dann z.B. erst mal an die serielle Schnittstelle anliefert... Klappt denn wenigstens das?

Hallo Beta User,

ich hab erstmal mit einem Sketch begonnen, der mit eine IP aus dem Netzwerk holt und die Werte von 2 DHTs einsammelt, das funktioniert auch. Aber wie nun weiter in Richtung MQTT


#include <DHT.h>

#define DHTPIN3 3     // what pin we're connected the DHT output
#define DHTPIN4 4
#define DHTTYPE3 DHT22   // DHT 22
#define DHTTYPE4 DHT22   // DHT 22
DHT kueche(DHTPIN3, DHTTYPE3);
DHT bad(DHTPIN4, DHTTYPE4);

#include <Wire.h>


#include <SPI.h>
#include <Ethernet.h>

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,178, 177);

// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
EthernetServer server(80);

void setup() {
  kueche.begin(); 
  bad.begin();
 
// Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }

  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("IP Arduino is ");
  Serial.println(Ethernet.localIP());
}


void loop() {

   // Wait a few seconds between measurements.
  delay(5000);

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  delay(1000);
  float h_kueche = kueche.readHumidity();
  delay(1000);
  float t_kueche = kueche.readTemperature();
  delay(1000);
  int h_bad = bad.readHumidity();
  delay(1000);
  int t_bad = bad.readTemperature();


  // Check if any reads failed and exit early (to try again).

  //|| isnan(h_bad)|| isnan(t_bad)
  if (isnan(h_kueche) || isnan(t_kueche)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }


  Serial.println("Sensor an PIN3 - Kueche ");
  Serial.print("Humidity: ");
  Serial.print(h_kueche);
  Serial.print("%  Temperature: ");
  Serial.print(t_kueche);
  Serial.println("°C ");

  Serial.println("Sensor an PIN4 - Bad ");
  Serial.print("Humidity: ");
  Serial.print(h_bad);
  Serial.print("%  Temperature: ");
  Serial.print(t_bad);
  Serial.println("°C ");

  }

Beta-User

Es gibt für MQTT irgendwo im Wiki eine "Einführung im MQTT Teil 3", da sollte in etwa drinstehen, wie das geht.

Allerdings könntest du m.E. mehr darauf achten, dass du den "Textanteil" in deinem Sketch reduzierst und ggf. auch das "F"-Makro nutzt, um das aus dem EEPROM zu lesen. Wie viel Speicher (welcher Art) dein Sketch nutzt, sollte dir die Arduino-IDE jeweils nach dem Kompilieren zurückmelden.

Weiter würde ich dringlich anraten, das ganze in Schleifenform zu vercoden und Arrays zu benutzen. Das klingt abstrakt, ist aber nicht soooo schwierig. Vielleicht schaust du dir mal den "Multi-Relay-multi-Button"-Beispiel-Sketch  (viele PINS per Array angesprochen) oder den MySensors-DS18B20-Sketch an (zwar nur ein PIN, daran aber viele Sensoren, die der Reihe nach durchgegangen werden).

Das Verpacken nach MQTT dürfte ähnlich sein wie bei MySensors die "msg"-Konstrukte. Tendenziell würde ich das "Vertexten" nach FHEM verlegen und z.B. im Topic nur die PIN-Nummer als ein Topic-Struktur-Element einbauen.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

tfriedrich85

Hallo,

Ich hab den Code jetzt in Schleifen verpackt, dass funktioniert auch gut. Jetzt fehlt mir noch der MQTT part. Ich stöber mal durchs Wiki.

//Mehrere DHT22 mit Arduino einlesen
//Original von: http://forum.arduino.cc/index.php?topic=256451.0


#include <DHT.h>

// Uncomment whatever type you're using!
//#define DHT1TYPE DHT11   // DHT 11
//#define DHTTYPE DHT21   // DHT 21 (AM2301)
#define DHT2TYPE DHT22  // DHT 22  (AM2302)

// Connect pin 1 (on the left) of the sensor to +5V
// Connect pin 2 of the sensor to whatever your DHTPIN is
// Connect pin 4 (on the right) of the sensor to GROUND
// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor

//======================================================================
//Pins der Sensoren angeben:
#define DHT1PIN 3   // what pin we're connected to
#define DHT2PIN 4



DHT dht[] = {DHT(DHT1PIN, DHT2TYPE), DHT(DHT2PIN, DHT2TYPE)};



void setup() {
  Serial.begin(115200);
  Serial.println("DHT22 test!");
  //======================================================================
  //Sensoren starten:
  dht[0].begin();
  dht[1].begin();

 
}
//======================================================================
//======================================================================
void loop() {
  //======================================================================
  //======================================================================
  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)

  float h[2]; //Anzahl der angeschlossenen Sensoren eingeben
  float t[2]; //Anzahl der angeschlossenen Sensoren eingeben


  for (int i = 0; i < 2; i++) { //Anzahl der angeschlossenen Sensoren eingeben



    h[i] = dht[i].readHumidity();
    t[i] = dht[i].readTemperature();
    delay(2500);



    // check if returns are valid, if they are NaN (not a number) then something went wrong!
    if (isnan(t[i]) || isnan(h[i])) {
      Serial.print("Failed to read from DHT #"); Serial.println(i);
    } else {
      Serial.print("Humidity "); Serial.print(i); Serial.print(": ");
      Serial.print(h[i]);
      Serial.print(" %\t");
      Serial.print("Temperature "); Serial.print(i); Serial.print(": ");
      Serial.print(t[i]);
      Serial.println(" *C");
    }

   
  } //ENDE for Schleife
  Serial.println();
}



tfriedrich85

Zitat von: Beta-User am 16 Februar 2022, 08:05:57

Das Verpacken nach MQTT dürfte ähnlich sein wie bei MySensors die "msg"-Konstrukte. Tendenziell würde ich das "Vertexten" nach FHEM verlegen und z.B. im Topic nur die PIN-Nummer als ein Topic-Struktur-Element einbauen.

Hallo Beta - User,

ich hab meinen funktionierenden Sketch mit dem Teil 3 aus dem Fhem Wiki MQTT kombiniert, aber irgendas läuft da nicht korrekt. Mir scheint als würde der Loop Teil mittendrin abbrechen, denn die Ausgabe im Serial Monitor wird nicht komplett ausgegeben. (Siehe bild)


//Mehrere DHT22 mit Arduino einlesen
//Original von: http://forum.arduino.cc/index.php?topic=256451.0

#include <DHT.h>
#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>
#include <DHT.h>

#define DHT2TYPE DHT22  // DHT 22  (AM2302)

// Connect pin 1 (on the left) of the sensor to +5V
// Connect pin 2 of the sensor to whatever your DHTPIN is
// Connect pin 4 (on the right) of the sensor to GROUND
// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor

//======================================================================
//Pins der Sensoren angeben:
#define DHT1PIN 3   // what pin we're connected to
#define DHT2PIN 4



DHT dht[] = {DHT(DHT1PIN, DHT2TYPE), DHT(DHT2PIN, DHT2TYPE)};

//Einfügen Ethernet

byte mac[]    = {  0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED }; //eine MAC Adresse wählen, darf im eigenen Netz nur 1x vorkommen
IPAddress ip(192, 168, 178, 220); //eine gültige IP Adresse für das eigene Netz
IPAddress server(192, 168, 178, 101); //die Adresse wo der eigene MQTT Broker drauf läuft

void callback(char* topic, byte* payload, unsigned int length) {
  // handle message arrived
}

EthernetClient ethClient;
PubSubClient client(ethClient);

long lastReconnectAttempt = 0;

boolean reconnect() {
  if (client.connect("Arduino_1", "zuHause/Arduino_1", 0, true, "offline")) {
    // Once connected, publish an announcement...
    client.publish("zuHause/Arduino_1","online", true);
    // ... and resubscribe
    client.subscribe("inTopic");
  }
  return client.connected();
}

//Ende Ethernet

void setup() {
 
  client.setServer(server, 1883);
  client.setCallback(callback);
  Ethernet.begin(mac, ip);

  delay(3500);
  lastReconnectAttempt = 0;
 
   
  Serial.begin(115200);
  Serial.println("DHT22 test!");
  Serial.print("My IP address: ");
  Serial.println(Ethernet.localIP());
  //======================================================================
  //Sensoren starten:
  dht[0].begin();
  dht[1].begin();

 
}

void loop() {

unsigned long previousMillis = 0; //Zählervariable, zählt Millisekunden seit dem letzten Funktionsaufruf nach oben
const long interval = 120000; //120000 Millisekunden aka 120 Sekunden, das Interval wie oft der Sensor überhaupt benutzt wird

//Connect herstellen

if (!client.connected()) {
    long now = millis();
    if (now - lastReconnectAttempt > 5000) {
      lastReconnectAttempt = now;
      // Attempt to reconnect
      if (reconnect()) {
        lastReconnectAttempt = 0;
      }
    }
  } else {
    // Client connected

    client.loop();
  }

//----

// Werte auslesen
  for (int i = 0; i < 2; i++) { //Anzahl der angeschlossenen Sensoren eingeben
 
// Variablen Dekleration neu

static char humidity[15]; //Speicherbereich reservieren um die Fechtigkeit zu speichern
static char temperature[15];
float h[2];
float t[2];


// ende

  Serial.print(i); Serial.print(": ");
    h[i] = dht[i].readHumidity();
    t[i] = dht[i].readTemperature();
    delay(2500);
   // check if returns are valid, if they are NaN (not a number) then something went wrong!
    if (isnan(t[i]) || isnan(h[i])) {
      Serial.print("Failed to read from DHT #"); Serial.println(i);
    client.publish("zuHause/Arduino_1","Sensorfehler",true); //true sendet die Nachricht retained, d.h. die Nachricht bleibt solange auf dem Broker, bis etwas neues kommt

    }
  else
  {
    client.publish("zuHause/Arduino_1","online", true);
    dtostrf(h[i],6, 1, humidity);
    dtostrf(t[i],6, 1, temperature);
    client.publish("zuHause/Arduino_1/Kueche/Kuehlschrank/Luftfeuchte",humidity, true);
    client.publish("zuHause/Arduino_1/Kueche/Kuehlschrank/Temperatur",temperature, true);
    Serial.print("Humidity "); Serial.print(i); Serial.print(": ");
    Serial.print(h[i]);
    Serial.print(" %\t");
    Serial.print("Temperature "); Serial.print(i); Serial.print(": ");
    Serial.print(t[i]);
    Serial.println(" *C");
   
  }
   
  } //ENDE for Schleife
  Serial.println();
}


Habt ihr eine Idee woran das liegt?

Beta-User

Würde mich interessieren, wie die Speichersituation aussieht:
Zitat von: Beta-User am 16 Februar 2022, 08:05:57
Allerdings könntest du m.E. mehr darauf achten, dass du den "Textanteil" in deinem Sketch reduzierst und ggf. auch das "F"-Makro nutzt, um das aus dem EEPROM zu lesen. Wie viel Speicher (welcher Art) dein Sketch nutzt, sollte dir die Arduino-IDE jeweils nach dem Kompilieren zurückmelden.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

tfriedrich85

#8
Zitat von: Beta-User am 21 Februar 2022, 13:50:33
Würde mich interessieren, wie die Speichersituation aussieht:

Der Sketch verwendet 20450 Bytes (63%) des Programmspeicherplatzes. Das Maximum sind 32256 Bytes.
Globale Variablen verwenden 1839 Bytes (89%) des dynamischen Speichers, 209 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.
Wenig Arbeitsspeicher verfügbar, es können Stabilitätsprobleme auftreten.

--> Ohne Kommentare sind es je 1% weniger

Mit dem F Makro, kann ich nichts anfangen, muss erstaml google bemühen :)

Beta-User

#9
Dachte mir, dass das erst "ankommt", wenn es "knallt" - hier ein Beispiel:
  Serial.print(F("Forecast at minute "));

Wenn du das mal "Flächendeckend" gemacht hast: Wirf soviel Text (iSv. Serial-prints) als möglich wieder raus oder kürze die Ausgaben. Das ist eine MCU, keine CPU+unendlich RAM ;) .

Hier am Ende gibt es eine kleine Info zu diese Makro: https://www.arduino.cc/reference/de/language/variables/utilities/progmem/
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

tfriedrich85

Zitat von: Beta-User am 21 Februar 2022, 14:07:41
Dachte mir, dass das erst "ankommt", wenn es "knallt" - hier ein Beispiel:
  Serial.print(F("Forecast at minute "));

Wenn du das mal "Flächendeckend" gemacht hast: Wirf soviel Text (iSv. Serial-prints) als möglich wieder raus oder kürze die Ausgaben. Das ist eine MCU, keine CPU+unendlich RAM ;) .

Hier am Ende gibt es eine kleine Info zu diese Makro: https://www.arduino.cc/reference/de/language/variables/utilities/progmem/

Guter Hinweis, mit einem Arduino 2560 läuft es problemlos!

Beta-User

Zitat von: tfriedrich85 am 21 Februar 2022, 15:29:40
Guter Hinweis, mit einem Arduino 2560 läuft es problemlos!
Ein Maple wäre auch eine Lösung, ist aber schwieriger in der Programmierung.

Wie bereits geschrieben: Evtl. wäre ein UDP-Broadcast einfacher umzusetzten (auch mit dem ATMega328) wie MQTT; diese MQTT-libs brauchen halt etwas Speicher...
Bzgl. Debug-Ausgaben sollte man eh' überlegen, was/wie viele man braucht. Meine sind meistens in #ifdef-Abschnitten versteckt.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

frober

Alles was mit callback zu tuen hat kannst du auch weg lassen. Ausnahme, du möchtest die Messung manuell anstoßen...
Raspi 3b mit Raspbian Bullseye und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...

tfriedrich85

Zitat von: frober am 21 Februar 2022, 20:31:54
Alles was mit callback zu tuen hat kannst du auch weg lassen. Ausnahme, du möchtest die Messung manuell anstoßen...

Danke, nehme ich raus.

Hast du eine Idee wie ich die Werte der verschiedenen Sensoren in dem MQTT Pulish unterscheidbar machen kann?
Wie kann ich denn hier den Zähler von der Schleife einbauen?
   
{
    client.publish("zuHause/Arduino_1","online", true);
    dtostrf(h[i],6, 1, humidity);
    dtostrf(t[i],6, 1, temperature);
    client.publish("zuHause/Arduino_1/Kueche/Kuehlschrank/Luftfeuchte",humidity, true);
    client.publish("zuHause/Arduino_1/Kueche/Kuehlschrank/Temperatur",temperature, true);
    Serial.print("Humidity "); Serial.print(i); Serial.print(": ");
    Serial.print(h[i]);
    Serial.print(" %\t");
    Serial.print("Temperature "); Serial.print(i); Serial.print(": ");
    Serial.print(t[i]);
    Serial.println(" *C");
   
  }


frober

If Schleife und für jeden Sensor ein eigener Publish

oder

Als topic eine Variable.
D.h. je ein Array mit den beiden topics
z.B.  char* feuchte[]    = {  "topic1", "topic2" }
und char* temperatur[]    = {  "topic1", "topic2" }

Raspi 3b mit Raspbian Bullseye und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...