Código Fonte do Sistema de Aquisição dos Dados

nov 18 2016

O código abaixo foi desenvolvido pelo estudante de ensino fundamental do Colégio Pedro II -João de Felipe Andrade. Todos os créditos pelo seu desenvolvimento são exclusivamente do mesmo.

//Bibliotecas necessárias
#include //Sensor de temperatura e umidade (DHT11)
#include //Cartão SD
#include //Cartão SD
#include //Resistor dependente de luz
#include “RTClib.h” //Módulo de relógio (RTC_DS1307)

//Pinos
#define ldrPin A0 //Pino do resistor dependente de luz (Light Depending Resistor)
#define dhtPin 7 //Pino de dados do sensor de temperatura e umidade (DHT11)
#define ledOkPin 9 //Pino da parte verde do LED tricolor (Ok)
#define ledErrPin 8 //Pino da parte vermelha do LED tricolor (Erro)
#define ledDataPin 6 //Pino da parte azul do LED tricolor (Dado salvo no cartão SD)

//Constantes
#define timeout 10 //Tempo em minutos do intervalo entre as medições.

//Variáveis
int luminosity; //Variável que armazena a luminosidade.
int temperature; //Variável que armazena a temperatura.
int humidity; //Variável que armazena a umidade.

//Objetos
DHT dht(dhtPin, DHT11); //Usa a biblioteca DHT para usar o pino definido no início do arquivo para comunicação com o sensor de temperatura e umidade.
RTC_DS1307 rtc; //Usa a biblioteca RTClib para iniciar o módulo de relógio.
File dados; //Define o objeto do arquivo a ser salvo no cartão SD.

//Funcão de setup
//Essa função é executada uma vez, assim que é fornecida energia para o Arduino.

void setup() {
//Inicia o monitor serial USB a uma taxa de 9600 bits por segundo, que é usado como debug nesse caso.
Serial.begin(9600);
//Inicia o sensor de temperatura e umidade.
dht.begin();
//Inicia os pinos do led e do cartão SD como pinos de saída de dados.
pinMode(ledOkPin, OUTPUT);
pinMode(ledErrPin, OUTPUT);
pinMode(ledDataPin, OUTPUT);
pinMode(10, OUTPUT);

//Escreve no serial USB “Iniciando módulo de relógio…”
Serial.print(“Iniciando m”);
Serial.print(char(243));
Serial.print(“dulo de rel”);
Serial.print(char(243));
Serial.print(“gio… “);

//Se o módulo de relógio não puder ser iniciado, escreve “Falha!”, pisca o LED tricolor em vermelho e “trava” o código, fazendo com que a execução não continue.
if (!rtc.begin()) {
Serial.println(“Falha!”);
digitalWrite(ledErrPin, HIGH);
delay(1000);
digitalWrite(ledErrPin, LOW);
while (1);
}
//Caso contrário, escreve “Ok” e pisca o LED tricolor em verde.
else {
Serial.println(“Ok!”);
digitalWrite(ledOkPin, HIGH);
delay(1000);
digitalWrite(ledOkPin, LOW);
}
//Se o módulo de relógio não tiver as horas definidas, o Arduino escreve “Ajustando data e hora…” e ajusta a hora e data para a data/hora em que o código foi compilado e enviado para o Arduino
if (! rtc.isrunning()) {
Serial.println(“Ajustando data e hora…”);
rtc.adjust(DateTime(F(DATE), F(TIME)));
}
//Escreve “Iniciando cartão SD…” no serial USB.
Serial.print(“Iniciando cart”);
Serial.print(char(227));
Serial.print(“o SD… “);
//Se o cartão SD não puder ser iniciado, escreve “Falha!”, pisca o LED tricolor em vermelho e “trava” o código, fazendo com que a execução não continue.
if (!SD.begin(4)) {
Serial.println(“Falha!”);
digitalWrite(ledErrPin, HIGH);
delay(1000);
digitalWrite(ledErrPin, LOW);
return;
}
//Caso contrário, escreve “Ok” e pisca o LED tricolor em verde.
else {
Serial.println(“OK.”);
digitalWrite(ledOkPin, HIGH);
delay(1000);
digitalWrite(ledOkPin, LOW);
}
}

//Função de loop
//Depois da função setup ser executada, a função loop é executada até a energia ser removida do Arduino.

