//2024_05_20_Ensaio BioREN_V1

/*########### Aproveitei a versão do sketch abaixo ##########
*2024_04_03_V1234_B_Nano_DHT22_DB18S20_SD_RTC_LCD
* Versão com todos os módulos e usando funções
* B: Melhorando a saída serial, LCD e cartão SD
* ######  Funcionou  ######
*############################################################
*/

#include <DHT.h>          //Sensor DHT22

#include <DallasTemperature.h>    //Sensor DB18S20
#include <OneWire.h>        //Sensor DB18S20

#include <SdFat.h>          //Cartão SD
#include <Arduino.h>

#include "RTClib.h"

#include <LiquidCrystal.h>

DHT dht(9,DHT22);             // Declara objeto dht do tipo DHT
float umid, temp, senterm;      // Declara variáveis

OneWire oneWire(8);
DallasTemperature sensor(&oneWire);

SdFat sdCard;
SdFile meuArquivo;
const int chipSelect = 10;      //Pino CS Cartão SD

RTC_DS1307 rtc;
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
//char daysOfTheWeek[7] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
LiquidCrystal lcd (2, 3, 4, 5, 6, 7);
//LiquidCrystal lcd (2, 3, 4, 5, 6, 7);

void setup() {
  Serial.begin(9600);
  dht.begin();       // Inicializa objeto dht (DHT22)
  delay(20);
  sensor.begin();   // Inicializa objeto sensor (DB18S20)
  if(!sdCard.begin(chipSelect,SPI_HALF_SPEED))sdCard.initErrorHalt();   // Inicializa o modulo SD
  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    Serial.flush();
    abort();}
  lcd.begin(16,2);
  delay (20);
}

void loop() {

  chamaSENSORDHT22();
  chamaSENSORDB18S20();
  chamaRTC();
  chamaLCD();
  chamaSerial();
  chamaSD();
  delay(2000);
}
 
void chamaSENSORDHT22()
{
  umid = dht.readHumidity();    // Lê umidade
  temp = dht.readTemperature(); // Lê temperatura
  senterm = dht.computeHeatIndex(temp,umid,false);//sensação térmica true=farenheit e false=graus celsius
  delay(2000);
}

void chamaSENSORDB18S20()
{
  sensor.requestTemperatures();
  delay(10);
}

void chamaSD()
{
  if (!meuArquivo.open("BioREN-V1", O_RDWR | O_CREAT | O_AT_END))     // Abre o arquivo LER_POT.TXT
  {
    sdCard.errorHalt("Erro na abertura do arquivo Grava_temperatura.txt!");
  }
  DateTime now = rtc.now();
  meuArquivo.println();
  meuArquivo.println("###  2024_04_03_V1234_B_Nano_DHT22_DB18S20_SD_RTC_LCD   ###");
  meuArquivo.print ("    ### BioREN-V1.txt ### ");  meuArquivo.println("  Temperaturas e Umidade  ");
  meuArquivo.print("T1 = ");meuArquivo.print(sensor.getTempCByIndex(0));meuArquivo.println("ºC");
  meuArquivo.print("T2 = ");meuArquivo.println(temp);
  meuArquivo.print("UR = ");meuArquivo.println(umid);
  meuArquivo.println();
  meuArquivo.print("Data: ");
  meuArquivo.print(now.year(), DEC);
  meuArquivo.print('/');
  meuArquivo.print(now.month(), DEC);
  meuArquivo.print('/');
  meuArquivo.print(now.day(), DEC);
  meuArquivo.print(" (");
  meuArquivo.print(daysOfTheWeek[now.dayOfTheWeek()]);
  meuArquivo.print(") ");
  meuArquivo.print(now.hour(), DEC);
  meuArquivo.print(':');
  meuArquivo.print(now.minute(), DEC);
  meuArquivo.print(':');
  meuArquivo.print(now.second(), DEC);
  meuArquivo.println();
   delay(1000); // every second
  meuArquivo.println();
  meuArquivo.close();
}

void chamaRTC()
{
  // Comentei a linha abaixo porque qdo rodava não mostrava a hora correta
  // e sim 3 horas a menos.
  //rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); //CAPTURA A DATA E HORA EM QUE O SKETCH É COMPILADO
  
  DateTime now = rtc.now();
 }

void chamaLCD()
{
  lcd.setCursor(0,0);
  //lcd.print("Temp: "+String(t,1) +" C");
  lcd.print("T1(C)");
  lcd.setCursor(0,1);
  lcd.print(sensor.getTempCByIndex(0));     //Referente ao Sensor DB18S20
  lcd.setCursor(6,0);
  lcd.print("T2(C)");
  lcd.setCursor(6,1);
  lcd.print(temp);
  lcd.setCursor(12,0);
  lcd.print("UR-%");
  lcd.setCursor(12,1);
  lcd.print(umid);
  delay(3000);
  lcd.clear();      //Início da mensagem do SD
  lcd.setCursor(0,0);
  lcd.print(" BioREN-V1.txt ");
  lcd.setCursor(0,1);
  lcd.setCursor(9,0);
  //lcd.print("Teste tds juntos");
  //lcd.setCursor(6,1);
  lcd.setCursor(0,1);
  lcd.print(" Temp e Umidade ");
  lcd.print("");
  delay(2000);
  lcd.clear();      //Fim da mensagem do SD
  delay(2000);
}
void chamaSerial()
{
   //Serial.println("###  2024_04_03_V1234_B_Nano_DHT22_DB18S20_SD_RTC_LCD   ###");
   Serial.println ("  ### BioREN-V1.txt ### ");
   Serial.println("    Temperaturas e Umidade  ");
   Serial.print("Sensor 1 - DB18S20");
   Serial.print("    T1 = ");Serial.print(sensor.getTempCByIndex(0));Serial.println("ºC");
   Serial.println();
   Serial.print("Sensor 2 - DHT22");
   Serial.print("      T2 = ");Serial.print(temp);
   Serial.print("      UR = ");Serial.println(umid);
    
   DateTime now = rtc.now();
   Serial.print("Data: ");
   Serial.print(now.year(), DEC);
   Serial.print('/');
   Serial.print(now.month(), DEC);
   Serial.print('/');
   Serial.print(now.day(), DEC);
   Serial.print(" (");
   Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
   Serial.print(") ");
   Serial.print(now.hour(), DEC);
   Serial.print(':');
   Serial.print(now.minute(), DEC);
   Serial.print(':');
   Serial.print(now.second(), DEC);
   Serial.println();
   Serial.println("#################################");
   delay(1000); // every second
   Serial.println();
   Serial.println();
   
   delay(1000);  
}
GND5VSDASCLSQWRTCDS1307+