Mega 2560+ rfid+RTC+SD
- Войдите на сайт для отправки комментариев
Всех приветствую!
Использую железо 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@mail.ru
#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); } } }Проверяйте, если все норм - жду оплаты, реквизиты на почте.
Да, все работает. Только если карту чуть дольше подержать, то записывается несколько строк (очень быстро идет считывание). Куда добавить паузу в считывании? 1-2 секунды.
А так же зажигался светодиод, например на 6 пине при записи строки на карту памяти.
#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); } }Проверил, задержка есть, но не то.
Дело вот в чем : надо считывать , например 1 раз, и сделать паузу в 2-3 секунды.
Тут получается немного не так : на карте и в консоли вот что
Попробуйте так:
#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(); } }Отлично, спасибо!
написал на почту!
А вы работаете с рамкой идущей в комплекте с платой, или устанавливаете отдельный покупной считыватель?
Использую вот такой : http://imall.iteadstudio.com/im120618002.html