Bom dia pessoal,
Mais uma vez venho pedir ajuda para essa comunidade que já me ajudou bastante em outras vezes.
É o seguinte, tenho um projeto utilizando uma placa de Arduino Mega com módulos SDCard e RTC, para que sejam salvos, a cada uma hora, em um cartão SDCard, as informações de um sensor ultrassônico de distância e de um sensor de temperatura.
Componentes de hardware:
Modulo HC-SR04
Sensor DHT11
Modulo RTC DS3231
Modulo SDCard
Arduino Mega 2560
A programação que estou usando está funcionando corretamente. Vejam mais abaixo.
A questão é que esse equipamento deverá ser utilizado em um local sem fornecimento de energia elétrica. O sensor de distância deverá medir o nível da superfície da água de um rio.
Então pensei e utilizar uma bateria como fonte de alimentação. Mas preciso que a bateria dure pelo menos uns 20 dias com o equipamento ligado constantemente e sem troca de bateria nesse período.
Tentei inicialmente com uma bateria 9V e ela forneceu a energia necessária para o equipamento funcionar por algumas horas apenas. Depois tentei com uma bateria de motocicleta (12v - 5Ah) e ela durou cerca de 2 dias. Ainda muito aquém do que eu preciso. Pensei em usar uma bateria de carro, mas o custo é alto e o tamanho é muito grande.
Assim, queria saber se vocês tem alguma ideia, se eu poderia fazer alguma coisa, tipo alteração na programação para poder reduzir o consumo de energia do equipamento.
Abaixo segue a programação (código) que desenvolvi utilizando outros códigos como referência. Em anexo tem uma foto do equipamento montado e o esquema de ligação do hardware.
Qualquer informação adicional ou dúvida, avisem.
// Componentes de Hardware: Módulo RTC DS3231, Modulo SD Card, Sensor de Temperatura e Umidade, Sensor Ultrassonico de Distancia
// Placa: ARDUINO MEGA 2560
// Modulo RTC DS3231 - ligado nas portas SDA e SCL (Portas digitais 20 e 21) do Arduino Mega
// Modulo SD Card - ligado nas portas digitais CS-4, MOSI-11, MISO-12, SCK-13
// Sensor de Temperatura e Umidade DHT 11- ligado a Porta Analogica A1 com resistor de pull-up
// Sensor Ultrassonico de Distancia HC-SR04 - TRIG ligado a Porta Digital 5 e ECO ligado a Porta Digital 6
// Inclui as bibliotecas do módulo RTC DS3231 e Time
#include <DS3231.h>
#include <Time.h>
#include <TimeLib.h>
// Inclui a biblioteca do módulo SD Card
#include <SdFat.h>
//Inclui a biblioteca do sensor ultrassonico
#include <Ultrasonic.h>
//Inclui a biblioteca do sensor de temperatura e umidade DHT 11
#include <DHT.h>
// Inicia o modulo RTC DS3231
DS3231 rtc(SDA, SCL);
// Inicia modulo SD Card e nomeia variavel SdFile como meuArquivo
SdFat sdCard;
SdFile meuArquivo;
// Pino digital 4 ligado ao CS do modulo SD Card
const int chipSelect = 4;
//Define os pinos para o trigger e echo do sensor ultrassonico de distancia
#define pino_trigger 5
#define pino_echo 6
//Inicializa o sensor ultrassonico nos pinos definidos acima
Ultrasonic ultrasonic(pino_trigger, pino_echo);
//Define o pino Analogico 1 para o sensor de temperatura e umid. DHT 11
#define DHTPIN A1
#define DHTTYPE DHT11 // DHT 11
DHT dht(DHTPIN, DHTTYPE);
// Declara variáveis para o loop de tempo
Time hora_atual_time;
unsigned long hora_atual;
unsigned long hora_cheia_atual;
unsigned long proxima_hora_cheia;
void setup()
{
// Configura Conexao Serial em 9600 Hz
Serial.begin(9600);
// Inicializa o objeto rtc
rtc.begin();
// As 3 linhas abaixo devem ser descomentadas para ajustar a data e hora
// Depois de carregar o programa, comentar as 3 linhas e carregar novamente o programa
// rtc.setDOW(FRIDAY); // Set Day-of-Week to SUNDAY
// rtc.setTime(20, 06, 30); // Set the time to 12:00:00 (24hr format)
// rtc.setDate(24, 3, 2017); // Set the date to January 1st, 2014
//Inicia o sensor de temperatura e umid. DHT 11
dht.begin();
// Inicializa o modulo SD Card
if(!sdCard.begin(chipSelect,SPI_HALF_SPEED))sdCard.initErrorHalt();
// Abre o arquivo LER_POT.TXT
if (!meuArquivo.open("ler_pot.txt", O_RDWR | O_CREAT | O_AT_END))
{
sdCard.errorHalt("Erro na abertura do arquivo LER_POT.TXT!");
}
// Envia para o Monitor Serial o título do projeto
Serial.println(" ");
Serial.println(" ");
Serial.print("Iniciado em : ");
// Envia para o Monitor Serial o Dia-da-Semana (Day-of-Week)
Serial.print(rtc.getDOWStr());
Serial.print(" ");
// Envia para o Monitor Serial a data (date)
Serial.print(rtc.getDateStr());
Serial.print(" -- ");
// Envia para o Monitor Serial a hora (time)
Serial.println(rtc.getTimeStr());
Serial.println(" ");
// Envia para o Arquivo TXT o título do projeto
meuArquivo.println(" ");
meuArquivo.println(" ");
meuArquivo.print("Iniciado em : ");
// Envia para o Monitor Serial o Dia-da-Semana (Day-of-Week)
meuArquivo.print(rtc.getDOWStr());
meuArquivo.print(" ");
// Envia para o Monitor Serial a data (date)
meuArquivo.print(rtc.getDateStr());
meuArquivo.print(" -- ");
// Envia para o Monitor Serial a hora (time)
meuArquivo.println(rtc.getTimeStr());
meuArquivo.println(" ");
//Fecha o arquivo TXT
meuArquivo.close();
//Le as informacoes do sensor ultrassonico, em cm para estabilizar o sensor
float cmMsecEstab;
long microsecEstab = ultrasonic.timing();
cmMsecEstab = ultrasonic.convert(microsecEstab, Ultrasonic::CM);
}
void loop()
{
//Define o delay para esperar o # de segundos ate a proxima hora cheia
hora_atual_time = rtc.getTime();
hora_atual = rtc.getUnixTime(hora_atual_time); //pega o tempo em segundos desde 1970 até a data/hora atual
hora_cheia_atual = hora_atual - hora_atual_time.min*60 - hora_atual_time.sec; //subtrai os minutos e segundos para se chegar até a hora cheia atual, tipo 11:00:00, 12:00:00, 13:00:00, etc (em segundos)
proxima_hora_cheia = hora_cheia_atual + 3600; //define que a proxima hora cheia será a hora cheia + 60 minutos
// Espera o # de segundos ate a proxima hora cheia
delay ((proxima_hora_cheia - hora_atual)*1000);// dorme o # de milisegundos necessários para chegar até a proxima hora cheia...
// Abre o arquivo TXT
meuArquivo.open("ler_pot.txt", O_RDWR | O_CREAT | O_AT_END);
//Le as informacoes do sensor ultrassonico, em cm
float cmMsec;
long microsec = ultrasonic.timing();
cmMsec = ultrasonic.convert(microsec, Ultrasonic::CM);
//Le as informacoes do sensor de temperatura e umid. DHT 11
float h = dht.readHumidity();
float t = dht.readTemperature();
// Envia para o Monitor Serial o Dia-da-Semana (Day-of-Week)
Serial.print(rtc.getDOWStr());
Serial.print(" ");
// Envia para o Monitor Serial a data (date)
Serial.print(rtc.getDateStr());
Serial.print(" -- ");
// Envia para o Monitor Serial a hora (time)
Serial.print(rtc.getTimeStr());
//Envia informacoes do sensor ultrassonico para o serial monitor
Serial.print(" Distancia em cm: ");
Serial.print(cmMsec);
//Envia informacoes do sensor de temperatura e umid. DHT 11 para o serial monitor
Serial.print(" --- Umidade: ");
Serial.print(h);
Serial.print(" %t");
Serial.print(" Temperatura: ");
Serial.print(t);
Serial.println(" *C");
// Envia para o Arquivo TXT o Dia-da-Semana (Day-of-Week)
meuArquivo.print(rtc.getDOWStr());
meuArquivo.print(" ");
// Envia para o Arquivo TXT a data (date)
meuArquivo.print(rtc.getDateStr());
meuArquivo.print(" -- ");
// Envia para o Arquivo TXT o hora (time)
meuArquivo.print(rtc.getTimeStr());
//Envia informacoes do sensor ultrassonico para o Arquivo TXT
meuArquivo.print(" Distancia em cm: ");
meuArquivo.print(cmMsec);
//Envia informacoes do sensor de temperatura e umid. DHT 11 para o serial monitor
meuArquivo.print(" ----- Umidade: ");
meuArquivo.print(h);
meuArquivo.print(" %t");
meuArquivo.print(" Temperatura: ");
meuArquivo.print(t);
meuArquivo.println(" *C");
//Fecha o arquivo TXT
meuArquivo.close();
// ;)
}
Abraços,
Ricardo
Projeto Esquema.pdf (953 KB)