Здравствуйте. Нужна помощь, есть 2 кнопки и потенциометр, задача такая, что если кнопки не нажаты то значения потенциометра ограничиваются от 0 до 255, при нажатой кнопки1 от 10 до 35 и также для второй кнопки от 10 до 35. Но при нажатой кнопки2 значения перемешиваются , прикрепил видео.
int kryt; //Хранение значений переменного резистора от 10 до 35 int kryt2; //Хранение значений переменного резистора от 0 до 255 int krytilka = A0; //Пин переменного резистора
int kryt; //Хранение значений переменного резистора от 10 до 35 int kryt2; //Хранение значений переменного резистора от 0 до 255 int krytilka = A0; //Пин переменного резистора
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 - Вам еще рано быть консультантом ...
dimamichev писал(а):А может так поменять в строке ? if(knopka == LOW && knopka2 == LOW)
Может и не красиво, но вполне работоспособно. Ибо digitalRead возвращает 1 или 0, которые можно присвоить и char и int и boolean. !0=1 и наоборот. if(), в свою очередь, считает истинным любое выражение, результат которого отличен от нуля. Т.е. в скобках не обязано быть значение типа boolean. Только && надо заменить на ||. Иначе режим будет меняться только при нажатии 2х кнопок одновременно. У автора if(knopka) выполнялось в обоих случаях, поэтому и смешение результатов
int kryt; //Хранение значений переменного резистора от 10 до 35 int kryt2; //Хранение значений переменного резистора от 0 до 255 int krytilka = A0; //Пин переменного резистора
кнопки не нажаты - выводится "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 ))){
Большое Спасибо! Ещё такой вопрос если значения потенциометра от 0 до 255 и покрутить потенциометр, то могут 2 числа между собой пересекаться, можно решить этот вопрос программно? Так, чтобы если пересекались 2 числа то выбирать большее.
Что обозначает "числа пересеклись" Приведи последовательности чисел и алгоритм выбора чисел. Можно просто написать - ... "если вот так идут числа ....., то вывод вот такой, по таким правилам, а если вот такая последовательность...., то вывод чисел по таким правилам и т.д Напиши это все в тексте, на видео ничего не видно все мелькает.. Спасибо loox
Проще всего не реагировать, если показания изменились только на единицу в меньшую сторону: Завести глобальную переменную 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;
loox писал(а):Можно просто написать - ... "если вот так идут числа ....., то вывод вот такой, по таким правилам, а если вот такая последовательность...., то вывод чисел по таким правилам и т.д
Не знаю как так написать "если вот так идут числа..,то вывод вот такой: "
Затруднительно дать Вам совет, поскольку не мне неизвестна целевая задача программы. Все что Вы вложили в программу исправно работает. По поводу "пересечения чисел" - они будут "пересекаться", поскольку так заложено программной. 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.
2. Цикл измерения, то есть одно значение Вы получаете каждые 30 mc. ..... Serial.println(kryt); delay(30);} По отношению к скорости вращения (не знаю как сформулировать) потенциометра - это автомобиль и пешеход. Естественно Вы будете получать + п.1 множество одинаковых значений.
Я так и понял, что Вы хотите получить Спасибо loox
Я хочу убрать эти "пересекания", так как задача будет такая: если kryt равно допустим 50, то обороты электромотора 30%, а если kryt = 51, то обороты 80%(преувеличил для примера). В таком случае если значения будут "пересекаться", то 50 то 51 , получается что обороты будут то повышаться, то понижаться. Буду тогда думать как исправить это). Спасибо большое за помощь!