#include <WiFi.h>
#include <WiFiClient.h>
#include <PubSubClient.h>
#define ADC_IN A5
#define ADC_REF 3.3


const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* hostname = "broker.hivemq.com";
int GLED=18;
long previousMillisR= 0; 
int intervalR= 500; 


WiFiClient espClient;
PubSubClient client(espClient);
const char* espClientName = "esp32Client_Yaoyao198993"; 
int PORTNUM = 1883;


void setup_wifi()
{
  WiFi.begin(ssid, password);
  while(WiFi.status() != WL_CONNECTED )
  {
    delay(1000);
    Serial.print(".");
  }
  Serial.println();
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("Given IP by the router to ESP32 is ");
  Serial.println(WiFi.localIP());
}


void connectMQTT()
{
  while(!client.connected() )
  {
    Serial.println("Connecting to MQTT ...");
    if (client.connect(espClientName) ) //, mqttUser, mqttPassword) )
    {
      Serial.println("Connected");
      MQTTSubscribe();
    }
    else
    {
      Serial.print("Failed with state ");
      Serial.print(client.state() );
      delay(2000);
    }
  }
}






void callback(String topic, byte* payload, unsigned int length)
{
  String messageTemp;
  Serial.print("Message received in topic: ");
  Serial.print(topic);
  Serial.print(" length is: ");
  Serial.println(length);

  Serial.print("Data received from broker: ");
  for (int i = 0; i<length; i++)
  {
    Serial.print( (char)payload[i] );
    messageTemp += (char)payload[i];
  }

/// Handle your topics and payload here
// Example

  if (topic == "Yaoyao/room/LED")
  {
    Serial.print("Changing room LED to ");
    if (messageTemp == "Off")
    {
      digitalWrite(GLED, HIGH);
      Serial.print("Off");
    }
    else if (messageTemp == "On")
    {
      digitalWrite(GLED, LOW);
      Serial.print("On");
    }
  }

 if (topic == "Yaoyao/room/analog")
 {
    Serial.println();
    Serial.println("messageTemp");
 }
}

 

void MQTTSubscribe() 
{
  // Subsccribe to your topics here
  client.subscribe("Yaoyao/room/LED");
  client.subscribe("Yaoyao/room/analog");
}


void setup_MQTT() 
{
  client.setServer(hostname, PORTNUM);
  client.setCallback(callback); 
}



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

  pinMode(GLED, OUTPUT);
  digitalWrite(GLED, LOW);

   setup_wifi();
  setup_MQTT();
}


void loop() 
{
  if ( !client.connected() )
  {
    connectMQTT();
  }
  client.loop();
    long currentMillisR = millis();
  if ( currentMillisR- previousMillisR>= intervalR)
  {    
    previousMillisR = currentMillisR;
     int adcRes = analogRead( ADC_IN );
    delay (10);
    Serial.println(adcRes);
    float voltage = (float) adcRes * ADC_REF/4095;
    Serial.println( voltage ); 
    
    char snum[5];
       itoa (adcRes, snum, 10);
       client.publish("Yaoyao/room/analog",snum);
  }

}