Arduino Digispark ATtiny85 условная логика не работает

Ожидаемое поведение:

Я пытаюсь использовать && или вложенные операторы if, чтобы добиться эффекта, при котором два переключателя должны замкнуться до того, как загорится светодиод (т. е. щелкнуть обоими переключателями), светодиод загорается на 1 секунду, а затем гаснет.

Встреченное поведение:

Похоже, что независимо от того, как я пишу утверждение, если ВТОРОЙ if истинен, светодиод загорается.

Дополнительная информация:

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

Я попробовал несколько условных операторов:

  1. используя &&: если (переключатель1 == НИЗКИЙ && переключатель2 == НИЗКИЙ) {код светодиода}
  2. Вложенный if: if (switch1 == LOW) { if (switch2 == LOW) {код светодиода} }

Я пробовал несколько объявлений переменных:

  1. int switch1 = 0; int switch2 = 1; (используется целочисленное представление распиновки digispark)
  2. #define switch1 PB1
#define switch1 PB1
#define switch2 PB0

void setup()
{
  pinMode(2, OUTPUT);
  pinMode(switch1, INPUT_PULLUP);
  pinMode(switch2, INPUT_PULLUP);
}

void loop() {
  if (!digitalRead(switch1)) {
    if (!digitalRead(switch2)) {
      digitalWrite(2, HIGH);
      // включаем светодиод (HIGH — уровень напряжения)
      delay(1000); // ждем секунду
      digitalWrite(2, LOW);
    }
  }

  else {
    digitalWrite(2, LOW);
    delay(1);
  }
}

Мой Digispark Attiny85 подключен к макетной плате, где он получает питание через контакты 5 В и заземления на плате Digispark. PB0 и PB1 подключаются напрямую к земле, когда они закрыты, в противном случае я рассчитываю на подтягивающие резисторы. PB2 подключен к светодиоду -> резистор -> заземление. Все компоненты используют одно и то же питание 5 В и заземление.

, 👍2

Обсуждение

что произойдет, если изменить второй оператор if на if (false){?, @jsotola

@jsotola Теперь ничего не происходит, когда я подключаюсь к заземлению PB0, PB1 или к обоим, @jmarywien

@jsotola. Последняя проблема. Это ВТОРОЙ `if` , который, если истина, включает светодиод. То есть, первый `if` по какой-то причине не имеет значения, и я не могу понять, почему так происходит, @jmarywien

создадим первый if (false) ... что произойдет потом?, @jsotola

@jsotola, я думаю, что ответил ниже. Можете проверить мои рассуждения?, @jmarywien


2 ответа


1

Похоже, к переключателям подключены неправильные физические контакты:

Контакты 0 и 1 подключаются непосредственно к земле в закрытом состоянии, в противном случае я рассчитываю на подтягивающие резисторы.

Однако:

  • PB0 — физический контакт 5
  • PB1 — это физический контакт 6

ATTiny85 распиновка

,

Прошу прощения за неряшливый язык. У digispark есть помеченные контакты, и я имел в виду, что я подключился к контактам PB0 и PB1 на digispark. Итак, у меня есть контакты PB0 и PB1 на digispark, которые подключены к земле, когда они закрыты, @jmarywien

@jmarywien, пожалуйста, обновите свой вопрос, добавив эту новую информацию, @jsotola

@jsotola. Спасибо, обновил язык и добавил схему, @jmarywien


3

Я уверен, что решил проблему, и думаю, что знаю, почему она возникает.

PB1 на digispark Attiny85 имеет встроенный светодиод. Этот светодиод все еще активен, когда я запускаю свой код. Светодиод тусклый, но потребляет энергию. Моя гипотеза заключается в том, что он потребляет достаточно тока, чтобы перевести этот вывод в низкий уровень, когда digital_read вызывается на PB1. Следовательно, PB1 всегда оценивается как true из-за внутреннего светодиода (несмотря на то, что input_pullup должен перевести его в false по умолчанию).

Вот как я проверил эту гипотезу:

  1. Если я подключу PB1 к 5 В+, внутренний светодиод станет ярче, а светодиод моего проекта никогда не загорится. То есть, мой первый if теперь !true, поэтому условие не выполнится.
  2. Если я перекодирую, чтобы исключить PB1 и вместо этого сопоставить с PB3, мой код будет работать так, как задумано.

Все это к тому, что я думаю, что даже если указать PB1 как input_pullup, он не будет вести себя так, как ожидалось, из-за внутреннего светодиода.

@jsotola, спасибо за твою доброту и терпение. Что ты думаешь?

,

имеет смысл... удалите внешний светодиод и используйте вместо него внутренний светодиод... используйте PB0 и PB2 для переключателей, @jsotola

Хорошая отладочная работа. В будущем вы также можете просто спамить там кучей Serial.print(), чтобы контролировать, работают ли ваши переключатели, @towe

@towe Я не уверен, что смогу сделать это с помощью digispark, но я новичок в этом деле и дам вам знать, что узнаю, @jmarywien