#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH110X.h>
#include <DHT.h>

#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET    -1

Adafruit_SH1106G display = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

int freeMemory() {
  extern int __heap_start, *__brkval;
  int v;
  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}

void setup() {
  Serial.begin(9600);
  dht.begin();

  if (!display.begin(0x3C, true)) {
    Serial.println(F("SH1106 allocation failed"));
    while (true);
  }

  display.clearDisplay();
  display.display();
  delay(500);

  Serial.print(F("Free RAM after init: "));
  Serial.println(freeMemory());
}

void loop() {
  float temp = dht.readTemperature();
  float hum  = dht.readHumidity();

  display.clearDisplay();
  display.setTextColor(SH110X_WHITE);

  display.setTextSize(1);
  display.setCursor(0, 0);
  display.print(F("DHT11 Sensor Data"));
  display.drawLine(0, 10, 128, 10, SH110X_WHITE);

  if (isnan(temp) || isnan(hum)) {
    display.setCursor(0, 25);
    display.print(F("Sensor read failed!"));
    Serial.println(F("Failed to read from DHT sensor!"));
  } else {
    display.setTextSize(2);
    display.setCursor(0, 20);
    display.print(temp, 1);
    display.print(F(" C"));

    display.setCursor(0, 42);
    display.print(hum, 1);
    display.print(F(" %"));

    Serial.print(F("Temp: "));
    Serial.print(temp);
    Serial.print(F(" C  Humidity: "));
    Serial.print(hum);
    Serial.println(F(" %"));
  }

  display.display();

  Serial.print(F("Free RAM: "));
  Serial.println(freeMemory());

  delay(2000);
}