TrashNotes

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


}

"""
← Previous Next →
Back to list