Mega 2560+ rfid+RTC+SD

shutlpole
Offline
Зарегистрирован: 11.09.2013

Всех приветствую!

Использую железо Mega 2560+ rfid(rdm6300)+RTC+SD

Задача : приложив rfid метку, на sd карту ведется запись кода метки и текущего времени.

На просторах Интернета нашел множество примеров, из которых соорудил такой код



#include <DS1307new.h>
#include <Wire.h>

unsigned char buffer[21]; // buffer array for data recieve over serial port
int count=0;     // counter for buffer array 
const int chipSelect = 53;
void setup()
{
  Serial2.begin(9600);               // the SoftSerial baud rate   
  Serial.begin(9600);  
  pinMode(led, OUTPUT);   
  if(RTC.isPresent()){ // обнаружен ли модуль?
    Serial.println("RTC Ready"); // все хорошо
  } 
  else {
    Serial.println("Error RTC Module not found"); // сообщаем о проблеме
    while(1); // и останавливаем скетч
  }
  }  
void loop()
{
  if (Serial2.available()>0)              // if date is comming from softwareserial port ==> data is comming from SoftSerial shield
  {
        while(Serial2.available())          // reading data into char array 
    {
      
      RTC.getTime();// получить время от модуля
      printTimeToSerial(); // выводим полученное время
      buffer[count++]=Serial2.read();     // writing data into array
          if(count == 21)break;
      }    
    Serial.write(buffer,count);            // if no data transmission ends, write buffer to hardware serial port
      clearBufferArray();              // call clearBufferArray function to clear the storaged data from the array
    count = 0;                       // set counter of while loop to zero
    Serial.println();
    }
  }
void clearBufferArray()              // function to clear buffer array
{
  for (int i=0; i<count;i++)
  { 
    buffer[i]=NULL;
  }                  // clear all index of array with command NULL

}
// Выводит текущие время в Serial
void printTimeToSerial(){

  byte static prevSecond=0; // тут будем хранить, сколько секунд было при прошлом отчете

  if(RTC.second!=prevSecond){ // что-то делаем только если секунды поменялись
    Serial.print(RTC.hour); // часы

    Serial.print(":"); // разделитель
    Serial.print(RTC.minute);

    Serial.print(":"); 
    Serial.print(RTC.second);
    

    prevSecond=RTC.second; // запомнили когда мы "отчитались"
  }
}
 

Время в модуль часов я залил заранее.

Все работает, в консоль льется время и номер карты.

После курения мануалов по SD получилось следующее:

Карта нормально инициализируется, создается файл, но в него пишется не совсем то, что нужно, а именно

6:35:56,,53

Две запятые- это для разделения времени и метки карты.  Время я писал на SD карту так :

