Загрузка данных
import tkinter as tk
import serial
import sqlite3
import threading
from datetime import datetime
ser = serial.Serial('COM3', 9600)
conn = sqlite3.connect('sensor_data.db', check_same_thread=False)
cursor = conn.cursor()
cursor.execute('''
CREATE TABLE IF NOT EXISTS temps (
id INTEGER PRIMARY KEY AUTOINCREMENT,
time TEXT,
temp REAL,
hum REAL
)
''')
conn.commit()
auto_mode = False
def read_serial():
while True:
try:
data = ser.readline().decode().strip()
if data and ',' in data:
t, h = data.split(',')
temp_label.config(text=t + "C")
hum_label.config(text=h + "%")
now = datetime.now().strftime("%H:%M:%S")
cursor.execute("INSERT INTO temps (time, temp, hum) VALUES (?, ?, ?)", (now, float(t), float(h)))
conn.commit()
except:
pass
def send(c):
ser.write(c.encode())
def switch_mode():
global auto_mode
auto_mode = not auto_mode
if auto_mode:
mode_btn.config(text="АВТОМАТ")
send('A')
else:
mode_btn.config(text="РУЧНОЙ")
send('M')
def show_instruction():
instr_win = tk.Toplevel(root)
instr_win.title("Добавление датчика")
instr_win.geometry("450x500")
instr_win.configure(bg="#2c3e50")
instruction = """
УНИВЕРСАЛЬНАЯ ИНСТРУКЦИЯ ПО ДОБАВЛЕНИЮ ЛЮБОГО ДАТЧИКА:
ШАГ 1: ФИЗИЧЕСКОЕ ПОДКЛЮЧЕНИЕ
---------------------------------------
- Найди пин DATA (сигнальный) у датчика
- Подключи VCC датчика → 5V Arduino
- Подключи GND датчика → GND Arduino
- Подключи DATA датчика → любой цифровой пин (2-13)
ШАГ 2: УСТАНОВКА БИБЛИОТЕКИ
---------------------------------------
- Arduino IDE: Инструменты → Управлять библиотеками
- Найди и установи библиотеку для ТВОЕГО датчика
- Примеры: DHT, OneWire, DallasTemperature, BMP280 и т.д.
ШАГ 3: КОД ДЛЯ ARDUINO (ДОБАВЬ В СВОЙ СКЕТЧ)
---------------------------------------
void setup() {
Serial.begin(9600);
// ИНИЦИАЛИЗАЦИЯ ТВОЕГО ДАТЧИКА
}
void loop() {
// ЧТЕНИЕ ДАННЫХ С ДАТЧИКА
float value1 = твой_датчик.readData();
float value2 = твой_датчик.readOther();
// ОТПРАВКА В СЕРИАЛ (ФОРМАТ: ЗНАЧЕНИЕ1,ЗНАЧЕНИЕ2)
Serial.print(value1);
Serial.print(",");
Serial.println(value2);
delay(1000);
}
ШАГ 4: НАСТРОЙКА ЭТОЙ ПРОГРАММЫ
---------------------------------------
- Отредактируй функцию read_serial() ниже
- Поменяй переменные t и h на свои данные
ШАГ 5: ПРОВЕРКА
---------------------------------------
- Загрузи код в Arduino
- Нажми кнопку "АВТОМАТ"
- Если данные появятся на экране - датчик работает
"""
label = tk.Label(instr_win, text=instruction, fg="white", bg="#2c3e50",
font=("Arial", 10), justify=tk.LEFT)
label.pack(padx=20, pady=20)
btn_close = tk.Button(instr_win, text="ПОНЯЛ", command=instr_win.destroy,
bg="#27ae60", fg="white", width=20)
btn_close.pack(pady=10)
root = tk.Tk()
root.title("CyberSteer AI")
root.geometry("400x520")
root.configure(bg="#2c3e50")
temp_label = tk.Label(root, text="--C", fg="white", bg="#2c3e50", font=("Arial", 14))
temp_label.pack(pady=(10,0))
hum_label = tk.Label(root, text="--%", fg="white", bg="#2c3e50", font=("Arial", 14))
hum_label.pack(pady=(0,5))
add_btn = tk.Button(root, text="➕ ДОБАВИТЬ УСТРОЙСТВО", command=show_instruction,
bg="#f39c12", fg="white", font=("Arial", 10), height=1, width=25)
add_btn.pack(pady=5)
img_u = tk.PhotoImage(file="up.png")
img_d = tk.PhotoImage(file="down.png")
img_l = tk.PhotoImage(file="left.png")
img_r = tk.PhotoImage(file="right.png")
fr = tk.Frame(root, bg="#2c3e50")
fr.pack(expand=True)
mode_btn = tk.Button(fr, text="РУЧНОЙ", command=switch_mode, width=20, height=2)
mode_btn.grid(row=3, column=1, pady=20)
b_f = tk.Button(fr, image=img_u, text="Вперед", compound=tk.LEFT, width=100, height=50)
b_b = tk.Button(fr, image=img_d, text="Назад", compound=tk.LEFT, width=100, height=50)
b_l = tk.Button(fr, image=img_l, text="Влево", compound=tk.LEFT, width=100, height=50)
b_r = tk.Button(fr, image=img_r, text="Вправо", compound=tk.LEFT, width=100, height=50)
b_f.grid(row=0, column=1, pady=10, padx=10)
b_l.grid(row=1, column=0, pady=10, padx=10)
b_r.grid(row=1, column=2, pady=10, padx=10)
b_b.grid(row=2, column=1, pady=10, padx=10)
b_f.bind("<ButtonPress-1>", lambda e: send('F'))
b_f.bind("<ButtonRelease-1>", lambda e: send('S'))
b_b.bind("<ButtonPress-1>", lambda e: send('B'))
b_b.bind("<ButtonRelease-1>", lambda e: send('S'))
b_r.bind("<ButtonPress-1>", lambda e: send('R'))
b_r.bind("<ButtonRelease-1>", lambda e: send('S'))
b_l.bind("<ButtonPress-1>", lambda e: send('L'))
b_l.bind("<ButtonRelease-1>", lambda e: send('S'))
thread = threading.Thread(target=read_serial, daemon=True)
thread.start()
root.mainloop()