76 lines
2.7 KiB
Python
76 lines
2.7 KiB
Python
from machine import Pin, PWM
|
|
import time
|
|
import json
|
|
|
|
TRANSMIT_PIN = 19
|
|
CARRIER_FREQ = 38000 # Гц, стандартная несущая для большинства ИК-пультов
|
|
DUTY = 33 # % заполнения (обычно 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)
|