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";
}

}

"""

[file-name 000090_2025-04-05_15-33-40.txt]