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)