Исходный код
/*
SD card datalogger
подключения:
* терморезисторы на входах 0 - 3
* SD сидит на SPI:
** MOSI - pin 11
** MISO - pin 12
** CLK - pin 13
** CS - pin 4
*/
#include <SPI.h>
#include <SD.h>
#include "LedControl.h"
#include "math.h"
LedControl lc=LedControl(9,8,7,2);
unsigned long previousMillis = 0; //тут будем хранить предыдущее время с момента включения
boolean sec=false;
const int chipSelect = 4;
const long interval = 1000; //интервал между отсчетами в мс
void setup()
{
// открытие канала связи UART
Serial.begin(9600);
/*включение и очистка индикаторов
The MAX72XX is in power-saving mode on startup,
we have to do a wakeup call
*/
lc.shutdown(0,false);
lc.shutdown(1,false);
/* Set the brightness to a medium values */
lc.setIntensity(0,8);
lc.setIntensity(1,8);
/* and clear the display */
lc.clearDisplay(0);
lc.clearDisplay(1);
while (!Serial) {
; // для экзотики - ждем отклика последовательного канала
}
Serial.print("Initializing SD card...");
// проверяем доступность SD
if (!SD.begin(chipSelect)) {
Serial.println("Card failed, or not present");
return;
}
Serial.println("card initialized.");
// откроем файл на запись
File dataFile = SD.open("datalog.txt", FILE_WRITE);
// если файл доступен - пишем в него шапку
if (dataFile) {
dataFile.println("time (s),ADC0,ADC1,ADC2,ADC3");
dataFile.close();
// в последовательный порт тоже закинем шапку
}
Serial.println("time (s),ADC0,ADC1,ADC2,ADC3");
}
//**********вывод номера датчика и его температуры на индикатор
void printNumber(int v, int ind, int pos, boolean sec) {
int ones;
int tens;
int hundreds;
boolean negative = false;
if (v < -99 || v > 999) return;
if (v < 0) {
negative = true;
v=v*-1;
}
ones=v%10;
v=v/10;
tens=v%10;
v=v/10;
hundreds=v;
lc.setChar(ind,pos*4+3,(byte)(ind*2+1-pos),sec);
if (negative == true) {
lc.setChar(ind,pos*4+2,'-',false);
}
else {
lc.setChar(ind,pos*4+2,' ',false);
}
//пишем '-' в крайний левый знак
//пишем число
if(hundreds==0) {
lc.setDigit(ind,pos*4+2,' ',false);
if(tens==0) {
lc.setDigit(ind,pos*4+1,' ',false);
}
else {
lc.setDigit(ind,pos*4+1,(byte)tens,false);
}
}
else {
lc.setDigit(ind,pos*4+2,(byte)hundreds,false);
lc.setDigit(ind,pos*4+1,(byte)tens,false);
}
lc.setDigit(ind,pos*4+0,(byte)ones,true);
}
//********** пересчет оцифрованного значения в градусы Цельсия
double Thermister(int RawADC) {
double Temp;
Temp = log((5222400/RawADC)-5100);
Temp = ((1+(0.006*Temp*Temp))*Temp)*10.2-102.5;
return Temp;
}
void loop()
{
//проверим, прошла ли секунда с прошлого раза
unsigned long currentMillis = millis();
if((currentMillis - previousMillis >= interval/2) && sec==true) {
lc.setDigit(0,7,0,false);
lc.setDigit(0,3,1,false);
lc.setDigit(1,7,2,false);
lc.setDigit(1,3,3,false);
sec=false;
}
if(currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
sec=true;
// обработаем аналоговые входы и запишем результаты с меткой времени
String dataString = ""; //строка для записи на карту памяти
String dataString1 = "°C: "; //строка с температурами в градусах Цельсия
// начать строку с метки времени от момента включения в мс
dataString += int(millis()/1000);
dataString += ",";
// считаем четыре датчика и запишем в строку и на индикатор
for (int analogPin = 0; analogPin < 4; analogPin++) {
int sensor = analogRead(analogPin);
dataString += String(sensor);
if (sensor<32) sensor=32;
if (sensor>1011) sensor=1011;
int dannye=int(Thermister(sensor));
dataString1 += String(dannye)+",";
printNumber(dannye,int(analogPin/2),(int(analogPin*3+1)%2),sec);
if (analogPin < 3) {
dataString += ",";
}
}
// откроем файл на запись. может быть открыт только один файл,
// поэтому перед открытием другого, текущий должен быть закрыт.
File dataFile = SD.open("datalog.txt", FILE_WRITE);
// если файл доступен, пишем в него:
if (dataFile) {
dataFile.println(dataString);
dataFile.close();
}
// если файл не открывается, отправим в UART сообщение об ошибке:
else {
Serial.println("error opening datalog.txt");
}
// отправим строку и в UART:
Serial.println(dataString);
Serial.println(dataString1);
}
}