#include <OneWire.h>
#include <DallasTemperature.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include <PubSubClient.h>
#define ONE_WIRE_BUS 14
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
// Ultrasonic Sensor pins
const int trigPin = 4;
const int echoPin = 2;
long duration;
int distance;
// WiFi credentials
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// ThingsBoard parameters
const char* mqtt_server = "thingsboard.cloud";
const char* tb_token = "x4OGUSDNA5qeZT1YEE5f";
// WiFi and MQTT clients
WiFiClient espClient;
PubSubClient client(espClient);
void setup() {
// Start serial communication
Serial.begin(9600);
// Start the DS18B20 sensor
sensors.begin();
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
// Connect to WiFi
WiFi.begin(ssid, password);
Serial.print("Connecting to WiFi...");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" connected");
// Setup MQTT
client.setServer(mqtt_server, 1883);
connectMQTT();
}
void loop() {
sensors.requestTemperatures();
// Fetch temperature in Celsius
float temperatureC = sensors.getTempCByIndex(0);
// Clear the trigPin by setting it LOW
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// Set the trigPin HIGH for 10 microseconds
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Read the echoPin, returns the sound wave travel time in microseconds
duration = pulseIn(echoPin, HIGH);
// Calculate the distance in centimeters
distance = duration * 0.034 / 2;
// Print the values to the Serial Monitor
Serial.print("Temperature: ");
Serial.print(temperatureC);
Serial.println(" °C");
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm");
// // Send data to ThingSpeak
// if (WiFi.status() == WL_CONNECTED) {
// HTTPClient http;
// String url = "http://api.thingspeak.com/update?api_key=" + String(apiKey) +
// "&field1=" + String(temperatureC) +
// "&field2=" + String(distance);
// http.begin(url);
// int httpCode = http.GET();
// if (httpCode > 0) {
// Serial.printf("HTTP GET code: %d\n", httpCode);
// } else {
// Serial.printf("HTTP GET failed, error: %s\n", http.errorToString(httpCode).c_str());
// }
// http.end();
// } else {
// Serial.println("WiFi not connected");
// }
// Send data to ThingsBoard
if (!client.connected()) {
connectMQTT();
}
client.loop();
String payload = "{";
payload += "\"temperature\":" + String(temperatureC) + ",";
payload += "\"distance\":" + String(distance);
payload += "}";
client.publish("v1/devices/me/telemetry", payload.c_str());
delay(20000);
}
void connectMQTT() {
while (!client.connected()) {
Serial.print("Connecting to ThingsBoard...");
if (client.connect("ESP32Client", tb_token, NULL)) {
Serial.println(" connected.");
} else {
Serial.print(" failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}