LusoRobótica - Robótica em Português

Sistemas específicos => Arduino / AVR => Tópico iniciado por: almamater em 02 de Dezembro de 2020, 19:25

Título: Biblioteca SDCard
Enviado por: almamater em 02 de Dezembro de 2020, 19:25
Bem, ia hoje iniciar o código de uma brincadeira que estou a fazer e há sempre contratempos claro.

Basicamente queria usar um Atmega328 a controlar algumas coisas e a receber dados de:

- Sensor Humidade
- Sensor Temperatura
- RTC

Nada de especial. O grande objectivo é controlar um módulo DFPlayer Mini MP3 player, e isso está ok, tudo o resto é um extra mas que gostava de implementar juntamente com isto:

Fazer um LOG num cartão miniSD com a info diária dos sensores acima.. a ideia era esta até perceber que.. as bibliotecas usadas para controlar o SDCard ocupam a memória quase toda (vá..uma grande parte) que tenho disponícel dos 32Kb  ::)

Andei a ver e não há muita forma de dar a volta, há duas bilbiotecas mais pequenas mas usam praticamente a mesma coisa.

Para terem uma ideia, apenas importei as bibliotecas necessárias ao projecto e o resultado foi:

Código: [Seleccione]
Sketch uses 17858 bytes (55%) of program storage space. Maximum is 32256 bytes.
Global variables use 1344 bytes (65%) of dynamic memory, leaving 704 bytes for local variables. Maximum is 2048 bytes.
Código: [Seleccione]
O código é apenas isto:

#include <Arduino.h>
#include "RTClib.h"
#include <OneWire.h>
#include <DallasTemperature.h>
#include <SPI.h> //SD Card
#include <SD.h>  //SD Card

// Data wire is plugged into pin 2 on the Arduino
#define ONE_WIRE_BUS 2
// Setup a oneWire instance to communicate with any OneWire devices
// (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

//RTC CLOCK:
RTC_DS1307 rtc;
char daysOfTheWeek[7][12] = { "Domingo", "Segunda", "Terca", "Quarta", "Quinta", "Sexta", "Sabado" };

int Valor_LDR = A0;      //LDR
int moisture_pin = A1;  //Moisture Sensor
int moisture_output;    //Moisture Sensor
int moistureMin=170;
int moistureMax = 550;

//SDCard:
File myFile;

void setup() {

  Serial.begin(9600);
  while (!Serial) {
  }
 
  //SDCARD
  Serial.print("Initializing SD card...");
  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    while (1);
  }
  Serial.println("initialization done.");

  //Ver se os ficheiros estão criados e cria-os se necessário
  if (SD.exists("example.txt")) {
    Serial.println("example.txt exists.");
  }
  else {
    Serial.println("example.txt doesn't exist.");
    Serial.println("Creating example.txt...");
    myFile = SD.open("example.txt", FILE_WRITE);
    myFile.close();
  }

  //Temperatura
  sensors.begin();
  sensors.requestTemperatures(); // Send the command to get temperatures
  Serial.print("Temperatura Atual: ");
  Serial.print(sensors.getTempCByIndex(0));
  Serial.println("");
 
  //RTC ****************
  Serial.println("");
  if(!rtc.begin()) {
    Serial.println("Couldn't find RTC");
    Serial.flush();
    abort();
  }
  if (!rtc.isrunning()) {
    Serial.println("RTC is NOT running, let's set the time!");
    // When time needs to be set on a new device, or after a power loss, the
    // following line sets the RTC to the date & time this sketch was compiled
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    // This line sets the RTC with an explicit date & time, for example to set
    // January 21, 2014 at 3am you would call:
    // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
  }
}

void loop() {
}

Ou seja, as bibliotecas ocupam isso tudo mas principalmente a do cartão SD.. raios! Como costumam fazer? Usam 2 micros? Um apenas para LOG e outro para o resto?

Na verdade não queria fazer isso porque não é muito importante fazer o LOG, era mais para ver a diferença diária, analisar os dados se necessário e registar alguma anomalia.

Sei que devem haver outras alternativas (Arduinos Megas, Raspberry Pi, etc.), mas é que este 328 era o ideal.. até agora!
Título: Re: Biblioteca SDCard
Enviado por: Njay em 02 de Dezembro de 2020, 20:55
O teu código não cabe nos ~15KB que sobram? 15KB é bueéééééééééda espaço pá....
Título: Re: Biblioteca SDCard
Enviado por: jm_araujo em 02 de Dezembro de 2020, 21:02
Mais um caso de otimização prematura.
Enquanto não der erro de falta de espaço podes continuar a adicionar código ao teu programa. Quando isso acontecer, depois exploras as alternativas.

Biblioteca para SD nunca vai ser pequena. A interface elétrica é relativamente simples de usar, o difícil é lidar com  o sistema de ficheiros, e FAT nem é dos mais complicados...

Título: Re: Biblioteca SDCard
Enviado por: dio123 em 02 de Dezembro de 2020, 21:14
Eu também quanto fiz uns testes com stm32f103 para usar um micro sd  para log, e o melhor que consegui em lib, o resultado foi.
Criar um  ficheiro txt, escrever uma ola mundo, fechar e voltar a ler o texto que foi escrito, ocupou 22.44kb deu-me logo 35% ocupado. e tenho 64k.
Depois acabei por desistir.
Título: Re: Biblioteca SDCard
Enviado por: almamater em 03 de Dezembro de 2020, 22:11
O teu código não cabe nos ~15KB que sobram? 15KB é bueéééééééééda espaço pá....

 ;D sem SDCard estava nos 31% e com a biblioteca passou para os 60% de espaço ocupado e com a msg de alerta (relativamente à memória disponível):

Código: [Seleccione]
Sketch uses 19442 bytes (60%) of program storage space. Maximum is 32256 bytes.
Global variables use 1670 bytes (81%) of dynamic memory, leaving 378 bytes for local variables. Maximum is 2048 bytes.
Low memory available, stability problems may occur.

Na realidade o código até deve caber nos 15Kb que faltam sim..
 

Mais um caso de otimização prematura.
Enquanto não der erro de falta de espaço podes continuar a adicionar código ao teu programa. Quando isso acontecer, depois exploras as alternativas.

Biblioteca para SD nunca vai ser pequena. A interface elétrica é relativamente simples de usar, o difícil é lidar com  o sistema de ficheiros, e FAT nem é dos mais complicados...

Pois, vou adicionar tudo sem usar o SD e no fim logo vejo se vai dar ou não para adicionar.

Eu também quanto fiz uns testes com stm32f103 para usar um micro sd  para log, e o melhor que consegui em lib, o resultado foi.
Criar um  ficheiro txt, escrever uma ola mundo, fechar e voltar a ler o texto que foi escrito, ocupou 22.44kb deu-me logo 35% ocupado. e tenho 64k.
Depois acabei por desistir.

Pois eu também me assustei logo quando vi que ocupava isto tudo..  :-\
Título: Re: Biblioteca SDCard
Enviado por: Njay em 04 de Dezembro de 2020, 00:03
Eu tenho um projecto já antigo de uma espécie de datalogger digital que loga 8 entradas digitais para um SD card... na verdade, um MMC, mas acho que o standard do SD card suporta o modo MMC (posso estar enganado)... uso um ATtiny26, que tem 2KB de memória de programa (1024 instruções) e 128 bytes de RAM. Com uns truques e limitações a coisa faz-se.