0 голосов

Собрал устройство для записи параметров организма человека.

Состав прибора:

  1. Iskra nano
  2. Датчик пульса
  3. Кожно-гальванический датчик
  4. Акселерометр
  5. Часы точного времени
  6. Плата питания
  7. Картридер SD

Т.к. не имею базовых знаний в программировании собрал скетч, все подключаемые модули работают, но у меня не получается записывать логи с датчиков на SD. Помогите дописать скетч, желательно, чтобы лог с каждого датчика записывался в отдельный файл на SD.

Мой скетч:

// Watch video here: https://www.youtube.com/watch?v=O5Ye5xJF44c

/*
  GSR connection pins to Arduino microcontroller

  Arduino           GSR

  GND               GND
  5V                VCC
  A2                SIG

  D13             RED LED

*/

/*
  GSR, standing for galvanic skin response, is a method of
  measuring the electrical conductance of the skin. Strong
  emotion can cause stimulus to your sympathetic nervous
  system, resulting more sweat being secreted by the sweat
  glands. Grove – GSR allows you to spot such strong emotions
  by simple attaching two electrodes to two fingers on one hand,
  an interesting gear to create emotion related projects, like
  sleep quality monitor. http://www.seeedstudio.com/wiki/Grove_-_GSR_Sensor
*/



// библиотека для работы I²C
#include <Wire.h>
// библиотека для работы с модулями IMU
#include <TroykaIMU.h>
// пульс
#include <iarduino_SensorPulse.h>
// библиотека для работы с часами реального времени
#include "TroykaRTC.h"
#include <SPI.h>
#include <SD.h>
// размер массива для времени
#define LEN_TIME 12
// размер массива для даты
#define LEN_DATE 12
// размер массива для дня недели
#define LEN_DOW 12



#define SD_CS_PIN  10
#define LEVEL_LOW   (0)
#define CH0_OFFSET  (25)

// данные модулей для записи
String dataString = "";

// создаём объект для работы с часами реального времени
RTC clock;

// массив для хранения текущего времени
char time[LEN_TIME];
// массив для хранения текущей даты
char date[LEN_DATE];
// массив для хранения текущего дня недели
char weekDay[LEN_DOW];

char buffer[100] = {0};
static int ch0_data = LEVEL_LOW;


// подключение к контакту A0
iarduino_SensorPulse Pulse(A3);



// создаём объект для работы с акселерометром
Accelerometer accel;

const int LED = 13;
const int GSR = A2;
int threshold = 0;
int sensorValue;
//пульс
int PulseSensorPurplePin = 3; // выход Ардуино А3
int LED13 = 13; // светодиод на плате
int Signal;
int Threshold = 550; // значение для данных сенсора, после которого подаётся сигнал

void setup() {
  {
    long sum = 0;
    Serial.begin(9600);
    pinMode(LED, OUTPUT);
    digitalWrite(LED, LOW);
    delay(1000);

    for (int i = 0; i < 500; i++)
    {
      sensorValue = analogRead(GSR);
      sum += sensorValue;
      delay(5);
    }
    threshold = sum / 500;
    Serial.print("threshold =");
    Serial.println(threshold);
  }
  {

    // открываем последовательный порт
    Serial.begin(115200);
    // выводим сообщение о начале инициализации
    Serial.println("Accelerometer init...");
    // инициализация акселерометра
    accel.begin();
    // устанавливаем чувствительность акселерометра
    // 2g — по умолчанию, 4g, 8g
    accel.setRange(RANGE_2G);
    // выводим сообщение об удачной инициализации
    Serial.println("Initialization completed");
  }
  // пульс
  {
    // запуск последовательного порта
    Serial.begin(9600);
    // запуск датчика пульса
    Pulse.begin();
  }
  {
    // открываем последовательный порт
    Serial.begin(9600);
    // инициализация часов
    clock.begin();
    // метод установки времени и даты в модуль вручную
    // clock.set(10,25,45,27,07,2005,THURSDAY);
    // метод установки времени и даты автоматически при компиляции
    clock.set(__TIMESTAMP__);
    // что бы время менялось при прошивки или сбросе питания
    // закоментируйте оба метода clock.set();
  }
  //sd
  {
    // открываем последовательный порт для мониторинга действий в программе
    Serial.begin(9600);

    // выводим сообщение в Serial-порт о поиске карты памяти
    Serial.println("Initializing SD card...");
    // если microSD-карта не была обнаружена
    if (!SD.begin(SD_CS_PIN)) {
      // выводим сообщение об ошибке
      Serial.println("Card failed, or not present");
      // don't do anything more:
      return;
    } else {
      Serial.println("Card initialized.");
    }
  }
}

