//ASSIGNMENT-3:
//To Built Wokwi product, use ultrasonic sensor and detect the distance from the object. whenever distance is less than 100cm upload the value to the ibm cloud.in recent device events as upload te data from wokwi.
#include <WiFi.h>//library for wifi
#include <PubSubClient.h>//library for MQtt
#define trigerPin 15 // what pin we're connected to
#define echoPin 2
#define LED 18
double duration, distance;
void callback(char* subscribetopic, byte* payload, unsigned int payloadLength);
//-------credentials of IBM Accounts------
#define ORG "0mbws1"//IBM ORGANITION ID
#define DEVICE_TYPE "abcd"//Device type mentioned in ibm watson IOT Platform
#define DEVICE_ID "1234"//Device ID mentioned in ibm watson IOT Platform
#define TOKEN "12345678" //Token
String data3;
//-------- Customise the above values --------
char server[] = ORG ".messaging.internetofthings.ibmcloud.com";// Server Name
char publishTopic[] = "iot-2/evt/Data/fmt/json";// topic name and type of event perform and format in which data to be send
char subscribetopic[] = "iot-2/cmd/command/fmt/String";// cmd REPRESENT command type AND COMMAND IS TEST OF FORMAT STRING
char authMethod[] = "use-token-auth";// authentication method
char token[] = TOKEN;
char clientId[] = "d:" ORG ":" DEVICE_TYPE ":" DEVICE_ID;//client id
//-----------------------------------------
WiFiClient wifiClient; // creating the instance for wificlient
PubSubClient client(server, 1883, callback ,wifiClient); //calling the predefined client id by passing parameter like server id,portand wificredential
void setup()// configureing the ESP32
{
Serial.begin(9600);
pinMode(trigerPin,OUTPUT);
pinMode(echoPin,INPUT);
pinMode(LED,OUTPUT);
delay(10);
Serial.println();
wificonnect();
mqttconnect();
}
void loop()// Recursive Function
{
digitalWrite(trigerPin,LOW);
delayMicroseconds(2);
digitalWrite(trigerPin,HIGH);
delayMicroseconds(10);
digitalWrite(trigerPin,LOW);
delayMicroseconds(2);
//get duration
duration=pulseIn(echoPin,HIGH);
//calculate distance
distance=(duration/2)*0.0343;
//consider minimum distance as 100cm
if(distance<100){
digitalWrite(LED,HIGH);
delayMicroseconds(30000);
Serial.println("The distance is less than 100cm");
digitalWrite(LED,LOW);
delayMicroseconds(30000);
}
else{
digitalWrite(LED,LOW);
Serial.println("The distance is greater than 100cm");
Serial.println("----------------------");
}
PublishData(distance);
delay(1000);
if (!client.loop()) {
mqttconnect();
}
}
/*.....................................retrieving to Cloud...............................*/
void PublishData(float distance) {
mqttconnect();//function call for connecting to ibm
// creating the String in in form JSon to update the data to ibm cloud
if(distance<100){
String payload = "{\"distance\":";
payload += distance;
payload += "}";
Serial.print("Sending payload: ");
Serial.println(payload);
if (client.publish(publishTopic, (char*) payload.c_str())) {
Serial.println("Publish ok");// if it sucessfully upload data on the cloud then it will print publish ok in Serial monitor or else it will print publish failed
} else {
Serial.println("Publish failed");
}
Serial.println("----------------------");
}
}
void mqttconnect() {
if (!client.connected()) {
Serial.print("Reconnecting client to ");
Serial.println(server);
while (!!!client.connect(clientId, authMethod, token)) {
Serial.print(".");
delay(500);
}
initManagedDevice();
Serial.println();
}
}
void wificonnect() //function defination for wificonnect
{
Serial.println();
Serial.print("Connecting to ");
WiFi.begin("Wokwi-GUEST", "", 6);//passing the wifi credentials to establish the connection
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void initManagedDevice() {
if (client.subscribe(subscribetopic)) {
Serial.println((subscribetopic));
Serial.println("subscribe to cmd OK");
} else {
Serial.println("subscribe to cmd FAILED");
}
}
void callback(char* subscribetopic, byte* payload, unsigned int payloadLength)
{
Serial.print("callback invoked for topic: ");
Serial.println(subscribetopic);
for (int i = 0; i < payloadLength; i++) {
//Serial.print((char)payload[i]);
data3 += (char)payload[i];
}
Serial.println("data: "+ data3);
if(data3=="lighton")
{
Serial.println(data3);
digitalWrite(LED,HIGH);
}
else
{
Serial.println(data3);
digitalWrite(LED,LOW);
}
data3="";
}