Проблема с чтением данных второй кнопки

La1m1e
Offline
Зарегистрирован: 30.12.2021

Имеется Arduino Leonardo, серва и две сенсорные кнопки выдающие 1 или 0.

Новичок в коде, решил сделать фокусировку для дешевого телескопа с управлением с двух сенсорных кнопок, но даже не подключая кнопки столкнулся с проблемой - в то время как одна кнопка как обычно шумит 0/1, вторая кнопка включена на 1 всегда и не реагирует на подключенную кнопку. Со второй кнопкой (minus) всё прекрасно - при её подключении в порт выводится соответствующие положению кнопки значение 1/0 без шума, в то время как первая (plus), подключенная к тому же контроллеру (пробовал назначать и подключать кнопку plus к 2,4,5 digital пинам) не подает признаков жизни. Снизу прикладываю код, посмотрите, люди знающие


#include <Servo.h>
Servo myservo;

int plus = 4; 
int minus = 2;
bool plusB = 0; //переменная состояния кнопки +
bool minusB = 0; //переменная состояния кнопки -
int a = 90; //начальный угол a

void setup() {
  myservo.attach(3); 
  Serial.begin(9600);
  
  pinMode(4, INPUT); //кнопки 4-Плюс, 2-Минус
  pinMode(2, INPUT);
}

void loop() {
  digitalRead(plus);
    plusB = digitalRead(plus); //Перевожу значение digitalRead(plus) в переменную plusB       |
                            //                                                                | Это практически бесполезный код, мне просто так захотелось
  digitalRead(minus);       //                                                                |
    minusB = digitalRead(minus); //Перевожу значение digitalRead(minus) в переменную minusB   |
  
  if(plusB = 1){                   //if на plusB и увеличение угла
    if(a<180)a = a+2;
    else a = a; //мусорный код
    myservo.write(a); //поворот сервомашинки
    delay(50);  //задержка для изменения скорости сервопривода
  }
  else if (minusB = 1) {           //if на minusB и уменьшение угла
   if(a>0)a = a-2;
    else a = a; //мусорный код
    myservo.write(a); //поворот сервомашинки
    delay(50);  //задержка для изменения скорости сервопривода
  }
  
  
  Serial.println(a);           //вывод debug данных в COM порт
  Serial.println(plusB); 
  Serial.println(minusB); 
  delay(15);        // delay для стабильности
}

 

La1m1e
Offline
Зарегистрирован: 30.12.2021

Вот что выдаёт порт при обеих выключенных кнопках:

180

0

Также 

pinMode(4, INPUT); //кнопки 4-Плюс, 2-Минус
  pinMode(2, INPUT);

я забыл в посте поменять вышеуказанный код с тестов на использующийся сейчас нижний 

pinMode(plus, INPUT); //кнопки 4-Плюс, 2-Минус
  pinMode(minus, INPUT);

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Мошт, INPUT_PULLUP тебя спасёть?

La1m1e
Offline
Зарегистрирован: 30.12.2021

DetSimen пишет:

Мошт, INPUT_PULLUP тебя спасёть?

Так проблема не в дребезге, сама сенсорная кнопка имеет всю начинку и выдает только стабильные 1/0. Проблема что ВСЕГДА на одной кнопке значение 1. С включенным INPUT_PULLUP  получается лишь завязать кнопку на контакт с gnd = 0 а не на присутствие/отсутствие сигнала выдаваемого сенсорной кнопкой. Первая кнопка прекрасно работает и без этого

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Ну, схему твою я в глаза не видел, а хрустальный шар у мня мутный.  Так что все свои советы я исчерпал

La1m1e
Offline
Зарегистрирован: 30.12.2021

Даже если скинуть с платы ВСЁ и тыкать пинцетом между GND и этими двумя (указанными в коде) пинами на голой плате, то ситуация не меняется. Проблема проявляется без какой либо схемы в принципе, поэтому чтобы её увидеть достаточно найти "Arduino Leonardo фото" в гугле :). Попробовал воткнуть в вторую плату, чтоб точно избежать неисправности платы. Поведение не изменилось

