全局变量arduino

时间:2016-06-06 02:28:03

标签: arduino serial-port global-variables arduino-uno i2c

我使用I2C将Master Arduino传送给4个Slaves Arduinos,并在每个Arduino奴隶上传送一个Shield(OULIMEX Shield LCD 16x2)。 我使用I2C将数据从主设备发送到从设备。所以我在master中使用了这段代码:

#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
    }

}

我希望数据打印在Shield上,但是我以与主服务器相同的方式连接所有从服务器。为此我有两个问题:

1-我用来打印值的全局数据总是打印为0,而不是给出实际值;

2- All Shields打印相同的东西:例如,我打印&#34;你好&#34;在第一个盾牌中,我打印&#34; hi&#34;在第二个盾牌,但是bouth打印相同的东西(你好或喜)。

用于第一个奴隶的代码是:

#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
}

提前谢谢!!

2 个答案:

答案 0 :(得分:0)

我认为这是由于主盾中程序结构不佳所致。

此块选择从站,但在第一行您已选择#8 我认为这对奴隶来说很困惑。

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;

然后解析字符串中的值。 但是省略第一个字符,因为你写的是++ i而不是i ++

此外,你关闭循环;所以什么都不做

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

最后你写下字节的序号 然后是整个字符串

所以你应该得到&#34; 0&#34; (或&#34; 1&#34;因为++ i) 如果Wire.write()支持它,则后跟你的号码

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

你的素描应该是:

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;
    }

让我知道这是否有效。

答案 1 :(得分:0)

我已经问过这个问题,但我想我有答案。必须在void设置和void循环中讨论全局变量,如:

type YourGlobalVariable;

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

所以,这正是我已经做过的事情。它不适合我的原因,是因为我使用了这个功能:

  void receiveEvent(int howMany) {}

我真的不知道它的哪些属性让它不适用于全局变量,但它的效果就像我说的那样。

谢谢大家