DataLogger: использование библиотеки SD для Arduino для сохранения лога показаний датчиков на SD карте
Данный пример показывает, как использовать библиотеку SD для сохранения журнала данных с трех аналоговых датчиков на SD карту. Для более подробной информации о библиотеке SD перейдите по ссылке.
Необходимые комплектующие
- плата Arduino или Genuino;
- плата расширения Ethernet Shield (или любая другая плата со слотом SD);
- 3 потенциометра 10 кОм;
- перемычки;
- макетная плата;
- форматированная SD карта.
Схема
Плата Arduino или Genuino должна быть подключена к плате расширения Ethernet Shield. Три потенциометра могут быть заменены другими аналоговыми датчиками, согласно их способам подключения.
Код
Код, приведенный ниже, настроен для использования совместно с платой Ethernet Shield, которая имеет слот для SD карты. В функции setup()
вызываем SD.begin()
, назначая вывод 4 выводом CS. Этот вывод меняется в зависимости от исполнения платы расширения.
В loop()
создается String
для хранения информации с трех аналоговых датчиков. Код перебирает датчики, добавляя данные с них в строку.
Затем на SD карте открывается файл с помощью SD.open()
. После этого данные записываются на SD карту с помощью вызова dataFile.println()
. Для сохранения информации файл должен быть закрыт с помощью dataFile.close()
.
/*
SD card datalogger
Схема:
* аналоговые датчики на аналоговых выводах 0, 1 и 2
* SD подключена к шине SPI следующим образом:
** MOSI - вывод 11
** MISO - вывод 12
** CLK - вывод 13
** CS - вывод 4 (для MKRZero SD: SDCARD_SS_PIN)
*/
#include <SPI.h>
#include <SD.h>
const int chipSelect = 4;
void setup()
{
// Открыть последовательное соединение и ждать открытия порта:
Serial.begin(9600);
while (!Serial)
{
; // ждать подключения последовательного порта. Необходимо только для USB порта
}
Serial.print("Initializing SD card...");
// посмотреть, доступна ли SD карта, и может ли она быть инициализирована:
if (!SD.begin(chipSelect))
{
Serial.println("Card failed, or not present");
// больше ничего не делать:
while (1);
}
Serial.println("card initialized.");
}
void loop() {
// создать строку для сборки данных в лог:
String dataString = "";
// прочитать три датчика и добавить данные к строке:
for (int analogPin = 0; analogPin < 3; analogPin++)
{
int sensor = analogRead(analogPin);
dataString += String(sensor);
if (analogPin < 2)
{
dataString += ",";
}
}
// открыть файл. обратите внимание, что за раз может быть открыт только один файл,
// поэтому вы должны закрыть его перед открытием другого.
File dataFile = SD.open("datalog.txt", FILE_WRITE);
// если файл доступен, то записать в него:
if (dataFile)
{
dataFile.println(dataString);
dataFile.close();
// вывести строку и в последовательный порт:
Serial.println(dataString);
}
// если файл не открыт, вывести сообщение об ошибке:
else
{
Serial.println("error opening datalog.txt");
}
}