/*
WIRING

OLED
GND--GND
VCC--5V
SDA--A4
SCL--A5

TEMP SENSOR
GND-GND
VCC-5V
OUT-D2

HUMIDITY SENSOR
GNG-GND
VCC-5V
OUT-D3

Code credit:
https://gist.github.com/tuxonice/0b746ab40030a4f3877dd0100441f284
https://docs.sunfounder.com/projects/umsk/en/latest/02_arduino/uno_lesson19_dht11.html

*/

#include <Wire.h> 
#include <Adafruit_SSD1306.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <DHT.h> //library for humidity sensor

// Data wire is conntec to the Arduino digital pin 4
#define ONE_WIRE_BUS 2
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels

//HUMIDITY SENSOR
#define DHTPIN 3 //pin for humidity sensor
#define DHTTYPE DHT11 //define sensor humidity type
DHT dht(DHTPIN, DHTTYPE); // create a DHT object

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature sensor 
DallasTemperature sensors(&oneWire);


#define OLED_RESET     4 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

void setup() {
  Serial.begin(9600);

  sensors.begin();

  // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
  }

  // Show initial display buffer contents on the screen --
  // the library initializes this with an Adafruit splash screen.
  display.display();
  delay(2000); // Pause for 2 seconds

  // Clear the buffer
  display.clearDisplay();

  // Show the display buffer on the screen. You MUST call display() after
  // drawing commands to make them visible on screen!
  display.display();
  delay(2000);

  //HUMIDITY SENSOR
  dht.begin(); //initialize the DHT sensor
}

void loop() {

  sensors.requestTemperatures(); 
  float temperature = sensors.getTempCByIndex(0); 

  displayTemperature(temperature);

  delay(1000);
}

void displayTemperature(float temperature) {
  display.clearDisplay();

  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(3, 1);
  display.print("Temp:");
  display.setCursor(40, 1);
  display.print(temperature);
  display.print(" C");
  display.display();

  //Humidity sensor readings
  float h = dht.readHumidity();
  float t = dht.readTemperature(); // celsius
  float f = dht.readTemperature(true); //Fahrenheit

  if (isnan(h) || isnan(t) || isnan(f)){
    Serial.println(F("Failed to read from DHT sensor!"));
    return;
  }

  float hif = dht.computeHeatIndex(f, h);
  float hic = dht.computeHeatIndex(t, h, false);
  
  //display.println(F("Humidity: "));
  display.setCursor(3, 19);
  display.print("Humidity:");
  display.setCursor(60, 19);
  display.print(h);
  display.print("%");
  display.display();
}