Как инициализировать цифровой выходной контакт как LOW

Мне нужно определить контакт как выход для релейного модуля, но когда я делаю это в разделе настройки, реле активируется автоматически (низкий уровень - 0), а затем я немедленно деактивирую его с помощью кодирования digitalWrite(pin, 1) но эта проблема приводит к тому, что реле активируется, а затем деактивируется в течение миллисекунд. Но я хочу знать, можно ли определить вывод как выходной, но по умолчанию низкий.

void setup(){
  pinMode(pin,OUTPUT);
  digitalWrite(pin,1);
}

void loop(){
  if(start_relay){
    digitalWrite(pin, 0);
  }
}

, 👍3

Обсуждение

у вас есть модуль реле, который отключается, если сигнал ВЫСОКИЙ. AVR MCU запускается с выводами в режиме INPUT, поэтому реле не управляется Arduino до тех пор, пока не будет установлена функция setup()., @Juraj

Вы имеете в виду, что вам нужен «OUTPUT» «HIGH» без переходного процесса «OUTPUT» «LOW»?, @Edgar Bonet


3 ответа


Лучший ответ:

2

Есть два решения:

  1. Используйте контакт как контакт с открытым коллектором, как в ответе VE7JRO.
    Переключите вывод между входом (высокий) и выходом с низким. я предпочитаю использовать INPUT_PULLUP.
  2. Запишите выходное значение перед установкой 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);
}

Если модуль реле имеет плавающие входы (насколько мне известно, их нет), вам потребуется дополнительное оборудование для повышения уровня сигнала с помощью подтягивающего резистора, чтобы реле оставались отключенными во время сброса.

,

1

Насколько я знаю, по умолчанию цифровые контакты установлены как входы. В Arduino есть только подтягивающие резисторы, которые вы можете использовать следующим образом:

digitalWrite(pinOut[i], HIGH);

в первой строке setup() (без pinMode(pinOut[i], OUTPUT);).

Если вам необходимо состояние LOW при запуске (подтягивающие резисторы), вам необходимо использовать внешний резистор.

,

Если вы хотите активировать внутреннее подтягивание, pinMode(pin, INPUT_PULLUP); более понятен (потому что более явный), чем digitalWrite(pin, HIGH);., @Edgar Bonet


2

Если у вас есть реле, которое активируется НИЗКИМ или заземляющим путем и деактивируется из-за разомкнутой цепи или подачи сигнала 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(){}
,