Запись полученных данных на sd

SineD13
Offline
Зарегистрирован: 03.01.2013

Доброго времени суток.

Что-то я совсем запутался в коде. Блуждаю средь 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 или пр.)

leshak
Offline
Зарегистрирован: 29.09.2011

>насколько я понимаю невозможна из-за использовании функции  прерывания 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 кем мы хотим работать.

 

 

Jacks_d
Offline
Зарегистрирован: 31.12.2011

пишем 

   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;} 
   }