выбор значения из массива

dimOnOff
Offline
Зарегистрирован: 21.04.2015

Как сделать следующее : разбить диапазон потенциометра (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);

}

 

Araris
Offline
Зарегистрирован: 09.11.2012

Массивы ? Проще функцией map() привести в диапазон 1...5, а затем умножить на 50.

Почитайте http://arduino.ru/Reference/Map

dimOnOff
Offline
Зарегистрирован: 21.04.2015

А если значения массива будут , например, такими ?

int Array[5]={24,67,156,203,255};

Я про map() тож сначала подумал. 

Araris
Offline
Зарегистрирован: 09.11.2012

Ммммм..., ну тогда я не понял про "разбить диапазон потенциометра (0 – 1023) на число элементов массива [5]"...

dimOnOff
Offline
Зарегистрирован: 21.04.2015

Может не правильно выражаюсь)) Вот так в общем: Есть массив с набором значений. Эти значения должны передаваться в данном случае в analogWrite(… ,  х ) вместо х поворотом потенциометра.  Как-то так)

Araris
Offline
Зарегистрирован: 09.11.2012

Что-то совсем туплю. Теперь не понял про "вместо х поворотом потенциометра". Может привести значения массива к диапазону 1...1023 ? Так это и map() может.

dimOnOff
Offline
Зарегистрирован: 21.04.2015

Так map() же пропорционально приводит значения. А как при помощи map() привести конкретные цифры ?  

Например, насколько повернуть потенциометр чтобы х приняло значение 67 ? 

Я вот так вижу решение: разбиваем диапазон потенциометра на количество элементов массива [размер массива] . И каждой "ступеньке" присваиваем значение из массива.

Это на словах)) Как так сделать еще не понял)

Datak
Онлайн
Зарегистрирован: 09.10.2014
x = analogRead(pot) / 205; // 205 = ( 1024 + 4 ) / 5;

 

dimOnOff
Offline
Зарегистрирован: 21.04.2015

А почему так? Ведь 1024 / 4 = 256.  Ну ладно, можно и так попробовать

х = map(analogRead(pot),0,1024,0,255); 

только те же шарики )

Так а к массиву-то как привязать потенциометр?

Chilori
Offline
Зарегистрирован: 10.05.2015

Datak пишет:

x = analogRead(pot) / 205; // 205 = ( 1024 + 4 ) / 5;

Что то тут точно не подумав написано. Зачем 1024 да ещё и + 4.

Вопрос автору так вам надо при определённом значении потенциометра выдать определённое значение из массива . Или выдавать последовательное.

Может так попробовать? 

int y = map(x,  0, 1023, 0, 5);
analogWrite ( led, Array[y]);

dimOnOff
Offline
Зарегистрирован: 21.04.2015

Поворачиваем потенциометр от 0 до 1024 тем самым перебираем последовательно значения от [0] до [4] . В этом примере 5 значений в массиве, но их то может быть и другое количество. 

dimOnOff
Offline
Зарегистрирован: 21.04.2015

А вот какой вопрос назрел: если мы приведем значения потенциометра к диапазону [0,5] , то как он будет изменяться с поворотом потенциометра ? Если 0-1-2-3-4-5 (кстати, так значений получается больше ,чем значений в массиве ), то наверное, все нормально. Не будет ли промежуточных значений? 

Нужно будет в Serial мониторе поглядеть)

Chilori
Offline
Зарегистрирован: 10.05.2015

dimOnOff пишет:

 Если 0-1-2-3-4-5 (кстати, так значений получается больше ,чем значений в массиве )

Правильно заметил, это я на скорую руку черкнул.Это дело калибровки.

Вот тоже пытаюсь глянуть в Протеусе , но он как назло ругается непонятно на что.  

Chilori
Offline
Зарегистрирован: 10.05.2015

Ну протеус показал нормальную работу пяти вариантов генерации  сигнала . Значит все сигналы взяты из массива. Код программы правильный вот так -

#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 = analogRead(pot);
int y = map( x,  0, 1023, 0, 5);
analogWrite( led, Array[y]);
}

 

dimOnOff
Offline
Зарегистрирован: 21.04.2015

Вечерком опробую , спасибо) 

Araris
Offline
Зарегистрирован: 09.11.2012

Chilori пишет:

#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 = analogRead(pot);
int y = map( x,  0, 1023, 0, 5);
analogWrite( led, Array[y]);
}

А если y = 5 будет ?

Либо поменяйте int y = map( x, 0, 1023, 0, 5); на int y = map( x, 0, 1023, 0, 4); ,

