roboforum.ru

Технический форум по робототехнике.

Нужна помощь, 2 вида значений потенциометра

Нужна помощь, 2 вида значений потенциометра

LoyrLino » 19 фев 2018, 14:08

Здравствуйте. Нужна помощь, есть 2 кнопки и потенциометр, задача такая, что если кнопки не нажаты то значения потенциометра ограничиваются от 0 до 255, при нажатой кнопки1 от 10 до 35 и также для второй кнопки от 10 до 35. Но при нажатой кнопки2 значения перемешиваются , прикрепил видео.

Код: Выделить всёРазвернуть
int kryt; //Хранение значений переменного резистора от 10 до 35
int kryt2; //Хранение значений переменного резистора от 0 до 255
int krytilka = A0; //Пин переменного резистора

void setup(){
  Serial.begin(9600);
  pinMode (2, INPUT_PULLUP); //Кнопка1
  pinMode (3, INPUT_PULLUP); //Кнопка2
}
void loop(){   
  char knopka = !digitalRead(2);
  char knopka2 = !digitalRead(3);
 
  if(knopka || knopka2 == HIGH){
  kryt = analogRead(krytilka);
  kryt = map(kryt, 0, 1023, 10, 35);
  kryt = constrain(kryt, 10, 35);
  Serial.print("От 10 До 35 = ");
  Serial.println(kryt);
  delay(30);}

  if(knopka || knopka2 == LOW){
  kryt2 = analogRead(krytilka);
  kryt2 = map(kryt2, 0, 1023, 0, 255);
  kryt2 = constrain(kryt2, 0, 255);
  Serial.print("От 0 До 255 = ");
  Serial.println(kryt2);
  delay(30);}
}


Re: Нужна помощь, 2 вида значений потенциометра

dimamichev » 19 фев 2018, 17:53

А может так поменять в строке ?
if(knopka == LOW && knopka2 == LOW)

Re: Нужна помощь, 2 вида значений потенциометра

Scorpio » 19 фев 2018, 19:28

Или так:
Код: Выделить всёРазвернуть
int kryt; //Хранение значений переменного резистора от 10 до 35
int kryt2; //Хранение значений переменного резистора от 0 до 255
int krytilka = A0; //Пин переменного резистора

#define knopka  !digitalRead(2)
#define knopka2  !digitalRead(3)

void setup(){
  Serial.begin(9600);
  pinMode (2, INPUT_PULLUP); //Кнопка1
  pinMode (3, INPUT_PULLUP); //Кнопка2
}
void loop(){ 
  int Min;
  int Max;
 
  if(knopka || knopka2){Min=10;Max=35;}
  else {Min=0;Max=255;}
 
  kryt = analogRead(krytilka);
  kryt = map(kryt, 0, 1023, Min, Max);
  String tmp="От " + String(Min)+" До "+String(Max)+" = "+String(kryt);
  Serial.println(tmp);
 
  delay(30);

}

Re: Нужна помощь, 2 вида значений потенциометра

loox » 19 фев 2018, 21:35

LoyrLino
так писать не корректно
char knopka = !digitalRead(2);
char knopka2 = !digitalRead(3);

тип char = очень малые целые числа и ASCII коды -128 ... 127
какое значение будет от выражения char knopka = !digitalRead(2), с однойной стороны тип char с другой стороны boolean ?
измените типы, так будет логичней
bool knopka = !digitalRead(2);
bool knopka2 = !digitalRead(3);
тут то же вопросы:
if(knopka || knopka2 == LOW) и так if(knopka || knopka2 == HIGH)
полуается knopka = true || knopka2 == LOW

