TrashNotes

2025-04-12 07:37:31
#ok #ETH2040 connect (функциональный аналог wifi-uqu-get-tm-time.py )
#Adafruit CircuitPython 10.0.0-alpha.2 on 2025-04-04; W5100S-EVB-Pico with rp2040
#Board ID:wiznet_w5100s_evb_pico
Данный код написан на CircuitPython и предназначен для работы с микроконтроллером RP2040 на плате W5100S-EVB-Pico. Он обеспечивает подключение к Ethernet, отправку HTTP-запросов и управление цифровыми выходами на основе ответа сервера. Ниже приведен анализ кода:

Обзор функциональности
Ethernet и HTTP: Код инициализирует Ethernet-интерфейс с помощью библиотеки adafruit_wiznet5k и создает HTTP-сессию для отправки GET-запросов на сервер.

Аналоговые входы: Читает значения с аналоговых входов A0, A1 и A2 и включает их в URL для отправки на сервер.

Цифровые выходы: Управляет шестью цифровыми выходами (D1-D6) на основе ответа сервера.

TM1637 дисплей: Использует дисплей TM1637 для отображения времени запроса или часов, полученных с сервера.

Основные функции
initialize_ethernet(): Инициализирует Ethernet-интерфейс и выводит информацию о версии чипа, MAC-адресе и IP-адресе.

send_http_request(): Отправляет GET-запрос на сервер с данными аналоговых входов и обрабатывает ответ.

process_server_response(response_text): Парсит ответ сервера и управляет цифровыми выходами.

display_time_on_tm1637(request_time_ms): Отображает время запроса на дисплее TM1637.

$ cat eth-uqu-get-tm-time.py 

import board
import busio
import digitalio
import adafruit_connection_manager
import adafruit_requests
from adafruit_wiznet5k.adafruit_wiznet5k import WIZNET5K
import time
import analogio
import TM1637  # https://github.com/bablokb/circuitpython-tm1637

# Настройка TM1637
display = TM1637.TM1637(board.GP7, board.GP8)  # clk, dio
display.brightness(1)
display.show("8888")  # Очищаем экран при старте

# Глобальные переменные
eth = None  # Ethernet интерфейс
session = None  # HTTP-сессия

# URL для GET-запроса
HTTP_URL = "http://ur4uqu.com/esp32/get.php?id=1&;get={}"  # Форматированная строка

# Инициализация аналоговых входов
analog_in_a0 = analogio.AnalogIn(board.A0)
analog_in_a1 = analogio.AnalogIn(board.A1)
analog_in_a2 = analogio.AnalogIn(board.A2)

# Определение пинов для цифровых выходов
d1_pin = board.GP10  # Замените на фактический пин
d2_pin = board.GP11  # Замените на фактический пин
d3_pin = board.GP12  # Замените на фактический пин
d4_pin = board.GP13  # Замените на фактический пин
d5_pin = board.GP14  # Замените на фактический пин
d6_pin = board.GP15  # Замените на фактический пин

# Инициализация цифровых выходов
d1 = digitalio.DigitalInOut(d1_pin)
d1.direction = digitalio.Direction.OUTPUT
d2 = digitalio.DigitalInOut(d2_pin)
d2.direction = digitalio.Direction.OUTPUT
d3 = digitalio.DigitalInOut(d3_pin)
d3.direction = digitalio.Direction.OUTPUT
d4 = digitalio.DigitalInOut(d4_pin)
d4.direction = digitalio.Direction.OUTPUT
d5 = digitalio.DigitalInOut(d5_pin)
d5.direction = digitalio.Direction.OUTPUT
d6 = digitalio.DigitalInOut(d6_pin)
d6.direction = digitalio.Direction.OUTPUT

def reset_all_outputs():
    """Сбрасывает все цифровые выходы в состояние 0."""
    d1.value = False
    d2.value = False
    d3.value = False
    d4.value = False
    d5.value = False
    d6.value = False
    print("All digital outputs have been reset to 0.")

