使用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函数?
如果是这样,我做错了什么?
如果没有,我该如何发送花车?
谢谢!
答案 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);
}
我将传感器数据放入更宽范围的浮点数,因为我在程序的其他地方绘制它们。