Запись полученных данных на sd
- Войдите на сайт для отправки комментариев
Доброго времени суток.
Что-то я совсем запутался в коде. Блуждаю средь 3х деревьев.
Собственно сам основной скетч:
unsigned char pin = 13;
unsigned char counter=0;
unsigned int heart_rate=0;
unsigned long temp[21];
unsigned long sub=0;
volatile unsigned char state = LOW;
bool data_effect=true;
const int max_heartpluse_duty=2000;
#include <SD.h>
File myFile;
void setup()
{
pinMode(pin, OUTPUT);
Serial.begin(9600);
Serial.println("Please ready your chest belt.");
delay(5000);//
array_init();
Serial.println("Heart rate test begin.");
attachInterrupt(0, interrupt, RISING);//set interrupt 0,digital port 2
}
void loop()
{
digitalWrite(pin, state);
}
void sum()
{
if(data_effect)
{
heart_rate=1200000/(temp[20]-temp[0]);//60*20*1000/20_total_time
Serial.print("Heart_rate_is:\t");
Serial.println(heart_rate);
}
data_effect=1;//sign bit
}
void interrupt()
{
temp[counter]=millis();
state = !state;
switch(counter)
{
case(0):
sub=temp[counter]-temp[20];
Serial.println(sub);
break;
default:
sub=temp[counter]-temp[counter-1];
Serial.println(sub);
break;
}
if(sub>max_heartpluse_duty)
{
data_effect=0;//sign bit
counter=0;
Serial.println("Heart rate measure error,test will restart!" );
array_init();
}
if (counter==20&&data_effect)
{
counter=0;
sum();
}
else if(counter!=20&&data_effect)
counter++;
else
{
counter=0;
data_effect=1;
}
}
void array_init()
{
for(unsigned char i=0;i!=20;++i)
{
temp[i]=0;
}
temp[20]=millis();
}
К нему нужно дописать кусок кода, чтобы каждое полученное значение heart_rate записывать на SD.
Собственно инициализация SD в разделе void setup() кодом:
Serial.begin(9600);
while (!Serial) {
;
}
Serial.print("Initializing SD card...");
pinMode(10, OUTPUT);
if (!SD.begin(4)) {
Serial.println("initialization failed!");
return;
}
Serial.println("initialization done.");
насколько я понимаю невозможна из-за использовании функции прерывания attachInterrupt.
Значит, по логике прийдется пихать эту часть кода в раздел void loop().
Тогда вопрос следующий:
1) Как осуществить последовательную запись необходимой переменной при учете особенностей конкретного кода?
Если не сложно, то прокомментируйте еще вот эти вопросы:
2)Как на ардуино можно осуществить работу с временем?
т.е. записывается значение переменной и время, когда было получено это значение.
Насколько знаю, необходимо подключение микросхемы реального времени (RTC, Real Time Clock IC).
Кто нибудь работал с аналогичными датчиками или знает, где можно почитать о их подключении и использовании?
3)Предупреждаю, вопрос крайне некорректен.
Возможно ли на SPI "повесить" несколько одинаковых модулей?
Или же знает кто платы с более серьезными возможностями подключения?(на ATxmega или пр.)
>насколько я понимаю невозможна из-за использовании функции прерывания attachInterrupt.
Для меня этот ход мысли не понятен. Каким образом "слушай D2" может мешать работе SD карты? Да и зачем постоянно "инициализировать карту"? IMHO один раз в setup() - будет вполне достаточно.
Вот внутри функции обработки прерывания работы с SD - теоретически может вызвать проблему (как и Serial). Не уверен, но лучше не искушать.
Вообще, функцию обработчик прерывания - лучше делать как можно меньше. Старатся выйти из нее как можно раньше. Оставлять в ней только минимально необходимое "запомнили когда произошло прерыване, увеличили какой-то счетчик" и все.
А все "тяжелое" - в loop(). Что-бы это "склеить вместе" заводим еще какую-то переменную флаг типа "нужен отчет", в interrupt(), взводим ее в true когда нам нужно что-то "подсчитать, вывести, записать", а в loop(), смотрим на нее постоянно. Если она true - работает с Serial, записываем на sd. На и "сбрасываем" в false (что-бы отметить что мы выполнили запрошенную работу).
>) Как осуществить последовательную запись необходимой переменной при учете особенностей конкретного кода
Вопрос как-то не очень понятен. Ну открываете файл и дописываете в его конец что-нибудь. Или вообще, один раз открыли и держите открытым по мере необходимости write в него делаете.
>Как на ардуино можно осуществить работу с временем?
Полазте по форуме. Не раз и не два вопрос обсуждался. Да и просто в гугул "Arduino RTC" куча примеров. ДА банальн найти любой RTC шилд, скажем на SparkFun и посмотреть пример работы с ардуиной.
Вообщем простите, но похоже к вам лень подкрадывается :) Вы просто не искали ответ на этот вопрос :(
>Возможно ли на SPI "повесить" несколько одинаковых модулей
Да без проблемм (кстати тоже гуглится). SS - пин. Это и есть пин "выбора", Вешаем всех "паралельно". Вот только SS пин каждому датчику свой должен быть. Ну а далее, с помощью SS пина всем, кроме одного, говорим "не слушайте шину" и работаем с этим оставшимся.
Посмотрите по форуму. На этой неделе обсуждался Ethernet шилд с SD картой. Там и "сетевой чип" и "sd" карта тоже работают через SPI. И нужно "переключатся" c кем мы хотим работать.
пишем
SD.remove("Setup/Alarm.txt"); myFile = SD.open("Setup/Alarm.txt", FILE_WRITE); if(myFile) {for(int i=0;i<56;i++) // бежим по элементам {Alarm[i]=TempArray1[i];TempArray1[i]=0; if(Alarm[i] < 10){myFile.print(0);} // если значение меньше 10, то пишем перед значением 0 myFile.print(Alarm[i]); } } myFile.close();читаем
myFile = SD.open("Setup/Alarm.txt"); if(myFile) {Serial.println("Alarm.txt"); while(myFile.available()){ for(int i=0; i<112; i++){TempSD[i] =(myFile.read() - 48);}myFile.close(); } for(int i=0; i<56; i++){Alarm[i] = TempSD[i*2]*10 + TempSD[i*2+1];TempSD[i*2]=0;TempSD[i*2+1]=0;} }