Догичней и правильней так :
if ((knopka == LOW)||(knopka2 == LOW)) { ....
так правильно , c HIGH аналогично
Справочник "язык С++" В.В.Подбельский
Учите мат.часть
Loox
Dimamichev - Вам еще рано быть консультантом ...

Re: Нужна помощь, 2 вида значений потенциометра

dimamichev » 19 фев 2018, 22:11

loox писал(а):
Dimamichev - Вам еще рано быть консультантом ...

Так это не консультация, не совет и не подсказка - это утверждение, что кроме или есть ещё по жизни и .

Re: Нужна помощь, 2 вида значений потенциометра

Scorpio » 20 фев 2018, 00:54

dimamichev писал(а):А может так поменять в строке ?
if(knopka == LOW && knopka2 == LOW)

Может и не красиво, но вполне работоспособно.
Ибо digitalRead возвращает 1 или 0, которые можно присвоить и char и int и boolean. !0=1 и наоборот.
if(), в свою очередь, считает истинным любое выражение, результат которого отличен от нуля. Т.е. в скобках не обязано быть значение типа boolean.
Только && надо заменить на ||. Иначе режим будет меняться только при нажатии 2х кнопок одновременно.
У автора if(knopka) выполнялось в обоих случаях, поэтому и смешение результатов

Re: Нужна помощь, 2 вида значений потенциометра

loox » 20 фев 2018, 03:12

правильно работает вот такой код


int kryt; //Хранение значений переменного резистора от 10 до 35
int kryt2; //Хранение значений переменного резистора от 0 до 255
int krytilka = A0; //Пин переменного резистора

void setup(){
Serial.begin(9600);
pinMode (2, INPUT_PULLUP); //Кнопка1
pinMode (3, INPUT_PULLUP); //Кнопка2
}
void loop(){
char knopka = !digitalRead(2);
char knopka2 = !digitalRead(3);

if((knopka == HIGH) || (knopka2 == HIGH)){
kryt = analogRead(krytilka);
kryt = map(kryt, 0, 1023, 10, 35);
kryt = constrain(kryt, 10, 35);
Serial.print("from 10 to 35 = ");
Serial.println(kryt);
delay(30);
}

if((knopka == LOW)|| (knopka2 == LOW )){
kryt2 = analogRead(krytilka);
kryt2 = map(kryt2, 0, 1023, 0, 255);
kryt2 = constrain(kryt2, 0, 255);
Serial.print("from 0 to 255 = ");
Serial.println(kryt2);
delay(30);
}
}

кнопки не нажаты - выводится "from 0 to 255 = "
нажата одна из кнопок ( любая), работает "from 10 to 35 = " и "from 0 to 255 = "
нажаты две кнопки одновременно, работает "from 10 to 35 = "
Для того, что бы не "перемешивались",зменить стороку :
if((knopka == LOW)|| (knopka2 == LOW )){

на
if(((knopka == LOW)&& (knopka2 == HIGH ))||((knopka ==HIGH) && (knopka2 == LOW ))){

Re: Нужна помощь, 2 вида значений потенциометра

LoyrLino » 20 фев 2018, 11:33

Большое Спасибо! Ещё такой вопрос если значения потенциометра от 0 до 255 и покрутить потенциометр, то могут 2 числа между собой пересекаться, можно решить этот вопрос программно? Так, чтобы если пересекались 2 числа то выбирать большее.

Re: Нужна помощь, 2 вида значений потенциометра

loox » 20 фев 2018, 18:01

Что обозначает "числа пересеклись"
Приведи последовательности чисел и алгоритм выбора чисел. Можно просто написать - ... "если вот так идут числа ....., то вывод вот такой, по таким правилам, а если вот такая последовательность...., то вывод чисел по таким правилам и т.д
Напиши это все в тексте, на видео ничего не видно все мелькает..
Спасибо loox

Re: Нужна помощь, 2 вида значений потенциометра

Scorpio » 20 фев 2018, 18:23

Проще всего не реагировать, если показания изменились только на единицу в меньшую сторону:
Завести глобальную переменную int kryt_old=0; для хранения предыдущего показания,
Если новое значение меньше предыдущего на 1, то не выводим его:
kryt = analogRead(krytilka);
kryt = map(kryt, 0, 1023, Min, Max);
if(kryt_old-kryt!=1){
String tmp="От " + String(Min)+" До "+String(Max)+" = "+String(kryt);
Serial.println(tmp);
}
kryt_old=kryt;

Re: Нужна помощь, 2 вида значений потенциометра

Dmitry__ » 21 фев 2018, 05:32

Убирать надо обьявление переменных, где это не требуется!
Сейчас вы переменные обьявляете, а завтра бабушку через дорогу не переведете :)
Вот так нада:
Код: Выделить всёРазвернуть
if((!digitalRead(2) == LOW) && (!digitalRead(3)) == low))
{
   bla-bla-bla;
}


Во вложении скобок мог запутаться, копипастил :)

