Может ли кто-нибудь проверить мой код Arduino для электрических ворот

Электрические ворота просто не делают того, что говорится в коде. Проблемы мерцания реле, MCU NODE перестает отвечать на запросы и не выполняет то, что должно произойти.

Это для управления электрическими воротами с нескольких телефонов с помощью приложения Blynk.

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

Я попробовал эту систему в гораздо меньших масштабах, которая включала в себя только использование одного рычага ворот для проверки работоспособности кода, и это сработало. Затем я расширил код, включив в себя оба шлюза - это включало необходимость добавления дополнительной логики, чтобы позволить один вентиль для продолжения открытия / закрытия, если другой вентиль уже достиг своего пункта назначения (пункт назначения / конечная точка каждого вентиля определяется кнопкой на каждом конце каждого из двигателей, которая при нажатии на соответствующую кнопку затем разрешает логику чтобы увидеть изменение состояния, это работает, однако, оно включает и выключает реле и прекращает подачу питания к обеим сторонам ворот, даже если кто-то еще не достиг пункта назначения.

#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>

// Shift Regsiter
// 2 - Power Supply
// 3 - Gate Left Power
// 4 - Gate Right Power
// 6 - Gate Switch
// 7 - LEDs

// Button stoppers
int btnLeftStopperOpened = D5;
int btnLeftStopperClosed = D6;
int btnRightStopperOpened = D7;
int btnRightStopperClosed = D3;

int btnLeftStopperOpenedState = LOW;
int btnLeftStopperClosedState = LOW;
int btnRightStopperOpenedState = LOW;
int btnRightStopperClosedState = LOW;

// Shift register pins
int latchPin = D0;
int clockPin = D1;
int dataPin = D2;
byte data = 0b00000000;

// WiFi details
char auth[] = "0a5a18c1a9f2457eb842013ec8f5fef3";
char ssid[] = "SKYCEDB2";
char pass[] = "LVDLBSBQSC";

// Blynk digital LED
WidgetLED indicatorLED(V3);

// Button booleans
bool openGateBool = false;
bool closeGateBool = false;
bool emergencyStopBool = false;

void setup() {
  Serial.begin(9600);
  Blynk.begin(auth, ssid, pass);

  // Inputs
  pinMode(btnLeftStopperOpened, INPUT);
  pinMode(btnLeftStopperClosed, INPUT);
  pinMode(btnRightStopperOpened, INPUT);
  pinMode(btnRightStopperClosed, INPUT);

  // Outputs
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);

  // Clear Shift Register
  bitClear(data, 2);
  bitClear(data, 3);
  bitClear(data, 4);
  bitClear(data, 6);
  bitClear(data, 7);
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, data);
  digitalWrite(latchPin, HIGH);
}

// Blynk virtual buttons
BLYNK_WRITE(V0) {
  openGateBool = !openGateBool;
}

BLYNK_WRITE(V1) {
  closeGateBool = !closeGateBool;
}

BLYNK_WRITE(V2) {
  emergencyStopBool = !emergencyStopBool;
}

