NodeMCU 1.0 - Порт D3, реле и насос не загружаются

Я пытаюсь создать систему полива с использованием NodeMCU 1.0, реле и нескольких насосов.

В настоящее время у меня уже используются порты D0, D1, D2, D5, D6, D7, D8. Я пытаюсь использовать порт D3 (GPIO0) следующим образом, но когда я подключаю или перезагружаю NodeMCU, иногда (!) при загрузке запускается реле, насос начинает поливать, а плата не завершает загрузку.

Упрощенная схема

Единственные способы начать игру следующие:

  • Отключите ток от реле
  • Отключите D4, пока загрузка не закончится
  • Отсоедините насос от реле

Я попробовал заменить насос светодиодом и резистором, и у меня не возникло никаких проблем. Я также попробовал поставить резистор перед насосом и он запустился (но насос не работает).

При загрузке моя первая команда (после определения переменной и объекта) устанавливает D3 как HIGH)

#define D0 16
#define D1 5
#define D2 4
#define D3 0
#define D4 2
#define D5 14
#define D6 12
#define D7 13
#define D8 15
#define A0 17
#define TX 1
#define RX 3
#define MSG_BUFFER_SIZE 128


// Инициализация клиентов
WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastMsg = 0;
char msg[MSG_BUFFER_SIZE];
int iteration = 0;
int ID = -1;
int first_run = 1;

void setup() {
  //Начальная настройка
  digitalWrite(D3, HIGH);
  pinMode(D3, OUTPUT);
  delay(4000);
  Serial.begin(9600);
  ...
}

Я действительно не понимаю, в чем проблема.

, 👍1


1 ответ


1

D3 подключен к кнопке FLASH на плате. Она используется для управления режимом загрузки при запуске. Если этот вывод имеет низкий уровень при запуске, он останется в режиме флэш-памяти, готовый к приему новой программы. Если он имеет высокий уровень при запуске, он выполнит сохраненную программу (обычная загрузка).

Вероятно, здесь происходит следующее: ваша релейная плата подтягивает D3 к LOW, когда она подключена (вероятно, лишь немного сильнее, чем встроенный подтягивающий резистор NodeMCU). Вероятно, на ее входном контакте есть подтягивающий резистор (чтобы реле оставалось открытым по умолчанию). Затем NodeMCU видит, что D3 находится в состоянии LOW при запуске, и остается в режиме флэш-памяти, никогда не выполняя ваш код. Чтобы NodeMCU мог выполнить ваш код, D3 должен быть в состоянии HIGH при запуске! Если это происходит случайным образом, то подтягивающие и подтягивающие резисторы, вероятно, имеют схожие значения, поэтому шум в системе может переключать состояние контакта.

Теперь у вас есть разные возможности :

  • Вы можете удалить резистор pulldown с платы реле, так что резистор pullup на NodeMCU может подтянуть штифт к HIGH во время запуска, пока ваша программа не установит его снова в LOW. Тогда вам придется смириться с тем фактом, что реле будет включено во время запуска NodeMCU, управляя вашим насосом в это время.
  • Вы можете сделать вышеописанное, но также переместить соединения насоса на контакт NC (нормально замкнутый) реле. Это означает, что насос активируется, когда D3 имеет НИЗКИЙ уровень, и деактивируется, если он имеет ВЫСОКИЙ уровень, поэтому логика инвертируется. Если D3 имеет ВЫСОКИЙ уровень при запуске, то насос не работает. Предостережение в том, что если питание насоса включено, а питание NodeMCU/реле выключено, насос будет работать.
  • Вы можете использовать другой вывод для этой функции. Тот, который свободен от специальной функции загрузки. Мы не знаем, что вы делаете с другими выводами. D3 хорошо подойдет для входного вывода, которому нужен подтягивающий резистор (например, для подключения кнопки). Или выходного вывода, где состояние при запуске не диктуется внешним устройством.
,