Загрузка данных


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()