Files
2026-08-18 17:56:40 +05:00

76 lines
2.7 KiB
Python

from machine import Pin, PWM
import time
import json
TRANSMIT_PIN = 19
CARRIER_FREQ = 38000 # Гц, стандартная несущая для большинства ИК-пультов
DUTY = 50 # % заполнения (обычно 30-50% для ИК-светодиода)
def _send_timings(pwm, pin, timings):
"""
Воспроизводит список таймингов (в мкс).
Чётные индексы (0, 2, 4...) - импульсы (несущая включена),
нечётные индексы (1, 3, 5...) - паузы (несущая выключена).
"""
for i, duration in enumerate(timings):
if i % 2 == 0:
# импульс: включаем несущую 38кГц
pwm.duty_u16(int(65535 * DUTY / 100))
else:
# пауза: несущая выключена
pwm.duty_u16(0)
time.sleep_us(duration)
# на всякий случай гарантированно выключаем несущую в конце
pwm.duty_u16(0)
def transmit_raw(timings, pin_num=TRANSMIT_PIN, freq=CARRIER_FREQ):
"""
Передаёт сырые тайминги ИК-сигнала через ИК-светодиод на pin_num.
"""
pin = Pin(pin_num, Pin.OUT)
pwm = PWM(pin)
pwm.freq(freq)
pwm.duty_u16(0)
try:
_send_timings(pwm, pin, timings)
finally:
pwm.duty_u16(0)
pwm.deinit()
def send_code(name, filename="codes.json", pin_num=TRANSMIT_PIN, freq=CARRIER_FREQ):
"""
Загружает сохранённый код по имени из codes.json и передаёт его.
"""
try:
with open(filename, "r") as f:
codes = json.load(f)
except OSError:
print("Файл кодов не найден")
return
if name not in codes:
print(f"Код '{name}' не найден. Доступные коды: {list(codes.keys())}")
return
timings = codes[name]
print(f"Передача '{name}' ({len(timings)} импульсов)...")
transmit_raw(timings, pin_num, freq)
print("Готово")
def send_code_repeat(name, times=1, delay_ms=50, filename="codes.json",
pin_num=TRANSMIT_PIN, freq=CARRIER_FREQ):
"""
Передаёт код несколько раз подряд с задержкой между повторами.
Полезно, если пульт нормально распознаётся только с нескольких попыток.
"""
for i in range(times):
send_code(name, filename, pin_num, freq)
if i < times - 1:
time.sleep_ms(delay_ms)