Ви не увійшли.
Вот скетч работающего замка. Работает так поднесли ключ открылась дверь по истечении 3 секунд сама закрылась. Мне же надо, чтоб поднесли ключ - открылась дверь и не закрывалась пока ещё раз не поднесут ключ к считывателю. Помогите исправить код.
#include <OneWire.h>
OneWire ds(10);// Определяем пин подключения к ключу
byte aaa[2][8] = {{0x01,0x11,0xF7,0x43,0x01,0x00,0x00,0x65},// Двухмерный массив известных ключей EB 0 0 1 B6 7A 12 1
{0xEB,0x00,0x00,0x01,0xB6,0x7A,0x12,0x01}};// Первое число - количество ключей, второе - количество байт в ключе
byte addr[8], k, m; // Обозначаем массив для чтения ключа из 8 байт
void setup() {
pinMode(13, OUTPUT);// Прописываем диод на пин 13.
Serial.begin(9600);}// Запускаем порт
void loop() {
m = 0;// Обнуляем указатель наличия ключа
if (ds.search(addr)){// Если устройство подключено - считываем
for (k=0; k<2; k++){// Запускаем цикл перебора ключей
if(aaa[k][0] == addr[0] && aaa[k][1] == addr[1] && aaa[k][2] == addr[2] // Сравниваем побайтно массивы
&& aaa[k][3] == addr[3] && aaa[k][4] == addr[4] && aaa[k][5] == addr[5] // Да, это черезчур громоздко, зато просто "как кувалда".
&& aaa[k][6] == addr[6] && aaa[k][7] == addr[7]){ m=1;}} // Если ключ есть увеличиваем значение указателя
if (m > 0) {// Проверяем значение указателя
Serial.println("OK");// Если код совпал пишем ОК!
digitalWrite(13, HIGH);// Зажигаем диод
delay(3000);// Выдерживаем паузу
digitalWrite(13, LOW);}// Гасим диод
else {Serial.println("NO!");// Если несовпадение пишем NO!
delay(500);}
for(int i=7; i>-1; i--){// Запускаем цикл печати данных из массива
Serial.print(addr[i], HEX);// Печатаем нужный байт в шестнадцатиричном виде
Serial.print(" ");}// Печатаем пробел
Serial.println();// В конце цикла переводим строку
ds.reset_search();}} // Сбрасываем устройство
Неактивний
Не проверял работу
//-----замок-----------------------
typedef void(*pDo)();
pDo Do = [] {};
#include <OneWire.h>
OneWire ds(/*пин*/10);
const byte num = 2; // 2 кода
const byte base[num][8] = {
{0x01, 0x11, 0xF7, 0x43, 0x01, 0x00, 0x00, 0x65},// 1-й код
{0xEB, 0x00, 0x00, 0x01, 0xB6, 0x7A, 0x12, 0x01} // 2-й код
};
void runLock() {
byte tmp[8];
bool ok = false;
if (ds.search(tmp)) {
for (int i = 0; i < num; i++) {
if (base[i][0] == tmp[0] && base[i][1] == tmp[1] &&
base[i][2] == tmp[2] && base[i][3] == tmp[3] &&
base[i][4] == tmp[4] && base[i][5] == tmp[5] &&
base[i][6] == tmp[6] && base[i][7] == tmp[7] ) ok = true;
}
for (int i = 7; i > -1; i--) {
Serial.print(tmp[i], HEX); Serial.print(" ");
}
Serial.println();
if (ok)Do();
ds.reset_search();
}
}
//---------автомат-----------------------------
const byte ledPin =/*пин*/13;
// состояния автомата
const byte s0 = 0;// считываем что бы открыть
const byte s1 = 1;// пауза что бы убрать ключ
const byte s2 = 2;// считываем что бы закрыть
const byte s3 = 3;// пауза что бы убрать ключ
pDo run = [] {};
const unsigned long time1s = 1000; // 1 секунда на убрать ключ
unsigned long past;
void set(byte s) {
past = millis();
switch (s) {
case s0:
digitalWrite(ledPin, LOW);
Do = [] {set(s1);};
run = [] {};
break;
case s1:
digitalWrite(ledPin, HIGH);
Do = [] {};
run = [] {
if (millis() - past > time1s)
set(s2);
};
break;
case s2:
Do = [] {set(s3);};
run = [] {};
break;
case s3:
digitalWrite(ledPin, LOW);
Do = [] {};
run = [] {
if (millis() - past > time1s)
set(s0);
};
break;
}
}
//-------------------------------------------------
void setup() {
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
set(s0);
}
void loop() {
runLock();
run();
}
Остання редакція qwone (2019-02-22 22:49:42)
Неактивний
qwone- Спасибо. Скопилировался правильно. Буду на работе проверю.
"а где у вас в коде дверь закрывается через 3 сек."
Дверь в коде - это светодиод!
Serial.println("OK");// Если код совпал пишем ОК!
digitalWrite(13, HIGH);// Зажигаем диод
delay(3000);// Выдерживаем паузу
digitalWrite(13, LOW);}// Гасим диод
else {Serial.println("NO!");// Если несовпадение пишем NO!
delay(500);}
Остання редакція ssipk (2019-02-22 20:54:50)
Неактивний
Вы же просили поднесли карточку дверь открылась . Еще раз дверь закрылась. Конечно это нужно делать с паузой в 1 секунду. А то дверь отрылась-закрылась будет меняться каждую секунду без отъема карточки.
Неактивний
Хороших то и нету. Посредственных море. А конечные автоматы с лямда функцией это моя личная наработка. Ну так по мелочам http://arduino.ru/forum/programmirovanie/tsifrovye-avtomaty-v-klassakh-po-qwone#comment-431698
Неактивний
Я работаю матером по ремонту оргтехники и бытовой техники. Ардуино решил освоить интересная штука. Меня интересует именно программирование. Модули я сам паяю ... Вот и спрашиваю про хороший учебник ... Я так понимаю Вы на Си пишите?
Неактивний
Полный справочник по C ++ 4-е издание Герберта Шилдта.