#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#include <WiFi.h>
#include "ThingSpeak.h"

// THING SPEAK ----------------------
const char* ssid = "Guest";   // your network SSID (name)
const char* password = "";   // your network password

WiFiClient  client;

unsigned long myChannelNumber = 1;
const char * myWriteAPIKey = "SE7YVEF1A9S7IGID";

// Timer variables
unsigned long lastTime = 0;
unsigned long timerDelay = 30000;
// --------------------------------

const int SensorDataPin = 14;    

OneWire oneWire(SensorDataPin);
DallasTemperature sensors(&oneWire);

Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire, -1);

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

  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
  Serial.println(F("SSD1306 allocation failed"));
  for(;;);
}
  delay(2000);
  display.clearDisplay();
  display.setTextColor(WHITE);

   WiFi.mode(WIFI_STA);  
 
  ThingSpeak.begin(client);  // Initialize ThingSpeak

}

void loop() {
  if ((millis() - lastTime) > timerDelay) {
   
    // Connect or reconnect to WiFi
    if(WiFi.status() != WL_CONNECTED){
      Serial.println("Attempting to connect");
      while(WiFi.status() != WL_CONNECTED){
        Serial.println("Connecting...");
        WiFi.begin(ssid, password);
        delay(5000);    
      }
      Serial.println("\nConnected.");
    }
 
  delay(5000);
  display.setCursor(0,0);
   display.setTextSize(1);
  display.clearDisplay();

  //Gathering data from temperature sensor
  sensors.requestTemperatures();
  float temperature_Celsius = sensors.getTempCByIndex(0);
  float temperature_F = sensors.getTempFByIndex(0);
  Serial.print("Temperature = "); Serial.print(temperature_Celsius); Serial.println(" *C");
  //display.print("Temperature: "); display.print(temperature_Celsius); display.println(" *C");
  display.setTextSize(1);
  display.setCursor(0,0);
  display.print("Temperature: ");
  display.setTextSize(2);
  display.setCursor(0,10);
  display.print(temperature_F);
  display.print(" ");
  display.setTextSize(1);
  display.cp437(true);
  display.write(167);
  display.setTextSize(2);
  display.print("F");

  // Writing to ThingSpeak
  ThingSpeak.setField(1, temperature_F);
  ThingSpeak.setField(2, temperature_Celsius);

  int x = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);

  if(x == 200){
     Serial.println("Channel update successful.");
   }
   else{
     Serial.println("Problem updating channel. HTTP error code " + String(x));
   }
     lastTime = millis();
  }

  //Displaying information to serial and led
  Serial.println();
  display.display();
  delay(2000);
}