void loop() {{
  int temp;
  sensorValue = analogRead(GSR);
  Serial.print("sensorValue=");
  Serial.println(sensorValue);
  temp = threshold - sensorValue;

}

{
  // вывод направления и величины ускорения в м/с² по оси X
  Serial.print(accel.readAX());
  Serial.print("\t\t");
  // вывод направления и величины ускорения в м/с² по оси Y
  Serial.print(accel.readAY());
  Serial.print("\t\t");
  // вывод направления и величины ускорения в м/с² по оси Z
  Serial.print(accel.readAZ());
  Serial.print("\t\t");
  Serial.println("");
  delay(1000);
  /*
    // вывод направления и величины ускорения в м/с² по X, Y и Z
    float x, y, z;
    accel.readAXYZ(&x, &y, &z);
    Serial.print(x);
    Serial.print("\t\t");
    Serial.print(y);
    Serial.print("\t\t");
    Serial.print(z);
    Serial.println("");
    delay(100);
  */
}
// пульс
{
  // если датчик подключен к пальцу
  if (Pulse.check(ISP_VALID) == ISP_CONNECTED) {
    // печать аналогового сигнала
    Serial.print(Pulse.check(ISP_ANALOG));
    Serial.print("  ");
    // печать значения пульса
    Serial.print(Pulse.check(ISP_PULSE));
    Serial.println();
  }
  else
    Serial.println("error");

}
{
  // запрашиваем данные с часов
  clock.read();
  // сохраняем текущее время, дату и день недели в переменные
  clock.getTimeStamp(time, date, weekDay);
  // выводим в serial порт текущее время, дату и день недели
  Serial.print(time);
  Serial.print("\t");
  Serial.print(date);
  Serial.print("\t");
  Serial.println(weekDay);
  // ждём одну секунду
  delay(1000);
}
//сд
}
void saveSD() {
  // создаём файл для записи
  File dataFile = SD.open("datalog.txt", FILE_WRITE);
  // если файл доступен для записи
  if (dataFile) {
    // сохраняем данные
    dataFile.println(dataString);
    Serial.print(dataString);
    // закрываем файл
    dataFile.close();
    // выводим сообщение об удачной записи
    Serial.println("Save OK");
  } else {
    // если файл не доступен
    Serial.println("Error opening datalog.txt");
  }
}

(5 баллов) 1 4

1 Ответ

+4 голосов
 
Лучший ответ

Сейчас у Вас вообще ничего не пишется на флешку.

Можно сделать функцию для записи на флешку:

/*
 * fileName — имя файла для записи
 * data — строка для записи
 */
void saveSD(String fileName, String data)
{
  File dataFile = SD.open(fileName, FILE_WRITE);

  if (dataFile)
  {
    dataFile.println(data);
    dataFile.close();
  } 
  else
  {
    Serial.println("Error opening " + fileName);
  }
}

Затем, создать функции для записи данных с каждого датчика, например, для температуры и пульса будет так:

/*
 * data — данные с датчика
 */
void saveTemperature(String data)
{
  saveSD("temperatureLog.txt", data);
}

/*
 * data — данные с датчика
 */
void savePulse(String data)
{
  saveSD("pulseLog.txt", data);
}

На подобии к этому можно создать функции для записи данных с других датчиков — меняется только название функции и имя файла для записи.

Затем в нужном месте в коде можно просто вызвать нужную функцию и записать данные, например:

if (Pulse.check(ISP_VALID) == ISP_CONNECTED)
{
  savePulse(Pulse.check(ISP_PULSE));
}
else
{
  // code
}

(1.6 тыс. баллов) 2 9 33
выбран
Добро пожаловать на Бредборд! Сайт вопросов и ответов на тему Arduino, Raspberry Pi и хоббийной электроники в целом. Цель Бредборда — быть максимально полезным. Поэтому мы строго следим за соблюдением правил, боремся с холиворами и оффтопиком.
  1. Aromik

    73 балл(ов)

  2. Un_ka

    54 балл(ов)

  3. parovoZZ

    12 балл(ов)

  4. sser

    6 балл(ов)

  5. Тёмик

    5 балл(ов)

  6. NesteruS

    5 балл(ов)

Награды месяца
1-е место: OLED-дисплей (Troyka-модуль)
2-е место: Графический экран 128×64
3-е место: Текстовый дисплей 16×2 (Troyka-модуль)

...