void loop() {
//Lê a quantidade de energia que está voltando para o Arduino depois de passar pelo resistor dependente de luz. Se estiver claro, a resistência é menor, portanto mais energia volta. Se estiver escuro, a resistência é maior, portanto menos energia volta.
int luminosity = analogRead(ldrPin);
//Lê a temperatura.
int temperature = dht.readTemperature();
//Lê a umidade.
int humidity = dht.readHumidity();
//Lê a data e hora.
DateTime now = rtc.now();
//Escreve no serial USB a data, hora, luminosidade, temperatura, e umidade relativa do ar.
Serial.println(“———-“);
Serial.print(“Data: “);
Serial.print(now.day(), DEC);
Serial.print(“/”);
Serial.print(now.month(), DEC);
Serial.print(“/”);
Serial.print(now.year(), DEC);
Serial.print(“, Hora: “);
Serial.print(now.hour(), DEC);
Serial.print(‘:’);
Serial.print(now.minute(), DEC);
Serial.print(‘:’);
Serial.println(now.second(), DEC);
Serial.print(“Luminosidade: “);
Serial.print(luminosity);
Serial.print(“, Temperatura: “);
Serial.print(temperature);
Serial.print(char(186));
Serial.print(” C”);
Serial.print(“, Umidade: “);
Serial.print(humidity);
Serial.println(“%”);
//Abre o arquivo “dados.csv” no cartão SD.
dados = SD.open(“dados.csv”, FILE_WRITE);
//Se for aberto com sucesso, escreve nele a data, hora, luminosidade, temperatura, e umidade relativa do ar. Após isso, pisca o LED tricolor em azul e salvar o arquivo. Salvar o arquivo a cada medida evita perda de dados se o Arduino for desligado.
if (dados) {
dados.print(now.day(), DEC);
dados.print(“,”);
dados.print(now.month(), DEC);
dados.print(“,”);
dados.print(now.year(), DEC);
dados.print(“,”);
dados.print(now.hour(), DEC);
dados.print(“,”);
dados.print(now.minute(), DEC);
dados.print(“,”);
dados.print(now.second(), DEC);
dados.print(“,”);
dados.print(luminosity);
dados.print(“,”);
dados.print(temperature);
dados.print(“,”);
dados.println(humidity);
dados.close();
Serial.println(“Dado salvo.”);
digitalWrite(ledDataPin, HIGH);
delay(1000);
digitalWrite(ledDataPin, LOW);
}
//Caso contrário, escreve no serial USB “O dado não foi salvo”.
else {
Serial.print(“O dado n”);
Serial.print(char(227));
Serial.println(“o foi salvo.”);
}
//Espera o número de minutos * 60 segundos * 1000 milissegundos. Essa função só funciona com milissegundos.
delay(timeout * 60000);
}
//Repete tudo de novo.

No responses yet

ICJ-2016 Atualização #5

set 08 2016

De volta! O sistema continua medindo, sem problemas. Hoje limpei o arquivo de dados. O pessoal da Biologia fará um novo cultivo, e vai arrancar as plantas hoje. Sendo assim, o adequado é começar as medidas do zero, já que esse será um outro desenvolvimento de plantas. Aprimorei os gráficos. Agora, os horários têm uma escala de dia em dia. Segue a versão final deles, e as últimas fotos das alfaces. O gráfico de luminosidade tem uma pequena distorção por causa das manutenções que realizei em 25/08.

ic2016_graph_temp_2

ic2016_graph_lumi_2

ic2016_graph_humi_2

20160908_140049

20160908_140143

20160908_140140

 

One response so far

ICJ-2016 Atualização #4

ago 25 2016

De volta com mais atualizações!

O arquivo de dados estava perfeito, medindo continuamente desde do dia 08/08 até hoje. Com certeza o problema era o mal contato citado anteriormente. Com os dados obtidos, fiz alguns gráficos com luminosidade (lux), temperatura (°C) e umidade relativa do ar (%).

ic2016_graph_lumi_1ic2016_graph_temp_1ic2016_graph_humi_1

Para a reta final, basta comentar o código do Arduino.

Seguem também algumas fotos do projeto:

20160808_121234

20160825_150236

20160825_150223

 

 

 

 

 

 

 

 

One response so far

ICJ-2016 Atualização #3

ago 22 2016

Mais mudanças significativas no projeto. As 3 coisas para deixar tudo operacional foram feitas. No entanto, tive alguns problemas depois de implementar tudo.

Todos os problemas eram relacionados com a coleta de dados. O sistema coleta os dados utilizando os sensores e salva as informações em um cartão de memória. A energia para manter o Arduino é provida pela fonte. O problema é que o código que estava dentro do Arduino corrompeu. Possivelmente o que causou isso foi o desligamento da alimentação do Arduino. Também houve um problema de mal contato com um módulo. Muitos dados não faziam o menor sentido e eram coletados em horários completamente randômicos. Durante um período eram coletados a cada segundo e posteriormente começaram a ser registrados em horários completamente sem sentido. Possivelmente, alguém que desligou o disjuntor do laboratório por não haver ninguém lá. Logo depois dos registros do dia em que eu configurei o sistema, só existem essas medidas:

