#include <WiFi.h>
#include <PubSubClient.h>
// ---------- Wi-Fi: Wokwi free network ----------
const char* WIFI_SSID = "Wokwi-GUEST";
const char* WIFI_PASS = "";
// ---------- ThingsBoard EU Cloud MQTT ----------
const char* TB_HOST = "mqtt.eu.thingsboard.cloud";
const int TB_PORT = 1883;
const char* TB_TOKEN = "QcRQdKIIfg0EdtroMCBT";
const char* TB_TOPIC = "v1/devices/me/telemetry";
// ---------- Wi-Fi and MQTT clients ----------
WiFiClient net;
PubSubClient mqtt(net);
// ---------- Simulated GPS starting point ----------
// University of Bahrain - Sakhir Campus
double latitude = 26.162639;
double longitude = 50.544288;
// Send telemetry every 5 seconds
unsigned long lastSend = 0;
const unsigned long SEND_INTERVAL = 5000;
// Connect to Wokwi Wi-Fi
void connectWiFi() {
Serial.print("Connecting to Wi-Fi");
WiFi.begin(WIFI_SSID, WIFI_PASS);
while (WiFi.status() != WL_CONNECTED) {
delay(300);
Serial.print(".");
}
Serial.println();
Serial.println("Wi-Fi connected.");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
// Connect to ThingsBoard
void connectMQTT() {
mqtt.setServer(TB_HOST, TB_PORT);
while (!mqtt.connected()) {
Serial.print("Connecting to ThingsBoard...");
// Access token is the MQTT username; password is empty.
if (mqtt.connect("picoW-client", TB_TOKEN, "")) {
Serial.println(" connected.");
} else {
Serial.print(" failed, MQTT state = ");
Serial.println(mqtt.state());
Serial.println("Retrying in 3 seconds...");
delay(3000);
}
}
}
void setup() {
Serial.begin(115200);
delay(1000);
Serial.println();
Serial.println("======================================");
Serial.println("Pico W ThingsBoard Telemetry");
Serial.println("======================================");
randomSeed(micros());
connectWiFi();
connectMQTT();
Serial.println("Starting location: University of Bahrain");
Serial.println("GPS and temperature telemetry started.");
}
void loop() {
if (WiFi.status() != WL_CONNECTED) {
connectWiFi();
}
if (!mqtt.connected()) {
connectMQTT();
}
mqtt.loop();
unsigned long now = millis();
if (now - lastSend >= SEND_INTERVAL) {
lastSend = now;
// Simulate slow movement around the UoB campus
latitude += 0.00005;
longitude += 0.00004;
// Simulate temperature between 20.0 and 34.9 C
float temperature = 20.0 + random(0, 1500) / 100.0;
// Create the JSON telemetry message
char payload[160];
snprintf(payload, sizeof(payload),
"{\"latitude\":%.6f,\"longitude\":%.6f,\"temperature\":%.1f}",
latitude, longitude, temperature);
bool published = mqtt.publish(TB_TOPIC, payload);
Serial.print(published ? "Sent: " : "Publish failed: ");
Serial.println(payload);
}
}