либо увеличьте размерность массива.

Datak
Онлайн
Зарегистрирован: 09.10.2014

Chilori пишет:

Datak пишет:



x = analogRead(pot) / 205; // 205 = ( 1024 + 4 ) / 5;

Что то тут точно не подумав написано. Зачем 1024 да ещё и + 4.


1024 - количество возможных входных значений (0...1023)
5 - число интервалов, на которые разбиваются эти 1024 значения
4 - число интервалов минус единица

Обычный способ округления результата целочисленного деления до большего.

А нужно именно до большего, т. к. при округлении до меньшего получим делитель 204, и потом, при делении 1024 / 204, после округления получится 5 - а это уже превышение допустимого индекса массива.

dimOnOff
Offline
Зарегистрирован: 21.04.2015

Araris,да все правильно вы говорите про размер массива. Изменил  и  проверил в serial, все значения присваиваются верно.  Chilori, вам спасибо. Спасибо за ответы.

Chilori
Offline
Зарегистрирован: 10.05.2015

Araris пишет:

Chilori пишет:

#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 = analogRead(pot);
x = min(x , 1022);
int y = map( x,  0, 1023, 0, 5);
analogWrite( led, Array[y]);
}

А если y = 5 будет ?

Либо поменяйте int y = map( x, 0, 1023, 0, 5); на int y = map( x, 0, 1023, 0, 4); ,

либо увеличьте размерность массива.

Добавил в скетч 9 строку. Таким образом 5 уже не будет и линейность сохраняется. Спасибо за поправку.

dimOnOff
Offline
Зарегистрирован: 21.04.2015

А как сделать функцию за пределами цикла loop (), в которой будет присваиваться значение из массива и подставляться в analogWrite вместо Array[y] ? Пример по ссылке http://arduino.ru/Reference/FunctionDeclaration просмотрел, а сделать как-то не выходит пока))

Araris
Offline
Зарегистрирован: 09.11.2012

Покажите, что делали, пусть сырое/неправильное, но покажите.

dimOnOff
Offline
Зарегистрирован: 21.04.2015

Пока ничего не вышло дельного, но вот набросок)

#define pot A0
#define led 9
int Array[5]={50,100,150,200,250};
void setup(){
pinMode(led, OUTPUT);
pinMode(pot, INPUT);
}
void loop(){
analogWrite( led, Array[func]);
}

int func (int y){
int x = analogRead(pot);
y = map( x,  0, 1023, 0, 4);
return y;  
}  

 

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013
#define pot A0
#define led 9
int Array[5]={50,100,150,200,250};

void setup(){
pinMode(led, OUTPUT);
pinMode(pot, INPUT);
}

void loop(){
int p = func();
analogWrite(led, p);  // можно просто analogWrite(led, func());  но это не очень наглядно
}

int func(){
int x = analogRead(pot);
int y = map( x,  0, 1023, 0, 4);
return y;  
}  

 

dimOnOff
Offline
Зарегистрирован: 21.04.2015

Что-то мне кажется , что массив значений тут никак не надействован. Или я ошибаюсь?

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

ага ;)

analogWrite(led, Array[p]);

 

dimOnOff
Offline
Зарегистрирован: 21.04.2015

Опробовал. Работает. Только вот как : значения из массива присваиваются как-то не равномерно по ходу вращения потенциометра. Уже отсроил диапазон  analogRead(pot) по Serial , но все равно прокручиваю на 90% потенциометр , а на экране еще [0] -е значение массива. И за оставшиеся 10% хода проскакивают [2],[3],[4]. Странно ,конечно)

Coolerr
Offline
Зарегистрирован: 30.06.2014

Потенциометр нужно с линейной характеристикой.

dimOnOff
Offline
Зарегистрирован: 21.04.2015

Вот только сам об этом подумал)) Спасибо.

dimOnOff
Offline
Зарегистрирован: 21.04.2015

А что если программно замутить из логарифмического потенциометра линейный?))

Chilori
Offline
Зарегистрирован: 10.05.2015

dimOnOff пишет:

А что если программно замутить из логарифмического потенциометра линейный?))

Так обычно все потенциометры линейные . На машинах встречал нелинейные потенциометры расхода воздуха. Зачем делать такой ? Когда линейных потенциометров полно.

dimOnOff
Offline
Зарегистрирован: 21.04.2015

dimOnOff пишет:

А что если программно замутить из логарифмического потенциометра линейный?))

 

Да это шутка, конечно))