2016-06-06 10 views
-1

내 프로젝트에서 Arduino Uno를 사용하고 있습니다. 하나는 마스터이고 다른 하나는 슬레이브입니다. I2C를 사용하여 마스터에서 슬레이브로 데이터를 보냅니다. 나는 float을 보낼 필요가 있지만, I2C는 char 만 보낼 수 있기 때문에 float을 String으로 변환 한 다음 문자로 문자를 보내고 Slave에서 조합해야합니다.I2C 및 LCD를 사용하는 arduino 전역 변수

내가 가진 문제는 전역 변수처럼 Float 수신 및 assumbling을 포함하는 변수 (슬레이브에서)를 선언하고 있으며이를 슬레이브의 코드에서 사용해야합니다. 내 문제는 항상 0으로 인쇄됩니다, 그리고 그것을 dosn't 올바른 값을 제공합니다.

내가 사용하는 코드는 다음과 같습니다

#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=0; // The Global Variable 

int comp=1 ; 

String wordd = ""; 

void setup() 
{ 
    Wire.begin(8);    // join i2c bus with address #8 
    Wire.onReceive(receiveEvent); // register event 
    Serial.begin(9600);   // start serial for output 

    lcd.lcdGoToXY(1,1); 
    lcd.lcdClear(); 
    lcd.lcdWrite("EG   "); 
    lcd.lcdGoToXY(7,1); 
    lcd.lcdWrite(numOut,3); 
} 

void loop() 
{ 

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

} 

나는 내 코드에서 사용할 수있는 전역 변수 "numOut"의 결과를 가지고하는 방법을 알고 있어야합니다.

미리 감사드립니다. !!

+0

'float numOut = 0;'을'volatile float numOut = 0;'으로 변경하고'String wordd = "";'를'volatile String wordd = "";'로 변경하여 부적절하게 최적화되지 않도록하십시오. – MikeCAT

+0

너무 효과적이지 않습니다./!! –

+0

[Global variable arduino] (http://stackoverflow.com/questions/37648796/global-variable-arduino)의 가능한 복제본 ** 질문을 다시 게시하지 마십시오! ** – Olaf

답변

-1

실제로받은 데이터가 정확한지 확인 했습니까? Arduino의 문자열에 대해서는 잘 모르지만 이 실패하면 0을 반환 할 수 있습니다.

wordd 변수가 올바른지, 그리고 이미 언급 한대로 volatile으로 선언해야합니다. EDIT : volatile은 서로 다른 함수 호출간에 데이터가 동기화되도록하기 위해 필요합니다. 그렇지 않으면 프로그램이 인터럽트를 통해 "실제"값이 업데이트되었지만 값을 레지스터에 유지할 수 있습니다. 그러나 누군가가 volatile이 아니고 모든 글로벌 변수에 대해이 필요하다고 말했지만 사용자는 세마포어/뮤텍스를 사용하지 않을 것입니다. Arduino에서 게시 한 문제에 대해 휘발성이있는 마녀를 붙여 두십시오.

편집 : https://www.arduino.cc/en/Reference/StringToFloat ". 문자열이 숫자로 시작하지 않기 때문에 유효한 변환이 수행 될 수 있다면, 제로가 반환됩니다"

+0

"전역 변수는 '휘발성'으로 선언되어야합니다. 그리고 이것은 대답이 아니라 더 많은 논평입니다. – Olaf

+0

죄송합니다. 그의 답변에 댓글을 달 수 없습니다. 그리고 전역 변수에 휘발성을 사용해야합니다. 적어도 Arduino에, 그렇지 않으면 나는 당신이 당신의 데이터가 동기화되도록하는 방법을 알지 못한다. – pLesur

+0

내 변수가 맞는지 아닌지 확인하려면 Matlab에 직접 보내십시오. Serial.println (numOut, 3); 올바른 내용입니다. –