void loop() {
  Blynk.run();

  // Detect Button States
  btnLeftStopperOpenedState = digitalRead(btnLeftStopperOpened);
  btnRightStopperOpenedState = digitalRead(btnRightStopperOpened);
  btnLeftStopperClosedState = digitalRead(btnLeftStopperClosed);
  btnRightStopperClosedState = digitalRead(btnRightStopperClosed);

  // Stability Delay
  delay(10);

  // Open gate function
  if((openGateBool == true) && (closeGateBool == false)) {

    // Initial Gate Check
    if((btnLeftStopperOpenedState == LOW) && (btnRightStopperOpenedState == LOW)) {
      bitSet(data, 2);
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, data);
      digitalWrite(latchPin, HIGH);
    }

    // If both gates are opened
    if((btnLeftStopperOpenedState == HIGH) && (btnRightStopperOpenedState == HIGH)) {
      bitClear(data, 2);
      bitClear(data, 3);
      bitClear(data, 4);
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, data);
      digitalWrite(latchPin, HIGH);

      // Blynk LED indicator
      Blynk.setProperty(V3, "color", "#23C48E");
      indicatorLED.on();
    }

    // Left Gate Opening
    if(btnLeftStopperOpenedState == LOW) {
      bitSet(data, 3);
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, data);
      digitalWrite(latchPin, HIGH);
    } else {
      bitClear(data, 3);
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, data);
      digitalWrite(latchPin, HIGH);
    }

    // Right Gate Opening
    if(btnRightStopperOpenedState == LOW) {
      bitSet(data, 4);
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, data);
      digitalWrite(latchPin, HIGH);
    } else {
      bitClear(data, 4);
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, data);
      digitalWrite(latchPin, HIGH);
    }

    // Emergency Stop button
    if(emergencyStopBool == true) {
      bitClear(data, 2);
      bitClear(data, 3);
      bitClear(data, 4);
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, data);
      digitalWrite(latchPin, HIGH);

      // Blynk LED indicator
      Blynk.setProperty(V3, "color", "#D3435C");
      indicatorLED.on();
      delay(900);
      indicatorLED.off();
      delay(900);
    }
  }

  // Close gate function
  if((openGateBool == false) && (closeGateBool == true)) {

    // Initial Gate Check
    if((btnLeftStopperClosedState == LOW) && (btnRightStopperClosedState == LOW)) {
      bitSet(data, 2);
      bitSet(data, 6);
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, data);
      digitalWrite(latchPin, HIGH);
    }

    // If both gates are closed
    if((btnLeftStopperClosedState == LOW) && (btnRightStopperClosedState == LOW)) {
      bitClear(data, 2);
      bitClear(data, 3);
      bitClear(data, 4);
      bitClear(data, 6);
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, data);
      digitalWrite(latchPin, HIGH);

      // Blynk LED indicator
      Blynk.setProperty(V3, "color", "#D3435C");
      indicatorLED.on();
    }

    // Left Gate Closing
    if(btnLeftStopperClosedState == LOW) {
      bitSet(data, 3);
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, data);
      digitalWrite(latchPin, HIGH);
    } else {
      bitClear(data, 3);
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, data);
      digitalWrite(latchPin, HIGH);
    }

    // Right Gate Closing
    if(btnRightStopperClosedState == LOW) {
      bitSet(data, 4);
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, data);
      digitalWrite(latchPin, HIGH);
    } else {
      bitClear(data, 4);
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, data);
      digitalWrite(latchPin, HIGH);
    }

    // Emergency Stop button
    if(emergencyStopBool == true) {
      bitClear(data, 2);
      bitClear(data, 3);
      bitClear(data, 4);
      bitClear(data, 6);
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, data);
      digitalWrite(latchPin, HIGH);

      // Blynk LED indicator
      Blynk.setProperty(V3, "color", "#D3435C");
      indicatorLED.on();
      delay(900);
      indicatorLED.off();
      delay(900);
    }
  }

  // Checks gate status
  if((btnLeftStopperClosedState == LOW) && (btnRightStopperClosedState == LOW) && (btnLeftStopperOpenedState == LOW) && (btnRightStopperOpenedState == LOW)) {
    indicatorLED.off();
  }

  // Checks if both buttons are false
  if((openGateBool == false) && (closeGateBool == false)) {
    bitClear(data, 2);
    bitClear(data, 3);
    bitClear(data, 4);
    bitClear(data, 6);
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, data);
    digitalWrite(latchPin, HIGH);
  }

  // Emergency Stop button
  if(emergencyStopBool == true) {
    bitClear(data, 2);
    bitClear(data, 3);
    bitClear(data, 4);
    bitClear(data, 6);
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, data);
    digitalWrite(latchPin, HIGH);

    // Blynk LED indicator
    Blynk.setProperty(V3, "color", "#D3435C");
    indicatorLED.on();
    delay(900);
    indicatorLED.off();
    delay(900);
  }

} // END //

Когда кнопка OPEN в приложении Blynk нажата, код выполняет проверку, чтобы увидеть, установлены ли кнопки состояния OPEN в положение HIGH - если нет, то включается питание, выполняется еще одна проверка, которая будет контролировать подачу питания на каждый затвор до тех пор, пока достигает своего пункта назначения, как только он достигнет пункта назначения, он остановится. То же самое должно произойти для кнопки ЗАКРЫТЬ в приложении Blynk, но с включением включения переключателя вместе с источником питания. Существует также кнопка аварийного останова, которая позволяет нажать кнопку в приложении Blynk, чтобы отключить все.

  • Вместо этого работает одна кнопка (я проверил, что виртуальный пин-код правильный)

  • Аварийная кнопка не останавливается

  • Если один из ворот достигает своего пункта назначения, он останавливает оба ворот, а не только один

  • Реле продолжают мигать, пока цель не была достигнута ни одним из ворот

  • Узел MCU иногда запирает себя

0 ответов

Другие вопросы по тегам