#include <DHT.h>
#include <WiFi.h>
#include <PubSubClient.h>

unsigned long currentMillis;
long startMillis = 0;
float suond;
int pinsound = 34;
int value = 0;
float p;
int pressure = 39; 
#define DHTPIN 13     
#define DHTTYPE DHT11   
DHT dht(DHTPIN, DHTTYPE);

// WiFi 
const char* ssid = "vallauri.docenti";       //Name WiFi
const char* password = "fossano-vallauri";   //password WiFi

// Thingsboard
const char* mqttServer = "thingsboard.cloud";        //Server Thingsboard
const int mqttPort = 1883;                           //Thingsboard port
const char* mqttUsername = "tVxYM9AxKNskYfXsrPCs";   //Username Thingsboard
const char* mqttTopic = "v1/devices/me/telemetry";  

WiFiClient espClient;
PubSubClient client(espClient);
                               
void connectWiFi() {                              // WiFi connection
  Serial.println("WiFi connecting...");
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connection...");
  }

  Serial.println("WiFi connected");
}

void connectMQTT() {                               // Thingsboard connection
  Serial.println("Connecting Thingsboard...");

  while (!client.connected()) {
    if (client.connect("ESP32Client", mqttUsername, NULL)) {
      Serial.println("Connected");
    } else {
      WiFi.reconnect();                            //WiFi reconnection;
      Serial.print("Connection failed, rc=");
      Serial.print(client.state());
      Serial.println("repeat in 5 seconds");
      delay(5000);
    }
  }
}

void setup() {
  Serial.begin(115200);
  connectWiFi();
  client.setServer(mqttServer, mqttPort);
  pinMode(pinsound, INPUT);
  pinMode(pressure, INPUT);
  dht.begin();
  
}

void loop() {
  if (!client.connected()) {
    connectMQTT();
  }
  long period;
  p = analogRead(pressure);
  p = map (p, 0, 4095, 0, 1200);
  p = (p / 100); 
  float temperature = dht.readTemperature();
  value = analogRead(pinsound);
  if (value >= 1000) {
    period = 4000;
  } else {
    period = 60000;
  }
  currentMillis = millis();                       //Time
  if (currentMillis - startMillis >= period) {
    String sound = "{\"sound\":" + String(value) + "}";
    String pres = "{\"pressure\":" + String(p) + "}";
    String temp = "{\"temperature\":" + String(temperature) + "}";
    
   client.publish(mqttTopic, sound.c_str());      //Publish data on Thingsboard
   client.publish(mqttTopic, pres.c_str());
   client.publish(mqttTopic, temp.c_str());
   
    Serial.print("Send data to ThingsBoard: ");   //Write on Serial Monitor
    Serial.print(sound);
    Serial.print("  ");
    Serial.print(pres);
    Serial.print("  ");
    Serial.println(temp);
    
    startMillis = currentMillis;
  }
}
