Buongiorno a tutti,
Sto cercando di realizzare un lettore/contatore di impulsi per il contatore dell' ENEL. Per farlo sfrutto una fotoresistenza, un trigger 74hc14, conto il tutto con il contatore hardware di arduino e ogni tot tempo scrivo sulla sd card con lo shield apposito, l'ora, il numero di impulsi nell'intervallo di tempo e gli impulsi totali. Per testare il tutto utilizzo un'altro arduino che mi fa lampeggiare un led.
Il problema e' questo:
Fin tanto che conto semplicemente gli impulsi con il contatore ottengo una lettura precisa, mentre quando introduco lo stadio "logger" al momento della scrittura sulla sd card mi perdo diversi lampeggi sfalsandomi la lettura. Sono arrivato ad affermare che l'errore avviene nel momento della scrittura sulla SD perche un led che replica il lampeggi letti del contatore sull'arduino rilevatore al momento della scrittura sulla SD sembra inciampare perdendosi i lampeggi incriminati.
Qualcuno e' gia incorso in questo tipo di inconveniente?
di seguito posto il codice che ho assemblato scopiazzando parti qua e la
#include <SD.h>
#include <Wire.h>
#include "RTClib.h"
#define redLEDpin 2
#define greenLEDpin 3
uint32_t syncTime = 0; // time of last sync()
RTC_DS1307 RTC; // define the Real Time Clock object
const int chipSelect = 10; // for the data logging shield, we use digital pin 10 for the SD cs line
File logfile; // the logging file
void error(char *str)
{
Serial.print("error: ");
Serial.println(str);
digitalWrite(redLEDpin, HIGH); // red LED indicates error
while(1);
}
unsigned int count;
unsigned int getCount()
{
TCCR1B=0;
count=TCNT1;
TCNT1=0;
bitSet(TCCR1B ,CS12);
bitSet(TCCR1B ,CS11);
bitSet(TCCR1B ,CS10);
return count;
}
unsigned int getCountPrev;
unsigned int getCountTotal;
unsigned int getCountPartial;
void setup()
{
pinMode(redLEDpin, OUTPUT);
pinMode(greenLEDpin, OUTPUT);
Serial.begin(9600);
#if WAIT_TO_START
Serial.println("Type any character to start");
while (!Serial.available());
#endif //WAIT_TO_START
Serial.print("Initializing SD card..."); // initialize the SD card
pinMode(10, OUTPUT); // make sure that the default chip select pin is set to output, even if you don't use it:
if (!SD.begin(chipSelect))
{
error("Card failed, or not present"); // see if the card is present and can be initialized:
}
Serial.println("card initialized.");
// create a new file
char filename[] = "LOGGER00.CSV";
for (uint8_t i = 0; i < 100; i++) {
filename[6] = i/10 + '0';
filename[7] = i%10 + '0';
if (! SD.exists(filename)) {
// only open a new file if it doesn't exist
logfile = SD.open(filename, FILE_WRITE);
break; // leave the loop!
}
}
if (! logfile) {
error("couldnt create file");
}
Serial.print("Logging to: ");
Serial.println(filename);
// connect to RTC
Wire.begin();
if (!RTC.begin()) {
logfile.println("RTC failed");
#if ECHO_TO_SERIAL
Serial.println("RTC failed");
#endif //ECHO_TO_SERIAL
}
#if ECHO_TO_SERIAL
Serial.println("millis,stamp,datetime,light,temp,vcc");
#endif //ECHO_TO_SERIAL
digitalWrite(5, HIGH);
TCCR1A=0;
getCount();
}
void loop()
{
delay(15000);
DateTime now;
now = RTC.now();
// Serial.print(getCount());
// Serial.print(" ");
getCountTotal=getCount()+ getCountPrev;
// Serial.print(getCountTotal);
// Serial.print(" ");
// Serial.print(getCountPrev);
getCountPartial = getCountTotal - getCountPrev;
// Serial.print(" ");
// Serial.println(getCountPartial);
//// getCountPrev = getCountTotal;
//
logfile.print('"');
logfile.print(now.year(), DEC);
logfile.print("/");
logfile.print(now.month(), DEC);
logfile.print("/");
logfile.print(now.day(), DEC);
logfile.print(" ");
logfile.print(now.hour(), DEC);
logfile.print(":");
logfile.print(now.minute(), DEC);
logfile.print(":");
logfile.print(now.second(), DEC);
logfile.print('"');
logfile.print(" Pulses ");
logfile.print(getCountPartial);
logfile.print(" PulsesToT ");
logfile.print(getCountTotal);
logfile.println();
////
Serial.print('"');
Serial.print(now.year(), DEC);
Serial.print("/");
Serial.print(now.month(), DEC);
Serial.print("/");
Serial.print(now.day(), DEC);
Serial.print(" ");
Serial.print(now.hour(), DEC);
Serial.print(":");
Serial.print(now.minute(), DEC);
Serial.print(":");
Serial.print(now.second(), DEC);
Serial.print('"');
Serial.print(" Pulses ");
Serial.print(getCountPartial);
Serial.print(" PulsesToT ");
Serial.print(getCountTotal);
Serial.println();
getCountPrev = getCountTotal;
}