roboforum.ru

Технический форум по робототехнике.
Текущее время: 30 ноя 2024, 03:26

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 16 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Нужна помощь, 2 вида значений потенциометра
СообщениеДобавлено: 19 фев 2018, 14:08 
Не в сети

Зарегистрирован: 07 янв 2018, 15:35
Сообщения: 4
Здравствуйте. Нужна помощь, есть 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 вида значений потенциометра
СообщениеДобавлено: 19 фев 2018, 17:53 
Не в сети
Аватара пользователя

Зарегистрирован: 03 янв 2013, 16:27
Сообщения: 1386
А может так поменять в строке ?
if(knopka == LOW && knopka2 == LOW)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Нужна помощь, 2 вида значений потенциометра
СообщениеДобавлено: 19 фев 2018, 19:28 
Не в сети
Аватара пользователя

Зарегистрирован: 30 сен 2008, 18:49
Сообщения: 2681
Откуда: Где-то в Латинской Америке
Или так:
Код:
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 вида значений потенциометра
СообщениеДобавлено: 19 фев 2018, 21:35 
Не в сети

Зарегистрирован: 26 мар 2008, 12:45
Сообщения: 326
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 вида значений потенциометра
СообщениеДобавлено: 19 фев 2018, 22:11 
Не в сети
Аватара пользователя

Зарегистрирован: 03 янв 2013, 16:27
Сообщения: 1386
loox писал(а):

Dimamichev - Вам еще рано быть консультантом ...

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Нужна помощь, 2 вида значений потенциометра
СообщениеДобавлено: 20 фев 2018, 00:54 
Не в сети
Аватара пользователя

Зарегистрирован: 30 сен 2008, 18:49
Сообщения: 2681
Откуда: Где-то в Латинской Америке
dimamichev писал(а):
А может так поменять в строке ?
if(knopka == LOW && knopka2 == LOW)

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Нужна помощь, 2 вида значений потенциометра
СообщениеДобавлено: 20 фев 2018, 03:12 
Не в сети

Зарегистрирован: 26 мар 2008, 12:45
Сообщения: 326
правильно работает вот такой код


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 вида значений потенциометра
СообщениеДобавлено: 20 фев 2018, 11:33 
Не в сети

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Нужна помощь, 2 вида значений потенциометра
СообщениеДобавлено: 20 фев 2018, 18:01 
Не в сети

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Нужна помощь, 2 вида значений потенциометра
СообщениеДобавлено: 20 фев 2018, 18:23 
Не в сети
Аватара пользователя

Зарегистрирован: 30 сен 2008, 18:49
Сообщения: 2681
Откуда: Где-то в Латинской Америке
Проще всего не реагировать, если показания изменились только на единицу в меньшую сторону:
Завести глобальную переменную 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 вида значений потенциометра
СообщениеДобавлено: 21 фев 2018, 05:32 
Не в сети
Аватара пользователя

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


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Нужна помощь, 2 вида значений потенциометра
СообщениеДобавлено: 21 фев 2018, 10:33 
Не в сети

Зарегистрирован: 07 янв 2018, 15:35
Сообщения: 4
loox писал(а):
Можно просто написать - ... "если вот так идут числа ....., то вывод вот такой, по таким правилам, а если вот такая последовательность...., то вывод чисел по таким правилам и т.д

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

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Нужна помощь, 2 вида значений потенциометра
СообщениеДобавлено: 21 фев 2018, 15:04 
Не в сети

Зарегистрирован: 26 мар 2008, 12:45
Сообщения: 326
Затруднительно дать Вам совет, поскольку не мне неизвестна целевая задача программы.
Все что Вы вложили в программу исправно работает.
По поводу "пересечения чисел" - они будут "пересекаться", поскольку так заложено программной.
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 вида значений потенциометра
СообщениеДобавлено: 21 фев 2018, 16:33 
Не в сети

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Нужна помощь, 2 вида значений потенциометра
СообщениеДобавлено: 21 фев 2018, 17:40 
Не в сети
Аватара пользователя

Зарегистрирован: 13 янв 2011, 15:25
Сообщения: 8033
Откуда: Санкт-Петербург
LoyrLino писал(а):
Я хочу убрать эти "пересекания"

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 16 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO