// After running the simulator, click on the DS18B20 chip to change the temperature
// Chip by bonnyr, source code: https://github.com/bonnyr/wokwi-ds1820-custom-chip/

//https://wokwi.com/projects/358129234661487617

#include <OneWire.h>
#include <DallasTemperature.h>
#include <DHT.h>
#include <LiquidCrystal.h>

OneWire oneWire(8);
DallasTemperature sensor(&oneWire);
DHT dht(9,DHT22);     // Declara objeto do tipo DHT
float umid, temp, senterm;     // Declara variáveis
LiquidCrystal lcd (2, 3, 4, 5, 6, 7);;

void setup(void) {
  Serial.begin(9600);
  delay(2);
  sensor.begin();
  dht.begin();       // Inicializa objeto dht
  delay(20);
  lcd.begin(16,2);
  // print a message to the LCD
  //lcd.backlight();
  //lcd.setCursor(2,3);
  //lcd.print("Lernfeld LF07-V2");
}

void loop(void) {
  sensor.requestTemperatures();
  Serial.print("Temperature is: ");
  delay(10);
  Serial.println(sensor.getTempCByIndex(0));
  delay(1000);
  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
   Serial.print("\n\nUmidade: ");
   Serial.print(umid);           // Exibe umidade
   Serial.print(" %");
   Serial.print("\nTemperatura: ");
   Serial.print(temp);           // Exibe temp.
   Serial.print(" °C");
   Serial.print("\nSensação Térmica: ");
   Serial.print(senterm);
   Serial.println(" °C");
   delay(2000);  

    // Wait a few seconds between measurements.
  //delay(2000);

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  float f = dht.readTemperature(true);
  //float f = dht.readTemperature(false);

  //lcd.setCursor(0,0);
  //lcd.print("Messung laeuft");
  lcd.setCursor(0,0);
  //lcd.print("Temp: "+String(t,1) +" C");
  lcd.print("T2: "+String(t,1) +" C");
  
  lcd.setCursor(0,1);
  //lcd.print("F: "+String(h,1) + " %");
  lcd.print("UR: "+String(h,1) + " %");
}















// ################ Vou colocar 2 sketch que funcionaram separados ####
// 1) Sketch do DB18S20
// 2) Sketch do DHT22

