Оптимизировать код "Ворота" придумать протокол
- Войдите на сайт для отправки комментариев
Вс, 11/03/2018 - 14:52
Я только начинаю разбираться, так как не нашел не чего подобного, делаю сам. Вроде работает, но иногда появляются не понятки. Управление калиткой и воротами. Ворота открываются и пульта по радио каналу, так же включается фонарь на столбе. Калитка открывается с наружи 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!");} } } }
Подсказываю с протоколом: ключевые слова для яндекс/гугль поиска: "RS-485 для чайников" вываливается просто море ссылок, выбираете соответственно уровню чайницкой..
второй вопрос: оптимизировать код можно многими разными способами, лучше всего применять для начала алгоритмическую оптимизацию всего алгоритма в целом, а потом последовательно просмотреть методы оптимизации по Касьянову. Как правило, этого хватает лет на 10-15 эксплуатации программы без т.н. "сопровождений", но оставит Вас без зарплаты по "сопровождению" кода (исправлению своих же косяков за отдельные бабки).
Наконец то доделал счетч. Все работает. ПО совету друзей попробовал заказать плату на https://jlcpcb.com/ Не ожидал такого, качество не отчичаеться от заводского, правда минимальная партия 5 штук и доставка дорогая, но оно того стоит. Так что если кому интересно могу выслать плату и исходники.