Проблема с реле при загрузке в wemos d1 r1

Привет, у меня есть wemos d1 r1, и я хочу активировать реле с RFID-модулем rc522. проблема в том, что когда я подключаю плату к питанию, или когда я ее перезагружаю, или когда я загружаю код, светодиод на релейном модуле мигает, я использую D9 (GPIO02) для реле, и я боюсь, что в какой-то момент активируется реле, я попробовал D8 (GPIO0) но в вышеуказанных состояниях (включение питания, сброс, загрузка кода) он активирует реле. есть ли какой - нибудь способ предотвратить это ? другие контакты используются модулем rc522. мой код таков:


#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN D4
#define RST_PIN D2

char *StrAB[] = {"29 EC C7 C1", "69 5B C9 C2", "22 3B 83 34",  "00 00 00 00", "C6 78 8E 2C","00 00 00 00","00 00 00 00","00 00 00 00","00 00 00 00","00 00 00 00","00 00 00 00","00 00 00 00","00 00 00 00","00 00 00 00","00 00 00 00","00 00 00 00","00 00 00 00","00 00 00 00","00 00 00 00","00 00 00 00","00 00 00 00","00 00 00 00","00 00 00 00","00 00 00 00","00 00 00 00","00 00 00 00","00 00 00 00","00 00 00 00","00 00 00 00","00 00 00 00","00 00 00 00","00 00 00 00","00 00 00 00","00 00 00 00","00 00 00 00","00 00 00 00","00 00 00 00","00 00 00 00","00 00 00 00","00 00 00 00","00 00 00 00","00 00 00 00","00 00 00 00","00 00 00 00","00 00 00 00","00 00 00 00","00 00 00 00","00 00 00 00","00 00 00 00","12 BF BF 34" };  
#define NOTE_G4  392
#define NOTE_C5  523
#define NOTE_G5  784
#define NOTE_C6  1047


int TrueMelody[] = {NOTE_G5, NOTE_C6};
int TrueNoteDurations[] = {12, 8};

int FalseMelody[] = {NOTE_C6, NOTE_G5};
int FalseNoteDurations[] = {12, 8};

#define playTrueMelody() playMelody(TrueMelody, TrueNoteDurations, 2)
#define playFalseMelody() playMelody(FalseMelody, FalseNoteDurations, 2)
 
#define PIEZO D8

#define RELAY D9

MFRC522 mfrc522(SS_PIN, RST_PIN);   // Create MFRC522 instance.
 
void setup() 
{
  Serial.begin(9600);   // Initiate a serial communication
  SPI.begin();          // Initiate  SPI bus
  mfrc522.PCD_Init();   // Initiate MFRC522
  digitalWrite(RELAY, HIGH);
  pinMode(RELAY, OUTPUT);
  pinMode(PIEZO, OUTPUT);
  
  Serial.println("Put your card to the reader...");
  Serial.println();

}
void loop() 
{
  // Look for new cards
  if ( ! mfrc522.PICC_IsNewCardPresent()) 
  {
    return;
  }
  // Select one of the cards
  if ( ! mfrc522.PICC_ReadCardSerial()) 
  {
    return;
  }
  //Show UID on serial monitor
  Serial.print("UID tag :");
  String content= "";
  byte letter;
  for (byte i = 0; i < mfrc522.uid.size; i++) 
  {
     Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
     Serial.print(mfrc522.uid.uidByte[i], HEX);
     content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
     content.concat(String(mfrc522.uid.uidByte[i], HEX));
  }
  Serial.println();
  Serial.print("Message : ");
  content.toUpperCase();
    
  if (content.substring(1) == StrAB[0] || content.substring(1) == StrAB[1] || content.substring(1) == StrAB[2] || content.substring(1) == StrAB[3]  || content.substring(1) == StrAB[4]  || content.substring(1) == StrAB[5]  || content.substring(1) == StrAB[6]  || content.substring(1) == StrAB[7]  || content.substring(1) == StrAB[8]  || content.substring(1) == StrAB[9]  || content.substring(1) == StrAB[10]  || content.substring(1) == StrAB[11]  || content.substring(1) == StrAB[12]  || content.substring(1) == StrAB[13]  || content.substring(1) == StrAB[14]  || content.substring(1) == StrAB[15]  || content.substring(1) == StrAB[16]  || content.substring(1) == StrAB[17]  || content.substring(1) == StrAB[18]  || content.substring(1) == StrAB[19]  || content.substring(1) == StrAB[20]  || content.substring(1) == StrAB[21]  || content.substring(1) == StrAB[22]  || content.substring(1) == StrAB[23]  || content.substring(1) == StrAB[24]  || content.substring(1) == StrAB[25]  || content.substring(1) == StrAB[26]  || content.substring(1) == StrAB[27]  || content.substring(1) == StrAB[28]  || content.substring(1) == StrAB[29]  || content.substring(1) == StrAB[30]  || content.substring(1) == StrAB[31]  || content.substring(1) == StrAB[32]  || content.substring(1) == StrAB[33]  || content.substring(1) == StrAB[34]  || content.substring(1) == StrAB[35]  || content.substring(1) == StrAB[36]  || content.substring(1) == StrAB[37]  || content.substring(1) == StrAB[38]  || content.substring(1) == StrAB[39]  || content.substring(1) == StrAB[40]  || content.substring(1) == StrAB[41]  || content.substring(1) == StrAB[42]  || content.substring(1) == StrAB[43]  || content.substring(1) == StrAB[44]  || content.substring(1) == StrAB[45]  || content.substring(1) == StrAB[46]  || content.substring(1) == StrAB[47]  || content.substring(1) == StrAB[48]  || content.substring(1) == StrAB[49]  ) //change here the UID of the card/cards that you want to give access
  {
    playTrueMelody();
    digitalWrite(RELAY, LOW);
    delay(700);
    digitalWrite(RELAY, HIGH);
    
  }
 
 else   {

    playFalseMelody();

  }

}


void playMelody(int *melody, int *noteDurations, int notesLength)
{
  pinMode(PIEZO, OUTPUT);

  for (int thisNote = 0; thisNote < notesLength; thisNote++) {
    int noteDuration = 1000 / noteDurations[thisNote];
    tone(PIEZO, melody[thisNote], noteDuration);
    int pauseBetweenNotes = noteDuration * 1.30;
    delay(pauseBetweenNotes);
    noTone(PIEZO);
  }
}

, 👍0

Обсуждение

используйте GPIO 4 или 5; это, пожалуй, единственные контакты, которые "молчат" во время загрузки. если вы застряли с 0/2, в зависимости от нескольких факторов, вы могли бы очистить их, поместив конденсатор от gnd для передачи сигнала и подав сигнал реле через резистор. Это создает фильтр нижних частот, который может поглощать короткие импульсы, возникающие во время загрузки, хотя и за счет немного более медленного (~ 150 мс) времени переключения (что часто вообще не имеет значения)., @dandavis

спасибо вам ооооооооооооооооочень большое:), @dave

https://randomnerdtutorials.com/esp8266-pinout-reference-gpios/, @Majenko