Да, изначально скетч писался для электромагнитного замка, но управление нагрузкой это всего лишь пару строчек кода, которые легко переписываются. Львиная доля программы - обработка RFID меток и соответствующая реакция на них.
Для того чтобы было понятно, что мы пытаемся изменить, предлагаю с начало разобраться в том, что происходит при подаче питания с пинами управления реле.
В самом начале программы смотрим содержимое первого байта EEPROM микроконтроллера. Там должно быть число, указывающее на количество ключей.
byte keys_count = EEPROM.read();
В функции Setup происходит инициализация пинов и на них выставляется высокий логический уровень, опять же все ради Китайских реле, это обесточит их.
// Реле
pinMode(PIN_RELAY_1, OUTPUT);
digitalWrite(PIN_RELAY_1, HIGH);
pinMode(PIN_RELAY_2, OUTPUT);
digitalWrite(PIN_RELAY_2, HIGH);
Следующий ключевой момент - принятие решения, открыть замок при отсутствие ключей в памяти и сообщить об этом в Serial или же запереть замок и встать на охрану.
if(keys_count > and keys_count < 255) {
keysRead();
lock(true);
}
else {
keys_count = ;
Serial.println(F("The master key is not in memory. The first presentation to the key will be the master!\n"));
lock(false);
}
Серьезным отличием от электромагнитного замка является наличие функции void lock(bool lock); именно она манипулирует пинами и переключает реле с паузой в 0.4 сек. Заодно фиксирует последнее состояние замка, своего рода программный концевик на двери.
void lock(bool lock) {
digitalWrite(lock ? PIN_RELAY_1 : PIN_RELAY_2, LOW);
delay(400);
digitalWrite(lock ? PIN_RELAY_1 : PIN_RELAY_2, HIGH);
lockStat = lock;
}
До момента, описанного в п.3 реле находились в покое и не производили никаких манипуляций с соленоидом. Функция lock, кроме возложенных на неё обязанностей, гарантирует нам, что любое реле будет в работе ровно 0.4 секунды, а затем вернется в свое обычное состояние. Следовательно, если ключ будет отсутствовать в памяти микроконтроллера то по условию в п.3 произойдет вызов lock(false); и это приведет к появлению логического нуля на 6 пине на 0.4 секунды, после вернется логическая единица. Если в EEPROM будет находиться хотя бы один ключ, то произойдет вызов lock(true); и аналогичные манипуляции произойдут с пином 7 - замок закроется.
Предлагаю проделать следующее:
Просмотреть вывод в Serial начиная с момента подачи питания, возможно там будет подсказка.
Модернизировать функцию lock и выводить в Serial все, что происходит с реле
void lock(bool lock) {
digitalWrite(lock ? PIN_RELAY_1 : PIN_RELAY_2, LOW);
Serial.println(lock ? "RELAY CLOSE (PIN 6) ACTIVATED" : "RELAY OPEN (PIN 7) ACTIVATED");
delay(400);
digitalWrite(lock ? PIN_RELAY_1 : PIN_RELAY_2, HIGH);
Serial.println(lock ? "RELAY CLOSE (PIN 6) DEACTIVATED" : "RELAY OPEN (PIN 7) DEACTIVATED");
lockStat = lock;
}
Можно, но не обязательно, пару фотографий как это выглядит (собрано).
Это вполне ожидаемое поведение т.к после подачи питания, микроконтроллер MFRC522 скорее всего ожидает запись в соответствующие регистры. Уверен, что этим занимается PCD_Init().