collapse

* Posts Recentes

Nevadent - Não carrega por almamater
[22 de Novembro de 2024, 21:36]


Classmate Leap T304 não liga por almamater
[19 de Novembro de 2024, 07:13]


+ LASERs por dropes
[18 de Novembro de 2024, 21:50]


Dúvida com fonte de alimentação comutada por filjoa
[28 de Outubro de 2024, 21:57]


Motoserra Stihl 120C por dropes
[26 de Outubro de 2024, 19:01]


Shelly em jeito de watchdog por SerraCabo
[24 de Outubro de 2024, 19:24]


Meu novo robô por josecarlos
[06 de Outubro de 2024, 13:33]


Sirene NOVA maluca por dropes
[01 de Outubro de 2024, 18:26]


Transmissão de energia sem fios por dropes
[21 de Setembro de 2024, 16:50]


Spot Welder - O que acham? por jm_araujo
[20 de Setembro de 2024, 09:34]

Autor Tópico: Biblioteca SDCard  (Lida 5250 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline almamater

  • Mini Robot
  • *
  • Mensagens: 1.944
    • GrcByte - Projectos
Biblioteca SDCard
« 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!
« Última modificação: 02 de Dezembro de 2020, 19:27 por almamater »

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.598
    • Tróniquices
Re: Biblioteca SDCard
« Responder #1 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á....

Offline jm_araujo

  • Mini Robot
  • *
  • Mensagens: 2.979
  • NERD!
Re: Biblioteca SDCard
« Responder #2 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...


Offline dio123

  • Mini Robot
  • *
  • Mensagens: 1.034
Re: Biblioteca SDCard
« Responder #3 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.

Offline almamater

  • Mini Robot
  • *
  • Mensagens: 1.944
    • GrcByte - Projectos
Re: Biblioteca SDCard
« Responder #4 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..  :-\

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.598
    • Tróniquices
Re: Biblioteca SDCard
« Responder #5 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.