Arduino Digispark ATtiny85 условная логика не работает
Ожидаемое поведение:
Я пытаюсь использовать && или вложенные операторы if, чтобы добиться эффекта, при котором два переключателя должны замкнуться до того, как загорится светодиод (т. е. щелкнуть обоими переключателями), светодиод загорается на 1 секунду, а затем гаснет.
Встреченное поведение:
Похоже, что независимо от того, как я пишу утверждение, если ВТОРОЙ if истинен, светодиод загорается.
Дополнительная информация:
При замыкании переключатели подключаются непосредственно к земле.
Я попробовал несколько условных операторов:
- используя
&&:если (переключатель1 == НИЗКИЙ && переключатель2 == НИЗКИЙ) {код светодиода} - Вложенный
if:if (switch1 == LOW) { if (switch2 == LOW) {код светодиода} }
Я пробовал несколько объявлений переменных:
int switch1 = 0; int switch2 = 1;(используется целочисленное представление распиновки digispark)#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 В и заземление.

@jmarywien, 👍2
Обсуждение2 ответа
Похоже, к переключателям подключены неправильные физические контакты:
Контакты 0 и 1 подключаются непосредственно к земле в закрытом состоянии, в противном случае я рассчитываю на подтягивающие резисторы.
Однако:
PB0— физический контакт 5PB1— это физический контакт 6

Прошу прощения за неряшливый язык. У digispark есть помеченные контакты, и я имел в виду, что я подключился к контактам PB0 и PB1 на digispark. Итак, у меня есть контакты PB0 и PB1 на digispark, которые подключены к земле, когда они закрыты, @jmarywien
@jmarywien, пожалуйста, обновите свой вопрос, добавив эту новую информацию, @jsotola
@jsotola. Спасибо, обновил язык и добавил схему, @jmarywien
Я уверен, что решил проблему, и думаю, что знаю, почему она возникает.
PB1 на digispark Attiny85 имеет встроенный светодиод. Этот светодиод все еще активен, когда я запускаю свой код. Светодиод тусклый, но потребляет энергию. Моя гипотеза заключается в том, что он потребляет достаточно тока, чтобы перевести этот вывод в низкий уровень, когда digital_read вызывается на PB1. Следовательно, PB1 всегда оценивается как true из-за внутреннего светодиода (несмотря на то, что input_pullup должен перевести его в false по умолчанию).
Вот как я проверил эту гипотезу:
- Если я подключу
PB1к 5 В+, внутренний светодиод станет ярче, а светодиод моего проекта никогда не загорится. То есть, мой первыйifтеперь!true, поэтому условие не выполнится. - Если я перекодирую, чтобы исключить
PB1и вместо этого сопоставить сPB3, мой код будет работать так, как задумано.
Все это к тому, что я думаю, что даже если указать PB1 как input_pullup, он не будет вести себя так, как ожидалось, из-за внутреннего светодиода.
@jsotola, спасибо за твою доброту и терпение. Что ты думаешь?
имеет смысл... удалите внешний светодиод и используйте вместо него внутренний светодиод... используйте PB0 и PB2 для переключателей, @jsotola
Хорошая отладочная работа. В будущем вы также можете просто спамить там кучей Serial.print(), чтобы контролировать, работают ли ваши переключатели, @towe
@towe Я не уверен, что смогу сделать это с помощью digispark, но я новичок в этом деле и дам вам знать, что узнаю, @jmarywien
- Digispark Atinny85 не распознан (проблема с загрузчиком)
- Связь последовательного порта Digispark
- Библиотеки I2C для ATTiny85?
- Программирование микроконтроллера Attiny85 без arduino
- Digispark ATtiny 85 - не распознается как HID устройство
- Клавиатура Digispark ATtiny85
- Та же кнопка одним кликом и двойным кликом
- Mac для последовательной связи с Digispark ATtiny85
что произойдет, если изменить второй оператор
ifнаif (false){?, @jsotola@jsotola Теперь ничего не происходит, когда я подключаюсь к заземлению PB0, PB1 или к обоим, @jmarywien
@jsotola. Последняя проблема. Это ВТОРОЙ
`if`, который, если истина, включает светодиод. То есть, первый`if`по какой-то причине не имеет значения, и я не могу понять, почему так происходит, @jmarywienсоздадим первый
if (false)... что произойдет потом?, @jsotola@jsotola, я думаю, что ответил ниже. Можете проверить мои рассуждения?, @jmarywien