发送漂浮物与NRF8001

时间:2015-04-08 16:33:24

标签: arduino bluetooth-lowenergy

使用Blend Micro(基本上是Arduino Uno + Nordic nRF8001)通过BLE收集和发送传感器数据。无法弄清楚如何发送花车。

这是一段代码:

if ((lib_aci_is_pipe_available(&aci_state, PIPE_AIR_QUALITY_SENSOR_TEMPERATURE_MEASUREMENT_TX)) && (lib_aci_is_pipe_available(&aci_state, PIPE_AIR_QUALITY_SENSOR_RELATIVE_HUMIDITY_TX)) && (lib_aci_is_pipe_available(&aci_state, PIPE_AIR_QUALITY_SENSOR_CARBON_MONOXIDE_LEVEL_TX)))
  {

    // Read DHT & MQ7 sensors
    h = dht.readHumidity(); // Read humidity from DHT
    t = dht.readTemperature(); // Read temperature as Celsius from DHT
    f = dht.readTemperature(true); // Read temperature as Fahrenheit from DHT
    int VoutAn = analogRead(MQ7PIN); //Read Vout in analog from MQ7

    // Compute heat index
    hi = dht.computeHeatIndex(f, h);

    // Compute CO in PPM
    float Vout = (5.0/1023)*VoutAn;
    co = 100.468*(pow(((5/Vout)-1),-1.43));

    lib_aci_send_data(PIPE_AIR_QUALITY_SENSOR_TEMPERATURE_MEASUREMENT_TX, &f, sizeof(f));
    lib_aci_send_data(PIPE_AIR_QUALITY_SENSOR_RELATIVE_HUMIDITY_TX, &h, sizeof(h));
    lib_aci_send_data(PIPE_AIR_QUALITY_SENSOR_CARBON_MONOXIDE_LEVEL_TX, &co, sizeof(co));
  }

这是编译错误:

  

Arduino:1.0.6(Mac OS X),主板:" Blend Micro 3.3V / 16MHz(超频)"

     

BLE-DHT-MQ7-Test.ino:在函数' void loop()':

     

BLE-DHT-MQ7-Test.ino:287:错误:无法转换'浮动*'到' uint8_t *'   争论' 2'到' bool lib_aci_send_data(uint8_t,uint8_t *,   uint8_t)'

     

BLE-DHT-MQ7-Test.ino:288:错误:无法转换'浮动*'到' uint8_t *'   争论' 2'到' bool lib_aci_send_data(uint8_t,uint8_t *,   uint8_t)'

     

BLE-DHT-MQ7-Test.ino:289:错误:无法转换'浮动*'到' uint8_t *'   争论' 2'到' bool lib_aci_send_data(uint8_t,uint8_t *,   uint8_t)'

我对aci_send_data函数的理解是参数2是一个uint8_t变量,它指向要发送的内存中的数据,并且该数据可以是任何形式。但是,如果数据位于uint8_t变量中,它似乎只能起作用 - 例如如果我将我的变量转换为uint8_t,这会编译 - 但我需要浮点数...

所以我的问题:

我是否正确理解了aci_send_data函数?

如果是这样,我做错了什么?

如果没有,我该如何发送花车?

谢谢!

2 个答案:

答案 0 :(得分:1)

我不确定lib_aci_send_data函数所需的参数但是,根据this code,似乎第一个参数接受TX引脚,第二个参数是第一个字节的引用(in一个字节数组)被解释为一个数字,第三个是要考虑的字节长度或数量。

数据类型float是一个4字节的变量。如果我们有一个表示浮点数的字节数组,我们可以在函数的第二个参数中传递第一个字节的引用,并在第三个参数中传递4作为长度(或要考虑的字节数)参数。

要将float转换为byte数组,请参阅此thread。在你的情况下,它看起来像这样:

typedef union _data {
  float f;
  char s[4];//since f takes 4 bytes
} myData;

myData q;

void setup(){
  Serial.begin(9600);
}
void loop(){
  q.f = 1.234;
  //you can access the char array by using q.s
  //q.s[0]  q.s[1] ...
  //take note that q.s is a reference to the first element
  //so we can pass that immediately to the 2nd parameter
}

现在您可以这样使用该功能:lib_aci_send_data(PIPE_AIR_QUALITY_SENSOR_RELATIVE_HUMIDITY_TX, q.s, 4);

我现在无法测试这个,因为我在不同的机器上,请告诉我这是否成功,我愿意在必要时添加编辑。

答案 1 :(得分:0)

谢谢,它有效!看起来有点麻烦,但这里是获取我需要作为浮点数发送的所有3个变量的代码:

if ((lib_aci_is_pipe_available(&aci_state, PIPE_AIR_QUALITY_SENSOR_TEMPERATURE_MEASUREMENT_TX)) && (lib_aci_is_pipe_available(&aci_state, PIPE_AIR_QUALITY_SENSOR_RELATIVE_HUMIDITY_TX)) && (lib_aci_is_pipe_available(&aci_state, PIPE_AIR_QUALITY_SENSOR_CARBON_MONOXIDE_LEVEL_TX)))
  {

    typedef union _dataF
    {
      float f;
      uint8_t fInt[4];
    } myDataF;

    myDataF F;

    typedef union _dataH
    {
      float h;
      uint8_t hInt[4];
    } myDataH;

    myDataH H;

    typedef union _dataCO
    {
      float co;
      uint8_t coInt[4];
    } myDataCO;

    myDataCO CO;

    // Read DHT & MQ7 sensors
    h = dht.readHumidity(); // Read humidity from DHT
    t = dht.readTemperature(); // Read temperature as Celsius from DHT
    f = dht.readTemperature(true); // Read temperature as Fahrenheit from DHT
    int VoutAn = analogRead(MQ7PIN); //Read Vout in analog from MQ7

    // Compute heat index
    hi = dht.computeHeatIndex(f, h);

    // Compute CO in PPM
    float Vout = (5.0/1023)*VoutAn;
    co = 100.468*(pow(((5/Vout)-1),-1.43));

    F.f = f;
    H.h = h;
    CO.co = co;

    lib_aci_send_data(PIPE_AIR_QUALITY_SENSOR_TEMPERATURE_MEASUREMENT_TX, F.fInt, 4);
    lib_aci_send_data(PIPE_AIR_QUALITY_SENSOR_RELATIVE_HUMIDITY_TX, H.hInt, 4);
    lib_aci_send_data(PIPE_AIR_QUALITY_SENSOR_CARBON_MONOXIDE_LEVEL_TX, CO.coInt, 4);
  }

我将传感器数据放入更宽范围的浮点数,因为我在程序的其他地方绘制它们。