78 lines
2.5 KiB
Python
78 lines
2.5 KiB
Python
#pip install pymodbus flask
|
||
#pip install pymodbus==2.5.3
|
||
#python d:\Антоше\Универ\Гит\Software_and_hardware\Версия_1.0\Server.py
|
||
|
||
|
||
|
||
import serial
|
||
from pymodbus.client.sync import ModbusSerialClient as ModbusClient
|
||
from flask import Flask, render_template
|
||
import serial.tools.list_ports
|
||
import time
|
||
|
||
app = Flask(__name__)
|
||
|
||
# Настройка Modbus
|
||
def find_arduino_port():
|
||
ports = list(serial.tools.list_ports.comports())
|
||
for port in ports:
|
||
if "Arduino" in port.description or "CH340" in port.description:
|
||
return port.device
|
||
return None
|
||
|
||
# Поиск порта Arduino
|
||
arduino_port = find_arduino_port()
|
||
|
||
if arduino_port is None:
|
||
print("Arduino не подключено или не найдено")
|
||
else:
|
||
print(f"Подключено к порту: {arduino_port}")
|
||
|
||
# Настройка клиента Modbus
|
||
modbus_client = ModbusClient(method='rtu', port=arduino_port, baudrate=9600)
|
||
modbus_client.connect()
|
||
|
||
# Состояние пина (будет обновляться через Modbus)
|
||
modbus_register = 0 # Регистор Modbus для состояния пина
|
||
|
||
# Функция для вывода состояния пина в консоль
|
||
def print_pin_state():
|
||
result = modbus_client.read_holding_registers(modbus_register, 1, unit=1)
|
||
if result.isError():
|
||
print("Ошибка чтения состояния")
|
||
return
|
||
|
||
# Состояние пина: 0 - OFF, 1 - ON
|
||
state = result.registers[0]
|
||
print(f"Состояние пина: {'Включен' if state == 1 else 'Выключен'}")
|
||
|
||
# Обновление состояния пина каждую секунду
|
||
def update_state_periodically():
|
||
while True:
|
||
print_pin_state()
|
||
time.sleep(1)
|
||
|
||
# Запуск обновления состояния в фоновом режиме
|
||
import threading
|
||
state_thread = threading.Thread(target=update_state_periodically)
|
||
state_thread.daemon = True
|
||
state_thread.start()
|
||
|
||
@app.route('/')
|
||
def index():
|
||
return render_template('index.html', arduino_port=arduino_port)
|
||
|
||
@app.route('/state')
|
||
def get_state():
|
||
# Чтение состояния пина через Modbus
|
||
result = modbus_client.read_holding_registers(modbus_register, 1, unit=1)
|
||
if result.isError():
|
||
return "Ошибка чтения состояния", 500
|
||
|
||
# Состояние пина: 0 - OFF, 1 - ON
|
||
state = result.registers[0]
|
||
return str(state)
|
||
|
||
if __name__ == '__main__':
|
||
app.run(debug=True)
|