#include <WiFi.h>
#include <HTTPClient.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <ArduinoJson.h>
// Khởi tạo LCD I2C với địa chỉ 0x27 (thay đổi tùy theo module của bạn)
LiquidCrystal_I2C lcd(0x27, 20, 4);
// WiFi thông tin kết nối
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// API giá xăng dầu
const char* api_fuel = "https://wifeed.vn/api/du-lieu-vimo/hang-hoa/gia-xang-dau-trong-nuoc?page=1&limit=100&apikey=demo";
// API giá vàng
const char* api_gold = "http://api.btmc.vn/api/BTMCAPI/getpricebtmc?key=3kd8ub1llcg9t45hnoh8hmn7t5kc2v";
void setup() {
Serial.begin(115200);
// Khởi tạo LCD
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Connecting to WiFi");
// Kết nối WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
lcd.setCursor(0, 1);
lcd.print(".");
}
Serial.println(" Connected!");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("WiFi Connected!");
}
void loop() {
if (WiFi.status() == WL_CONNECTED) {
// Lấy giá xăng dầu
getFuelPrices();
// Lấy giá vàng
getGoldPrices();
// Đợi 30 giây trước khi cập nhật lại
delay(30000);
}
}
void getFuelPrices() {
HTTPClient http;
http.begin(api_fuel);
int httpCode = http.GET();
if (httpCode > 0) {
String payload = http.getString();
Serial.println(httpCode);
Serial.println(payload);
// Parse dữ liệu JSON
StaticJsonDocument<2048> doc;
DeserializationError error = deserializeJson(doc, payload);
if (!error) {
// Lấy thông tin giá xăng dầu cho vùng 1
float vung_1_xang_ron_95_v = doc["data"][0]["vung_1_xang_ron_95_v"];
float vung_1_xang_e5_ron_92 = doc["data"][0]["vung_1_xang_sinh_hoc_e5_ron_92_ii"];
// Hiển thị lên LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Xang 95V: ");
lcd.print(vung_1_xang_ron_95_v);
lcd.print("k");
lcd.setCursor(0, 1);
lcd.print("Xang E5: ");
lcd.print(vung_1_xang_e5_ron_92);
lcd.print("k");
} else {
Serial.println("Failed to parse JSON");
}
} else {
Serial.println("Error on HTTP request");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("HTTP Error");
}
http.end();
}
void getGoldPrices() {
HTTPClient http;
http.begin(api_gold);
int httpCode = http.GET();
if (httpCode > 0) {
String payload = http.getString();
Serial.println(httpCode);
Serial.println(payload);
// Parse dữ liệu XML
if (payload.indexOf("<DataList>") >= 0) {
// Tìm vị trí của các giá trị trong dữ liệu XML
String vang_vrtl_pb = getValueFromXML(payload, "pb_1");
String vang_vrtl_ps = getValueFromXML(payload, "ps_1");
String vang_sjc_pb = getValueFromXML(payload, "pb_7");
String vang_sjc_ps = getValueFromXML(payload, "ps_7");
// Hiển thị lên LCD
lcd.setCursor(0, 2);
lcd.print("VRTL B: ");
lcd.print(vang_vrtl_pb);
lcd.print("k");
lcd.setCursor(0, 3);
lcd.print("SJC B: ");
lcd.print(vang_sjc_pb);
lcd.print("k");
} else {
Serial.println("Failed to parse XML");
}
} else {
Serial.println("Error on HTTP request");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("HTTP Error");
}
http.end();
}
String getValueFromXML(String xml, String tag) {
int start = xml.indexOf(tag + "=\"");
if (start == -1) {
return "";
}
start += tag.length() + 2; // Điểm bắt đầu của giá trị
int end = xml.indexOf("\"", start); // Điểm kết thúc của giá trị
return xml.substring(start, end);
}