Да, нет, подтяжку можно и так как выше было делать. Вернее, даже, это единственный путь, просто INPUT_PULLUP именно так и поступает – пишет HIGH в порт, сконфигурированный как INPUT.
В даташите написано: If PORTxn is written logic one when the pin is configured as an input pin, the pull-up resistor is activated.
Макет и все все все, на работе, там я буду через 2 дня.
Попробую установить программу ардуино и все библиотеки на домашнем ПК, а также собрать на макетке дома и попробовать в ближайшее время. Спасибо.
Ваше условие простое
для ВКЛ используйте ИЛИ (Или датчик , или кнопка активны)
для ВЫКЛ используйте И (Выключаем, если и датчик, и кнопка не активны)
Зачастую, условие можно описать при помощи оператора else
Специально для этого придумали логические функции: конъюнкцию и дизъюнкцию.
Выбор между ними осуществляется, исходя из того, что нужно: чтобы заданное действие наступало либо при одновременном наличии двух условий, либо, наоборот, при наличии хотя бы одного из них.
Вы не приводите схему и не описываете, чего хотите, поэтому наверняка сказать нельзя, но есть подозрение, что Вы перепутали эти функции между собой.
Ну и еще несколько замечаний по коду:
digitalRead() принято вызывать один раз за проход цикла. Если величина должна использоваться более одного раза, принято запоминать ее в переменной. Иначе в программе возможно непредсказуемое поведение, например, при дребезге контактов.
Для логических переменных вместо someValue == 0 (или == LOW) принято писать !someValue, вместо someValue == 1 - someValue.
Начать следует с изучения учебника математической логики.
Что-то я этот код не осилил.
Читается состояние кнопки, и, через несколько микросекунд - опять оно же. С чего бы оно должно разными значениями - непонятно.
Т.е., если кнопка НЕ нажата, flag = 1, и millis() перезапоминаются каждый раз. А если кнопка нажата, а потом быстро отпущена?
Тут явно что-то не то.
Тебе надо реагировать на два события - кнопка нажата и кнопка отпущена. Сделать это можно используя attachInterrupt().