Отображение при нажатии кнопки для светодиода и возврат 1
Я только начал использовать Arduino, и у меня возникли проблемы с написанием кода.
Вот задание, которое мне нужно выполнить.
"Создать функцию чтения кнопки
Подсказка: заголовок функции должен быть int checkbutton ( void )
в функции цикла добавьте код, чтобы, если кнопка была нажата (например, функция контрольной кнопки
возвращает 1), на последовательный монитор отправляется сообщение с вашим именем пользователя."
В коде нет ошибок, но в последовательном мониторе ничего не происходит, когда я нажимаю светодиодную кнопку, и он не возвращает 0, когда я не нажимаю светодиодную кнопку. Будем признательны за любую помощь!
Спасибо!
int Button = 15; //светодиод и выход на одном контакте
int last = 0;
void setup() {
Serial.begin(9600);
}
int button() {
pinMode(Button, INPUT);
int current = digitalRead(Button);
if (current and not last) {
delay(5);
pinMode(Button, OUTPUT);
Serial.print("Hey");
return 1;
}
else {
pinMode(Button, OUTPUT);
current == last;
return 0;
}
}
void loop() {
if (button >=0)
{
button();
}
else
{
;
}
}
@Zèro , 👍0
Обсуждение2 ответа
Лучший ответ:
В вашей функции button() строка
if (current and not last) {
является менее распространенным синтаксисом. Более распространенный эквивалент:
if (current && !last) {
(см. https://stackoverflow.com/questions/2376448/the -написанные-версии-логических-операторов)
Эта строка:
current == last;
Не имеет никакого эффекта и является неверным. Это ( "==" ) не присваивание, а сравнение, и оно не делает того, что вы хотите.
Я также думаю, что вы ошибаетесь. Вы хотите сохранить «последнее» состояние кнопки, чтобы сравнить его с текущим состоянием кнопки при вызове button()
в следующий раз. Таким образом, вам нужно будет установить «последнее» в текущее состояние кнопки, например:
last = current;
В следующий раз, когда вы вызовете button()
, «последнее» будет содержать предыдущее состояние кнопки, поэтому ваше сравнение с текущим состоянием кнопки будет работать.
И я думаю, что ваш код обнаружения кнопки будет работать лучше, если вы будете устанавливать last = current
каждый раз, когда вы вызываете кнопку(), независимо от того, была ли кнопка нажата или нет. В противном случае ваш код будет постоянно печатать «Эй», пока вы не перестанете нажимать кнопку (если только вы этого не хотите). Вот так:
int button() {
pinMode(Button, INPUT);
int current = digitalRead(Button);
if (current && !last) {
...
...
Serial.print("Hey");
last = current; // Вставить сюда
return 1;
}
else {
pinMode(Button, OUTPUT);
...
(Это не тестировалось, но должно дать вам общее представление).
Большое спасибо! Исправил мой код и помог улучшить мое понимание, очень признателен., @Zèro
Ваша проблема может заключаться только в том, что вы не вызываете функцию кнопки. Попробуйте изменить if (button >=0)
на if (button() >=0)
.
Ах да, ты прав. Я внес изменения, и теперь последовательный монитор печатает привет, но не возвращает 1, и я не получаю 0, когда не нажимаю кнопку. Кстати, спасибо за редактирование! Очень признателен., @Zèro
Если вы хотите вывести 0 и 1 на последовательную консоль, вам нужно добавить вызовы Serial.print(...). Если я правильно понимаю, что вы хотите, вы можете заменить все тело цикла() на Serial.println(loop());, @kentavv
- Остановить мигание светодиодов
- Интеграция 2 кнопок для включения и выключения светодиода.
- Код Arduino для управления 4 светодиодами с 4 кнопок
- Нужен ли подтягивающий/понижающий резистор для цепи светодиода кнопки?
- Прерывание при нажатии кнопки + устранение дребезга
- Светодиод с кнопочным управлением Arduino со сборкой AVR
- Как повторить другое действие внутри цикла?
- Изменение состояния светодиода с помощью кнопки приводит к нестабильному результату
Посмотрите пример StateChangeDetection, который предоставляется в среде разработки Arduino IDE, а также https://www.arduino.cc/en/Tutorial/Button., @MichaelT
Кроме того, это зависит от микроконтроллера, но на большинстве продуктов Arduino светодиод находится на контакте 13, а не на 15., @MichaelT
это школьное задание?, @jsotola