// ####### Meu sketch que tá com muitos erros ######
/*
//2023_08_10_Temperatura_Umidade_DHT22_DB18S20_LCD_Uno
#include <SdFat.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h> // Incluindo a biblioteca do LCD
LiquidCrystal lcd (2, 3, 4, 5, 6, 7); //Definindo os pinos de controle do LCD (RS, E, D4, D5, D6, D7). programa da apostila aula 6A

//#define dados 8 //No original estava no pino 2 (eu já usava) coloquei o 8
OneWire oneWire(dados);  /*Protocolo OneWire*/
DallasTemperature sensors(&oneWire); /*encaminha referências OneWire para o sensor
SdFat sdCard;
SdFile meuArquivo;

#include <DHT.h>    //Biblioteca indicada pelo ìtalo p inserir: DHT sensor library versão 1.4.4
#include <DHT_U.h>  //Veio junto com a bibloteca acima
#define DHTPIN 9 // Definindo o pino 9 como o pino de dados do DHT22.
#define DHTTYPE DHT22 // Definindo o sensor DHT22.
DHT dht(DHTPIN, DHTTYPE); // Inicializando a biblioteca do sensor DHT22.

char temperatura[] = "A=00.0 "; // É a temperatura lida do DHT22 (Eu criei no pgm com o DB18S20), vou chamar de "A" (Não vai aparecer a letra C (Centigrados)
char umidade  []  = "Umid.= 00.0 %"; // Criando a váriável "umidade" e iniciando zerada.
const int chipSelect = 10;
const int PINO_ONEWIRE = 8;         // Estou usando o NANO então mudei p 8
OneWire oneWire(PINO_ONEWIRE);      // Cria um objeto OneWire
DallasTemperature sensor(&oneWire); // Informa a referencia da biblioteca dallas temperature para Biblioteca onewire
DeviceAddress endereco_temp;        // Cria um endereco temporario da leitura do sensor


void setup()
{
  Serial.begin(9600); //Eu inclui p depurar
  Serial.println("  Leitura nos Sensores DHT22 e DB18S20  "); /*Printa "Demonstração do funcionamento do sensor"
  sensors.begin();    /*inicia biblioteca
  lcd.begin(16, 2);   // Inicializando e definindo o número de colunas e linhas do LCD
  dht.begin();        // Inicializando o sensor DHT22.
  sensor.begin();
  if(!sdCard.begin(chipSelect,SPI_HALF_SPEED))sdCard.initErrorHalt();
}
 
void loop()
{
  if (!meuArquivo.open("Grava_temperatura.txt", O_RDWR | O_CREAT | O_AT_END))     // Abre o arquivo LER_POT.TXT
  {
    sdCard.errorHalt("Erro na abertura do arquivo Grava_temperatura.txt!");
  }
  Serial.print(" Leitura DB18S20");
  sensors.requestTemperatures();      /* Envia o comando para leitura da temperatura 
  sensor.requestTemperatures();       // Envia comando para realizar a conversão de temperatura
  if (!sensor.getAddress(endereco_temp,0)) { // Encontra o endereco do sensor no barramento
    Serial.println("SENSOR NAO CONECTADO"); // Sensor conectado, imprime mensagem de erro
  } else {
    Serial.print("Temperatura = "); // Imprime a temperatura no monitor serial
    Serial.println(sensor.getTempC(endereco_temp), 1); // Busca temperatura para dispositivo
  }
  delay(1000);
  
  
  
  /*******************************************************************
  Serial.println();                   /*Para pular umalinha
  Serial.print("T(DB18S20) = "); 
  Serial.println(sensors.getTempCByIndex(0)); /* Endereço do sensor - Valor da temperatura do sensor DB18S20
  //Serial.println("   Temperatura lida do DB18S20");
  delay(2000); // Esperando 2s entre leituras
  Serial.print(" Leitura DHT22");
  Serial.print("T(DHT22 e UR(%))= "); 
  int UR = dht.readHumidity() * 10; // fazendo a leitura da umidade.
  int Temp = dht.readTemperature() * 10; // Fazendo a leitura da temperatura em graus Celcius.
  //Serial.print("     Temp="); //Para depuração e entender a conta "(Temp / 100) % 10  + 48;"
  Serial.println(Temp);

  if (isnan(UR) || isnan(Temp)) // " || = OU lógico" (isnan: Is Not a Number) Verificando se ocorreu alguma falha de leitura. 
                                //Se ocorrer, ele monstra "Erro" tenta ler novamente.
                                //Verifica se a umidade ou temperatura são ou não um número
  {
    lcd.clear();
    lcd.setCursor(5, 0);
    lcd.print("Erro");
    Serial.println("erro");//Eu inclui
    return;
  }
  if(Temp < 0)
  {
    temperatura[6] = '-';
    Temp = abs(Temp); //abs "Calcula o módulo (ou valor absoluto) de um número"
  }
  else
    temperatura[2] = (Temp / 100) % 10  + 48;  //O + 48 é só p adicionar o algarismo 0(zero)
    temperatura[3] = (Temp / 10)  % 10  + 48;
    temperatura[5] =  Temp % 10 + 48;
    temperatura[6] = 223; // Gerar o símbolo de graus no LCD.

  if(UR >= 1000)
    umidade[6]  = '1';
  else
    umidade[6]  = ' ';
    umidade[7]  = (UR / 100) % 10 + 48;
    umidade[8]  = (UR / 10) % 10 + 48;
    umidade[10] =  UR % 10 + 48;

  lcd.setCursor(0, 0); // Posiciona o cursor na linha 1 e coluna 1 do LCD.
  lcd.println(temperatura); // escreve o valor da temperatura no LCD, temperatura do DHT22 (temperatura[] = "A=00.0 ")
  Serial.println(temperatura);//Eu inclui
  lcd.setCursor(0, 1); // Posiciona o cursor na linha 2 e coluna 1 do LCD.
  //UR = umidade[];
  lcd.print(umidade); // Escreve o valor da umidade no LCD, lida do DHT22
  lcd.setCursor(9,0 );
  lcd.print("B="); //Temperatura lida do DB18S20
  lcd.print(sensors.getTempCByIndex(0)); //Temperatura lida do DB1820
  Serial.println(umidade);//Eu inclui
  delay(1000);
//}

  meuArquivo.println("2024_02_19_Grava_Cartao_SD_V2");
  meuArquivo.print("Leitura Temperatura: ");
  meuArquivo.println(sensor.getTempC(endereco_temp));
  meuArquivo.print(" Leitura DHT22");
  meuArquivo.println(temperatura);
  meuArquivo.print(umidade); 

  meuArquivo.close();
  
}*/