/* 
   Código demonstrativo para a aula de Bancos de Dados aplicados à Internet das Coisas,
   Curso de Engenharia e Administração de Sistemas de Banco de Dados,
   Faculdade de Tecnologia - UNICAMP.
   Adilson Marques Moralles - ex179269
*/ 

#include <LiquidCrystal.h>
#define PINO_TRIGGER 10  
#define PINO_ECHO    9 
const float BETA = 3950;
int polegadas = 0;
int centimetros = 0;
int pino_Led  = 13;
int porta_LDR = A3; 

long readUltrasonicDistance(){
  
  digitalWrite(PINO_TRIGGER, LOW);
  delayMicroseconds(2);
  digitalWrite(PINO_TRIGGER, HIGH);
  delayMicroseconds(10);  
  digitalWrite(PINO_TRIGGER, LOW);
  
  return pulseIn(PINO_ECHO, HIGH);
  
}

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

int pino_sensor = A0;


void setup() {
  
   Serial.begin(9600);
   pinMode(PINO_TRIGGER, OUTPUT);
   pinMode(PINO_ECHO, INPUT);
   pinMode(pino_Led, OUTPUT);
  
   lcd.begin(16, 2);
   lcd.clear();

   lcd.setCursor(0,0);
   lcd.print("Fac. Tecnologia");  
   lcd.setCursor(0,1);
   lcd.print("Unicamp Limeira"); 
   delay(2000);
   lcd.clear();
  
   lcd.setCursor(0,0);
   lcd.print("Banco de Dados");  
   lcd.setCursor(0,1);
   lcd.print("Aplicados a IoT"); 
   delay(2000);
   lcd.clear();
  
   lcd.setCursor(0,0);
   lcd.print("  Projeto 02  ");  
   lcd.setCursor(0,1);
   lcd.print("  ----------  "); 
   delay(2000);
   lcd.clear();
  
   lcd.setCursor(0,0);
   lcd.print("Componente");  
   lcd.setCursor(0,1);
   lcd.print("Adilson M. Moralles"); 
   delay(2000);
   lcd.clear();  
   
}

void loop() {
          
  int temp_c = 1 / (log(1 / (1023. / analogRead(pino_sensor) - 1)) / BETA + 1.0 / 298.15) - 273.15;
  int temp_f = (temp_c * 9) / 5 + 32;
  int valor_LDR = analogRead(porta_LDR);
  int luminosidade = map(valor_LDR,8,1015,100,0);  
  
  centimetros = 0.01723 * readUltrasonicDistance();
  polegadas = (centimetros / 2.54);
  
  lcd.setCursor(0,0);
  lcd.print("Recuperar Dados");  
  lcd.setCursor(0,1);
  lcd.print("  dos sensores");
  delay(2000);
  lcd.clear();
  
  lcd.setCursor(0,0);
  lcd.print("Temp: ");             
  lcd.print(temp_c,DEC);             
  lcd.print("C");
  lcd.setCursor(0,1);
  lcd.print("Temp: ");             
  lcd.print(temp_f,DEC);             
  lcd.print("F");  
  delay(2000);
  lcd.clear();

  lcd.setCursor(0,0);
  lcd.print("Dist: ");             
  lcd.print(centimetros);             
  lcd.print(" cm");
  lcd.setCursor(0,1);
  lcd.print("Dist: ");             
  lcd.print(polegadas);             
  lcd.print(" pol.");  
  delay(2000);
  lcd.clear();
  
  lcd.setCursor(0,0);
  lcd.print("LDR: ");             
  lcd.print(valor_LDR);
  lcd.setCursor(0,1);
  lcd.print("Luminosidade: ");             
  lcd.print(luminosidade); 
  lcd.print("%");
  if ( luminosidade < 51 )  {  
     digitalWrite(pino_Led, HIGH);  
  } else  {  
    digitalWrite(pino_Led, LOW);  
  } 
  delay(2000);
  lcd.clear();          
}