bizzon
Offline
Зарегистрирован: 29.03.2016

Местами менял?

La1m1e
Offline
Зарегистрирован: 30.12.2021

DetSimen пишет:

Ну, схему твою я в глаза не видел, а хрустальный шар у мня мутный.  Так что все свои советы я исчерпал

 

La1m1e
Offline
Зарегистрирован: 30.12.2021

bizzon пишет:

Местами менял?

Если имеешь ввиду значения 

int plus = 2; 
int minus = 4;

то менял, просто проблема перемещается с 4 на 2 пин)

Если ты имеешь ввиду кнопки физически - я уже писал что проблема не зависит даже от наличия кнопок, не говоря о порядке их подключения

mifar
Offline
Зарегистрирован: 07.04.2021

В строках 25 и 31 что написано?

La1m1e
Offline
Зарегистрирован: 30.12.2021

mifar пишет:

В строках 25 и 31 что написано?

Спасибо. Не думал что синтаксическая ошибка в if будет так влиять и почему он делал такую ерунду вместо обычной ошибки компиляции. я исправил на == и оно заработало как должно. Но всё ещё остаётся загадкой - почему в таком случае одна из кнопок работала на вывод в сериал порт, а вторая нет?

sadman41
Offline
Зарегистрирован: 19.10.2016

А что остаётся делать if-у, если условие всегда верно - else выполнять по рандомайзу что ли?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

La1m1e пишет:
Не думал что синтаксическая ошибка в if будет так влиять и почему он делал такую ерунду вместо обычной ошибки компиляции.

А чего тут думать? Не было там никакой синтаксической ошибки и никакой ошибки компиляции тоже не было. Там была написана вполне правильная, легальная  конструкция, которая, правда, делает не то, чего Вы ожидали. А то, Вы хотели написать другое - это исключительно Ваша проблема. Откуда компилятору знать, что Вы хотели написать? У него нет хрустального шара. Он компилирует то, что Вы написали.

La1m1e
Offline
Зарегистрирован: 30.12.2021

Ну это как минимум глупо присваивать переменной значение внутри "пустого" if. В других компиляторах на такие случаи хотя-бы предупреждения есть XD

b707
Offline
Зарегистрирован: 26.05.2017

La1m1e пишет:

Ну это как минимум глупо присваивать переменной значение внутри "пустого" if. В других компиляторах на такие случаи хотя-бы предупреждения есть XD


как минимум глупо обижаться на компилятор, если берешься программировать, не зная языка

sadman41
Offline
Зарегистрирован: 19.10.2016

Глупость в данном случае - это не про контроллер или компилятор.

Предупреждения включить нужно в настройках и понять, что никакой переменной внутри "пустого" if не присваивалось. Да и, скорее всего, "пустой" if был выкинут на этапе компиляции.

La1m1e
Offline
Зарегистрирован: 30.12.2021

При одиночном "=" переменной в if присвоилось значение 1, а кроме этого в if ничего не было

nik182
Offline
Зарегистрирован: 04.05.2015

Как это не было? Попробуй присвоить 1 и 0 поочерёденo и посмотри как сработает if.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

La1m1e пишет:

Ну это как минимум глупо присваивать переменной значение внутри "пустого" if.

Как минимум, глупо спорить о вещах в которых "ни уха, ни рыла".

La1m1e пишет:

В других компиляторах на такие случаи хотя-бы предупреждения есть XD

Это в каких?

----------------------------

Вы бы вместо того, чтобы спорить, подумали бы как таких ситуаций гарантированно избегать, чтобы никогда на них не нарываться, даже если случайно написал не так. Вам это интересно? Подсказать? Или Вы только поспорить зашли?

Green
Offline
Зарегистрирован: 01.10.2015

Думаю, пару раз нарвётся, просидев по пол дня, тогда и никакие приёмы будут не нужны.)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Green пишет:

Думаю, пару раз нарвётся, просидев по пол дня, тогда и никакие приёмы будут не нужны.)

Ну, есть же простые и действенные правила, типа "мойте руки перед едой".

Просто у человека, похоже, зуд не научиться, а доказать всем, что он прав, а компилятор - кривой. У нас уже был один такой участник.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Похоже, ТС путает понятия "компилятор" и "язык программирования", отсюда и непонятки. 

Компилятор делает в точности то, что предписано языком. 

Но, с другой стороны, IMHO хороший язык программирования ни в коем случае не должен допускать ситуации:

ЕвгенийП пишет:

Там была написана вполне правильная, легальная  конструкция, которая, правда, делает не то, чего Вы ожидали.

Ну не должна ошибка трактоваться как "легальная инструкция". И если это вдруг происходит - это недостаток системы, которая допускает подобное.

Цитата:

А то, Вы хотели написать другое - это исключительно Ваша проблема.

Да, язык Си именно таков - создает проблемы там, где их вполне могло бы и не быть. Причем, решение этих проблем перекладывает на пользователя (программиста).

В конце концов, как известно, "человеку свойственно ошибаться" и любой человеческий продукт должен учитывать это обстоятельство. В идеале. Увы, в реальной жизни это не так.

Upper
Offline
Зарегистрирован: 23.06.2020

andriano пишет:

В конце концов, как известно, "человеку свойственно ошибаться" и любой человеческий продукт должен учитывать это обстоятельство. В идеале. Увы, в реальной жизни это не так.

Текстовые редакторы стали довольно дружественны. Находят грамматические, стилистические, пунктуационные ошибки и предлагают варианты исправления. Есть люди которые считают, что это не всегда хорошо, т.к. снижает грамотность.

Если бы у разработчиков IDE (ориентированных на учащихся) было бы желание, то я думаю было бы не очень сложно добавить опцию с указанием уровня контроля грамотности, и если пользователь простит, то выполнять поиск "ошибок новичков", и возможно отклонение от заданного стиля форматирования.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

andriano,

Вы, похоже, сами того не подозревая, вторглись в старый холивар между сторонниками простоты языка с одной стороны и дуракоустойчивости - с другой.

В этом холиваре овер8к аргументов в обе стороны и вдаваться в них (т.е. возрождать холивар здесь) у меня нет никакого желания.

Отмечу лишь, что отменять тот факт, что операция присваивания - такая же операция, как и все остальные и также возвращает значение - сильно обеднять язык. А делать исключение (типа, мол в if её использовать нельзя) сильно его усложнит.

andriano пишет:

не должна ошибка трактоваться как "легальная инструкция"

Вы сами-то слышите, что говорите? Т.е. если я в формуле ошибся и вместо плюса написал минус, это не должно быть легальной конструкцией? Так? Или я чего-то недопонял? А откуда ему знать, ошибся я или я хотел написать именно минус?

andriano пишет:

"человеку свойственно ошибаться" и любой человеческий продукт должен учитывать это обстоятельство. В идеале. 

Ну, Вы же понимаете, что это невозможно и что идеальным бывает только операционный усилитель (если не считать гениальных решений "партии и правительства").

P.S. Все "вопросы" в этом посте - риторические. Отвечать не надо, т.к. никакой дискуссии всё равно не будет, не хочу, чтобы тема скатилась в холивар.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Upper пишет:

если пользователь простит, то выполнять поиск "ошибок новичков", и возможно отклонение от заданного стиля форматирования.

Видимо, "просит", так?

Upper пишет:

было бы не очень сложно

Вообще-то, по-уму, это работа по сложности сопоставима с написанием компилятора.

Если делать "по-простому", то получит то, что имеем в IDE сейчас, когда IDE при подготовке текста к компилированию сплошь и рядом уродует текст и провоцирует ошибки компиляции.

La1m1e
Offline
Зарегистрирован: 30.12.2021

