Оптимизировать код "Ворота" придумать протокол

anshor
anshor аватар
Offline
Зарегистрирован: 21.06.2016
Я только начинаю разбираться, так как не нашел не чего подобного, делаю сам. Вроде работает, но иногда появляются не понятки. Управление калиткой и воротами. Ворота открываются и пульта по радио каналу, так же включается фонарь на столбе. Калитка открывается с наружи RFID меткой. Из внутри просто кнопка. Во время открытия ворот мигает лампа. Надо сделать связь с умным домом, передавать состояние калитки и ворот для охраны. Думаю что RS485 подойдет. Подскажите с протоколом? и как можно оптимизировать код?
boolean Fotkr= false;    // флаг открытия
boolean Fzakr= false;    // флаг закрытия
boolean Fstolb=false;    // флаг столба
boolean Flampa=false;    // флаг мигания 
boolean Fzamok=false;    // флаг замка
#include <RFID.h>
#include <SPI.h>
#include <SoftwareSerial.h>
RFID rfid(10, 9);
unsigned char reading_card[5]; //for reading card
unsigned char master[5] = {134, 60, 15, 158, 43}; // allowed card   // Карточки и метки. Метка смотрится через монитор порта
unsigned char master2[5] = {72, 125, 151, 16, 178}; // allowed card
unsigned char i;
 
int Lamp = LOW;                 // этой переменной устанавливаем состояние светодиода
long previousMillis = 0;        // храним время последнего переключения лампы
long previousMillis1 = 0;       // храним время последнего работы прожектора
long previousMillis2 = 0;       // храним время последнего работы замка
long previousMillis3 = 0;  
long previousMillis4 = 0;

unsigned long timeStartFlash = 0;  // временная переменная лампы
unsigned long timeStartFlash1 = 0; // временная переменная прожектора
unsigned long timeStartFlash2 = 0; // временная переменная замка
unsigned long timeStartFlash3 = 0; 
unsigned long timeStartFlash4 = 0;

long interval = 500;           // интервал между включение/выключением лампы (1 секунда)
long interval1 = 8000;         // время горения прожектора
long interval2 = 1000;         // время работы замка
long interval3 = 10000;
 
void setup()
{  pinMode(A0, INPUT);  // концевик открытия
   pinMode(A1, INPUT);  // концевик закрытия
   pinMode(A2, INPUT);  // концевик домофон
   pinMode(A3, INPUT);  // брелок D
   pinMode(A4, INPUT);  // брелок C
   pinMode(A5, INPUT);  // брелок B
   pinMode(A6, INPUT);  // брелок A
   pinMode(A7, INPUT);  // концевик калитка
   pinMode(6, INPUT);  // открыть замок

   pinMode(8, OUTPUT);  // лампа
   pinMode(7, OUTPUT);  // RS 485
   digitalWrite(7, LOW);  
   pinMode(5, OUTPUT);  // 1 реле
   pinMode(4, OUTPUT);  // 2 реле
   pinMode(3, OUTPUT);  // 3 реле
   pinMode(2, OUTPUT);  // 4 реле

  Serial.begin(9600);
  SPI.begin();
  rfid.init();
   for (int i = 2; i < 6; i++){ digitalWrite(i,HIGH);} // Подаем единицы на плату реле (сигнал инвентированный)
}
void loop()
{  rid();   // читаем карту
   Otkr();  // открываем ворота
   Zakr();  // закрываем ворота
   Lampa(); // мигаем лампой
   Stolb(); // включаем прожектор
   Zamok(); // открываем замок
  if (digitalRead(A5)== HIGH ) Fstolb= true;                       // нажали кнопку В включили прожектор
  if (digitalRead(A4)== HIGH) {Flampa=true; Fotkr= true; Fzakr= false;}         // нажали кнопку с открыли ворота
  if (digitalRead(A3)== HIGH ) {Flampa=true; Fzakr= true; Fotkr= false;  }       // нажали кнопку д закрыли ворота
  if (digitalRead(6)== LOW){ Fstolb= true; Fzamok=true; }          // нажали кнопку внутри

}

void Zamok()
{  if (Fzamok) {  digitalWrite (5, LOW);      // открываем замок
    unsigned long currentMillis2 = millis(); 
       if (currentMillis2 - previousMillis2 > interval2)   // ждем
        { previousMillis2 = currentMillis2;  Fzamok =false; digitalWrite (5, HIGH);}  // закрываем замок
              }
}

void Stolb()
{  if (Fstolb){  digitalWrite (2, LOW);
    unsigned long currentMillis1 = millis(); 
       if (currentMillis1 - previousMillis1 > interval1)
        { previousMillis1 = currentMillis1;  Fstolb=false; digitalWrite (2, HIGH);}
              }
}
 
void Otkr()
{ if (Fotkr) 
   {digitalWrite (4, HIGH);  digitalWrite (3, LOW);
      if (digitalRead(A1)== LOW ){Fotkr= false; Flampa=false; digitalWrite (3, HIGH);}
   }   unsigned long currentMillis3 = millis(); 
       if (currentMillis3 - previousMillis3 > interval3)
        { previousMillis3 = currentMillis3; Fotkr= false; Flampa=false; digitalWrite (3, HIGH); }
}

void Zakr()
{ if (Fzakr) 
   {digitalWrite (3, HIGH); digitalWrite (4, LOW); 
      if (digitalRead(A0)== LOW){Fzakr= false; Flampa=false; digitalWrite (4, HIGH);}
   }   unsigned long currentMillis4 = millis(); 
       if (currentMillis4 - previousMillis4 > interval3)
        { previousMillis4 = currentMillis4; Fzakr= false; Flampa=false; digitalWrite (4, HIGH);  }
}

void Lampa()  
{  if (Flampa) { unsigned long currentMillis = millis();
     if (currentMillis - previousMillis > interval)
      { previousMillis = currentMillis; // если светодиод не горит, то зажигаем, и наоборот
        if (Lamp == LOW) Lamp = HIGH; else Lamp = LOW; digitalWrite(8, Lamp); }     // устанавливаем состояния выхода, чтобы включить или выключить светодиод 
       } else digitalWrite(8, LOW);
}

void rid()  
{  if (rfid.isCard())
  { if (rfid.readCardSerial())
    {  for (i = 0; i < 5; i++)
       reading_card[i] = rfid.serNum[i];
       for (i = 0; i < 5; i++)
      { if (reading_card[i] != master[i] & reading_card[i] != master2[i] ){ break; } } //Количество карточек/меток
      if (i == 5)
      { timeStartFlash = millis(); Fzamok = true; Fstolb= true;} else   { Serial.println("Access denied!");}
    }
  }
}

 

 

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Подсказываю с протоколом: ключевые слова для яндекс/гугль поиска: "RS-485 для чайников" вываливается просто море ссылок, выбираете соответственно уровню чайницкой..

второй вопрос: оптимизировать код можно многими разными способами, лучше всего применять для начала алгоритмическую оптимизацию всего алгоритма в целом, а потом последовательно просмотреть методы оптимизации по Касьянову. Как правило, этого хватает лет на 10-15 эксплуатации программы без т.н. "сопровождений", но оставит Вас без зарплаты по "сопровождению" кода (исправлению своих же косяков за отдельные бабки).

anshor
anshor аватар
Offline
Зарегистрирован: 21.06.2016

Наконец то доделал счетч. Все работает. ПО совету друзей попробовал заказать плату на https://jlcpcb.com/ Не ожидал такого, качество не отчичаеться от заводского, правда минимальная партия 5 штук и доставка дорогая, но оно того стоит. Так что если кому интересно могу выслать плату и исходники.