【问题标题】:Sending floats w/NRF8001使用 NRF8001 发送浮点数
【发布时间】:2015-04-08 16:33:24
【问题描述】:

使用 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:错误:无法将“float*”转换为“uint8_t*” 对于参数 '2' 到 'bool lib_aci_send_data(uint8_t, uint8_t*, uint8_t)'

BLE-DHT-MQ7-Test.ino:288:错误:无法将“float*”转换为“uint8_t*” 对于参数 '2' 到 'bool lib_aci_send_data(uint8_t, uint8_t*, uint8_t)'

BLE-DHT-MQ7-Test.ino:289:错误:无法将“float*”转换为“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 函数?

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

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

谢谢!

【问题讨论】:

    标签: arduino bluetooth-lowenergy


    【解决方案1】:

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

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

    要将浮点数转换为字节数组,请参阅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);

    由于我在另一台机器上,我目前无法对此进行测试,如果测试成功,请告诉我,如有必要,我愿意添加编辑。

    【讨论】:

      【解决方案2】:

      谢谢,成功了!看起来有点麻烦,但这里是获取我需要作为浮点数发送的所有 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);
        }
      

      当我在程序的其他地方使用它们时,我将传感器数据放入更大范围的浮点数中。

      【讨论】:

        猜你喜欢
        • 2011-11-05
        • 2015-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-19
        • 1970-01-01
        • 2019-12-10
        • 2017-06-27
        相关资源
        最近更新 更多