Indice
Descrizione
Quando usi un qualsiasi sensore con Arduino, puoi memorizzare tutti i dati rilevati in modo permanente. Questo ti dà la possibilità di elaborarli e visualizzarli in un secondo momento.
Un dispositivo in grado di farlo si chiama data logger e seguendo questo video scoprirai come costruirne uno sulla breadboard.
Tra gli esempi vedrai come salvare la luminosità rilevata tramite una fotoresistenza. Le informazioni le puoi memorizzare sulla scheda microSD, abbinando ad ogni valore la data e l’ora, recuperati con un modulo RTC.
Inoltre scoprirai come ottimizzare tutto, integrando la gestione degli interrupt e della sleep mode, in modo da risvegliare Arduino solo quando serve effettuare una misurazione.
#include <SD.h>
#include <RTClib.h>
#define SD_PIN 10
#define LED_PIN 9
#define SWITCH_PIN 3
#define SENSOR_PIN A1
#define FILE_NAME "datalog.csv"
File file;
RTC_DS3231 rtc;
void setup() {
pinMode(SWITCH_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
while (!SD.begin(SD_PIN));
rtc.begin();
if (rtc.lostPower()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
}
void loop() {
int enable = digitalRead(SWITCH_PIN);
if (!enable) {
return;
}
DateTime now = rtc.now();
char dateBuffer[] = "DD/MM/YYYY hh:mm:ss";
log(now.toString(dateBuffer), analogRead(SENSOR_PIN));
delay(500);
}
void log(String data, int value) {
file = SD.open(FILE_NAME, FILE_WRITE);
if (!file) {
if (SD.begin(SD_PIN)) {
file = SD.open(FILE_NAME, FILE_WRITE);
}
}
if (file) {
digitalWrite(LED_PIN, HIGH);
file.println(data + "," + String(value));
file.close();
digitalWrite(LED_PIN, LOW);
}
}
#include <SD.h>
#include <RTClib.h>
#include <avr/sleep.h>
#define SD_PIN 10
#define LED_PIN 9
#define SWITCH_PIN 3
#define RTC_WAKEUP_PIN 2
#define SENSOR_PIN A1
#define FILE_NAME "datalog.csv"
File file;
RTC_DS3231 rtc;
void setup() {
pinMode(SWITCH_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
pinMode(RTC_WAKEUP_PIN, INPUT_PULLUP);
while (!SD.begin(SD_PIN));
rtc.begin();
if (rtc.lostPower()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
rtc.disableAlarm(1);
rtc.disableAlarm(2);
rtc.clearAlarm(1);
rtc.clearAlarm(2);
rtc.writeSqwPinMode(DS3231_OFF);
}
void loop() {
int enable = digitalRead(SWITCH_PIN);
if (!enable) {
sleep(SWITCH_PIN, RISING);
}
DateTime now = rtc.now();
char dateBuffer[] = "DD/MM/YYYY hh:mm:ss";
log(now.toString(dateBuffer), analogRead(SENSOR_PIN));
rtc.setAlarm1(rtc.now() + TimeSpan(2), DS3231_A1_Second);
sleep(RTC_WAKEUP_PIN, FALLING);
rtc.clearAlarm(1);
}
void log(String data, int value) {
file = SD.open(FILE_NAME, FILE_WRITE);
if (!file) {
if (SD.begin(SD_PIN)) {
file = SD.open(FILE_NAME, FILE_WRITE);
}
}
if (file) {
digitalWrite(LED_PIN, HIGH);
file.println(data + "," + String(value));
file.close();
digitalWrite(LED_PIN, LOW);
}
}
void sleep(int pin, int type) {
sleep_enable();
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
attachInterrupt(digitalPinToInterrupt(pin), callback, type);
delay(200);
sleep_cpu();
detachInterrupt(digitalPinToInterrupt(pin));
sleep_disable();
}
void callback() {
}