Я тут уже получил ответ и вышел как сутки назад из диалога, а здесь до сих пор гуру-форумчане кукарекаются. А ведь ответил на мой вопрос по теме и правильно лишь один человек, пока остальные в разделе "ДЛЯ НОВИЧКОВ" наезжают на новичка, люблю форумы

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

La1m1e пишет:
Я тут уже получил ответ и вышел как сутки назад из диалога, а здесь до сих пор гуру-форумчане кукарекаются.

Понятно. Удачи Вам!

La1m1e
Offline
Зарегистрирован: 30.12.2021

И вам удачи

b707
Offline
Зарегистрирован: 26.05.2017

La1m1e пишет:
ответил на мой вопрос по теме и правильно лишь один человек, пока остальные в разделе "ДЛЯ НОВИЧКОВ" наезжают на новичка, люблю форумы

Старайтесь учиться - и никто наезжать не будет.

 

mixail844
Offline
Зарегистрирован: 30.04.2012

ЕвгенийП пишет:

подумали бы как таких ситуаций гарантированно избегать, чтобы никогда на них не нарываться, даже если случайно написал не так. Вам это интересно? Подсказать? Или Вы только поспорить зашли?

Интересно,расскажите пожалуйста:)

sadman41
Offline
Зарегистрирован: 19.10.2016

Поменять местами константу и переменную.

La1m1e
Offline
Зарегистрирован: 30.12.2021

sadman41 пишет:

Поменять местами константу и переменную.

mifar уже ответил давно, я просто забыл как == в if писать :)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

mixail844 пишет:

Интересно,расскажите пожалуйста:)

До Кихот уже опередил - выработать привычку писать константу слева, а переменную справа.

Upper
Offline
Зарегистрирован: 23.06.2020

ЕвгенийП пишет:

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

Я думал под "такими ситуациями" подразумевается ошибочное использование = вместо ==. А "гарантированный" ответ дан только для случая когда один из операндов не допускает присвоения. А если сравниваются две переменные?

Если же рассматривался конкретный пример ТС, то достаточно было просто включить вывод warning.

La1m1e
Offline
Зарегистрирован: 30.12.2021

В своём последнем проекте у меня половина всех if это сравнивание переменной и указанной в настройках кода перед войдсетуп "константе", т.е как не переставляй в сравнении "Mode == ModeLED", всё равно если поставить один "=" всё сломается

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Поставь вывод всех варнингов, обычно МинКомпиляции предупреждает...

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ЕвгенийП пишет:

andriano,

Вы, похоже, сами того не подозревая, вторглись в старый холивар

Вы, конечно, можете считать меня провокатором, но "не подозревая" - это не про меня. А вот для ТС это, похоже, в новинку. И именно ему я попытался объяснить, что проблема в рассматриваемом случае не в несовершенстве компилятора, а в известном недостатке самого языка программирования. Т.е. с языком Си иначе нельзя.

Цитата:

...сильно обеднять язык.

Обеднять?

А ничего, что он после такого "обеднения" остается сильно избыточным. При этом избыточность языка отмечают в качестве недостатка сам разработчик языка (сошлюсь на Кенрниган, Пайк Практика программирования).

Цитата:

Вы сами-то слышите, что говорите? Т.е. если я в формуле ошибся и вместо плюса написал минус, это не должно быть легальной конструкцией?

Ну, ошибки бывают разные. В частности, их можно разделить на легко- и трудно-обнаруживаемые. Так вот, парадокс заключается в том, что от всех ошибок защититься нельзя, но можно - от некоторых. При этом именно эти некоторые, как правило, оказываются трудно обнаруживаемыми

В конце концов, конструкция

   DO 3 I = 1.3

является вполне легальной конструкцией, тем не менее, "вина" за эту ошибку была возложена именно на язык, а не на программиста, допустившего эту ошибку.

Цитата:

Ну, Вы же понимаете, что это невозможно и что идеальным бывает только...

Безусловно, но я пытался донести эту мысль также и до ТС.