самопальная ОПС на 1 канал. точнее прототип. помогите плз, не взлетает.
- Войдите на сайт для отправки комментариев
Чт, 07/12/2017 - 06:52
Доброго времени суток.
вот что должно было получиться
"на порту д2 висит геркон, на д3 реле нр, имеется считыватель rfid и 2 ключа .
при включенном питании светодиод на д4 (зеленый) горит, при постановке на охрану загорается д5 (красный)
при включении объект под охраной!, записываем статус в переменную,
при размыкании д2 включить д3.
при появлении на считывателе зарегистрированного ключа поменять статус в переменной погасить д5 выключить д3 если сработала, выключить услови при размыкании д2 включить д3
при появлении на считывателе зарегистрированного ключа поменять статус в переменной включить д5 слушать д2".
теперь что имеем:
int RelayDev = 3;//d3
int GerkonDev = 2; //d2
int Stat = 1;//еще одна хрень для статуса
int Arm = 0; //переменная статуса
int RedLed = 4;//d4
int GreenLed = 5;//d5
//добавляем херню длярфид
#include <SPI.h>
#include <MFRC522.h> // библиотека "RFID".
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);
unsigned long uidDec, uidDecTemp; // для храниения номера метки в десятичном формате
void setup() {
pinMode(RelayDev, OUTPUT);//выход
pinMode(GerkonDev, INPUT);//вход
pinMode(GreenLed, OUTPUT); //индикация питания
SPI.begin(); // инициализация SPI / Init SPI bus.
mfrc522.PCD_Init(); // инициализация MFRC522 / Init MFRC522 card.
}
void loop() {
digitalWrite(GreenLed, HIGH);//индикатор питания включен
digitalWrite(RedLed, HIGH);//индикатор запущеной службы вроде тоже
if ( ! mfrc522.PICC_IsNewCardPresent()) {
return;
}
if ( ! mfrc522.PICC_ReadCardSerial()) {
return;
}
uidDec = 0;
for (byte i = 0; i < mfrc522.uid.size; i++)
{
uidDecTemp = mfrc522.uid.uidByte[i];
uidDec = uidDec * 256 + uidDecTemp;
}
//а с этого места уже заплюхался.
if (uidDec == 1973922155 || 299185877) {
digitalWrite(RelayDev, LOW);
digitalWrite(RedLed, HIGH);
}
Arm = digitalRead(GerkonDev);//забираем статус геркона
if (Arm == LOW) {
digitalWrite(RelayDev, HIGH);
}
}
И что именно не работает? "Не взлетает" это что? бутлоадер слетел и не шьется или что? Если конкретные вопросы по коду задавайте конкретные вопросы.
в С такая логика не работает
39if(uidDec == 1973922155 || 299185877)нада
39if((uidDec == 1973922155L) || (uidDec == 299185877L)) // не забывать про longи вот это, хоть ни на што не влияеть, но в loop-е явно лишнее
23digitalWrite(GreenLed, HIGH);//индикатор питания включен24digitalWrite(RedLed, HIGH);//индикатор запущеной службы вроде тожеесли GreenLed должен гореть все время, то его надо в setup() и включить.
А RedLed независимо от того, должен он гореть или нет, включается при каждом входе в loop() (это значит всегда).
заведи все свои ключи в массив и проверяй потом, правильный ли ключ приклали, в одной функции, читабельней будет
long idKeys[] = { 0xDEADBEEF, 0xBEEFDEAD }; // массив ключиков, не более 255 bool ValidKey(long key) // вернуть true, если ключ найден в массиве разрешенных и false, если нет { int size = sizeof(idKeys) / sizeof(long); if (size > 255) abort(); // или вывести здесь ошибку, что ключей больше 255 for (byte i = 0; i < byte(size); i++) // иначе i и size сравниваца будет как int, а это дольше и не нужно { if (idKeys[i] == key) return true; } return false; }ой, не совсем корректно написал. мозги уже в отключенном состоянии были %)
самая большая сложность в том что постановка и снятие с охраны происходит по предъявлении ключа считывателю. конечно уже и форум читал и примеры смотрел все возможные, но самый нормальный пример это вот этот абстрактный пример подходит идеально, но как указать вместо абстрактного buttonPin условия наличия uid'ов ключей.
const int buttonPin = 2; const int ledPin = 13; void setup() { // initialize the LED pin as an output: pinMode(ledPin, OUTPUT); // initialize the pushbutton pin as an input: pinMode(buttonPin, INPUT); } void loop() { digitalRead(buttonPin); while(!digitalRead(buttonPin)){} digitalWrite(ledPin, HIGH); while(digitalRead(buttonPin)){} while(!digitalRead(buttonPin)){} digitalWrite(ledPin, LOW); while(digitalRead(buttonPin)){} }как указать вместо абстрактного buttonPin условия наличия uid'ов ключей.
как в самом первом скетче написано в строке #7 : "Добавляем херню для rfid"
Эээ.. То есть? Немного не понял ход Ваших мыслей
в скетче из сообщения #4 нету ничего для чтения RFID ключей. Надо добавить.
доброго времени еще раз.
ткните рожей в ошибку плз(
#include <SPI.h> //вроде нужна для mfrc522 #include <MFRC522.h> // библиотека "RFID". #define SS_PIN 10 //пин ss ридера #define RST_PIN 9 //пин rst ридера int RelayDev = 3;//d3 int GerkonDev = 2; //d2 int Arm; int RedLed = 4;//красный светодиод на d4 int GreenLed = 5;//зеленый светодиод на d5 MFRC522 mfrc522(SS_PIN, RST_PIN); //объявляем ридер unsigned long uidDec, uidDecTemp; // для храниения номера метки в десятичном формате long key; void setup() { pinMode(RelayDev, OUTPUT);//реле как выход pinMode(GerkonDev, INPUT);//геркон вход pinMode(GreenLed, OUTPUT); //индикация питания pinMode(RedLed, OUTPUT); //индикация при боевом режиме SPI.begin(); // инициализация SPI / Init SPI bus. mfrc522.PCD_Init(); // инициализация MFRC522 / Init MFRC522 card. digitalWrite(GreenLed, HIGH);//светильник включен, питание есть работает всегда Arm = digitalRead(GerkonDev);//забираем статус геркона } void loop() { // Поиск новой метки if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } // Выбор метки if ( ! mfrc522.PICC_ReadCardSerial()) { return; } uidDec = 0; // Выдача серийного номера метки. for (byte i = 0; i < mfrc522.uid.size; i++) { uidDecTemp = mfrc522.uid.uidByte[i]; uidDec = uidDec * 256 + uidDecTemp; long uidDec[] = {1973922155L, 299185877L }; // массив ключиков, не более 255 bool ValidKey(long key); // вернуть true, если ключ найден в массиве разрешенных и false, если нет int size = sizeof(uidDec) / sizeof(long); for (byte i = 0; i < byte(size); i++) // иначе i и size сравниваца будет как int, а это дольше и не нужно { if (uidDec[i] == key) return true; } return false; } uidDec; //где-то while(!uidDec){} //тут digitalWrite(RedLed, HIGH); //я if (Arm == LOW) { digitalWrite(RelayDev, HIGH); //сделал } while(uidDec){} //какую то while(!uidDec){} //х..ню digitalWrite(RedLed, LOW); if (Arm == LOW) { digitalWrite(RelayDev, LOW); } while(uidDec){} //я дятел( }Дак ошибка секретная же. Тем более написан бессмысленный набор операторов, с виду похожих на С
#include <SPI.h> //нужно для MFRC522.h #include <MFRC522.h> // библиотека "RFID". #define STATE_LED 5 MFRC522 mfrc522(10, 9); //объявляем считыватель unsigned long uidDec, uidDecTemp; //номера метки(10) int State=1; void setup() { Serial.begin(9600); Serial.println("Waiting for card..."); SPI.begin(); // инициализация SPI / Init SPI bus. mfrc522.PCD_Init(); // инициализация MFRC522 / Init MFRC522 card. pinMode(STATE_LED, OUTPUT); } void loop() { if ( ! mfrc522.PICC_IsNewCardPresent()) { return;} //ждем метку... if ( ! mfrc522.PICC_ReadCardSerial()) { return; } // Метка есть) uidDec = 0; for (byte i = 0; i < mfrc522.uid.size; i++) {uidDecTemp = mfrc522.uid.uidByte[i]; uidDec = uidDec * 256 + uidDecTemp; } // получаем серийник(10) Serial.println("Card UID: "); Serial.println(uidDec); // Выводим UID метки в консоль. /////////////////////////////////////////////////////////////////////////////////////////////////////// if (uidDec == 1973922155 || 299185877 ) { uidDec = 0; if ( State==1 ){ Serial.println("Security state: Off"); tone(2, 700, 500); // Делаем звуковой сигнал, Открытие State = 0; delay(2000); // метку ввели. отсеиваем лишнее } else { State=1; Serial.println("Security state: On"); tone(2, 700, 1000); // Делаем звуковой сигнал, Открытие delay(2000); // метку ввели. отсеиваем лишнее } } }вот эта фигня уже работает. дык блин, почти то же самое делал.. отсюда