Обращние к индексу массива
- Войдите на сайт для отправки комментариев
Приветствую!
Новичок, пытаюсь написать свой первый скетч для подключения нескольких кнопок к одному выходу arduino nano.
Подсмотрел в сети решения с последовательным подключением резисторов - при нажатии на каждую последующую из кнопок будет понижаться напряжение.
Напряжения перевожу в АЦП и создаю из этого одномерный массив. Соответственно теперь напряжение при нажатии каждой из кнопок соответствует её номеру (индексу) в заданном массиве.
Как мне обратиться к номеру кнопки, а не к значению АЦП, если я хочу чтобы при нажатии определённо кнопки выполнялось действие?
Насколько я понимаю, это должно выполняться через имя переменной NumberToValue (см. часть скетча ниже)
{ int NumberToValue (int value) int values[8] = {128, 144, 169, 204, 255, 341, 511, 1023}; //массив для 8 кнопок по значением АЦП int error = 15; // Погрешность for (int i = 0; i <= 7; i++) { if (value <= values[i] + error && value >= values[i] - error) return i; } return -1; // Значение не принадлежит заданному диапазону }
Но при попытке обращения к ней (см. часть скетча ниже)
if (NumberToValue == 3)
получаю ошибку
C:\ARDUINO\1\1.info: In function 'void loop()': C:\ARDUINO\1\1.info:180:39: warning iso c++ forbids comparison between pointer and integer [-fpermissive] if (NumberToValue == 3)
Если же указать значение массива, то ошибок нет и всё компилируется, но это не тот результат, что мне нужен.
Я конечно могу просто задать диапозон для полученных значений АЦП от нажатия кнопки, но с массивом было бы проще..
Подскажите, как правильно решить данную задачу?
приведите скетч полностью, судя по ошибке. вы в скетче обращаетесь к функции не так, как в показанном примере
Ну и еще - очень похоже. что вы эту функцию где-то скопипастили и ни черта не понимаете, как она работает.
Так я и не скрываю что скопипастил с просторов интернета, об этом писал в начале :)
Моё понимание работы это функции вероятно отличается от правильного, скажем так..
Скетч ниже, это программа для универсального пульта от ТВ и ресиверов, там много лишнего, что я ещё только планирую задействовать, просто пока хочу эту задачурешить, а дальше буду решать остальные.
слушайте, вы совсем чтоли в этом коде ничего не понимаете?
У вас текущий номер кнопки уже сидит в переменной keyValue - так и используйте его! зачем вы в своих условиях (строка 165 и далее) снова вызываете GetButtonNumberByValue, да еще и с неправильным синтаксисом?
разве keyvalue, в данном случае, это не значение АЦП?
GetButtonNumberByValue я использую чтобы присвоить значению АЦП номер в массиве.
И соответтвенно по его значению хочу чтобы ИК диод посылал нужный код.
Что не так с синтаксисом?
разве keyvalue, в данном случае, это не значение АЦП?
к чему эти вопросы - код ведь перед вами. Посмотрите сами, откуда берется значение keyvalue в строчках 160 и 162
Что не так с синтаксисом?
GetButtonNumberByValue - это функция. Синтаксис вызова функции смотрите в учебнике
в третьей строке должно быть NumberToValue(какое то начение или переменная)
Пух, вылазь своими лямбдами фарцовать, без тебя тут не обойтись.
Спасибо, я сам себя запутал, когда решил, что keyvalue это значение АЦП.
Буду дальше допиливать код...
Меня вот вопрос беспокоит. Сколько не пробовал кнопки на резисторах нажимать всегда разные значения дает. Но 1-2 разряда, но всё же. Выходил из положения тем, что делил результат на 64 и получал значения от 0 до 16 сразу значение нопки, которое использовал в программе без всяких переназначений и массивов.
Я правильно понимаю, что Вы значение АЦП делите на 64 ?
Если не сложно, можете покзазать пример кода?
Простите не понял. key = analogRead(analogPin) / 64; Что тут может быть непонятного? Единственное что я делал, это в экселе посчитал номиналы резисторов так, что бы при нажатии кнопки напяжение на получившемся делителе после оцифровки попало точно в середину диапазона шага по 64 бита. Чтобы специально не подбирать номиналы резисторов. Получилось с первого раза, резисторы из стандартного ряда уложились в погрешность измерения. Ошибок определения кнопок не было.
Но значение же будет не целое, а Вы говорире про целые числа (0-16)
Допустим при 5v 1023/65=15,98
Но значение же будет не целое, а Вы говорире про целые числа (0-16)
Допустим при 5v 1023/65=15,98
если переменная результата описана как int - то результат деления будет целым.
int key = 1023/65=15
https://metanit.com/cpp/tutorial/2.6.php
Опять моя невнимательность....
спасибо!
Вообще, на мой взгляд, такой метод более изящный, нежеле массив, буду пробовать.