Отображение при нажатии кнопки для светодиода и возврат 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
  {
    ;
  }
} 

, 👍0

Обсуждение

Посмотрите пример StateChangeDetection, который предоставляется в среде разработки Arduino IDE, а также https://www.arduino.cc/en/Tutorial/Button., @MichaelT

Кроме того, это зависит от микроконтроллера, но на большинстве продуктов Arduino светодиод находится на контакте 13, а не на 15., @MichaelT

это школьное задание?, @jsotola


2 ответа


Лучший ответ:

1

В вашей функции 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


0

Ваша проблема может заключаться только в том, что вы не вызываете функцию кнопки. Попробуйте изменить if (button >=0) на if (button() >=0).

,

Ах да, ты прав. Я внес изменения, и теперь последовательный монитор печатает привет, но не возвращает 1, и я не получаю 0, когда не нажимаю кнопку. Кстати, спасибо за редактирование! Очень признателен., @Zèro

Если вы хотите вывести 0 и 1 на последовательную консоль, вам нужно добавить вызовы Serial.print(...). Если я правильно понимаю, что вы хотите, вы можете заменить все тело цикла() на Serial.println(loop());, @kentavv