Re: Нужна помощь, 2 вида значений потенциометра

LoyrLino » 21 фев 2018, 10:33

loox писал(а):Можно просто написать - ... "если вот так идут числа ....., то вывод вот такой, по таким правилам, а если вот такая последовательность...., то вывод чисел по таким правилам и т.д

Не знаю как так написать "если вот так идут числа..,то вывод вот такой: "

loox писал(а):Что обозначает "числа пересеклись"

Может по видео поймёте, только так показать могу:

Re: Нужна помощь, 2 вида значений потенциометра

loox » 21 фев 2018, 15:04

Затруднительно дать Вам совет, поскольку не мне неизвестна целевая задача программы.
Все что Вы вложили в программу исправно работает.
По поводу "пересечения чисел" - они будут "пересекаться", поскольку так заложено программной.
1. Использование - kryt = map(kryt, 0, 1023, 0, 255);
фактически Вы делите значение kryt на 4, для приведения его к диапазону 0-255
Возьмем Ваше значение = 192
Помним, что: int kryt; //Хранение значений переменного резистора от 0 до 255
Например:
Чему будет равно значение kryt = analogRead(krytilka), если map(kryt, 0, 1023, 0, 255)= 192
192*4 = 768
когда, измениться значение map(kryt, 0, 1023, 0, 255)?, вот когда 191*4 = 764 и 193*4 = 772
в диапазоне измерений от 764 до 772 Вы будете получать одно и то же значение 192, так как kryt имеет тип int.

сторока kryt2 = constrain(kryt2, 0, 255) - вероятно избыточна.
со строками kryt = map(kryt, 0, 1023, 10, 35);
kryt = constrain(kryt, 10, 35);
аналогично.

2. Цикл измерения, то есть одно значение Вы получаете каждые 30 mc.
.....
Serial.println(kryt); delay(30);}
По отношению к скорости вращения (не знаю как сформулировать) потенциометра - это автомобиль и пешеход. Естественно Вы будете получать + п.1 множество одинаковых значений.


Я так и понял, что Вы хотите получить
Спасибо loox

Re: Нужна помощь, 2 вида значений потенциометра

LoyrLino » 21 фев 2018, 16:33

Я хочу убрать эти "пересекания", так как задача будет такая: если kryt равно допустим 50, то обороты электромотора 30%, а если kryt = 51, то обороты 80%(преувеличил для примера). В таком случае если значения будут "пересекаться", то 50 то 51 , получается что обороты будут то повышаться, то понижаться. Буду тогда думать как исправить это). Спасибо большое за помощь!

Re: Нужна помощь, 2 вида значений потенциометра

Dmitry__ » 21 фев 2018, 17:40

LoyrLino писал(а):Я хочу убрать эти "пересекания"

Фильтр сделай. Скользящая средняя. Например 4 сложения результата и делить на 4.
Или экспоненциальный, он проще, но плавающая точка :)
http://stackoverflow.com/questions/10990618/calculate-rolling-moving-average-in-c/10990656#10990656


Rambler\'s Top100 Mail.ru counter