RFID контроль сотрудников

akimov_aleks
Offline
Зарегистрирован: 04.04.2013

выкладываю свою наработку 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("-");
  }
  
  
}

 

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

Не, ну прямо в скетч прописывать карточки это как-то сосем по колхозному. Надо в EEPROM их записывать. Ну и механизм создания новых нужен.

Aven
Offline
Зарегистрирован: 16.04.2015

SD карта же используется, почему не хранить ключи там? Хотя это довольно медленно. Лучше хранить в EEPROM

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Aven пишет:

SD карта же используется, почему не хранить ключи там? Хотя это довольно медленно. Лучше хранить в EEPROM

Не на столько медленно, чтобы об этом задумываться. Но в подобных системах лучше хранить ключи именно в EEPROM - В таком случае с отсутствием карточки не будет только логов, но если на карте будут ключи - система вообще не будет работать

Хранение ключей в EEPROM реализуется несложно - вон у Осипова есть вообще готовый скетч.

akimov_aleks
Offline
Зарегистрирован: 04.04.2013

это только набросок... сама суть. буду ее улудшать... 

а писать логи всетаки лучше на флешку или EEPROM ?

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

По сути я бы с езернетом или вифи делал и возможностью удаленного доступа для внесения карточек, считывания логов, установки часов и т.д.

А для логов (и базы карточек) можно ещё в FRAM память использовать, хотя в данной задаче и флеш не сильно плохо, а то EEPROMа не так чтобы много в контроллере да и количество циклов записи у нее ограничено.

akimov_aleks
Offline
Зарегистрирован: 04.04.2013

 езернетом или вифи  я тоже хотел. и mysql  подключить. но так как если пропожет свях то все сразу накроеться. 

поэтому решил что апарат должен быть автономный 

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

Конечно автономный. По сети только чтение логов и настройка.

akimov_aleks
Offline
Зарегистрирован: 04.04.2013

жду когда приедут wifi  модуль... . а щас займус EEPROM

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

akimov_aleks пишет:

это только набросок... сама суть. буду ее улудшать... 

а писать логи всетаки лучше на флешку или EEPROM ?

Логи в еепром не пишут - мало места. А когда еепром умрет от постоянного использования - не заменишь.

bwn
Offline
Зарегистрирован: 25.08.2014

А чем плох EEPROM в виде отдельной мелкосхемы? Там вроде и ресурс на пару порядков выше?

akimov_aleks
Offline
Зарегистрирован: 04.04.2013

подскажите хочу на php  сделать сервер мини с графиком не как не могу нарыть инфу про такой график как он делаеться

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

ну я гугл чартом нечто подобное рисовал

akimov_aleks
Offline
Зарегистрирован: 04.04.2013

KVadik пишет:

ну я гугл чартом нечто подобное рисовал

можешь помочь сделать.

таблица

user|дата прихода |дата ухода |
alex|2015.05.01 09:00|2015.05.01 09:30|
alex|2015.05.01 10:00|2015.05.01 10:20|
alex|2015.05.01 11:00|2015.05.01 11:30|
alex|2015.05.01 14:00|2015.05.01 18:00|
alex|2015.05.02 09:00|2015.05.02 09:30|
alex|2015.05.02 10:00|2015.05.02 10:20|
alex|2015.05.02 11:00|2015.05.02 11:30|
alex|2015.05.02 14:00|2015.05.02 18:00|
KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

akimov_aleks пишет:

можешь помочь сделать.

Могу завтра поискать от своих проектов пример получающий данные из майскуля и строящий график. Там суть в том, что на пхп формируешь html файлик строящий график с помощью гугл чарта. Простенько, но я не силен в веб программировании.

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

Типа так:

<? 
/*Скрипт позволяет графически отображать данные таблицы */ 

/* Переменные для соединения с базой данных */ 
$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), правильное формирование шапочки хтымыеля смотри в примерах гугл чарта по ссылке выше.

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

Ну что? Получилось?

akimov_aleks
Offline
Зарегистрирован: 04.04.2013

почти.... скоро выложу код

akimov_aleks
Offline
Зарегистрирован: 04.04.2013
Парень с украины написал мне бесплатно .

 

 

<?РНР

$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 стиль="плавать: слева;"> &nbsp; с 20:00</дел>
HERETEXT;
 $page_html .= <<<HERETEXT
<div стиль="ясно: слева; плавать:слева;">$д 09:00 &nbsp; В </дел>
HERETEXT;
 по каждому элементу( $день $час )
{
 по каждому элементу( $час, $м=>$минута )
{
 $page_html .= <<<HERETEXT
<div стиль="
HERETEXT;
 если( !$м )
 $page_html .= <<<HERETEXT
границы-слева: 1 пиксель твердых #вся;
HERETEXT;
 $page_html .= <<<HERETEXT
фон-цвет: $цвета[$минута]; Ширина: 1 пиксель; высота: 15px; плавать: слева;"></дел>
HERETEXT;
}
}
 $я += 1;
}
 $page_html .= <<<HERETEXT
<div стиль="плавать: слева;"> &nbsp; с 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;
?>

 

akimov_aleks
Offline
Зарегистрирован: 04.04.2013

подправил код немного оптимизировал пока без 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++;
}
  
}

 

akimov_aleks
Offline
Зарегистрирован: 04.04.2013

подправил код немного оптимизировал пока без 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++;
}
  
}

 

dimitii
Offline
Зарегистрирован: 24.06.2015

День добрый! Подскажите а получится к UNO подключить считыватель PROXY–3M? 

Aven
Offline
Зарегистрирован: 16.04.2015

Да.

dimitii
Offline
Зарегистрирован: 24.06.2015

Aven пишет:

Да.

Не подскажите где почитать как?