ARDUINO MEGA2560. РЕЛЕ. При загрузки скетча реле стрекочет как гигантский кузнечик

milione

✩✩✩✩✩✩✩
3 Окт 2024
2
0
Есть у меня ардуинка MEGA 2560 . 2 реле - оба инвалидских(работают то от низкого сигнала, то от высокого... Проблему решаю перебросом контактов с NC а NO и наоборот) оба реле одноканальные . Проблема в том, что при загрузке скетча на плату, реле начинает(-ют) срабатывать с такой скоростью, что звук похож на стрекотание гигантского кузнечика-мутанта... Боюсь, как бы реле не сгорело. Всю схему выкладывать не буду, там рисовать слишком много, скажу только , что 1 реле у меня на 12 пине, а другое на 13.
Код скетча:
Скетч:
#include <Wire.h> // библиотека для управления устройствами по I2C
#include <LiquidCrystal_I2C.h> // подключаем библиотеку для QAPASS 1602
#include <Key.h>
#include <Keypad.h>
#include <pitches.h>
#include "SPI.h"
#include "MFRC522.h"

#define RST_PIN  9 // RES pin
#define SS_PIN  10 // SDA (SS) pin
LiquidCrystal_I2C LCD(0x27,16,2);
MFRC522 mfrc522(SS_PIN, RST_PIN); // создание объекта mfrc522

const byte ROWS = 4; //4 строки у клавиатуры
const byte COLS = 3; //три столбца
#define RELAY_OPEN 13
#define RELAY_CLOSE 12
char keys[ROWS][COLS] = {
  {'1', '2', '3'},
  {'4', '5', '6'},
  {'7', '8', '9'},
  {'*', '0', '#'}
};
byte rowPins[ROWS] = {3, 8, 7, 5};    
        //Подключены строки (4 пина)
byte colPins[COLS] = {4, 2, 6};
int piezoPin = 22;
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); //иниициализировать клавиатуру

byte bukva_B[8]   = {B11110,B10000,B10000,B11110,B10001,B10001,B11110,B00000,}; // Буква "Б"
byte bukva_G[8]   = {B11111,B10001,B10000,B10000,B10000,B10000,B10000,B00000,}; // Буква "Г"
byte bukva_D[8]   = {B01111,B00101,B00101,B01001,B10001,B11111,B10001,B00000,}; // Буква "Д"
byte bukva_ZH[8]  = {B10101,B10101,B10101,B11111,B10101,B10101,B10101,B00000,}; // Буква "Ж"
byte bukva_Z[8]   = {B01110,B10001,B00001,B00010,B00001,B10001,B01110,B00000,}; // Буква "З"
byte bukva_I[8]   = {B10001,B10011,B10011,B10101,B11001,B11001,B10001,B00000,}; // Буква "И"
byte bukva_IY[8]  = {B01110,B00000,B10001,B10011,B10101,B11001,B10001,B00000,}; // Буква "Й"
byte bukva_L[8]   = {B00011,B00111,B00101,B00101,B01101,B01001,B11001,B00000,}; // Буква "Л"
byte bukva_P[8]   = {B11111,B10001,B10001,B10001,B10001,B10001,B10001,B00000,}; // Буква "П"
byte bukva_Y[8]   = {B10001,B10001,B10001,B01010,B00100,B01000,B10000,B00000,}; // Буква "У"
byte bukva_F[8]   = {B00100,B11111,B10101,B10101,B11111,B00100,B00100,B00000,}; // Буква "Ф"
byte bukva_TS[8]  = {B10010,B10010,B10010,B10010,B10010,B10010,B11111,B00001,}; // Буква "Ц"
byte bukva_CH[8]  = {B10001,B10001,B10001,B01111,B00001,B00001,B00001,B00000,}; // Буква "Ч"
byte bukva_Sh[8]  = {B10101,B10101,B10101,B10101,B10101,B10101,B11111,B00000,}; // Буква "Ш"
byte bukva_Shch[8]= {B10101,B10101,B10101,B10101,B10101,B10101,B11111,B00001,}; // Буква "Щ"
byte bukva_Mz[8]  = {B10000,B10000,B10000,B11110,B10001,B10001,B11110,B00000,}; // Буква "Ь"
byte bukva_IYI[8] = {B10001,B10001,B10001,B11001,B10101,B10101,B11001,B00000,}; // Буква "Ы"
byte bukva_Yu[8]  = {B10010,B10101,B10101,B11101,B10101,B10101,B10010,B00000,}; // Буква "Ю"
byte bukva_Ya[8]  = {B01111,B10001,B10001,B01111,B00101,B01001,B10001,B00000,}; // Буква "Я"
byte oz[8] = {B11111,B11111,B00000,B00000,B00000,B00000,B00000,B00000,};
String codedom;
char code[2] = {'#', '*'};
int ozidanie=1;
int schet;
int spas;
String pass;
String gostpass = "1052";
String myString ;
int admen;
byte readCard[4];
String tagID = "";
void setup() {
  Serial.begin(9600);
  // put your setup code here, to run once:
LCD.init(); // инициализация LCD дисплея
   LCD.backlight(); // включение подсветки дисплея
   pinMode(24, OUTPUT);
  // печатаем сообщение на первой строке
   pinMode(10, INPUT_PULLUP);
   LCD.setCursor(5, 1);        // ставим курсор на 1 символ второй строки
   //LCD.print("Domophon 1.0");  // печатаем сообщение на второй строке
pinMode(RELAY_OPEN, OUTPUT);
pinMode(RELAY_CLOSE, OUTPUT);
  SPI.begin();
  mfrc522.PCD_Init();

         // Включаем антенну
digitalWrite(RELAY_OPEN, HIGH);

}

