Über Blynk Daten vom Slave auslesen

Hey Leute, ich bin neu und hoffe, ihr könnt mir irgendwie weiterhelfen, bin langsam am verzweifeln.
Mein Arduino Uno ist der Slave und der NodeMCU der Master. Verbindung wird über I2C hergestellt. Verwende ich den Sketch ohne die Einbindung von Blynk, funktioniert alles sehr gut. Sobald ich die Variante mit Blynk scharf schalte, bekomme ich einen Fehler. Ich bin schon so weit, dass es an der for-Schleife liegen muss und zwar die Zeile mit "data.bytes[i] = Wire.read()". Kommentier ich diese aus, bekomme ich keinen wdt-Fehler, dann kann ich aber natürlich nicht die Daten von Slave anfordern und ich bekomme Nullen. Also ohne den wire.read() funktioniert die Blynk-Verbindung (ich kann den am Master angeschlossenen DHT auslesen), mit der Zeile bekomme ich den wdt-Fehler. Kann es vielleicht an den delays liegen?
Zu den beiden Themen findet man was, zu diesen in Verbindung habe ich noch nichts finden können.
Vielleicht gibt es auch eine komplett andere Möglichkeit als diese mit einer union struct. Hauptsache ich kann die Daten zusammen an den Master senden und dann einzeln auslesen.
Vielen Dank schon mal im Voraus Leute!

#define BLYNK_TEMPLATE_ID "lalala"
#define BLYNK_DEVICE_NAME "lalala"                   

#include "DHT.h"
#define DHTPIN 13
#define DHTTYPE DHT22

#define BLYNK_FIRMWARE_VERSION        "1.0.1"
#define BLYNK_PRINT Serial
#define APP_DEBUG
#include "BlynkEdgent.h"
//#define BLYNK_DEBUG
//#define USE_NODE_MCU_BOARD

#include "Wire.h"

float Luftfeuchtigkeit = 0;
float Temperatur = 0;

DHT dht(DHTPIN, DHTTYPE);

BLYNK_WRITE(V5)
{
  if(param.asInt()==1){
    digitalWrite(12, HIGH);
  }
  else{
    digitalWrite(12, LOW);
  }
}

union data_u
{                                                 
  struct
  {
    int bfeuchte1;
    int bfeuchte2;
    int bfeuchte3;
    int bfeuchte4;
    int bfeuchte5;
  };
  int bytes[10];
};
data_u data;

BLYNK_CONNECTED()
{
  Blynk.syncVirtual(V5);                           //Relais am NodeMCU
  Blynk.virtualWrite(V8, Luftfeuchtigkeit);        //DHT am NodeMCU
  Blynk.virtualWrite(V9, Temperatur);              //DHT am NodeMCU
  Blynk.virtualWrite(V10, data.bfeuchte1);         //Bodenfeuchtesensoren am Arduino
  Blynk.virtualWrite(V11, data.bfeuchte3);
  Blynk.virtualWrite(V12, data.bfeuchte5);
}

void setup()
{
  Serial.begin(115200);
  Wire.begin(D1, D2);
  BlynkEdgent.begin();
  pinMode(12, OUTPUT);
  dht.begin();
}
void loop() {

  BlynkEdgent.run();
 
  Wire.beginTransmission(8);
  getData();
  Serial.println(data.bfeuchte1);
  Serial.println(data.bfeuchte3);
  Serial.println(data.bfeuchte5);
  Wire.endTransmission();
  
  Luftfeuchtigkeit = dht.readHumidity();
  Temperatur = dht.readTemperature();

  Blynk.virtualWrite(V8, Luftfeuchtigkeit);
  Blynk.virtualWrite(V9, Temperatur);
  Blynk.virtualWrite(V10, data.bfeuchte1);
  Blynk.virtualWrite(V11, data.bfeuchte3);
  Blynk.virtualWrite(V12, data.bfeuchte5);
}

void getData()
{
  Wire.requestFrom(8, sizeof(data));
  for (unsigned int i = 0; i < sizeof(data); i++)
    data.bytes[i] = Wire.read();
    delay(100);                                     
}

Serieller Monitor:

___  __          __

/ _ )/ /_ _____ / /__
/ _ / / // / _ / '/
/
//_, /////_
/
__/ v1.0.1 on ESP8266

....
....
[6187] CONNECTING_CLOUD => RUNNING
10
40
120
[6248] Hold the button for 10 seconds to reset configuration...
10
0
255
[6688] Hold the button for 10 seconds to reset configuration...
-1
-1
-1

ets Jan 8 2013,rst cause:4, boot mode:(3,7)

wdt reset
load 0x4010f000, len 3460, room 16
tail 4
chksum 0xcc
load 0x3fff20b8, len 40, room 4
tail 4
chksum 0xc9
csum 0xc9
v000737b0
~ld

Setze Deinen Code bitte in Codetags. Wie das geht, steht hier.
Den Code vorher ordentlich zu formatieren würde auch die Lesbarkeit erhöhen.

