陆续更新
红外发射模块
踩坑:
1、未理解:38K红外原理
学习:38K红外通信原理_vs1838b红外接收头工作原理-优快云博客
2、红外发射模块功率不足:产品设计问题
解决方案:1、放近一点(2-3cm);2、板件改造(详见b站视频)
import machine
import time
# 定义GPIO引脚
ir_pin = machine.Pin(4, machine.Pin.OUT)
# 定义38kHz的载波频率
carrier_frequency = 38000
# 计算每个周期的时间(单位:秒)
period = 1.0 / carrier_frequency
# 计算高电平和低电平的时间(单位:秒)
half_period = period / 2
# 定义发送红外信号的方法
def send_ir_signal(pulse_times):
for idx,pulse_time in enumerate(pulse_times):
#print(pulse_time)
if idx%2 ==0:
# 打开红外LED
end_time = time.ticks_add(time.ticks_us(), pulse_time)
while time.ticks_diff(end_time, time.ticks_us()) > 0:
ir_pin.on()
time.sleep_us(int(half_period * 1e6))
ir_pin.off()
time.sleep_us(int(half_period * 1e6))
else:
# 信号间隔
end_time = time.ticks_add(time.ticks_us(), pulse_time)
while time.ticks_diff(end_time, time.ticks_us()) > 0:
time.sleep_us(int(half_period * 1e6))
time.sleep_us(int(half_period * 1e6))
time.sleep_us(1000)
pulse_times_list = []
# 示例:发送红外信号(注意,这里pulse_times需要根据你实际的编码方案来设置)
pulse_times_list.append([2406,3324,470,1215,1288,420,1285,398,416,1246,1307,377,1308,373,1282,427,1304,386,1278,398,1258,404,464,1218,441,1245,463,1221,1307,400,1284,399,414,1250,460,6910,2514,3330,464,1219,1307,377,1305,403,441,1218,1301,387,1301,381,1302,380,1303,402,1283,400,1281,403,415,1245,463,1223,465,1218,1311,398,1281,402,444,1221,456,6912,2537,3305,466,1220,1306,400,1280,404,438,1223,1304,402,1277,385,1301,380,1300,385,1298,383,1300,383,459,1225,460,1224,460,1225,1304,379,1302,381,461,1220,461])
for pulse_times in pulse_times_list:
print("发送红外信号...")
print(pulse_times)
send_ir_signal(pulse_times)
time.sleep(1)
红外接受模块
踩坑:
1、在irq中断回调函数中进行时间长度计算,导致偏差太多。
优化方案:中断回调函数中仅记录,每个1秒进行计算。
# 捕获脉冲模块
def capture_ir_signal_handler(pin):
global pulse_times
# 记录时间戳
current_time = time.ticks_us()
# 存储时间戳
pulse_times.append(current_time)
#计算脉冲模块
def calculate_pulse_times():
global pulse_times
# 计算每个脉冲的持续时间
durations = []
for i in range(1, len(pulse_times)):
durations.append(time.ticks_diff(pulse_times[i], pulse_times[i-1]))
return durations
# 存储捕获到的脉冲时间
pulse_times = []
led = machine.Pin(2, machine.Pin.OUT)
irRecv = machine.Pin(16, machine.Pin.IN, machine.Pin.PULL_UP)
irRecv.irq(trigger=machine.Pin.IRQ_RISING | machine.Pin.IRQ_FALLING, handler=capture_ir_signal_handler)
if __name__ == '__main__':
for i in range(10*60):
print("new task")
led.on()
time.sleep(1)
led.off()
time.sleep(1)
durations=calculate_pulse_times()
if len(durations)>0:
send_msg_text=",".join([str(x) for x in durations])
print(send_msg_text)
pulse_times.clear()