#include <MQTTClient.h>
#include <ArduinoJson.h>
#include <WiFi101.h>
#include "DHT.h"

#define DHTPIN 2     // what digital pin we're connected to
#define DHTTYPE DHT11   // DHT 11

DHT dht(DHTPIN, DHTTYPE);

const char* _SSID     = "[Wi-Fi SSID]";
const char* _PASSWORD = "[Wi-Fi Password]";  

// ARTIK Cloud MQTT params
char mqttCloudServer[]     = "api.artik.cloud";
int  mqttCloudPort         = 8883;
char mqttCloudClientName[] = "ARTIK-Arduino";
char mqttCloudUsername[]   = "[device-id]"; 
char mqttCloudPassword[]   = "[device-token]"; 
char mqttCloudDataOut[]    = "/v1.1/messages/[device-id]"; 

WiFiSSLClient ipCloudStack;
MQTTClient mqttCloudClient;

char buf[128];

float temperature, humidity;

int n = 0;

void getNextSample(float* Temperature, float* Humidity)
{
  // 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)
  *Humidity = dht.readHumidity();
  // Read temperature as Celsius (the default)
  *Temperature = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  // float f = dht.readTemperature(true);

  //printf("Temp=%.2f, Pres=%.2f, Humi=%.2f\n", Temp_c__f, Pres_hPa__f, Humi_pct__f);

  Serial.print("Temperature="); Serial.println(*Temperature);
  Serial.print("Humidity="); Serial.println(*Humidity);
}

void setup() {

  Serial.begin(57600);  

  dht.begin();
  
  // Wifi Setting
  WiFi.begin(_SSID, _PASSWORD);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println();
  Serial.println("WiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  
  mqttCloudClient.begin(mqttCloudServer, mqttCloudPort, ipCloudStack);

  Serial.println("start ARTIK Cloud connect"); Serial.println();
  
  while (!mqttCloudClient.connect(mqttCloudClientName, mqttCloudUsername, mqttCloudPassword)) {
    Serial.print("*");
    delay(500);    
  }

}

void messageReceived(String topic, String payload, char * bytes, unsigned int length) {}

void sendToArtikCloud(float temperature, float humidity) {
  loadBuffer(temperature, humidity); // load current values into the buffer
  mqttCloudClient.publish(mqttCloudDataOut, buf);
}

void loadBuffer(float temperature, float humidity) {
  StaticJsonBuffer<200> jsonBuffer;
  JsonObject& dataPair = jsonBuffer.createObject();

  dataPair["temperature"] = temperature;
  dataPair["humidity"] = humidity;

  dataPair.printTo(buf, sizeof(buf));
}

void loop() {

  if (++n > 10) { 
    Serial.println("Stopped.");
    exit(0); 
  }

  mqttCloudClient.loop();
  delay(1000);
  
  getNextSample(&temperature, &humidity);
  
  Serial.println("Publishing..."); Serial.println();
  
  sendToArtikCloud(temperature, humidity);

  delay(15000);

}
