#include <WiFi.h>
#include "RTClib.h"
#include <NewPing.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
const char* SSID = "Wokwi-GUEST";
const char* password = "";
const char* openaiApiKey = "b453666eb3d04c1fa7c608375d88f7fc";
#define trigPin 2
#define echoPin 4
NewPing sonar(trigPin, echoPin);
RTC_DS1307 rtc;
int peopleCount = 0;
int lastPeopleState = 0;
int co2Level = 450;
int vocLevel = 120;
void request_gpt(String prompt) {
Serial.println("Sending request to GPT...");
DynamicJsonDocument doc(1024);
doc["model"] = "gpt-3.5-turbo";
JsonArray messages = doc.createNestedArray("messages");
JsonObject systemMsg = messages.createNestedObject();
systemMsg["role"] = "system";
systemMsg["content"] = "Ти — розумний аналітик громадського транспорту. Коротко генеруй звіт українською.";
JsonObject userMsg = messages.createNestedObject();
userMsg["role"] = "user";
userMsg["content"] = prompt;
HTTPClient http;
String apiUrl = "https://artificialintelligence.openai.azure.com/openai/deployments/test/chat/completions?api-version=2023-05-15";
http.begin(apiUrl);
http.addHeader("Content-Type", "application/json");
http.addHeader("api-key", openaiApiKey);
String body;
serializeJson(doc, body);
int httpCode = http.POST(body);
if (httpCode == 200) {
String response = http.getString();
DeserializationError error = deserializeJson(doc, response);
if (!error) {
String reply = doc["choices"][0]["message"]["content"].as<String>();
Serial.println("GPT reply:\n" + reply);
} else {
Serial.println("JSON parse error");
}
} else {
Serial.println("Error sending request to GPT. HTTP code: " + String(httpCode));
}
http.end();
}
String getTimeString() {
DateTime now = rtc.now();
char buf[9];
sprintf(buf, "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
return String(buf);
}
void setup() {
Serial.begin(115200);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);;
WiFi.begin(SSID, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nConnected to WiFi!");
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
if (!rtc.isrunning()) {
Serial.println("RTC is NOT running, setting default time!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
Serial.println("Setup complete.");
}
void loop() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
unsigned int distance_cm = sonar.ping_cm();
if (distance_cm == 0) distance_cm = 999;
int currentPeopleState = (distance_cm < 50) ? 1 : 0;
if (currentPeopleState == 1 && lastPeopleState == 0) {
peopleCount++;
}
lastPeopleState = currentPeopleState;
co2Level = 400 + random(0, 50);
vocLevel = 100 + random(0, 50);
String timeStr = getTimeString();
Serial.print("Time: "); Serial.print(timeStr);
Serial.print(" | People: "); Serial.print(peopleCount);
Serial.print(" | Distance: "); Serial.print(distance_cm); Serial.print(" cm");
Serial.print(" | CO2: "); Serial.print(co2Level); Serial.print(" ppm");
Serial.print(" | VOC: "); Serial.println(vocLevel);
static unsigned long lastRequestTime = 0;
if (millis() - lastRequestTime > 10000) {
lastRequestTime = millis();
String prompt = "Оцінка ситуації в транспорті о " + timeStr + ". " +
"Кількість людей: " + String(peopleCount) + ", " +
"CO2: " + String(co2Level) + " ppm, VOC: " + String(vocLevel) + " ppb. " +
"Зроби короткий прогноз заповненості і поради безпеки.";
request_gpt(prompt);
}
delay(500);
}