Запись полученных данных на 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 кем мы хотим работать.
пишем
читаем