Проблема с чтением данных второй кнопки
- Войдите на сайт для отправки комментариев
Чт, 30/12/2021 - 16:19
Имеется 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 для стабильности }
Вот что выдаёт порт при обеих выключенных кнопках:
180
1
0
Также
я забыл в посте поменять вышеуказанный код с тестов на использующийся сейчас нижний
Мошт, INPUT_PULLUP тебя спасёть?
Мошт, INPUT_PULLUP тебя спасёть?
Так проблема не в дребезге, сама сенсорная кнопка имеет всю начинку и выдает только стабильные 1/0. Проблема что ВСЕГДА на одной кнопке значение 1. С включенным INPUT_PULLUP получается лишь завязать кнопку на контакт с gnd = 0 а не на присутствие/отсутствие сигнала выдаваемого сенсорной кнопкой. Первая кнопка прекрасно работает и без этого
Ну, схему твою я в глаза не видел, а хрустальный шар у мня мутный. Так что все свои советы я исчерпал
Даже если скинуть с платы ВСЁ и тыкать пинцетом между GND и этими двумя (указанными в коде) пинами на голой плате, то ситуация не меняется. Проблема проявляется без какой либо схемы в принципе, поэтому чтобы её увидеть достаточно найти "Arduino Leonardo фото" в гугле :). Попробовал воткнуть в вторую плату, чтоб точно избежать неисправности платы. Поведение не изменилось
Местами менял?
Ну, схему твою я в глаза не видел, а хрустальный шар у мня мутный. Так что все свои советы я исчерпал
Местами менял?
Если имеешь ввиду значения
то менял, просто проблема перемещается с 4 на 2 пин)
Если ты имеешь ввиду кнопки физически - я уже писал что проблема не зависит даже от наличия кнопок, не говоря о порядке их подключения
В строках 25 и 31 что написано?
В строках 25 и 31 что написано?
Спасибо. Не думал что синтаксическая ошибка в if будет так влиять и почему он делал такую ерунду вместо обычной ошибки компиляции. я исправил на == и оно заработало как должно. Но всё ещё остаётся загадкой - почему в таком случае одна из кнопок работала на вывод в сериал порт, а вторая нет?
А что остаётся делать if-у, если условие всегда верно - else выполнять по рандомайзу что ли?
А чего тут думать? Не было там никакой синтаксической ошибки и никакой ошибки компиляции тоже не было. Там была написана вполне правильная, легальная конструкция, которая, правда, делает не то, чего Вы ожидали. А то, Вы хотели написать другое - это исключительно Ваша проблема. Откуда компилятору знать, что Вы хотели написать? У него нет хрустального шара. Он компилирует то, что Вы написали.
Ну это как минимум глупо присваивать переменной значение внутри "пустого" if. В других компиляторах на такие случаи хотя-бы предупреждения есть XD
Ну это как минимум глупо присваивать переменной значение внутри "пустого" if. В других компиляторах на такие случаи хотя-бы предупреждения есть XD
как минимум глупо обижаться на компилятор, если берешься программировать, не зная языка
Глупость в данном случае - это не про контроллер или компилятор.
Предупреждения включить нужно в настройках и понять, что никакой переменной внутри "пустого" if не присваивалось. Да и, скорее всего, "пустой" if был выкинут на этапе компиляции.
При одиночном "=" переменной в if присвоилось значение 1, а кроме этого в if ничего не было
Как это не было? Попробуй присвоить 1 и 0 поочерёденo и посмотри как сработает if.
Ну это как минимум глупо присваивать переменной значение внутри "пустого" if.
Как минимум, глупо спорить о вещах в которых "ни уха, ни рыла".
В других компиляторах на такие случаи хотя-бы предупреждения есть XD
Это в каких?
----------------------------
Вы бы вместо того, чтобы спорить, подумали бы как таких ситуаций гарантированно избегать, чтобы никогда на них не нарываться, даже если случайно написал не так. Вам это интересно? Подсказать? Или Вы только поспорить зашли?
Думаю, пару раз нарвётся, просидев по пол дня, тогда и никакие приёмы будут не нужны.)
Думаю, пару раз нарвётся, просидев по пол дня, тогда и никакие приёмы будут не нужны.)
Ну, есть же простые и действенные правила, типа "мойте руки перед едой".
Просто у человека, похоже, зуд не научиться, а доказать всем, что он прав, а компилятор - кривой. У нас уже был один такой участник.
Похоже, ТС путает понятия "компилятор" и "язык программирования", отсюда и непонятки.
Компилятор делает в точности то, что предписано языком.
Но, с другой стороны, IMHO хороший язык программирования ни в коем случае не должен допускать ситуации:
Там была написана вполне правильная, легальная конструкция, которая, правда, делает не то, чего Вы ожидали.
Ну не должна ошибка трактоваться как "легальная инструкция". И если это вдруг происходит - это недостаток системы, которая допускает подобное.
А то, Вы хотели написать другое - это исключительно Ваша проблема.
Да, язык Си именно таков - создает проблемы там, где их вполне могло бы и не быть. Причем, решение этих проблем перекладывает на пользователя (программиста).
В конце концов, как известно, "человеку свойственно ошибаться" и любой человеческий продукт должен учитывать это обстоятельство. В идеале. Увы, в реальной жизни это не так.
В конце концов, как известно, "человеку свойственно ошибаться" и любой человеческий продукт должен учитывать это обстоятельство. В идеале. Увы, в реальной жизни это не так.
Текстовые редакторы стали довольно дружественны. Находят грамматические, стилистические, пунктуационные ошибки и предлагают варианты исправления. Есть люди которые считают, что это не всегда хорошо, т.к. снижает грамотность.
Если бы у разработчиков IDE (ориентированных на учащихся) было бы желание, то я думаю было бы не очень сложно добавить опцию с указанием уровня контроля грамотности, и если пользователь простит, то выполнять поиск "ошибок новичков", и возможно отклонение от заданного стиля форматирования.
andriano,
Вы, похоже, сами того не подозревая, вторглись в старый холивар между сторонниками простоты языка с одной стороны и дуракоустойчивости - с другой.
В этом холиваре овер8к аргументов в обе стороны и вдаваться в них (т.е. возрождать холивар здесь) у меня нет никакого желания.
Отмечу лишь, что отменять тот факт, что операция присваивания - такая же операция, как и все остальные и также возвращает значение - сильно обеднять язык. А делать исключение (типа, мол в if её использовать нельзя) сильно его усложнит.
не должна ошибка трактоваться как "легальная инструкция"
Вы сами-то слышите, что говорите? Т.е. если я в формуле ошибся и вместо плюса написал минус, это не должно быть легальной конструкцией? Так? Или я чего-то недопонял? А откуда ему знать, ошибся я или я хотел написать именно минус?
"человеку свойственно ошибаться" и любой человеческий продукт должен учитывать это обстоятельство. В идеале.
Ну, Вы же понимаете, что это невозможно и что идеальным бывает только операционный усилитель (если не считать гениальных решений "партии и правительства").
P.S. Все "вопросы" в этом посте - риторические. Отвечать не надо, т.к. никакой дискуссии всё равно не будет, не хочу, чтобы тема скатилась в холивар.
если пользователь простит, то выполнять поиск "ошибок новичков", и возможно отклонение от заданного стиля форматирования.
Видимо, "просит", так?
было бы не очень сложно
Вообще-то, по-уму, это работа по сложности сопоставима с написанием компилятора.
Если делать "по-простому", то получит то, что имеем в IDE сейчас, когда IDE при подготовке текста к компилированию сплошь и рядом уродует текст и провоцирует ошибки компиляции.
Я тут уже получил ответ и вышел как сутки назад из диалога, а здесь до сих пор гуру-форумчане кукарекаются. А ведь ответил на мой вопрос по теме и правильно лишь один человек, пока остальные в разделе "ДЛЯ НОВИЧКОВ" наезжают на новичка, люблю форумы
Понятно. Удачи Вам!
И вам удачи
Старайтесь учиться - и никто наезжать не будет.
подумали бы как таких ситуаций гарантированно избегать, чтобы никогда на них не нарываться, даже если случайно написал не так. Вам это интересно? Подсказать? Или Вы только поспорить зашли?
Интересно,расскажите пожалуйста:)
Поменять местами константу и переменную.
Поменять местами константу и переменную.
mifar уже ответил давно, я просто забыл как == в if писать :)
Интересно,расскажите пожалуйста:)
До Кихот уже опередил - выработать привычку писать константу слева, а переменную справа.
.... как таких ситуаций гарантированно избегать, чтобы никогда на них не нарываться, даже если случайно написал не так. Вам это интересно? Подсказать?
Я думал под "такими ситуациями" подразумевается ошибочное использование = вместо ==. А "гарантированный" ответ дан только для случая когда один из операндов не допускает присвоения. А если сравниваются две переменные?
Если же рассматривался конкретный пример ТС, то достаточно было просто включить вывод warning.
В своём последнем проекте у меня половина всех if это сравнивание переменной и указанной в настройках кода перед войдсетуп "константе", т.е как не переставляй в сравнении "Mode == ModeLED", всё равно если поставить один "=" всё сломается
Поставь вывод всех варнингов, обычно МинКомпиляции предупреждает...
andriano,
Вы, похоже, сами того не подозревая, вторглись в старый холивар
Вы, конечно, можете считать меня провокатором, но "не подозревая" - это не про меня. А вот для ТС это, похоже, в новинку. И именно ему я попытался объяснить, что проблема в рассматриваемом случае не в несовершенстве компилятора, а в известном недостатке самого языка программирования. Т.е. с языком Си иначе нельзя.
...сильно обеднять язык.
Обеднять?
А ничего, что он после такого "обеднения" остается сильно избыточным. При этом избыточность языка отмечают в качестве недостатка сам разработчик языка (сошлюсь на Кенрниган, Пайк Практика программирования).
Вы сами-то слышите, что говорите? Т.е. если я в формуле ошибся и вместо плюса написал минус, это не должно быть легальной конструкцией?
Ну, ошибки бывают разные. В частности, их можно разделить на легко- и трудно-обнаруживаемые. Так вот, парадокс заключается в том, что от всех ошибок защититься нельзя, но можно - от некоторых. При этом именно эти некоторые, как правило, оказываются трудно обнаруживаемыми.
В конце концов, конструкция
является вполне легальной конструкцией, тем не менее, "вина" за эту ошибку была возложена именно на язык, а не на программиста, допустившего эту ошибку.
Ну, Вы же понимаете, что это невозможно и что идеальным бывает только...