Estoy realizando un proyecto usando un Arduino UNO, un modulo RTC, una SD y un SIM800L.
Funcionamiento: el contador se activa por interrupcion y almacena los datos en una SD como la fecha, hora y numero de pulsaciones, la fecha y hora puede programarse mediante la SD en caso de estar desprogramado el rtc, luego los datos almacenados en la SD se envian a un servidor FTP en una hora fijada.
Trabaje en dos partes por una parte un codigo que almacena y hace todo perfecto y por otro un codigo que envia un archivo de la SD al servidor FTP y hace todo perfecto pero al unirlos tengo inconvenientes con la memoria sram, esta usando aproximadamente un 85% y me indica que habra posiblemente inestabilidad, me gustaria compartir el codigo y ver si es posible hacer alguna mejora dado que soy de nivel bajo en programacion e hice el codigo poco a poco con la ayuda de google. Queria usar el Arduino UNO porque es mas facil luego colocar el atmega328 en una placa aparte y usarlo con bateria para bajo consumo, de usar un MEGA 2560 el consumo de bateria seria elevado y no seria viable con dos paneles solares, compre tambien un STM32F103C8T6 pero aun desconozco como usarlo. Agradeceria si pudieran ayudarme indicandome si es posible hacer mejoras que eviten tanto consumo de memoria sram, Saludos.
Codigo para obtener y registrar datos en la sd:
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 rtc;
#include <SPI.h>
#include <SD.h>
int year;
int month;
int day;
int hour;
int minute;
int second;
int periodo=60;
int veces;
int min_registro[20],i;
volatile int sensor;
long T0=0;
File myFile;
void add0(byte numero) // imprime 2 dígitos
{
if (numero >= 0 && numero < 10)
{
myFile.print('0');
}
myFile.print(numero, DEC);
}
void alarma_registro () //Crea arreglo con los minutos para
// Registrar en la memoria
{
veces=60/periodo;
for(i=0;i<veces;i++)
{
min_registro[i]=periodo*i;
}
}
void interrupcion_sensor()
{
if ( millis() > T0 + 250)
{ sensor++ ;
T0 = millis();
}
}
void setup()
{
Serial.begin(9600);
pinMode(10, OUTPUT);
attachInterrupt( 0, interrupcion_sensor, FALLING);
rtc.begin();
if (!SD.begin(10)){
// Serial.println("Se ha producido un fallo al iniciar la comunicacion");
return;
}
// Serial.println("Se ha iniciado la comunicacion correctamente");
if (! rtc.isrunning())
{
File myFile = SD.open("cfgrtc.txt");
if (myFile) {
// Serial.println("abriendo cfgrtc.txt");
while (myFile.available()) {
year = myFile.parseInt();
month = myFile.parseInt();
day = myFile.parseInt();
hour = myFile.parseInt();
minute = myFile.parseInt();
second = myFile.parseInt();
myFile.close();
rtc.adjust(DateTime(year,month,day,hour,minute,second));
// Serial.println("datos cargados en el rtc ");
}
}
else {
// si no abre cfgrtc.txt
// Serial.println("error abriendo cfgrtc.txt");
}
}
File myFile = SD.open("periodo.txt");
if (myFile) {
// Serial.println("abriendo periodo.txt");
while (myFile.available()) {
periodo = myFile.parseInt();
myFile.close();
alarma_registro ();
}
}
else {
// si no abre el periodo.txt
// Serial.println("error abriendo periodo.txt");
}
}//FIN SETUP
void loop()
{
DateTime now = rtc.now(); // Obtiene la fecha y hora del RTC
for (i=0;i<veces;i++)
{
if((now.minute()==min_registro[i]) && (now.second()==0)) // comparar la hora del RTC con el ciclo de medicion
{
SD.begin(10); // se inicializa SD por si se retiro
delay(20);
myFile = SD.open("log.txt", FILE_WRITE);
if (myFile) // Si el archivo abre escribir la hora
{
myFile.print(now.day());
myFile.print('/');
myFile.print(now.month());
myFile.print('/');
myFile.print(now.year(), DEC);
myFile.print(' ');
myFile.print(' ');
myFile.print(now.hour());
myFile.print(':');
add0(now.minute());
myFile.print(':');
add0(now.second());
myFile.print(' ');
myFile.print(' ');
myFile.print(' ');
myFile.print(sensor);
myFile.println();
myFile.close(); // cerrar archivo log.txt
Serial.println("GUARDO DATOS EN SD");
sensor=0;
}
}
}
delay(1000);
} // FIN LOOP*/