Acessing/Adressing Arduino 中带有字符串和整数的变量

Acessing/Adressing variables with strings and int in Arduino

已经有一个关于在 Arduino 中使用字符串寻址变量的问题,但给出的答案不适用于我的问题。

我有多个传感器(大约 14 个,数量可能会增加)连接到我的 Arduino,我还有继电器、引擎和 RFID。我正在创建一个函数来检查 all 传感器是否 active.

思路基本是这样的:

#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 ) 命令。

error: invalid conversion from 'const char*' to 'uint8_t {aka unsigned char}' [-fpermissive]

我已经尝试在 String = "Sensor_" 中使用 "Sensor_",我试图将类型转换强制为 uint8_t,但错误消息说它失去了精度。

我也尝试了 .toCharArray 命令,但也失败了。

有没有办法通过字符串+整数访问变量?

我比较熟悉PHP中的"loose"变量,所以这给我带来了很多麻烦。

在 C 中,此行将不起作用

if( !digitalRead("Sensor_" + n))

你不能在 C 中构建这样的字符串。因为你没有 post 函数 digitalRead() 我认为它需要一个 char* 类型,这里是一个字符串,它在C 你可以像这样建造

char senstr[50];
sprintf(senstr, "Sensor_%d", n);
...
if (!digitalRead(senstr)) { ...

作为附带问题,请习惯从 0 开始迭代循环。您添加 1 以与人类互动。

您的代码存在一些问题。首先,您不能通过动态使用作为变量名称的字符串来获取变量的值或定义。它在 C 中不是那样工作的。最简单的方法是使用一个数组,然后通过它进行索引。为了使这项工作顺利进行,我将 for 循环更改为从 0 开始计数,因为数组的索引从 0 开始。我更改了 all_active 逻辑,假设稍后您会想知道有多少传感器是活跃的,而不仅仅是他们是否都活跃。如果您不想要那样,那么您的逻辑也比需要的更复杂。它可能只是 return 1 在 for 循环的末尾,因为所有人都必须通过测试才能到达那里。

#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;
}