Уже есть вопрос об адресации переменных с помощью строк в 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 («Датчик_» + n) команда.
ошибка: неверное преобразование из ‘const char *’ в ‘uint8_t {aka unsigned char}’ [-fpermissive]
Я уже пытался использовать «Sensor_» в String = «Sensor_», я пытался принудительно привести тип к uint8_t, но в сообщении об ошибке говорится, что он теряет точность.
Я также попробовал команду .toCharArray, но она также не удалась.
Есть ли способ получить доступ к переменной через строку + Int?
Я больше знаком с «свободными» переменными в PHP, поэтому это доставляет мне много хлопот.
Есть несколько проблем с вашим кодом. Во-первых, вы не можете получить значение переменной или определения, динамически используя строку, которая является именем переменной. Это не работает в Си. Самый простой подход — использовать массив, а затем просто индексировать его. Чтобы это работало хорошо, я изменил цикл for на 0, так как массив индексируется, начиная с 0. Я изменил логику all_active, предполагая, что в какой-то момент позже вы захотите узнать, сколько датчиков активны вместо просто все ли они активны или нет. Если вы этого не хотите, то ваша логика также сложнее, чем нужно. Он может просто вернуть 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;
}
В C эта строка не будет работать
if( !digitalRead("Sensor_" + n))
вы не можете построить такую строку в C. Так как вы не опубликовали функцию digitalRead()
Я предполагаю, что это занимает char*
введите здесь строку, которую в C вы можете построить следующим образом
char senstr[50];
sprintf(senstr, "Sensor_%d", n);
...
if (!digitalRead(senstr)) { ...
Как побочный вопрос, пожалуйста, привыкните к итерации циклов из 0
, Вы добавляете 1
взаимодействовать с людьми.