90% мого Data Science-проєкту написав ШІ
Усі статті, обговорення, новини про AI — в одному місці. Підписуйтеся на DOU | AI!
Вітаю! Мене звати Сергій, і я — інженер з комп’ютерних систем. Нещодавно я загорівся ідеєю зібрати якомога більше даних з наявних під рукою пристроїв, і в реалізації цієї ідеї мені неабияк допоміг ChatGPT. Ось як це відбувалось.
У сучасному світі технології стають все більш доступними, що дозволяє нам розробляти дивовижні речі навіть за короткий проміжок часу. Мій проєкт WIFIDataLogger — саме такий приклад.
Ідея проєкту
Занурившись у Data Science, я замислився, де брати дані (саме справжні, а не синтетичні), або хоча б як їх згенерувати. Це наштовхнуло мене на ідею створити систему, яка може збирати дані про сигнали Wi-Fi та візуалізувати їх для подальшого аналізу.
Тут мені на допомогу прийшов ESP8266 — я працював з цим контролером в минулому і знав, що він може сканувати WiFi-мережі та передавати ці дані на комп’ютер GET-запитом.
Простими словами, мені було треба зробити примітивний інструмент для збору та візуалізації даних, щоб набути досвіду у цьому напрямі. Тож цей проєкт корисний, ймовірно, лише для мого знайомства з Data Science, проте це переросло у цікавий досвід.
Реалізація проєкту
Від ідеї до реалізації проєкту пройшло всього три дні.
Використані технології
Проєкт поєднує в собі кілька технологій:
- Wi-Fi — я використовую наявну мережу для обміну інформацією між пристроєм та програмою;
- Python та його бібліотеки для збору та візуалізації даних;
- штучний інтелект, як інструмент для поєднання всіх цих технологій в одну систему.
Це була довга розмова. Я запустив ChatGPT на смартфоні та говорив голосом, а ШІ мені відповідав, пропонував код, який я з web-версії на комп’ютері одразу вставляв у середовище розробки. Це було дуже схоже на «екстремальне програмування», або навіть мозковий штурм.
Можна сказати, кожен раз я підштовхував AI до саме того варіанту реалізації, який би мене влаштував саме як розробника. Це не було щось на кшталт «Зроби Data Science за три дні» — я знав, чого хочу, тож з кожною реплікою направляв чат саме в потрібному мені напрямку. Ось фрагмент нашої бесіди:
User
Які дані можна зібрати вдома?
ChatGPT
Вдома можна зібрати різноманітні дані, наприклад:Інформація про витрати: рахунки за комунальні послуги, квитанції з магазину, і таке інше.
Записи про фізичну активність: кількість кроків, час тренувань, вага.
Дані про їжу: список продуктів, споживана кількість, калорії.
Результати вимірювань: температура, вологість, якість сну, рівень шуму.
Ці дані можна використовувати для власного аналізу або навіть для створення власних проєктів у галузі Data Science.User
Є такий контролер ESP8266.
ChatGPT
ESP8266 — це популярний контролер з підтримкою Wi-Fi, який часто використовується для розробки проєктів Інтернету речей (IoT). Які саме питання або інформацію ви хочете знати про нього?User
Які дані з його допомогою я можу зібрати?
ChatGPT
За допомогою контролера ESP8266 можна зібрати різні дані з довкілля або пристроїв, які підключені до нього. Наприклад, ви можете збирати дані про температуру, вологість, рівень освітлення, рух або навіть стан різних пристроїв (наприклад, вимикачів, сенсорів руху тощо), які підключені до контролера. Ці дані можна використовувати для моніторингу довкілля, автоматизації різних процесів або для створення різноманітних IoT-проєктів.User
Можна з його допомогою рівень сигналу всіх Wi-Fi точок, які мене оточують, зібрати.
ChatGPT
Так, з контролером ESP8266 можна сканувати навколишні Wi-Fi мережі і збирати інформацію про рівень сигналу, який вони мають. Ця інформація може бути корисною для аналізу якості Wi-Fi покриття в певній області або для інших цілей, таких як оптимізація розташування маршрутизаторів або пошук найкращої доступної мережі.User
Ти можеш згенерувати код для ESP8266, який би відсилав дані по компорту.
ChatGPT
Звичайно! Ось приклад коду для ESP8266, який сканує доступні Wi-Fi мережі та відправляє інформацію про рівень сигналу через Serial порт...User
User
Гаразд, мене влаштовує ця концепція. Тепер дивись, ESP8266 отримує від мого роутера Wi-Fi IP-адресу, яка є статичною і не буде мінятися. Тепер мені треба написати на Python програму, яка буде звертатися до ESP8266 за адресою та отримувати дані, їх записувати у файл...
Додай до програми на Python простий юзер-інтерфейс, де виводяться дані від ESP і лічильник записів.
ChatGPTЗвичайно, ось оновлений код Python з простим користувацьким інтерфейсом, який виводить дані від ESP і лічильник записів..
Далі обговорення дійшло до шматків коду, які з першого разу не виконувались. Я дивився та розбирався, як воно хоча б повинно було працювати, і відправляв чат-боту «правки». Зазначу, що до цього я робив подібні системи, де використовується саме програмно-апаратний комплекс, тому знаю, як повинні обмінюватись інформацією hardware та software-рішення. Внаслідок чотирьох-п’яти ітерацій, було розроблено ось такий фінальний код для ESP8266:
/*
Tech01 simple python WiFi signal logger By Serhii Trush with MIT License.
https://github.com/techn0man1ac/WIFIDataLogger
Thank's ChatGPT for help.
By Tech01 labs 2024.
*/
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <ArduinoJson.h> // ArduinoJson 7.0.4
const char* ssid = "YOUSSID";
const char* password = "YOUPASSWORD";
ESP8266WebServer server(80);
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, 1); // LED off
Serial.begin(115200);
// Connect to Wi-Fi network
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
// Start the web server
server.on("/devices", HTTP_GET, handleDevices);
server.begin();
Serial.println("HTTP server started");
}
void loop() {
server.handleClient();
digitalWrite(LED_BUILTIN, 1); // LED off
}
void handleDevices() {
// Create a dynamic JSON buffer
DynamicJsonDocument jsonBuffer(1024);
// Create a JSON array to store Wi-Fi network information
JsonArray devices = jsonBuffer.createNestedArray("devices");
// Scan Wi-Fi networks
int numNetworks = WiFi.scanNetworks();
// Add information about each device to the JSON array
for (int i = 0; i < numNetworks; i++) {
JsonObject device = devices.createNestedObject();
device["ssid"] = WiFi.SSID(i);
device["rssi"] = WiFi.RSSI(i);
}
digitalWrite(LED_BUILTIN, 0); // LED on
// Send data in JSON format
String response;
serializeJson(jsonBuffer, response);
server.send(200, "application/json", response);
}
Спочатку я просто генерував стрічку, куди записував по черзі SSID та рівень сигналу в циклі. Насамперед тому, що я довго не знав, яку структуру даних обрати. Тому першим варіантом був запис у текстовий файл рівня сигналу та імені точки доступу, типу цього:"ssid",-70,"ssid",80,
"ssid",-74, "ssid",86,
Проте я почав спілкуватись з людьми, котрі мають більше досвіду в роботі з даними, і вони мені порекомендувати записувати дані з timestamp (міткою часу) та у форматі JSON.
Згодом сам ChatGPT на одному з етапів запропонував використати бібліотеку ArduinoJson, яка взяла на себе формування структури даних для передачі їх через GET-запит мережею Wi-Fi.
І це був хороший вибір — питання формування структури даних, щоб потім передати її на сторону комп’ютера, та її опрацювання в Python відпало, бо тут все стандартизовано і є готові та зручні інструменти для роботи з JSON.
Проте я велосипед і справді винайшов, бо під час логування генерую не валідний JSON-файл — він повинен починатись та закінчуватись квадратними дужками, а я так і не придумав, як мені це зробити кожного разу коли починаю нове логування. Тому я попросив ШІ адаптував програму для візуалізації даних під цю особливість.
Software
Спочатку це була програма без інтерфейсу. Працювала вона так: просто прописуєш шлях до файлу, запускаєш і вона посилає GET-запит за прописаною в коді адресою — ШІ згенерував програму точнісінько так, як я йому сказав. Ось так виглядала «гола» програма суто для перевірки ідеї на справність:
import requests def main(): esp8266_ip = "192.168.1.100" # IP-адреса ESP8266 url = f"http://{esp8266_ip}/data" # URL для отримання даних try: response = requests.get(url) if response.status_code == 200: data = response.text with open("data.txt", "a") as file: # Відкриття файлу для додавання даних file.write(data + "\n") # Запис даних на новому рядку print("Дані успішно додано до файлу data.txt") else: print(f"Помилка: {response.status_code}") except Exception as e: print(f"Помилка під час виконання запиту: {e}") if __name__ == "__main__": main()
Так, всього 20 рядків коду, певно за це і люблять Python. Потім я зрозумів, що хочеться трохи зручності, і ми зі штучним інтелектом дійшли до примітивного інтерфейсу — ось так зараз виглядає програма main.py:
Візуалізація даних
Для візуалізації даних у цьому проєкті через visualization.py ми вибрали бібліотеку Matplotlib у сполученні з Tkinter для створення графічного інтерфейсу користувача (GUI).
Matplotlib — це потужна бібліотека для створення графіків та діаграм у Python, яка надає широкі можливості для відображення різноманітних типів даних. Вибір Matplotlib був зумовлений його простотою використання, багатим набором функцій та можливістю створювати високоякісні графіки.
Tkinter був обраний для створення GUI через свою простоту та вбудовану підтримку Python. Він дозволяє швидко створювати вікна, кнопки та інші елементи інтерфейсу, що дозволяє зосередитися на функціональності програми, не витрачаючи багато часу на розробку інтерфейсу.
Резюме проєкту
Отримані графіки — це саме те, що я хотів бачити з самого початку. А дані я продовжую накопичувати — можливо, вони мені знадобляться для якихось інших цілей, наприклад, захочу оптимізувати розташування роутера для якіснішого сигналу у всьому домі.
Проєкт реалізований у форматі опенсорс з використанням ліцензії MIT, що дозволяє іншим робити свій внесок у розвиток програми, або під’єднати ChatGPT для розвитку проєкту. Крім того, для розробки були використані виключно безкоштовні інструменти, чим я підкреслюю доступність та широкі можливості цих технологій для всіх охочих.
WIFIDataLogger — це мій перший досвід, коли я 90% роботи віддаю саме штучному інтелекту. Розкажіть про свій досвід, коли ШІ став не просто помічником, а повноцінним співавтором проєкту, у коментарях.
32 коментарі
Додати коментар Підписатись на коментаріВідписатись від коментарів