2016-06-06 14 views
1

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 !!

Antwort

0

Ich habe schon diese Frage gestellt, aber ich denke, ich habe die Antwort darauf. Auch eine globale Variable vor dem Leeren Setup werden müssen diclared, und die Leere Schleife, wie folgt aus:

type YourGlobalVariable; 

void setup() 
{ 
} 
void loop() 
{ 
} 

Also, es ist genau, wie ich bereits getan hat. Der Grund, warum es nicht für mich arbeiten, war es Sache der ich diese Funktion verwendet:

void receiveEvent(int howMany) {} 

Ich weiß nicht wirklich, was sind die Eigenschaften davon, dass sie nicht für eine globale Variablen arbeiten lassen, aber es funktioniert so, wie ich es schon gesagt habe.

Vielen Dank alle

0

Ich denke, dass es wegen einer schlechten Programmstruktur im Hauptschild ist.

Dieser Block wählt den Slave, aber in der ersten Zeile, die Sie bereits auswählen # 8 Ich denke, das ist für die Sklaven verwirrend.

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 

Dieser Block am Ende der Funktion

M++; 
if (M==5) 
    M=0; 

Dann analysieren Sie den Wert in einem String sein sollte. Aber lassen Sie die erste char, weil Sie schreiben ++ i anstelle von i ++

Darüber hinaus schließen Sie die Schleife mit; so es tut nichts

String a = ""; 
a = floatToString(test,incomingData,3,5,true); 
for(i=0; a[i]!='\0'; ++i); // length of the string 

Schließlich Sie die Ordnungszahl des Bytes schreiben und dann wieder die gesamte Zeichenfolge

So sollten Sie „0“ (oder „1“ wegen ++ i) erhalten gefolgt von der Nummer, wenn Wire.write() unterstützt

Wire.write(i); 
Wire.write(floatToString(test,incomingData,3,5,true));  // sends one byte 
Wire.endTransmission(); // stop transmitting 
} 

Ihre Skizze sein sollte:

if (Serial.available()) 
    { 
    incomingData = Serial.parseFloat(); //read incoming data 

    String a = ""; 
    a = floatToString(test,incomingData,3,5,true); 

    if ((M==0) || (M==1) || (M==2)) 
     Wire.beginTransmission(8); // transmit to device #8 
    else 
     Wire.beginTransmission(7); // transmit to device #7 

    for(i=0; a[i]!='\0'; ++i) // length of the string 
     Wire.write(a[i]);  // write one byte 


    Wire.endTransmission(); // stop transmitting 

    M++; 
    if (M==5) M=0; 
    } 

Lassen Sie mich wissen, ob das funktioniert.

+0

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 –