Dia Mês Ano Hora Minuto Segundo Luminosidade Temperatura Umidade
1 7 2016 8 59 20 140 22 59
1 7 2016 9 48 3 160 22 59
1 7 2016 10 34 25 172 22 59
1 7 2016 10 40 1 188 22 59
1 7 2016 11 31 34 192 22 59
1 7 2016 16 2 20 140 23 58
1 7 2016 16 13 41 184 23 58
1 7 2016 16 16 48 164 22 59
1 7 2016 19 32 14 0 22 62
2 7 2016 6 37 32 168 22 62
2 7 2016 15 6 35 148 23 59
2 7 2016 15 7 54 184 23 59
3 7 2016 2 3 57 0 22 62

Todas em horários sem nenhum padrão.

Desde então, fiz várias alterações.

  • Adicionado uma função que pisca um LED azul toda vez que o Arduino coleta algum dado. Isso é importante para determinar quanto o projeto está funcionando, como um “sinal vital”.
  • O upload do código foi refeito no Arduino, porque estava corrompido.
  • A coleta de dados passou a ocorrer de 10 em 10 minutos (antes era a cada segundo). Não há necessidade disso, tendo em vistas que não haverão alterações bruscas a cada segundo.

Depois dessas mudanças, os dados apresentaram total regularidade, mas só apareciam desde 2 dias antes. Examinei o arquivo no dia 08/08, e os dados só estavam sendo salvos a partir do dia 6/08, 00:51. Encontrei pastas corrompidas. O módulo de relógio estava com mal contato (ele é responsável por informar o horário em que os dados foram salvos). Isso leva a duas conclusões:

  • O disjuntor não foi desligado desde o dia 6/08, e os arquivos não foram corrompidos de novo desde então.

OU

  • O módulo de relógio não estava em contato com o Arduino, e só estabeleceu uma conexão no dia 6/08 (talvez algum vento). Isso explica porque os dados só foram armazenados dias depois. O Arduino simplesmente “congela” o código se algum módulo não funciona, ou seja, não prossegue com as medições e armazenamento.

Depois disso, me certifiquei que o módulo estava bem conectado e sem nenhum mal contato. Atualizo aqui assim que puder saber mais sobre seu status. Também atualizei a esquemática do circuito, agora incluindo o módulo de relógio. Desta vez, os fios tem as mesmas cores que no projeto real, para facilitar a compreensão.

 

ic2016_schem_bb

 

One response so far

ICJ-2016 Atualização #2

jun 23 2016

Desde a última postagem, o projeto evoluiu bastante. Características do protótipo:

  • Mostra a temperatura em ºC
  • Mostra a umidade relativa do ar
  • Mostra a luminosidade sem escala
  • Salva todos os dados coletados em um cartão de memória
  • Salva os dados mesmo sem estar conectado a um computador
  • Tem um LED que pisca em verde se os dados conseguirem ser salvos, e em vermelho se algum erro ocorrer. Com isso é possível saber se está tudo funcionando sem precisar de um computador.

Componentes usados até agora:

  • Arduino UNO rev3
  • Protoboard 420 pontos
  • Módulo de cartão SD (LC Soft)
  • Sensor de temperatura e umidade (DHT11)
  • Resistor dependente de luz ou LDR
  • Resistor comum de 100 ohms
  • LED tricolor de catodo compartilhado

Esquemática do projeto:

Ainda faltam algumas coisas para deixar o projeto totalmente operacional:

  • Fonte 12v para Arduino (assim pode deixar o sistema coletando os dados sem se preocupar com energia)
  • Módulo de relógio (é um módulo para Arduino que fornece as horas, assim as informações coletadas terão uma data e hora, o que gera informações mais específicas e que podem ser usadas de forma mais produtiva)
  • Uma forma de integrar o Microsoft Excel para que ele analise os dados do arquivo de texto salvo pelo Arduino, podendo fazer gráficos ou simplesmente armazenando tudo de forma mais organizada.

Os 2 primeiros items já estão chegando e em breve, em cerca de uma semana, já estarão integrados ao projeto. O terceiro item está sendo desenvolvido por mim, mas é uma barreira que em breve já será superada 😀

2 responses so far

Referências Arduíno

abr 28 2016

No responses yet

Older »