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
-
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:
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.
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!
-
O teu código não cabe nos ~15KB que sobram? 15KB é bueéééééééééda espaço pá....
-
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...
-
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.
-
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):
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.. :-\
-
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.