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.