#include <WiFi.h>
#include <PubSubClient.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
// WiFi credentials
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// MQTT Broker settings
const char* mqtt_broker = "broker.hivemq.com";
const int mqtt_port = 1883;
const char* mqtt_topic = "pokemon/dataa";
WiFiClient espClient;
PubSubClient client(espClient);
// Function to connect to WiFi
void setup_wifi() {
delay(10);
Serial.println("Connecting to WiFi");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
// Function to reconnect to MQTT broker
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
String clientId = "ESP32Client-";
clientId += String(random(0xffff), HEX);
if (client.connect(clientId.c_str())) {
Serial.println("connected");
// Subscribe to our topic
client.subscribe(mqtt_topic);
Serial.println("Subscribed to topic: " + String(mqtt_topic));
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" trying again in 5 seconds");
delay(5000);
}
}
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
}
// Function to get Pokemon data
void getPokemonData() {
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
String url = "https://pokeapi.co/api/v2/pokemon/ditto"; // Fixed URL for Ditto
Serial.print("Getting data from: ");
Serial.println(url);
http.begin(url);
int httpResponseCode = http.GET();
Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);
if (httpResponseCode > 0) {
String payload = http.getString();
Serial.println("Received data length: " + String(payload.length()));
// Create a JSON document
DynamicJsonDocument doc(4096); // Increased buffer size
DeserializationError error = deserializeJson(doc, payload);
if (error) {
Serial.print("deserializeJson() failed: ");
Serial.println(error.f_str());
return;
}
// Create a smaller JSON object with selected data
DynamicJsonDocument outputDoc(1024);
outputDoc["name"] = doc["name"].as<const char*>();
outputDoc["id"] = doc["id"].as<int>();
outputDoc["height"] = doc["height"].as<int>();
outputDoc["weight"] = doc["weight"].as<int>();
// Convert to string
String outputJson;
serializeJson(outputDoc, outputJson);
// Publish to MQTT
bool published = client.publish(mqtt_topic, outputJson.c_str());
Serial.print("Published Pokemon data: ");
Serial.println(outputJson);
Serial.print("Publish success: ");
Serial.println(published ? "Yes" : "No");
}
http.end();
} else {
Serial.println("WiFi not connected!");
}
}
void setup() {
Serial.begin(115200);
while(!Serial) { delay(100); }
Serial.println("\nStarting Pokemon MQTT Client");
setup_wifi();
client.setServer(mqtt_broker, mqtt_port);
client.setCallback(callback);
Serial.println("Setup complete");
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
// Get Ditto data every 10 seconds
static unsigned long lastTime = 0;
if (millis() - lastTime > 10000) {
Serial.println("\nFetching Ditto data...");
getPokemonData();
lastTime = millis();
}
}