def initialize_ethernet():
    """Инициализирует Ethernet-интерфейс."""
    global eth
    try:
        print("Initializing Ethernet...")
        cs = digitalio.DigitalInOut(board.GP17)
        spi_bus = busio.SPI(board.GP18, MOSI=board.GP19, MISO=board.GP16)

        # Initialize ethernet interface with DHCP
        eth = WIZNET5K(spi_bus, cs)

        print("Chip Version:", eth.chip)
        print("MAC Address:", [hex(i) for i in eth.mac_address])
        print("My IP address is:", eth.pretty_ip(eth.ip_address))
        return True
    except Exception as e:
        print(f"Ethernet initialization failed: {e}")
        return False

def send_http_request():
    """Отправляет HTTP-запрос и обрабатывает ответ."""
    global session
    if not session:
        print("HTTP session not initialized. Cannot send request.")
        return

    try:
        # Получаем значения с аналоговых входов
        a0_value = analog_in_a0.value
        a1_value = analog_in_a1.value
        a2_value = analog_in_a2.value
        print(f"Analog inputs: A0={a0_value}, A1={a1_value}, A2={a2_value}")
        
        # Формируем URL с данными для отправки
        url = HTTP_URL.format(f"{a0_value},{a1_value},{a2_value}")
        print(f"Sending request to: {url}")

        display.show("8888")

        # Отправляем GET-запрос
        start_time = time.monotonic()
        response = session.get(url)
        end_time = time.monotonic()
        request_time_ms = (end_time - start_time) * 1000
        print(f"HTTP request successful. Time: {request_time_ms:.2f} ms")
        print(f"Response: {response.status_code}, {response.text}")
        
        # Обработка ответа сервера
        process_server_response(response.text)
        response.close()  # Закрываем соединение
        
        # Выводим время запроса на TM1637
        display_time_on_tm1637(request_time_ms)
    except Exception as e:
        print(f"Error sending HTTP request: {e}")
        reset_all_outputs()
        display.show("ERR ")  # Показываем ошибку на дисплее

def process_server_response(response_text):
    """Обрабатывает ответ сервера."""
    try:
        # Парсим ответ сервера (например, ":in,2025-04-09,20-13-52,34852,37315,52149,15331:out,d1=1,d2=1,d3=0,d4=1")
        parts = response_text.split(":")
        input_part = parts[1]  # Часть с входными данными
        output_part = parts[2]  # Часть с выходными данными
        
        # Обрабатываем входные данные (время)
        time_str_full = input_part.split(",")[2]  # Извлекаем "20-13-52"
        time_str = time_str_full.replace("-", "")[:4]  # Убираем дефисы и берём первые 4 символа ("2013")
        display.show(time_str)  # Выводим время на дисплей
        
        # Обрабатываем выходные данные (управление светодиодами)
        d1_value = int(output_part.split(",")[1].split("=")[1])
        d2_value = int(output_part.split(",")[2].split("=")[1])
        d3_value = int(output_part.split(",")[3].split("=")[1])
        d4_value = int(output_part.split(",")[4].split("=")[1])
        d5_value = int(output_part.split(",")[5].split("=")[1])
        d6_value = int(output_part.split(",")[6].split("=")[1])
        
        d1.value = bool(d1_value)
        d2.value = bool(d2_value)
        d3.value = bool(d3_value)
        d4.value = bool(d4_value)
        d5.value = bool(d5_value)
        d6.value = bool(d6_value)
        
        print(f"set to: {d1_value} {d2_value} {d3_value} {d4_value} {d5_value} {d6_value} \n")
    except Exception as e:
        print(f"Error parsing server response: {e}")

def display_time_on_tm1637(request_time_ms):
    """
    Отображает время запроса на TM1637.
    Формат: XXXX (миллисекунды, до 4 цифр).
    Если значение больше 9999, отображается "MAX".
    """
    if request_time_ms > 9999:
        display.show("MAX ")
    else:
        # Форматируем время запроса как целое число
        request_str = f"{int(request_time_ms):04}"
        display.show(request_str)

def main():
    """Основная функция программы."""
    global session
    if not initialize_ethernet():
        print("Failed to initialize Ethernet. Exiting...")
        return

    # Создаем HTTP-сессию
    pool = adafruit_connection_manager.get_radio_socketpool(eth)
    ssl_context = adafruit_connection_manager.get_radio_ssl_context(eth)
    session = adafruit_requests.Session(pool, ssl_context)

    while True:
        send_http_request()
        time.sleep(10)  # Отправляем запрос каждые 10 секунд

# Запуск программы
main()
← Previous Next →
Back to list