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
Я уверен, что решил проблему, и думаю, что знаю, почему она возникает.
PB1
на digispark Attiny85 имеет встроенный светодиод. Этот светодиод все еще активен, когда я запускаю свой код. Светодиод тусклый, но потребляет энергию. Моя гипотеза заключается в том, что он потребляет достаточно тока, чтобы перевести этот вывод в низкий уровень, когда digital_read
вызывается на PB1
. Следовательно, PB1
всегда оценивается как true
из-за внутреннего светодиода (несмотря на то, что input_pullup
должен перевести его в false
по умолчанию).
Вот как я проверил эту гипотезу:
- Если я подключу
PB1
к 5 В+, внутренний светодиод станет ярче, а светодиод моего проекта никогда не загорится. То есть, мой первыйif
теперь!true
, поэтому условие не выполнится. - Если я перекодирую, чтобы исключить
PB1
и вместо этого сопоставить сPB3
, мой код будет работать так, как задумано.
Все это к тому, что я думаю, что даже если указать PB1
как input_pullup
, он не будет вести себя так, как ожидалось, из-за внутреннего светодиода.
@jsotola, спасибо за твою доброту и терпение. Что ты думаешь?
- Digispark Atinny85 не распознан (проблема с загрузчиком)
- Связь последовательного порта Digispark
- Библиотеки I2C для ATTiny85?
- Программирование микроконтроллера Attiny85 без arduino
- Digispark ATtiny 85 - не распознается как HID устройство
- Клавиатура Digispark ATtiny85
- Та же кнопка одним кликом и двойным кликом
- Mac для последовательной связи с Digispark ATtiny85