Du forderst 8 Bytes an, willst in der Schleife aber 10 lesen.

Gruß Tommy

Hallo
Nur Mal kurz drüber gesehen , ich denke das delay(100) muss aus der for.. Schleife raus .
Heinz

Zunächst mal danke für die schnellen Antworten.

Ist erledigt :wink: so ist es wirklich besser.

ich habe nun in der union das int mit einem byte getauscht und der Fehler ist tatsächlich weg.

union data_u
{                                                 
  struct
  {
    int bfeuchte1;
    int bfeuchte2;
    int bfeuchte3;
    int bfeuchte4;
    int bfeuchte5;
  };
  byte bytes[10];
};
data_u data;

Allerdings habe ich nun das Problem, dass mir, obwohl ich ein delay(3000) stehen habe, ich ca. halbsekündlich im seriellen Monitor "-1" geplottet bekomme. Verändert sich der Sensorwert, kommt dieser alle 3 Sekunden richtig an, beim zweiten und dritten Sensor dann nur fehlerhaft. Hier nochmal der geänderte Sketch und zusätzlich der des Slaves.

#define BLYNK_TEMPLATE_ID "lalala"
#define BLYNK_DEVICE_NAME "lalala"                   

#include "DHT.h"
#define DHTPIN 13
#define DHTTYPE DHT22

#define BLYNK_FIRMWARE_VERSION        "1.0.1"
#define BLYNK_PRINT Serial
#define APP_DEBUG
#include "BlynkEdgent.h"
//#define BLYNK_DEBUG
//#define USE_NODE_MCU_BOARD

#include "Wire.h"

float Luftfeuchtigkeit = 0;
float Temperatur = 0;

DHT dht(DHTPIN, DHTTYPE);

BLYNK_WRITE(V5)
{
  if(param.asInt()==1){
    digitalWrite(12, HIGH);
  }
  else{
    digitalWrite(12, LOW);
  }
}

union data_u
{                                                 
  struct
  {
    int bfeuchte1;
    int bfeuchte2;
    int bfeuchte3;
    int bfeuchte4;
    int bfeuchte5;
  };
  byte bytes[10];
};
data_u data;

BLYNK_CONNECTED()
{
  Blynk.syncVirtual(V5);
  Blynk.virtualWrite(V8, Luftfeuchtigkeit);
  Blynk.virtualWrite(V9, Temperatur);
  Blynk.virtualWrite(V10, data.bfeuchte1);
  Blynk.virtualWrite(V11, data.bfeuchte3);
  Blynk.virtualWrite(V12, data.bfeuchte5);
}

void setup()
{
  Serial.begin(115200);
  Wire.begin(D1, D2);//i2c bus über Anschlüsse SDA=D1 und SCL=D2 am NodeMCU
  BlynkEdgent.begin();
  pinMode(12, OUTPUT);
  dht.begin();
}
void loop() {
delay(3000);
//  int bfeuchte1 = data.bfeuchte1;
//  int bfeuchte3 = data.bfeuchte3;
//  int bfeuchte5 = data.bfeuchte5;

  BlynkEdgent.run();
  
  Wire.beginTransmission(8);
  getData();
  Serial.println(data.bfeuchte1);
  Serial.println(data.bfeuchte3);
  Serial.println(data.bfeuchte5);
  Wire.endTransmission();
  
  Luftfeuchtigkeit = dht.readHumidity();
  Temperatur = dht.readTemperature();

  Blynk.virtualWrite(V8, Luftfeuchtigkeit);
  Blynk.virtualWrite(V9, Temperatur);
  Blynk.virtualWrite(V10, data.bfeuchte1);
  Blynk.virtualWrite(V11, data.bfeuchte3);
  Blynk.virtualWrite(V12, data.bfeuchte5);
}

void getData()
{
  Wire.requestFrom(8, sizeof(data));
  for (unsigned int i = 0; i < sizeof(data); i++)
    data.bytes[i] = Wire.read();                           
}

Slave:

#include <Wire.h>

union data_u
{
 struct
 {
    int bfeuchte1;
    int bfeuchte2;
    int bfeuchte3;
    int bfeuchte4;
    int bfeuchte5;
 };
  byte bytes[10];
};

data_u data;

void setup() {

  Serial.begin(115200);
  Wire.begin(8);
  Wire.onRequest(requestEvent);
//  Wire.onReceive(receiveEvent);
}

void loop() {

 data.bfeuchte1 = analogRead(A0);
 data.bfeuchte2 = analogRead(A1);
 data.bfeuchte3 = analogRead(A2);
 Serial.println(data.bfeuchte1);
 Serial.println(data.bfeuchte2);
 Serial.println(data.bfeuchte3);
}

void requestEvent() {
 Wire.write(data.bytes, sizeof(data));
}

Euch einen entspannten Sonntag! Und danke schon bis hier hin! Ich bin immerhin einen Schritt weiter gekommen!

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.