Ich benutze I2C, um einen Master Arduino zu 4 Slaves Arduinos zu kommunizieren, und ein Schild (OULIMEX Shield LCD 16x2) auf jedem Arduino-Slave. Ich sende Daten vom Master an die Slaves mit I2C. So verwende ich diesen Code in dem Master:Globale Variable Arduino
#include <Wire.h>
#include <math.h>
#include <floatToString.h>
double incomingData;
void setup()
{
Wire.begin();
Serial.begin(9600);
incomingData = Serial.parseFloat(); //read incoming data
}
void loop()
{
delay (1000);
if (Serial.available())
{
incomingData = Serial.parseFloat(); //read incoming data
Wire.beginTransmission(8); // transmit to device #8
if ((M==0) || (M==1) || (M==2))
Wire.beginTransmission(8); // transmit to device #8 *****************************************************************
else
Wire.beginTransmission(7); // transmit to device #7 *****************************************************************
M++;
if (M==5)
M=0;
String a = "";
a = floatToString(test,incomingData,3,5,true);
for(i=0; a[i]!='\0'; ++i); // length of the string
Wire.write(i);
Wire.write(floatToString(test,incomingData,3,5,true)); // sends one byte
Wire.endTransmission(); // stop transmitting
}
}
wollte ich die Daten auf dem Schild gedruckt werden, aber ich bin alle Slaves mit der gleichen Art und Weise mit dem Master verbindet. Dafür habe ich zwei Probleme:
1- Die globalen Daten, die ich verwende, um Wert zu drucken, wird immer als 0 gedruckt und gibt nicht den tatsächlichen Wert;
2- Alle Shields drucken dasselbe: Zum Beispiel drucke ich "Hallo" im ersten Shield, und ich drucke "hi" im zweiten Shield, aber bouth druckt dasselbe (hallo oder hallo).
Der Code für den ersten Slave verwendet, ist:
#include <LCD16x2.h>
#include <Wire.h>
LCD16x2 lcd;
int buttons;
int sensorPin = A0; // select the input pin for the potentiometer
int sensorValue = 0; // variable to store the value coming from the sensor
float numOut;
int comp=1 ;
String wordd = "";
int M =0;
void setup()
{
Wire.begin(8); // join i2c bus with address #8
Wire.onReceive(receiveEvent); // register event
Serial.begin(9600); // start serial for output
}
void loop()
{
delay(500);
}
// function that executes whenever data is received from master
// this function is registered as an event, see setup()
void receiveEvent(int howMany) {
wordd = "";
int x = Wire.read();
for (int i=0; i<=x; i++)
{
char c = Wire.read();
wordd += c;
}
numOut = wordd.toFloat();
Serial.println(numOut,3); // print the integer
}
Vielen Dank im Voraus !!
Vielen Dank für die Details. Sie haben Recht, ich habe eine Zeile mehr 'Wire.beginTransmission (8);'. Das Programm funktioniert jedoch einwandfrei und sendet die Daten vom Master an den Slave, ich drucke Daten auf dem Slave nach Matlab (über den seriellen Port) und es scheint korrekt. Dafür denke ich, dass es kein Problem in meinem Code-Schreiben auf dem Master gibt, aber es ist ** nur **, wenn ich versuche, es auf dem LCD zu drucken, dass es ein Problem verursacht. Ich sende die Länge des Strings 'Wire.write (i);', um es im Slave zu verbinden 'int x = Wire.read();'. Vielen Dank für jeden anderen Vorschlag oder eine Frage –