Как инициализировать цифровой выходной контакт как LOW
Мне нужно определить контакт как выход для релейного модуля, но когда я делаю это в разделе настройки, реле активируется автоматически (низкий уровень - 0), а затем я немедленно деактивирую его с помощью кодирования digitalWrite(pin, 1)
но эта проблема приводит к тому, что реле активируется, а затем деактивируется в течение миллисекунд. Но я хочу знать, можно ли определить вывод как выходной, но по умолчанию низкий.
void setup(){
pinMode(pin,OUTPUT);
digitalWrite(pin,1);
}
void loop(){
if(start_relay){
digitalWrite(pin, 0);
}
}
@Alper, 👍3
Обсуждение3 ответа
Лучший ответ:
Есть два решения:
- Используйте контакт как контакт с открытым коллектором, как в ответе VE7JRO.
Переключите вывод между входом (высокий) и выходом с низким. я предпочитаю использовать INPUT_PULLUP. - Запишите выходное значение перед установкой pinMode.
Все микроконтроллеры семейства AVR (чипы ATtiny и ATmega) позволяют устанавливать выходное значение перед установкой вывода в качестве выхода. Это включит подтягивающий резистор, но если все сделано в правильном порядке, это нормально.
Поскольку это распространенный способ использования микроконтроллеров и процессоров, библиотеки Arduino позволяют его использовать. Библиотеки Arduino для процессоров SAMD (Arduino Zero, M0 и MKR) также позволяют это сделать.
void setup() {
digitalWrite(pin,HIGH); // предварительно устанавливаем выходное значение HIGH
pinMode(pin,OUTPUT); // устанавливаем вывод, он будет ВЫСОКИЙ
}
void loop() {
digitalWrite(pin,LOW);
delay(1000);
digitalWrite(pin,HIGH);
delay(1000);
}
Если модуль реле имеет плавающие входы (насколько мне известно, их нет), вам потребуется дополнительное оборудование для повышения уровня сигнала с помощью подтягивающего резистора, чтобы реле оставались отключенными во время сброса.
Насколько я знаю, по умолчанию цифровые контакты установлены как входы. В Arduino есть только подтягивающие резисторы, которые вы можете использовать следующим образом:
digitalWrite(pinOut[i], HIGH);
в первой строке setup() (без pinMode(pinOut[i], OUTPUT);
).
Если вам необходимо состояние LOW при запуске (подтягивающие резисторы), вам необходимо использовать внешний резистор.
Если вы хотите активировать внутреннее подтягивание, pinMode(pin, INPUT_PULLUP);
более понятен (потому что более явный), чем digitalWrite(pin, HIGH);
., @Edgar Bonet
Если у вас есть реле, которое активируется НИЗКИМ или заземляющим путем и деактивируется из-за разомкнутой цепи или подачи сигнала HIGH, вы можете попробовать переключить pinMode действовать как ВЫСОКИЙ или разомкнутая цепь.
const byte pin = 2;
void setup(){
// Определите вывод как INPUT_PULLUP, пока не будете готовы его использовать.
pinMode(pin, INPUT_PULLUP);
}
void loop(){
delay(1000);
// Активируем реле. Обеспечение низкого импеданса
// путь к земле включает реле.
pinMode(pin, OUTPUT);
digitalWrite(pin, LOW);
delay(1000);
// Деактивируем реле.
pinMode(pin, INPUT_PULLUP);
// Использование digitalWrite(pin, HIGH); является альтернативой использованию
// pinMode(pin, INPUT_PULLUP); Если ваш релейный модуль
// то же, что показано ниже, тогда не имеет значения, какой
// метод, который вы выбираете.
}
Я не уверен, какой модуль реле вы используете, но если он такого же типа, использование INPUT_PULLUP подойдет.
Как Эдгар Боне упоминает в своем комментарии к ответу Кота, использование pinMode(pin, INPUT_PULLUP);
более понятно, чем использование digitalWrite(pin, HIGH);
.
Этот код делает две вещи:
digitalWrite(pin,HIGH);
pinMode(pin,OUTPUT);
Сначала он устанавливает для вывода значение INPUT_PULLUP, затем устанавливает его в значение VCC (из-за отсутствия лучшего термина). Если подключить к выводу 2 современный светодиод с резистором сопротивлением 1 кОм и использовать этот скетч, то можно увидеть, что светодиод "тускло" горит 5 секунд, затем он "ярко" горит.
const byte pin = 2;
void setup() {
// предварительно устанавливаем выходное значение HIGH
// Внутренний подтягивающий резистор теперь подключен к выводу.
digitalWrite(pin,HIGH);
// Подождите 5 секунд.
delay(5000);
// устанавливаем вывод, он будет ВЫСОКИЙ
// Вывод теперь подключен к VCC (из-за отсутствия лучшего термина).
pinMode(pin,OUTPUT);
}
void loop(){}
- Ardunio Mega/ATmega2560: использование порта F или K как для аналоговых входов, так и для цифровых выходов.
- Управлять твердотельным реле непосредственно с цифрового вывода arduino?
- Несколько кнопок для управления реле
- Выходное напряжение цифрового вывода падает при управлении реле
- Ищу ссылку на двухполюсное однопозиционное реле (DPST) для Arduino.
- Вопрос новичка - Biltong Box Project
- Регулятор напряжения перегревается
- управление 2 датчиками и 3 насосами с помощью millis
у вас есть модуль реле, который отключается, если сигнал ВЫСОКИЙ. AVR MCU запускается с выводами в режиме INPUT, поэтому реле не управляется Arduino до тех пор, пока не будет установлена функция
setup()
., @JurajВы имеете в виду, что вам нужен «OUTPUT» «HIGH» без переходного процесса «OUTPUT» «LOW»?, @Edgar Bonet