void loop() {

   char customKey = keypad.getKey();
   //String str(customKey);
if(digitalRead(10))
{
  AccesGranted();
}
   
  //  if (tagID == "79C78D85" || tagID == "FFAB6C1E") {
      while (getID()) {
  if (tagID == "79C78D85" || tagID == "FFAB6C1E") {
     AccesGranted();
    }
    else {
     error();
    }
    Serial.print("ID: ");
    Serial.println(tagID);
   
      }
      if (customKey ){
         Serial.println(schet);
        String myString = String(customKey);
    if (myString == "#"){
       Serial.println(analogRead(0));
      LCD.setCursor(0,1);
      LCD.print("               ");
      codedom = "";
      schet = 0;
      spas = 0;
      return;
    }else if((myString == "*" || spas== 1)){
      if(codedom == "" && schet <=4 && admen==0|| spas== 1&& schet <=4 && admen ==0)
      {
        codedom = codedom + myString;
         LCD.setCursor(0,1);
     
        if (codedom == "*"){
         codedom= "";
        }
          spas = 1;
        LCD.print("CODE:" + codedom);
        schet +=1;
         digitalWrite(24, HIGH);
         tone(piezoPin, 1000);// Включение светодиода
  delay(100);                     // Задержка
noTone(piezoPin);
       
digitalWrite(24, LOW);
     
      }else
       
      if (codedom == "3978" or codedom == "1904"){
        admen = 1;
            codedom = codedom + myString;
     
         
           LCD.setCursor(0,1);
      LCD.print("                ");
         LCD.setCursor(4,1);
        LCD.print("Acces Granted");
        delay(800);
       LCD.setCursor(0,1);
      LCD.print("                ");
       AccesGranted();

     

         

         

      }else {
        error();
      }
     
    } else if(customKey && schet<=10 && spas ==0){
       digitalWrite(24, HIGH);
         tone(piezoPin, 1000);// Включение светодиода
  delay(100);                     // Задержка
noTone(piezoPin);
       
digitalWrite(24, LOW);
         
            LCD.setCursor(0,1); // устанавливаем курсор на начало второй строки
            codedom = codedom + myString;
            LCD.print(codedom);
            schet +=1;
      }else
      return;
    }

}


