已经有一个关于在Arduino中使用字符串来处理变量的问题,但给出的答案并不适用于我的问题。
我有多个传感器(大约14个,数量可能会增加)连接到我的Arduino,我也有继电器,引擎和RFID。我正在创建一个功能,用于检查所有传感器是否有效。
这个想法基本上是这样的:
#define Sensor_1 2
#define Sensor_2 3
#define Sensor_3 4
#define Sensor_4 5
#define Sensor_5 6
int checkSensors(){
int all_active = 0;
int num_sens = 5;
int n;
int active_sens = 0;
for(n= 1; n <= num_sens; n++) {
if( !digitalRead("Sensor_" + n)) {
active_sens= active_sens+ 1;
}
else {
all_active = 0;
return ( all_active);
}
}
if(active_sens== num_sens) {
all_active = 1;
return(all_active);
}
}
问题是:我想解决变量Sensor_n,但我找不到办法。我得到的错误消息是指 digitalRead(“Sensor_”+ n)命令。
错误:从'const char *'无效转换为'uint8_t {aka unsigned char}'[-fpermissive]
我已经尝试在String =“Sensor_”中使用“Sensor_”,我试图强制对uint8_t进行类型转换,但错误消息表明它失去了精度。
我也尝试过.toCharArray命令,但它也失败了。
有没有办法通过字符串+ int访问变量?
我对PHP中的“松散”变量比较熟悉,所以这给我带来了很多麻烦。
答案 0 :(得分:2)
您的代码存在一些问题。首先,您不能通过动态使用作为变量名称的字符串来获取变量或定义的值。它在C中不会那样工作。最简单的方法是使用数组,然后只通过它进行索引。为了使这项工作顺利,我已经将for循环从0开始计数,因为数组从0开始编入索引。我改变了all_active逻辑,假设在某个时候你想要知道有多少传感器是活跃的而不仅仅是他们是否都是活跃的。如果你不想要那个,那么你的逻辑也比需要的更复杂。它可以在for循环结束时返回1,因为所有必须通过测试才能到达那里。
#define Sensor_1 2
#define Sensor_2 3
#define Sensor_3 4
#define Sensor_4 5
#define Sensor_5 6
int sensors[] = {Sensor_1, Sensor_2, Sensor_3, Sensor_4, Sensor_5};
int checkSensors(){
int all_active = 1;
int num_sens = 5;
int n;
int active_sens = 0;
for(n= 0; n < num_sens; n++){
if( !digitalRead(sensors[n])){
active_sens= active_sens+ 1;
}
else {
all_active = 0;
}
}
return all_active;
}
答案 1 :(得分:1)
在C中,此行不起作用
if( !digitalRead("Sensor_" + n))
你不能在C中构建这样的字符串。因为你没有发布函数digitalRead()
我假设它采用char*
类型,这里是一个字符串,在C中你可以构建像这样
char senstr[50];
sprintf(senstr, "Sensor_%d", n);
...
if (!digitalRead(senstr)) { ...
作为一个副作用,请习惯于从0
迭代循环。您将1
添加到与人类接口。