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


2 ответа


1

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

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

Однако:

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

ATTiny85 распиновка

,

3

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

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

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

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

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

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

,