boolean getID() {
  if (! mfrc522.PICC_IsNewCardPresent()) {
    return false;
  }

  if (! mfrc522.PICC_ReadCardSerial()) {
    return false;
  }

  tagID = "";

  for (uint8_t i = 0; i < 4; i++) {
    tagID.concat(String(mfrc522.uid.uidByte[i], HEX));
  }

  tagID.toUpperCase();
  mfrc522.PICC_HaltA();
  return true;
}



void AccesGrantedAdm()
{
   
}
void AccesGranted()
{
    digitalWrite(RELAY_OPEN,LOW);
  spas=0;
      codedom = "";
      pass = "";
      myString ="";
      digitalWrite(24, LOW);
Serial.println("Access Granted!");
      digitalWrite(5, LOW);
      digitalWrite(6, HIGH);
      delay(20);
        tone(piezoPin,  NOTE_A5,1000); // Запустили звучание
          delay(200);
      tone(piezoPin,  NOTE_B5,1000);
      delay(350);
      digitalWrite(RELAY_OPEN, HIGH);
      noTone(3);
      delay(250);
   

       
              tone(piezoPin,  NOTE_A5,1000); // Запустили звучание
          delay(200);
      tone(piezoPin,  NOTE_B5,1000);
      delay(350);
      noTone(3);
      delay(250);
       
               tone(piezoPin,  NOTE_A5,1000); // Запустили звучание
          delay(200);
      tone(piezoPin,  NOTE_B5,1000);
      delay(350);
      noTone(3);
      delay(250);
       
               tone(piezoPin,  NOTE_A5,1000); // Запустили звучание
          delay(200);
      tone(piezoPin,  NOTE_B5,1000);
      delay(350);
      noTone(3);
      delay(250);
       
               tone(piezoPin,  NOTE_A5,1000); // Запустили звучание
          delay(200);
      tone(piezoPin,  NOTE_B5,1000);
      delay(350);
      noTone(3);
      delay(250);
       
               tone(piezoPin,  NOTE_A5,1000); // Запустили звучание
          delay(200);
      tone(piezoPin,  NOTE_B5,1000);
      delay(350);
      noTone(22);
      digitalWrite(24, LOW);
   

}

void error()
{
    pass = "";
      myString = "";
  spas=0;
   codedom = "";
      LCD.setCursor(0,1);
      LCD.print("                ");
         LCD.setCursor(4,1);
        LCD.print("Error!");
   Serial.println("Access Denied!");
        tone(piezoPin, NOTE_F5); // Запустили звучание
      delay(900);
      noTone(22);
      delay(150);
        tone(piezoPin, NOTE_F5); // Запустили звучание
      delay(900);
      noTone(22);
        LCD.setCursor(0,1);
      LCD.print("                ");
}
И да, не обращайте внимание на массивы с "буквами", они вообще никакой роли в моем скетче не играют
 

VictorArx

★★✩✩✩✩✩
22 Мар 2021
525
86
@milione, код на ардуино загружается отдельно от всех устройств, будь то реле или исчё что нибудь. Gnd ардуино и других устройств должны быть соединены.
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
472
134
@milione,
Вы загружаете через бутлоадер или внешний программатор?
Если через бутлоадер (т.е. без дополнительного программатора) то
Реле на 13 пине может срабатывать т.к. на этом пине встроенный светодиод, на который бутлоадер может выводить состояние процесса загрузки. Почему срабатывает реле на 12 пине, не понятно.
 
  • Лойс +1
Реакции: milione

milione

✩✩✩✩✩✩✩
3 Окт 2024
2
0
Реле на 13 пине может срабатывать т.к. на этом пине встроенный светодиод, на который бутлоадер может выводить состояние процесса загрузки. Почему срабатывает реле на 12 пине, не понятно.
Да! Теперь понял, срабатывало только 13 реле, в такт со светодиодом . Благодарю!