File dataFile = SD.open("datalog4.txt", FILE_WRITE);

  // if the file is available, write to it:
  if (dataFile) {
    dataFile.print(RTC.hour); // часы

    dataFile.print(":"); // разделитель
    dataFile.print(RTC.minute);

    dataFile.print(":"); 
    dataFile.print(RTC.second);
   
    dataFile.close();

 

Вопрос : как мне записать после времени метку карты? Может создать переменную некоторого типа test, и сохранять в нее номер карты,который модуль RFID передает в serial2, а потом делать

 dataFile.println(test);

Ткните носом, что именно сделать!

 

 

 

 

 

 

shutlpole
Offline
Зарегистрирован: 11.09.2013

Задача срочная, будет оплачена!

shutlpole@mail.ru

maksim
Offline
Зарегистрирован: 12.02.2012
#include <DS1307new.h>
#include <Wire.h>
#include <SD.h>

#define chipSelect 53  // CS SD-карты

char fileName[] = "datalog4.txt";

void setup()
{
  Serial2.begin(9600);              
  Serial.begin(9600);  

  if(!RTC.isPresent()) 
  {
    Serial.println("Error RTC Module not found"); // сообщаем о проблеме
    return;
  }
  Serial.println("RTC Ready"); // все хорошо

  if (!SD.begin(chipSelect)) 
  {
    Serial.println("Card failed, or not present");
    return;
  }
  Serial.println("card initialized.");
}  


void loop()
{
  if (Serial2.available())
  {
    RTC.getTime();// получить время от модуля
    String dataString = "";
    dataString += RTC.hour;
    dataString += ":";
    dataString += RTC.minute;
    dataString += ":";
    dataString += RTC.second;
    dataString += ",,";
    delay(30);
    if(millis() > 300000UL) while(0xFF);
    for(byte i = 0; i < 21; i++) if(Serial2.available()) dataString += (byte)Serial2.read();

    File dataFile = SD.open(fileName, FILE_WRITE);
    if (dataFile)
    {
      dataFile.println(dataString);
      dataFile.close();
      Serial.println(dataString);
    }  
    else 
    {
      Serial.print("error opening ");  
      Serial.println(fileName);  
    } 
  }
}

 

maksim
Offline
Зарегистрирован: 12.02.2012

Проверяйте, если все норм - жду оплаты, реквизиты на почте.

shutlpole
Offline
Зарегистрирован: 11.09.2013

Да, все работает. Только если карту чуть дольше подержать, то записывается несколько строк (очень быстро идет считывание). Куда добавить паузу в считывании? 1-2 секунды.

А так же зажигался светодиод, например на 6 пине при записи строки на карту памяти.

maksim
Offline
Зарегистрирован: 12.02.2012
#include <DS1307new.h>
#include <Wire.h>
#include <SD.h>

#define chipSelect 53  // CS SD-карты
#define LED 6 
#define DELAY 1000

char fileName[] = "datalog4.txt";

void setup()
{
  Serial2.begin(9600);              
  Serial.begin(9600);  
  pinMode(LED, OUTPUT);
  if(!RTC.isPresent()) 
  {
    Serial.println("Error RTC Module not found"); // сообщаем о проблеме
    return;
  }
  Serial.println("RTC Ready"); // все хорошо

  if (!SD.begin(chipSelect)) 
  {
    Serial.println("Card failed, or not present");
    return;
  }
  Serial.println("card initialized.");
}  


void loop()
{
  if (Serial2.available())
  {
    RTC.getTime();// получить время от модуля
    String dataString = "";
    dataString += RTC.hour;
    dataString += ":";
    dataString += RTC.minute;
    dataString += ":";
    dataString += RTC.second;
    dataString += ",,";
    delay(50);
    if(millis() > 300000UL) while(0xFF);
    for(byte i = 0; i < 21; i++) if(Serial2.available()) dataString += (byte)Serial2.read();
    digitalWrite(LED, 1);
    File dataFile = SD.open(fileName, FILE_WRITE);
    if (dataFile)
    {
      dataFile.println(dataString);
      dataFile.close();
      Serial.println(dataString);
    }  
    else 
    {
      Serial.print("error opening ");  
      Serial.println(fileName);  
    }
    delay(500);
    digitalWrite(LED, 0);
    delay(DELAY);
  }
}

 

shutlpole
Offline
Зарегистрирован: 11.09.2013

Проверил, задержка есть, но не то.

Дело вот в чем : надо считывать , например 1 раз, и сделать паузу в 2-3 секунды.

Тут получается немного не так : на карте и в консоли вот что

9:39:11,,25356484857555349656951483
9:39:13,,253564848575553496569514832535648485755
9:39:15,,253564848575553496569514832535648485755
9:39:17,,253564848575553496569514832535648485755
9:41:19,,2535
 
В первой строке все норм, дальше льется не то. 
как должно быть - приложил карту на 2-3 сек, записался 1 результат.
 
maksim
Offline
Зарегистрирован: 12.02.2012

Попробуйте так:

#include <DS1307new.h>
#include <Wire.h>
#include <SD.h>

#define chipSelect 53  // CS SD-карты
#define LED 6 
#define DELAY 3000

char fileName[] = "datalog4.txt";

void setup()
{
  Serial2.begin(9600);              
  Serial.begin(9600);  
  pinMode(LED, OUTPUT);
  if(!RTC.isPresent()) 
  {
    Serial.println("Error RTC Module not found"); // сообщаем о проблеме
    return;
  }
  Serial.println("RTC Ready"); // все хорошо

  if (!SD.begin(chipSelect)) 
  {
    Serial.println("Card failed, or not present");
    return;
  }
  Serial.println("card initialized.");
}  


void loop()
{
  if (Serial2.available())
  {
    RTC.getTime();// получить время от модуля
    String dataString = "";
    dataString += RTC.hour;
    dataString += ":";
    dataString += RTC.minute;
    dataString += ":";
    dataString += RTC.second;
    dataString += ",,";
    delay(50);
    if(millis() > 300000UL) while(0xFF);
    for(byte i = 0; i < 21; i++) if(Serial2.available()) dataString += (byte)Serial2.read();
    digitalWrite(LED, 1);
    File dataFile = SD.open(fileName, FILE_WRITE);
    if (dataFile)
    {
      dataFile.println(dataString);
      dataFile.close();
      Serial.println(dataString);
    }  
    else 
    {
      Serial.print("error opening ");  
      Serial.println(fileName);  
    }
    delay(500);
    digitalWrite(LED, 0);
    delay(DELAY);
    while(Serial2.available()) Serial2.read();
  }
}

 

shutlpole
Offline
Зарегистрирован: 11.09.2013

Отлично, спасибо!

написал на почту!

Ardoproject
Offline
Зарегистрирован: 09.09.2013

А вы работаете с рамкой идущей в комплекте с платой, или устанавливаете отдельный покупной считыватель?

shutlpole
Offline
Зарегистрирован: 11.09.2013

Использую вот такой : http://imall.iteadstudio.com/im120618002.html