/*
https://wokwi.com/projects/383624825061858305
On se propose de réaliser un système IoT à base de microcontrôleur ESP32
qui permet de récupérer l’adresse Ip du système
et d'afficher "ip", "region" et le pays relatif à l'adresse Ip du système sur
un écran LCD 20X4 et mettre le broker à jour
Vous pouvez utiliser les api suivants:
1. http://api.ipify.org/?format=json
permet de retouner mon adresse ip public
2. http://ipinfo.io/MYPUBLICIPADRESSE/geo
(verifier sur votre navigateur le format de reponse du serveur)
parametre de broker :
server: ds-lce3-2023.japaneast.cloudapp.azure.com
port:1883
username:student
password:lce3
clientID: <Your Name>
topic:ds/location
FORMAT Json File: {"nom_prenom":"kamel echaieb" ,"location":{"ip":"4.227.141.167","region":"Virginia","pays":"US"}}
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED width, in pixels
#define SCREEN_HEIGHT 64 // OLED height, in pixels
// create an OLED display object connected to I2C
Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
void setup() {
Serial.begin(9600);
// initialize OLED display with I2C address 0x3C
if (!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("failed to start SSD1306 OLED"));
while (1);
}
delay(2000); // wait two seconds for initializing
oled.clearDisplay(); // clear display
oled.setTextSize(1); // set text size
oled.setTextColor(WHITE); // set text color
oled.setCursor(0, 2); // set position to display (x,y)
oled.println("Ip:"); // set text
oled.setCursor(0, 20); // set position to display (x,y)
oled.println("Region:"); // set text
oled.setCursor(0, 40); // set position to display (x,y)
oled.println("pays:"); // set text
oled.display(); // display on OLED
}
void loop() {}
*/
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
#include <PubSubClient.h>
#define SCREEN_WIDTH 128 // OLED width, in pixels
#define SCREEN_HEIGHT 64 // OLED height, in pixels
const char* ssid = "Wokwi-GUEST";
const char* password = "";
WiFiClient espClient;
const char* mqtt_server = "ds-lce3-2023.japaneast.cloudapp.azure.com";
const int mqtt_port = 1883;
const char* mqtt_username = "student";
const char* mqtt_password = "lce3";
char ClientID []= "";
const char* mqtt_topic = "ds/location";
const String serveurapi1 = "http://api.ipify.org/?format=json";
const String serveurapi2 = "http://ipinfo.io/154.105.189.34/geo";
Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
PubSubClient client(mqtt_server,1883,espClient);
void connectToWiFi() {
Serial.println("Connecting to WiFi");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting...");
}
Serial.println("Connected to WiFi");
}
const char* IP;
void updateDisplay(const char* ip, const char* region, const char* country) {
oled.clearDisplay();
oled.setTextSize(1);
oled.setTextColor(WHITE);
oled.setCursor(0, 2);
oled.println("Ip: " + String(ip));
oled.setCursor(0, 20);
oled.println("Region: " + String(region));
oled.setCursor(0, 40);
oled.println("Pays: " + String(country));
oled.display();
}
// Connect to MQTT broker
void setup() {
Serial.begin(9600);
connectToWiFi();
if (!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("Failed to start SSD1306 OLED"));
while (1);
}
delay(2000);
updateDisplay("Fetching...", "", "");
// Connect to MQTT broker
client.setServer(mqtt_server, mqtt_port);
/*client.setCredentials(mqtt_username, mqtt_password);
*/
while (!client.connect(ClientID)) {
delay(1000);
Serial.println("MQTT Connection Failed, retrying...");
}
}
void loop() {
if(!client.connected()){
Serial.println("MQTT not connected");
sprintf(ClientID, "%s%s", "kamelsub", String(random(10)));
if(client.connect(ClientID, mqtt_username,NULL)){
Serial.println("MQTT Connected");
client.subscribe(mqtt_topic);}
}
// Fetch IP information from the API
HTTPClient http;
http.begin("http://api.ipify.org/?format=json");
int httpCode = http.GET();
if (httpCode == HTTP_CODE_OK) {
Serial.print("HTTP ");
Serial.println(httpCode);
String payload = http.getString();
Serial.print("JsonFile=");
Serial.println(payload);
DynamicJsonDocument doc(1024);
deserializeJson(doc, payload);
const char* ip = doc["ip"];
Serial.println(ip);
//const char* region = "Unknown"; // You may fetch region information from another API
//const char* country = "Unknown"; // You may fetch country information from another API
updateDisplay(ip,"","");
DynamicJsonDocument root(1024);
root["ip"]=String(ip);
http.end();
delay(2000);
IP=ip;
// Publish data to MQTT broker
//String mqttPayload = "{\"nom_prenom\":\"Your_Name\",\"location\":{\"ip\":\"" + String(ip) + "\",\"region\":\"" + String(region) + "\",\"pays\":\"" + String(country) + "\"}}";
//FORMAT Json File: {"nom_prenom":"kamel echaieb" ,"location":{"ip":"4.227.141.167","region":"Virginia","pays":"US"}}
//FORMAT Json File: {"nom_prenom":"kamel echaieb" ,"location":{"ip":"4.227.141.167","region":"Virginia","pays":"US"}}
} else {
Serial.println("Failed to get IP information");
}
HTTPClient http2;
http2.begin(espClient,serveurapi2);
int httpCode2 = http2.GET();
if(httpCode2 > 0) {
Serial.print("HTTP");
Serial.println(httpCode2);
String payload2 = http2.getString();
Serial.print("JsonFile2=");
Serial.println(payload2);
DynamicJsonDocument doc1(1024);
deserializeJson(doc1,payload2);
const char* region =doc1["region"];
const char* country = doc1["country"];
oled.setTextSize(1); // set text size
oled.setTextColor(WHITE); // set text color
oled.setCursor(0, 20);
oled.println("Region: " + String(region)); // set text color
oled.setCursor(0,40);
oled.println("Pays: " + String(country));
oled.display();
Serial.print("JsonFile=");
Serial.println(payload2);
//client.publish(mqtt_topic, JsonFile.c_str());
// Publish data to MQTT broker
DynamicJsonDocument root(1024);
root["nom_prenom"] = "kamel echaieb";
root["location"]["ip"]= "ip";
root["location"]["region"]= String(region);
root["location"]["country"]=String(country);
String mqttPayload;
serializeJson(root,mqttPayload);
Serial.print("mqttpayload=");
Serial.println(mqttPayload);
client.publish(mqtt_topic, mqttPayload.c_str());
http2.end();
delay(60000); // Update every 60 seconds
} else {
Serial.print("Error code: ");
Serial.println(http.errorToString(httpCode2).c_str());
}
}Loading
esp32-devkit-c-v4
esp32-devkit-c-v4
Loading
ssd1306
ssd1306