выбор значения из массива
- Войдите на сайт для отправки комментариев
Пнд, 15/06/2015 - 15:25
Как сделать следующее : разбить диапазон потенциометра (0 – 1023) на число элементов массива [5] и при повороте потенциометра pot принимал соответствующие значения из массива и записывал их в analogWrite(… , х ) ?
#define led 9 #define pot A0 int Array[5]={50,100,150,200,250}; void setup() { pinMode(led, OUTPUT); pinMode(pot, INPUT); } void loop() { int x; x = analogRead(pot) / 4; analogWrite(led, x); }
Массивы ? Проще функцией map() привести в диапазон 1...5, а затем умножить на 50.
Почитайте http://arduino.ru/Reference/Map
А если значения массива будут , например, такими ?
Я про map() тож сначала подумал.
Ммммм..., ну тогда я не понял про "разбить диапазон потенциометра (0 – 1023) на число элементов массива [5]"...
Может не правильно выражаюсь)) Вот так в общем: Есть массив с набором значений. Эти значения должны передаваться в данном случае в analogWrite(… , х ) вместо х поворотом потенциометра. Как-то так)
Что-то совсем туплю. Теперь не понял про "вместо х поворотом потенциометра". Может привести значения массива к диапазону 1...1023 ? Так это и map() может.
Так map() же пропорционально приводит значения. А как при помощи map() привести конкретные цифры ?
Например, насколько повернуть потенциометр чтобы х приняло значение 67 ?
Я вот так вижу решение: разбиваем диапазон потенциометра на количество элементов массива [размер массива] . И каждой "ступеньке" присваиваем значение из массива.
Это на словах)) Как так сделать еще не понял)
А почему так? Ведь 1024 / 4 = 256. Ну ладно, можно и так попробовать
только те же шарики )
Так а к массиву-то как привязать потенциометр?
Что то тут точно не подумав написано. Зачем 1024 да ещё и + 4.
Вопрос автору так вам надо при определённом значении потенциометра выдать определённое значение из массива . Или выдавать последовательное.
Может так попробовать?
Поворачиваем потенциометр от 0 до 1024 тем самым перебираем последовательно значения от [0] до [4] . В этом примере 5 значений в массиве, но их то может быть и другое количество.
А вот какой вопрос назрел: если мы приведем значения потенциометра к диапазону [0,5] , то как он будет изменяться с поворотом потенциометра ? Если 0-1-2-3-4-5 (кстати, так значений получается больше ,чем значений в массиве ), то наверное, все нормально. Не будет ли промежуточных значений?
Нужно будет в Serial мониторе поглядеть)
Если 0-1-2-3-4-5 (кстати, так значений получается больше ,чем значений в массиве )
Правильно заметил, это я на скорую руку черкнул.Это дело калибровки.
Вот тоже пытаюсь глянуть в Протеусе , но он как назло ругается непонятно на что.
Ну протеус показал нормальную работу пяти вариантов генерации сигнала . Значит все сигналы взяты из массива. Код программы правильный вот так -
Вечерком опробую , спасибо)
#define led 9
А если y = 5 будет ?
Либо поменяйте int y = map( x, 0, 1023, 0, 5); на int y = map( x, 0, 1023, 0, 4); ,
либо увеличьте размерность массива.
Что то тут точно не подумав написано. Зачем 1024 да ещё и + 4.
1024 - количество возможных входных значений (0...1023)
5 - число интервалов, на которые разбиваются эти 1024 значения
4 - число интервалов минус единица
Обычный способ округления результата целочисленного деления до большего.
А нужно именно до большего, т. к. при округлении до меньшего получим делитель 204, и потом, при делении 1024 / 204, после округления получится 5 - а это уже превышение допустимого индекса массива.
Araris,да все правильно вы говорите про размер массива. Изменил и проверил в serial, все значения присваиваются верно. Chilori, вам спасибо. Спасибо за ответы.
#define led 9
А если y = 5 будет ?
Либо поменяйте int y = map( x, 0, 1023, 0, 5); на int y = map( x, 0, 1023, 0, 4); ,
либо увеличьте размерность массива.
Добавил в скетч 9 строку. Таким образом 5 уже не будет и линейность сохраняется. Спасибо за поправку.
А как сделать функцию за пределами цикла loop (), в которой будет присваиваться значение из массива и подставляться в analogWrite вместо Array[y] ? Пример по ссылке http://arduino.ru/Reference/FunctionDeclaration просмотрел, а сделать как-то не выходит пока))
Покажите, что делали, пусть сырое/неправильное, но покажите.
Пока ничего не вышло дельного, но вот набросок)
Что-то мне кажется , что массив значений тут никак не надействован. Или я ошибаюсь?
ага ;)
Опробовал. Работает. Только вот как : значения из массива присваиваются как-то не равномерно по ходу вращения потенциометра. Уже отсроил диапазон analogRead(pot) по Serial , но все равно прокручиваю на 90% потенциометр , а на экране еще [0] -е значение массива. И за оставшиеся 10% хода проскакивают [2],[3],[4]. Странно ,конечно)
Потенциометр нужно с линейной характеристикой.
Вот только сам об этом подумал)) Спасибо.
А что если программно замутить из логарифмического потенциометра линейный?))
А что если программно замутить из логарифмического потенциометра линейный?))
Так обычно все потенциометры линейные . На машинах встречал нелинейные потенциометры расхода воздуха. Зачем делать такой ? Когда линейных потенциометров полно.
А что если программно замутить из логарифмического потенциометра линейный?))
Да это шутка, конечно))