#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
#include "RTClib.h"
const int ledpin = 2;
const int PIRinput = 13;
int pirState = LOW;
const char* SSID = "Wokwi-GUEST";
const char* password = "";
const char* openaiApiKey = "b453666eb3d04c1fa7c608375d88f7fc";
RTC_DS1307 rtc;
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() {
pinMode(ledpin, OUTPUT);
pinMode(PIRinput, INPUT);
Serial.begin(115200);
// WiFi
WiFi.begin(SSID, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nConnected to WiFi!");
// RTC
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__)));
}
}
void loop() {
const int IP = digitalRead(PIRinput);
delay(100);
if (IP == 1) {
digitalWrite(ledpin, HIGH);
if (pirState == LOW) {
Serial.println("Motion detected!");
pirState = HIGH;
String prompt = "Зафіксовано рух у вітальні о " + getTimeString() +
". Двері відчинені. Зроби короткий звіт охоронця.";
request_gpt(prompt);
}
delay(1000);
} else {
digitalWrite(ledpin, LOW);
if (pirState == HIGH) {
Serial.println("Motion ended!");
pirState = LOW;
}
delay(1000);
}
}