Создать функцию обратного вызова для датчика освещенности I2C с помощью Arduino IDE - PullRequest
0 голосов
/ 03 марта 2019

Я пытаюсь создать функцию обратного вызова и отобразить параметры в функции цикла без инициализации глобальной переменной.

#include <Wire.h>
#define Addr 0x39

void setup() {
  Wire.begin();
  Serial.begin(115200);
}

void loop()
{

  tmg39931(green, red, blue, cdata, c);
  delay(100);
}

void tmg39931(float green, float red, float blue, float cdata, float c){

   // Start I2C Transmission
  Wire.beginTransmission(Addr);
  // Select Enable register
  Wire.write(0x80);
  // Power ON, ALS enable, Proximity enable, Wait enable
  Wire.write(0x0F);
  // Stop I2C transmission
  Wire.endTransmission();

  // Start I2C Transmission
  Wire.beginTransmission(Addr);
  // Select ADC integration time register
  Wire.write(0x81);
  // ATIME : 712ms, Max count = 65535 cycles
  Wire.write(0x00);
  // Stop I2C transmission
  Wire.endTransmission();

  // Start I2C Transmission
  Wire.beginTransmission(Addr);
  // Select Wait time register
  Wire.write(0x83);
  // WTIME : 2.78ms
  Wire.write(0xFF);
  // Stop I2C transmission
  Wire.endTransmission();

  // Start I2C Transmission
  Wire.beginTransmission(Addr);
  // Select control register
  Wire.write(0x8F);
  // AGAIN is 1x
  Wire.write(0x00);
  // Stop I2C transmission
  Wire.endTransmission();
  delay(300);

  //Reading the values 
  unsigned int data[9];

  // Start I2C Transmission
  Wire.beginTransmission(Addr);
  // Select data register
  Wire.write(0x94);
  // Stop I2C transmission
  Wire.endTransmission();

  // Request 9 bytes of data
  Wire.requestFrom(Addr, 9);

  // Read the 9 bytes of data
  // cData channel LSB, cData channel MSB, Red channel LSB, Red channel MSB
  // Green channel LSB, Green channel MSB, Blue channel LSB, Blue channel MSB, proximity
  if(Wire.available() == 9) 
  {
    data[0] = Wire.read();
    data[1] = Wire.read();
    data[2] = Wire.read();
    data[3] = Wire.read();
    data[4] = Wire.read();
    data[5] = Wire.read();
    data[6] = Wire.read();
    data[7] = Wire.read();
    data[8] = Wire.read();
   }

  // Convert the data
  float cData = data[1] * 256.0 + data[0];
  float red = data[3] * 256.0 + data[2];
  float green = data[5] * 256.0 + data[4];
  float blue = data[7] * 256.0 + data[6];

  float c = data[8];

 // Output data to serial monitor       
//  Serial.print("Green Color Luminance : ");
//  Serial.println(green);
//  Serial.print("Red Color Luminance : ");
//  Serial.println(red)  ;
//  Serial.print("Blue Color Luminance : ");
//  Serial.println(blue) ;
//  Serial.print("InfraRed Luminance : ");
//  Serial.println(cData) ;
//  Serial.print("Proximity of the device : ");
//  Serial.println(c);
  delay(500);
}

}

Я не могу получить свои значения для функции цикла из-за неправильной реализации функции.Мне нужно ваше предложение, чтобы сделать такое решение или любой другой способ, который будет полезен для создания функции обратного вызова.

1 Ответ

0 голосов
/ 03 марта 2019

На Arduino типично использовать глобальные переменные для вещей.Вам будет трудно пытаться бороться с этим.

Если вы хотите получить несколько значений, считанных из вашей функции, вы можете определить структуру , которая упаковывает эти значения, и передать указатель на эту структуру в качестве выходного параметра и заполнить его в своей функции.

Я не верю, что Arduino имеет обратные вызовы из коробки, но вы можете реализовать цикл обработки событий самостоятельно.

...