2025-04-05 15:33:40
# ESP32-S3-Zero отправляет 4 аналоговых входа и получает комманду что включить/выключить
import supervisor
import wifi
import socketpool
import time
import os
import analogio
import board
import adafruit_requests as requests
import digitalio
server_ip = "172.104.137.172"
# Список сетей
networks = [
{"ssid": 'Ы_32', "password": '***'},
{"ssid": 'mi5', "password": '***'},
{"ssid": 'prg', "password": '***'},
]
# URL для GET-запроса
HTTP_URL = "http://prg.in.ua/ard/ard-get.php?id=1&get={}" # Форматированная строка
# Определение пинов для цифровых выходов
d10_pin = board.D10 # Замените на фактический пин
d11_pin = board.D11 # Замените на фактический пин
d12_pin = board.D12 # Замените на фактический пин
d5_pin = board.D5 # Замените на фактический пин
# Инициализация цифровых выходов
d10 = digitalio.DigitalInOut(d10_pin)
d10.direction = digitalio.Direction.OUTPUT
d11 = digitalio.DigitalInOut(d11_pin)
d11.direction = digitalio.Direction.OUTPUT
d12 = digitalio.DigitalInOut(d12_pin)
d12.direction = digitalio.Direction.OUTPUT
d5 = digitalio.DigitalInOut(d5_pin)
d5.direction = digitalio.Direction.OUTPUT
def reset_all_outputs():
"""Сбрасывает все цифровые выходы в состояние 0."""
d10.value = False
d11.value = False
d12.value = False
d5.value = False
print("All digital outputs have been reset to 0.")
def scan_available_networks():
"""Сканирует доступные сети."""
available_networks = []
for network in wifi.radio.start_scanning_networks():
available_networks.append(network)
wifi.radio.stop_scanning_networks()
return available_networks
def connect_to_wifi(ssid, password):
"""Подключается к Wi-Fi."""
try:
print(f"Trying to connect to {ssid}...")
wifi.radio.connect(ssid, password)
print(f"Connected to {ssid}.")
print(f"IP address: {wifi.radio.ipv4_address}")
return True
except ConnectionError as e:
print(f"Connection error for {ssid}: {e}")
except Exception as e:
print(f"Unexpected error connecting to {ssid}: {e}")
return False
def ping_server(pool, server_ip):
"""Пингует сервер и возвращает время пинга в миллисекундах."""
try:
start_time = time.monotonic()
socket = pool.socket()
socket.connect((server_ip, 53)) # DNS порт для проверки подключения
socket.close()
end_time = time.monotonic()
ping_time_ms = (end_time - start_time) * 1000
print(f"Ping to {server_ip} successful. Time: {ping_time_ms:.2f} ms")
return True, ping_time_ms
except Exception as e:
print(f"Error pinging {server_ip}: {e}")
return False, None
def get_voltage(pin):
"""Преобразует значение аналогового входа в напряжение."""
return (pin.value * 3.3) / 65536
def set_digital_outputs(response_text):
"""Устанавливает уровни на цифровых выходах на основе ответа сервера."""
try:
start_index = response_text.find("out,") + 4
output_values = response_text[start_index:]
d10_value = int(output_values[output_values.find("d10=") + 4])
d11_value = int(output_values[output_values.find("d11=") + 4])
d12_value = int(output_values[output_values.find("d12=") + 4])
d5_value = int(output_values[output_values.find("d5=") + 3])
d10.value = bool(d10_value)
d11.value = bool(d11_value)
d12.value = bool(d12_value)
d5.value = bool(d5_value)
print(f"d10 set to: {d10_value}")
print(f"d11 set to: {d11_value}")
print(f"d12 set to: {d12_value}")
print(f"d5 set to: {d5_value}")
except Exception as e:
print(f"Error parsing output values: {e}")
def main():
# Инициализация аналоговых входов
analog_in_a0 = analogio.AnalogIn(board.A0)
analog_in_a1 = analogio.AnalogIn(board.A1)
analog_in_a2 = analogio.AnalogIn(board.A2)
analog_in_a3 = analogio.AnalogIn(board.A3)
while True:
available_networks = scan_available_networks()
connected = False
# Проверяем доступность сетей
for network in networks:
if any(net.ssid == network["ssid"] for net in available_networks):
print(f"Network {network['ssid']} is available. Attempting to connect...")
if connect_to_wifi(network["ssid"], network["password"]):
pool = socketpool.SocketPool(wifi.radio)
print(f"Using network: {network['ssid']}, IP: {wifi.radio.ipv4_address}")
session = None
while True:
try:
if session is None:
session = requests.Session(pool)
reachable, ping_time = ping_server(pool, server_ip)
if reachable:
print(f"Server {server_ip} is reachable. Ping time: {ping_time:.2f} ms")
# Получите значения с аналоговых входов
voltage_a0 = get_voltage(analog_in_a0)
voltage_a1 = get_voltage(analog_in_a1)
voltage_a2 = get_voltage(analog_in_a2)
voltage_a3 = get_voltage(analog_in_a3)
print("A0 Voltage:", voltage_a0)
print("A1 Voltage:", voltage_a1)
print("A2 Voltage:", voltage_a2)
print("A3 Voltage:", voltage_a3)
# Сформируйте URL с значениями всех аналоговых входов
url = HTTP_URL.format(f"{voltage_a0},{voltage_a1},{voltage_a2},{voltage_a3}")
print("Sending:", url)
# Отправьте GET-запрос
try:
response = session.get(url)
print("Response:", response.status_code, response.text) # Выведите статус и содержимое ответа
# Установите цифровые выходы
set_digital_outputs(response.text)
response.close() # Закройте соединение
except Exception as e:
print("Error sending request:", e)
session = None # Перезапустите сессию при ошибке
else:
print(f"Server {server_ip} is not reachable. Switching to next network.")
break
connected = True
time.sleep(10) # Ждите 10 секунд
except Exception as e:
print(f"Unexpected error: {e}")
session = None # Перезапустите сессию при ошибке
break
else:
print(f"Failed to connect to {network['ssid']}. Trying next network...")
continue
else:
print(f"{network['ssid']} not available.")
# Если ни одна сеть не доступна
if not connected:
print("No available networks. Resetting all digital outputs to 0.")
reset_all_outputs()
print("Trying again in 5 seconds.")
time.sleep(5)
while True:
main()
"""
в облаке
<?php
ini_set('date.timezone', 'UTC');
$today = date("Y-m-d,H-i-s,");
if (isset($_GET['get']) and isset($_GET['id'])){
if ($_GET['id']=='1'){
file_put_contents('get.txt', $today.$_GET['get'] . PHP_EOL, FILE_APPEND);
echo ':in,'.$today.$_GET['get'].":out,d10=0,d11=0,d12=0,d5=1 \n";
}
}
"""
Back to list