68 lines
2.1 KiB
Python
68 lines
2.1 KiB
Python
from machine import Pin
|
|
import time
|
|
import json
|
|
|
|
RECV_PIN = 20
|
|
|
|
|
|
def capture_raw(pin_num=RECV_PIN, timeout_ms=5000, idle_us=8000):
|
|
"""
|
|
Захватывает тайминги ИК-сигнала.
|
|
timeout_ms - сколько ждать начала сигнала
|
|
idle_us - через сколько мкс тишины считать сигнал законченным
|
|
"""
|
|
pin = Pin(pin_num, Pin.IN, Pin.PULL_UP)
|
|
timings = []
|
|
|
|
print("Ожидание сигнала... наведите пульт и нажмите кнопку")
|
|
|
|
# Ждём начала сигнала (первый переход в 0, т.к. сигнал инвертирован)
|
|
start_wait = time.ticks_ms()
|
|
while pin.value() == 1:
|
|
if time.ticks_diff(time.ticks_ms(), start_wait) > timeout_ms:
|
|
print("Таймаут, сигнал не обнаружен")
|
|
return []
|
|
|
|
last_state = pin.value()
|
|
last_time = time.ticks_us()
|
|
|
|
while True:
|
|
state = pin.value()
|
|
now = time.ticks_us()
|
|
|
|
if state != last_state:
|
|
duration = time.ticks_diff(now, last_time)
|
|
timings.append(duration)
|
|
last_time = now
|
|
last_state = state
|
|
|
|
# если долго нет изменений и мы в состоянии "покоя" (1) - сигнал закончился
|
|
if state == 1 and time.ticks_diff(now, last_time) > idle_us:
|
|
break
|
|
|
|
print(f"Захвачено {len(timings)} импульсов")
|
|
return timings
|
|
|
|
|
|
def save_code(name, timings, filename="codes.json"):
|
|
try:
|
|
with open(filename, "r") as f:
|
|
codes = json.load(f)
|
|
except OSError:
|
|
codes = {}
|
|
|
|
codes[name] = timings
|
|
with open(filename, "w") as f:
|
|
json.dump(codes, f)
|
|
print(f"Сохранено: '{name}' ({len(timings)} импульсов)")
|
|
|
|
|
|
def list_codes(filename="codes.json"):
|
|
try:
|
|
with open(filename, "r") as f:
|
|
codes = json.load(f)
|
|
for name, timings in codes.items():
|
|
print(f"{name}: {len(timings)} импульсов")
|
|
except OSError:
|
|
print("Файл кодов пока пуст")
|