RFID контроль сотрудников
- Войдите на сайт для отправки комментариев
Втр, 05/05/2015 - 09:27
выкладываю свою наработку RFID контроль сотрудников
#include <SPI.h>
#include <MFRC522.h>
#include <EEPROM.h>
#include <SD.h>
#include <DS1302.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C lcd(0x27,20,4);
// Init the DS1302
DS1302 rtc(2, 3, 5);
#define RST_PIN 9 //
#define SS_PIN 10 //
File myFile; // Файл Алексей
char Str1[10];
MFRC522 mfrc522(SS_PIN, RST_PIN); // Создали MFRC522 instance
unsigned long uidDec, uidDecTemp; // переменные для получения UID
boolean aleks= EEPROM.read(0); //EEPROM читаем значения true или false Aleks
int addr_aleks = 0; //Aleks использует ячеку 0
boolean aleksandr= EEPROM.read(1);
int addr_aleksandr = 1;
boolean anton= EEPROM.read(2);
int addr_anton = 2;
boolean vova= EEPROM.read(3);
int addr_vova = 3;
boolean nasti= EEPROM.read(4);
int addr_nasti = 4;
void setup()
{
pinMode(2, OUTPUT);
Serial.begin(9600); // Initialize serial communications with the PC
while (!Serial); // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)
SPI.begin(); // Init SPI bus
mfrc522.PCD_Init(); // Init MFRC522
// Инициализируем СД карту
cheksd();
rtc.halt(false);
rtc.writeProtect(false);
lcd.begin();
lcd.backlight();
status();
}
void loop() {
lcd.setCursor(0, 0);
lcd.print(rtc.getTimeStr());
SD_check();
// Look for new cards
if ( ! mfrc522.PICC_IsNewCardPresent()) {
return;
}
// Select one of the cards
if ( ! mfrc522.PICC_ReadCardSerial()) {
return;
}
// полученя UID
for (byte i = 0; i < mfrc522.uid.size; i++) {
uidDecTemp=mfrc522.uid.uidByte[i];
uidDec=uidDec*256+uidDecTemp;
}
// полученя UID
Serial.println(uidDec);
// lcd.setCursor(2, 2);
// lcd.print(uidDec);
// Оброботка Алесея
if (uidDec == 4200285874)
{
if (aleks == true)
{
//String s = rtc.getTimeStr();
//s.toCharArray(Str1, s.length());
printtrue ("aleks.txtt");
}
if (aleks == false)
{
printfalse ("aleks.txtt");
}
myFile.close();
aleks = ! aleks;
EEPROM.write(addr_aleks, aleks);
}
// Оброботка Алесея
// Оброботка Александор
if (uidDec == 2123090467)
{
if (aleksandr == true)
{
printtrue ("alex.txtt");
}
if (aleksandr == false)
{
printfalse ("alex.txtt");
}
myFile.close();
aleksandr = ! aleksandr;
EEPROM.write(addr_aleksandr, aleksandr);
}
// Оброботка Александор
// Оброботка Антон
if (uidDec == 691247130)
{
if (anton == true)
{
printtrue ("anton.txtt");
}
if (anton == false)
{
printfalse ("anton.txtt");
}
myFile.close();
anton = ! anton;
EEPROM.write(addr_anton, anton);
}
// Оброботка Антон
// Оброботка Настя
if (uidDec == 3104822041)
{
if (nasti == true)
{
printtrue ("nasti.txtt");
}
if (nasti == false)
{
printfalse ("nasti.txtt");
}
myFile.close();
nasti = ! nasti;
EEPROM.write(addr_nasti, nasti);
}
// Оброботка Настя
// Оброботка Вова
if (uidDec == 3645938714)
{
if (vova == true)
{
printtrue ("vova.txtt");
}
if (vova == false)
{
printfalse ("vova.txtt");
}
myFile.close();
vova = ! vova;
EEPROM.write(addr_vova, vova);
}
// Оброботка Вово
status();
delay(1000);
lcd.setCursor(0, 4);
lcd.print(" ");
}
void printfalse (String tex)
{
String s = tex;
s.toCharArray(Str1, s.length());
myFile.close();
myFile = SD.open(Str1, FILE_WRITE);
if (myFile) {
myFile.print(rtc.getDateStr());
myFile.print(" ; ");
myFile.println(rtc.getTimeStr());
myFile.close();
lcd.setCursor(2, 1);
lcd.print("OK");
tone(7,700,500);
}
}
void printtrue (String tex )
{
String s = tex;
s.toCharArray(Str1, s.length());
myFile.close();
myFile = SD.open(Str1, FILE_WRITE);
if (myFile) {
myFile.print(tex+" ; ");
myFile.print(rtc.getDateStr());
myFile.print(" ; ");
myFile.print(rtc.getTimeStr());
myFile.print(" ; ");
myFile.close();
lcd.setCursor(2, 1);
lcd.print("OK ");
tone(7,500,500);
}
}
void SD_check()
{
static uint32_t pre_millis = 0;
if(millis()-pre_millis < 500) return; // 2 раза в секунду проверяем
pre_millis = millis();
myFile = SD.open("log.txt", FILE_READ);
if(myFile.read() == -1) // Если файл не читается
// if(base.available()) // или нечего читать
{
lcd.setCursor(0, 2);
lcd.print("ERROR");
delay(50);
asm volatile ("jmp 0x0000"); // перезагружаемся
}
myFile.close();
}
void cheksd()
{
if (!SD.begin(4)) {
Serial.println("initialization failed!");
return;
}
Serial.println("initialization done.");
}
void status() {
if (aleks == false)
{
lcd.setCursor(0, 8);
lcd.print("+");
}
if (aleks == true)
{
lcd.setCursor(0, 8);
lcd.print("-");
}
if (aleksandr == false)
{
lcd.setCursor(2, 8);
lcd.print("+");
}
if (aleksandr == true)
{
lcd.setCursor(2, 8);
lcd.print("-");
}
if (anton == false)
{
lcd.setCursor(4, 8);
lcd.print("+");
}
if (anton == true)
{
lcd.setCursor(4, 8);
lcd.print("-");
}
if (vova == false)
{
lcd.setCursor(6, 8);
lcd.print("+");
}
if (vova == true)
{
lcd.setCursor(6, 8);
lcd.print("-");
}
if (nasti == false)
{
lcd.setCursor(8, 8);
lcd.print("+");
}
if (nasti == true)
{
lcd.setCursor(8, 8);
lcd.print("-");
}
}
Не, ну прямо в скетч прописывать карточки это как-то сосем по колхозному. Надо в EEPROM их записывать. Ну и механизм создания новых нужен.
SD карта же используется, почему не хранить ключи там? Хотя это довольно медленно. Лучше хранить в EEPROM
SD карта же используется, почему не хранить ключи там? Хотя это довольно медленно. Лучше хранить в EEPROM
Не на столько медленно, чтобы об этом задумываться. Но в подобных системах лучше хранить ключи именно в EEPROM - В таком случае с отсутствием карточки не будет только логов, но если на карте будут ключи - система вообще не будет работать
Хранение ключей в EEPROM реализуется несложно - вон у Осипова есть вообще готовый скетч.
это только набросок... сама суть. буду ее улудшать...
а писать логи всетаки лучше на флешку или EEPROM ?
По сути я бы с езернетом или вифи делал и возможностью удаленного доступа для внесения карточек, считывания логов, установки часов и т.д.
А для логов (и базы карточек) можно ещё в FRAM память использовать, хотя в данной задаче и флеш не сильно плохо, а то EEPROMа не так чтобы много в контроллере да и количество циклов записи у нее ограничено.
езернетом или вифи я тоже хотел. и mysql подключить. но так как если пропожет свях то все сразу накроеться.
поэтому решил что апарат должен быть автономный
Конечно автономный. По сети только чтение логов и настройка.
жду когда приедут wifi модуль... . а щас займус EEPROM
это только набросок... сама суть. буду ее улудшать...
а писать логи всетаки лучше на флешку или EEPROM ?
Логи в еепром не пишут - мало места. А когда еепром умрет от постоянного использования - не заменишь.
А чем плох EEPROM в виде отдельной мелкосхемы? Там вроде и ресурс на пару порядков выше?
подскажите хочу на php сделать сервер мини с графиком не как не могу нарыть инфу про такой график как он делаеться
ну я гугл чартом нечто подобное рисовал
ну я гугл чартом нечто подобное рисовал
можешь помочь сделать.
таблица
можешь помочь сделать.
Могу завтра поискать от своих проектов пример получающий данные из майскуля и строящий график. Там суть в том, что на пхп формируешь html файлик строящий график с помощью гугл чарта. Простенько, но я не силен в веб программировании.
Типа так:
<? /*Скрипт позволяет графически отображать данные таблицы */ /* Переменные для соединения с базой данных */ $hostname = "MyHostName"; $username = "user"; $password = "password"; $dbName = "DataBase"; /* Таблица MySQL, в которой хранятся данные */ $userstable = "TimeLog"; /* создать соединение */ mysql_connect($hostname,$username,$password) OR DIE("Не могу создать соединение "); /* выбрать базу данных. Если произойдет ошибка - вывести ее */ mysql_select_db($dbName) or die(mysql_error()); /* составить запрос, который выберет поля таблицы */ $query = "SELECT Name AS Name , ArrivalDateTime AS ArrivalDateTime , DepartureDateTime AS DepartureDateTime FROM ".$userstable." ORDER BY ArrivalDateTime "; /* Выполнить запрос. Если произойдет ошибка - вывести ее. */ $res = mysql_query($query) or die(mysql_error()); /* Как много нашлось таких */ $number = mysql_num_rows($res); /* открыть файл и начать создание строки записи функции Google Chart API*/ $file = fopen ("TimeLog.html","w"); $str = " <html> <head> <script type=\"text/javascript\" src=\"https://www.google.com/jsapi\"></script> <script type=\"text/javascript\"> google.load(\"visualization\", \"1\", {packages:[\"timeline\"]}); google.setOnLoadCallback(drawChart); function drawChart() { var container = document.getElementById('timeline'); var chart = new google.visualization.Timeline(container); var dataTable = new google.visualization.DataTable(); dataTable.addColumn({ type: 'string', id: 'Name' }); dataTable.addColumn({ type: 'date', id: 'Start' }); dataTable.addColumn({ type: 'date', id: 'End' }); dataTable.addRows(["; /* Получать по одной строке из таблицы в массив $row, пока строки не кончатся */ while ($row=mysql_fetch_array($res)) { $str.="[ '".$row['Name']."', new Date('".$row['ArrivalDateTime']."'), new Date('".$row['DepartureDateTime']."')],\n"; } $str.="]); var options = { timeline: { colorByRowLabel: true }, hAxis: { format: 'H'} }; chart.draw(dataTable,options); } </script> </head> <body> <div id=\"timeline\" style=\"width: 900px; height: 600px;\"></div> </body> </html> "; if ( !$file ) { echo("Ошибка открытия файла"); } else { fputs ( $file, $str); } fclose ($file); ?> <? /*Начертить диаграмму*/ include ('TimeLog.html') ; ?>з.ы. движок форума портит код делая ссылку (строка 38), правильное формирование шапочки хтымыеля смотри в примерах гугл чарта по ссылке выше.
Ну что? Получилось?
почти.... скоро выложу код
<?РНР $database_params = массив (локальным 'localhost', 'корень', ", 'раб' ); $_GET['пользователь'] = 'Алекс'; если( конструкцию isset( $_GET['date_to'] ) && $_GET['date_to'] != "&& Функцию isdate( $_GET['date_to'] ) ) { $date_to = DateFormatForDatabase( $_GET['date_to'] ); $date_from = DateTimePrev( 30, 0, $date_to ); $запрос = "выбрать * из new_table1 где пользователь='" . $_GET['пользователь'] . "' И data_p >= '" . $date_from . "00:00:00' и data_p <= '" . $date_to . "23:59:59' заказ по data_p"; //печати $запроса . '<бр />'; $раз = массив(); $current_day = $date_from; $current_hour = 0; $current_minute = 0; $DatabaseConnection = @как mysql_connect( $database_params[0], $database_params[1], $database_params[2] ); если( $DatabaseConnection && @mysql_select_db( $database_params[3], $DatabaseConnection ) ) { $query_result = функции mysql_query( $запроса ); в то время как( $query_result && $строки = mysql_fetch_array( $query_result ) ) { в то время как( $current_day . '' . number_text( $current_hour ) . ':' . number_text( $current_minute ) . ':00' < $строки['data_p'] ) { //печати $current_day . '' . number_text( $current_hour ) . ':' . number_text( $current_minute) . ':00' . '=' . $строки['data_p'] . '<бр />'; если( $current_hour >= 9 && $current_hour <= 19 ) { $раза[$current_day][$current_hour][$current_minute] = 0; //печати '0'; } если( $current_minute < 59 ) $current_minute += 1; еще { $current_minute = 0; если( $current_hour < 23 ) $current_hour += 1; еще { $current_hour = 0; $current_day = DateTimeNext( 1, 0, $current_day ); //печать " <бр />' . $current_day . ': '; } } } в то время как( $current_day . '' . number_text( $current_hour ) . ':' . number_text( $current_minute ) . ':00' < $строки['data_u'] ) { //печати $current_day . '' . number_text( $current_hour ) . ':' . number_text( $current_minute) . ':00' . '=' . $строки['data_u'] . '<бр />'; если( $current_hour >= 9 && $current_hour <= 19 ) { $раза[$current_day][$current_hour][$current_minute] = 1; //выводим '1'; } если( $current_minute < 59 ) $current_minute += 1; еще { $current_minute = 0; если( $current_hour < 23 ) $current_hour += 1; еще { $current_hour = 0; $current_day = DateTimeNext( 1, 0, $current_day ); //печать " <бр />' . $current_day . ': '; } } } } $next_day = DateTimeNext( 1, 0, $current_day ); в то время как( $current_day . '' . number_text( $current_hour ) . ':' . number_text( $current_minute ) . ':00' < $next_day ) { //печати $current_day . '' . number_text( $current_hour ) . ':' . number_text( $current_minute) . ':00' . '=' . $строки['data_u'] . '<бр />'; если( $current_hour >= 9 && $current_hour <= 19 ) { $раза[$current_day][$current_hour][$current_minute] = 1; //выводим '1'; } если( $current_minute < 59 ) $current_minute += 1; еще { $current_minute = 0; если( $current_hour < 23 ) $current_hour += 1; еще { $current_hour = 0; $current_day = DateTimeNext( 1, 0, $current_day ); //печать " <бр />' . $current_day . ': '; } } } } $datenow = $_GET['date_to']; } еще $datenow = Дата( 'д'.м.У' ); функция number_text( $н ) { если( $N < 10 ) возвращает '0' . $н; еще вернуть $н; } / / ==== проверяет формат строки на дату функция функцию isdate( $pDateString ) { $DateArray = взорваться( ".", $pDateString ); если( значение sizeof( $DateArray ) != 3 || использования strspn( $DateArray[0], "1234567890" ) != по смещению strlen( $DateArray[0] ) || использования strspn( $DateArray[1], "1234567890" ) != по смещению strlen( $DateArray[1] ) || использования strspn( $DateArray[2], "1234567890" ) != по смещению strlen( $DateArray[2] ) || (Тип int)$DateArray[0] > 31 || (Тип int)$DateArray[1] < 1 || (Тип int)$DateArray[1] > 12 || смещению strlen($DateArray[2]) < 4 ) возвратить false; возвратите True; } / / ==== форматирует дату для хранения в базе данных функция DateFormatForDatabase( $pDateString ) { $DateTimeArray = взорваться( " ", $pDateString ); $DateArray = взорваться( ".", $DateTimeArray[0] ); если( значение sizeof( $DateArray ) == 1 ) $DateArray = массив( "00", "00", $DateArray[0] ); ключевые слова elseif( значение sizeof( $DateArray ) == 2 ) $DateArray = массив( "00", $DateArray[0], $DateArray[1] ); $рез = $DateArray[2] . "-" . $DateArray[1] . "-" . $DateArray[0]; вернуть $РЭС; } функция DateTimePrev( $pDays = 1, $pSeconds = 0, $pFromDate = ложь ) { если( !$pFromDate ) $pFromDate = Дата( 'Г-М-Д ч:я:ы' ); $Д1 = DateFormatForUnix( $pFromDate ); $Д2 = $Д1 - $pDays * 24 * 60 * 60 - $pSeconds; возврат Дата( 'Г-М-Д', $Д2 ); } функция DateTimeNext( $pDays = 1, $pSeconds = 0, $pFromDate = ложь ) { если( !$pFromDate ) $pFromDate = Дата( 'Г-М-Д ч:я:ы' ); $Д1 = DateFormatForUnix( $pFromDate ); $Д2 = $Д1 + $pDays * 24 * 60 * 60 + $pSeconds; возврат Дата( 'Г-М-Д', $Д2 ); } функция DateFormatForUnix( $бновить ) { $ТММ = взорваться( " ", функция TRIM( $бновить ) ); $tmp1 = взорваться( "-", $tmp в[0] ); возвращение функцией mktime( 0, 0, 0, $tmp1[1], $tmp1[2], $tmp1[0] ); } $page_html = <<<HERETEXT <!Элемент doctype в HTML общественности "-//консорциума W3C//dtd в формате XHTML 1.0 переходный//АН" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <HTML с префиксом xmlns="http://в ВСП.В3.орг/1999/XHTML-кода" в XML:Ланг="ру" Ланг="ру"> <глава> <название>Отображение графика посещений</название> <Мета нттр-экв="содержимое-Тип" content="интернет-текст/HTML; Кодировка=Кодировка utf-8" /> <скриптовый язык="Яваскрипт" срц="calendar1.с JS"></скрипт> </глава> <тело стиль="обивка: в 50px;"> HERETEXT; если( конструкцию isset( $раз ) ) { $цвет = массив( '#dd7364', '#1AFF00' ); $page_html .= <<<HERETEXT <Н2>График посещаемости за период от $date_from по $date_to</Н2> HERETEXT; $я = 0; по каждому элементу( $раз $д=>$день ) { если( $я > 0 ) $page_html .= <<<HERETEXT <div стиль="плавать: слева;"> с 20:00</дел> HERETEXT; $page_html .= <<<HERETEXT <div стиль="ясно: слева; плавать:слева;">$д 09:00 В </дел> HERETEXT; по каждому элементу( $день $час ) { по каждому элементу( $час, $м=>$минута ) { $page_html .= <<<HERETEXT <div стиль=" HERETEXT; если( !$м ) $page_html .= <<<HERETEXT границы-слева: 1 пиксель твердых #вся; HERETEXT; $page_html .= <<<HERETEXT фон-цвет: $цвета[$минута]; Ширина: 1 пиксель; высота: 15px; плавать: слева;"></дел> HERETEXT; } } $я += 1; } $page_html .= <<<HERETEXT <div стиль="плавать: слева;"> с 20:00</дел> <div стиль="ясно: слева;"> </дел> HERETEXT; } $page_html .= <<<HERETEXT <Н1>Отображение графика посещений</Н1> <имя формы="frm_search" action="show_chart.php" метод="получить"> <р>Укажите конечную дату периода: <входной класс="текст" Тип="текст" идентификатор="date_to" название="date_to" значение="$datenow" Размер="8" />title="в код JavaScript:cal1.всплывающее окно();"><имг src="img/cal.gif" Ширина="16" высота="16" граница="0" АЛТ="Выбрать дату"></а> <скрипт языка="JavaScript"> <!-- вар cal1 = calendar1 новый(документ.форм['frm_search'].элементы['date_to']); cal1.year_scroll = истина; cal1.time_comp = ложь; //--> </script>и</р> <р><входной класс="кнопка" типа="отправить" значение="Показать график" /></р> </форма> </тело> </HTML>в HERETEXT; печать $page_html; ?>подправил код немного оптимизировал пока без web интерфейса
#include <SPI.h> #include <MFRC522.h> #include <EEPROM.h> #include <SD.h> #include <DS1302.h> #include <LiquidCrystal_I2C.h> #include <Wire.h> LiquidCrystal_I2C lcd(0x27,20,4); // Init the DS1302 DS1302 rtc(2, 3, 5); #define RST_PIN 9 // #define SS_PIN 10 // File myFile; // Файл Алексей char Str1[10]; MFRC522 mfrc522(SS_PIN, RST_PIN); // Создали MFRC522 instance unsigned long uidDec, uidDecTemp; // переменные для получения UID boolean aleks= EEPROM.read(0); //EEPROM читаем значения true или false Aleks int addr_aleks = 0; //Aleks использует ячеку 0 boolean aleksandr= EEPROM.read(1); int addr_aleksandr = 1; boolean anton= EEPROM.read(2); int addr_anton = 2; boolean vova= EEPROM.read(3); int addr_vova = 3; boolean nasti= EEPROM.read(4); int addr_nasti = 4; int karti[ ]={4200285874, 2123090467, 691247130, 3645938714, 3104822041}; char* users[]={"aleks.txtt","alex.txtt","anton.txtt","vova.txtt","nasti.txtt"}; void setup() { pinMode(2, OUTPUT); Serial.begin(9600); // Initialize serial communications with the PC while (!Serial); // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4) SPI.begin(); // Init SPI bus mfrc522.PCD_Init(); // Init MFRC522 // Инициализируем СД карту cheksd(); rtc.halt(false); rtc.writeProtect(false); lcd.begin(); lcd.backlight(); status(); } void loop() { lcd.setCursor(0, 0); lcd.print(rtc.getTimeStr()); SD_check(); // Look for new cards if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } // Select one of the cards if ( ! mfrc522.PICC_ReadCardSerial()) { return; } // полученя UID for (byte i = 0; i < mfrc522.uid.size; i++) { uidDecTemp=mfrc522.uid.uidByte[i]; uidDec=uidDec*256+uidDecTemp; } // полученя UID Serial.println(uidDec); lcd.setCursor(2, 2); lcd.print(uidDec); int z =uidDec; for (int i=0; i <= 5; i++){ if (z == karti[i]) { boolean loginstatus= EEPROM.read(i); if (loginstatus == true) { printtrue (users[i]); } if (loginstatus == false) { printfalse (users[i]); } myFile.close(); loginstatus = ! loginstatus; EEPROM.write(i, loginstatus); } } status(); delay(1000); lcd.setCursor(0, 4); lcd.print(" "); } void printfalse (String tex) { String s = tex; s.toCharArray(Str1, s.length()); myFile.close(); myFile = SD.open(Str1, FILE_WRITE); if (myFile) { myFile.print(rtc.getDateStr()); myFile.print(" ; "); myFile.println(rtc.getTimeStr()); myFile.close(); lcd.setCursor(2, 1); lcd.print("OK"); tone(7,700,500); } } void printtrue (String tex ) { String s = tex; s.toCharArray(Str1, s.length()); myFile.close(); myFile = SD.open(Str1, FILE_WRITE); if (myFile) { myFile.print(tex+" ; "); myFile.print(rtc.getDateStr()); myFile.print(" ; "); myFile.print(rtc.getTimeStr()); myFile.print(" ; "); myFile.close(); lcd.setCursor(2, 1); lcd.print("OK"); tone(7,500,500); } } void SD_check() { static uint32_t pre_millis = 0; if(millis()-pre_millis < 500) return; // 2 раза в секунду проверяем pre_millis = millis(); myFile = SD.open("log.txt", FILE_READ); if(myFile.read() == -1) // Если файл не читается // if(base.available()) // или нечего читать { lcd.setCursor(0, 2); lcd.print("ERROR"); delay(50); asm volatile ("jmp 0x0000"); // перезагружаемся } myFile.close(); } void cheksd() { if (!SD.begin(4)) { Serial.println("initialization failed!"); return; } Serial.println("initialization done."); } void status() { int kursor = 0; for (int i=0; i <= 5; i++){ if (boolean loginstatus= EEPROM.read(i) == false) { lcd.setCursor(kursor, 8); lcd.print("+"); } if (boolean loginstatus= EEPROM.read(i) == true) { lcd.setCursor(kursor, 8); lcd.print("-"); } kursor++; kursor++; } }подправил код немного оптимизировал пока без web интерфейса
#include <SPI.h> #include <MFRC522.h> #include <EEPROM.h> #include <SD.h> #include <DS1302.h> #include <LiquidCrystal_I2C.h> #include <Wire.h> LiquidCrystal_I2C lcd(0x27,20,4); // Init the DS1302 DS1302 rtc(2, 3, 5); #define RST_PIN 9 // #define SS_PIN 10 // File myFile; // Файл Алексей char Str1[10]; MFRC522 mfrc522(SS_PIN, RST_PIN); // Создали MFRC522 instance unsigned long uidDec, uidDecTemp; // переменные для получения UID boolean aleks= EEPROM.read(0); //EEPROM читаем значения true или false Aleks int addr_aleks = 0; //Aleks использует ячеку 0 boolean aleksandr= EEPROM.read(1); int addr_aleksandr = 1; boolean anton= EEPROM.read(2); int addr_anton = 2; boolean vova= EEPROM.read(3); int addr_vova = 3; boolean nasti= EEPROM.read(4); int addr_nasti = 4; int karti[ ]={4200285874, 2123090467, 691247130, 3645938714, 3104822041}; char* users[]={"aleks.txtt","alex.txtt","anton.txtt","vova.txtt","nasti.txtt"}; void setup() { pinMode(2, OUTPUT); Serial.begin(9600); // Initialize serial communications with the PC while (!Serial); // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4) SPI.begin(); // Init SPI bus mfrc522.PCD_Init(); // Init MFRC522 // Инициализируем СД карту cheksd(); rtc.halt(false); rtc.writeProtect(false); lcd.begin(); lcd.backlight(); status(); } void loop() { lcd.setCursor(0, 0); lcd.print(rtc.getTimeStr()); SD_check(); // Look for new cards if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } // Select one of the cards if ( ! mfrc522.PICC_ReadCardSerial()) { return; } // полученя UID for (byte i = 0; i < mfrc522.uid.size; i++) { uidDecTemp=mfrc522.uid.uidByte[i]; uidDec=uidDec*256+uidDecTemp; } // полученя UID Serial.println(uidDec); lcd.setCursor(2, 2); lcd.print(uidDec); int z =uidDec; for (int i=0; i <= 5; i++){ if (z == karti[i]) { boolean loginstatus= EEPROM.read(i); if (loginstatus == true) { printtrue (users[i]); } if (loginstatus == false) { printfalse (users[i]); } myFile.close(); loginstatus = ! loginstatus; EEPROM.write(i, loginstatus); } } status(); delay(1000); lcd.setCursor(0, 4); lcd.print(" "); } void printfalse (String tex) { String s = tex; s.toCharArray(Str1, s.length()); myFile.close(); myFile = SD.open(Str1, FILE_WRITE); if (myFile) { myFile.print(rtc.getDateStr()); myFile.print(" ; "); myFile.println(rtc.getTimeStr()); myFile.close(); lcd.setCursor(2, 1); lcd.print("OK"); tone(7,700,500); } } void printtrue (String tex ) { String s = tex; s.toCharArray(Str1, s.length()); myFile.close(); myFile = SD.open(Str1, FILE_WRITE); if (myFile) { myFile.print(tex+" ; "); myFile.print(rtc.getDateStr()); myFile.print(" ; "); myFile.print(rtc.getTimeStr()); myFile.print(" ; "); myFile.close(); lcd.setCursor(2, 1); lcd.print("OK"); tone(7,500,500); } } void SD_check() { static uint32_t pre_millis = 0; if(millis()-pre_millis < 500) return; // 2 раза в секунду проверяем pre_millis = millis(); myFile = SD.open("log.txt", FILE_READ); if(myFile.read() == -1) // Если файл не читается // if(base.available()) // или нечего читать { lcd.setCursor(0, 2); lcd.print("ERROR"); delay(50); asm volatile ("jmp 0x0000"); // перезагружаемся } myFile.close(); } void cheksd() { if (!SD.begin(4)) { Serial.println("initialization failed!"); return; } Serial.println("initialization done."); } void status() { int kursor = 0; for (int i=0; i <= 5; i++){ if (boolean loginstatus= EEPROM.read(i) == false) { lcd.setCursor(kursor, 8); lcd.print("+"); } if (boolean loginstatus= EEPROM.read(i) == true) { lcd.setCursor(kursor, 8); lcd.print("-"); } kursor++; kursor++; } }День добрый! Подскажите а получится к UNO подключить считыватель PROXY–3M?
Да.
Да.
Не подскажите где почитать как?