前言上一篇文章分析了美的空调 R05D 红外协议原理,接下来将通过 STM32 单片机编程实现空调控制。代码初始化 PWM将红外发射管接在 PA1 引脚上,使用 TIM2 时钟控制 PWM 波形,输出 38kHz 载波。通过分频和自动重装载值设定,得出 PWM 波形频率为 72MHz / 19(预分频)/ 101(计数次数)≈ 38kHz。void PWM_Init(void) { // 38kHz 初始化 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPI
背景通常情况下红外遥控采用NEC协议传输数据,而美的空调采用 R05D 协议,因此一般的红外发射模块无法对空调进行控制。本文将对美的空调 R05D 协议展开分析,并通过 STM32 单片机进行红外遥控。R05D 红外协议原理1.编码格式编码格式为 L A A' B B' C C' S L A A' B B' C C'2.L S A B C 字母说明L 为引导码,S 为分隔码,A 为识别码 (一般为 10110010 = 0xB2,预留方案 10110111 = 0xB7),A' 为 A 的反码,B' 为 B 的反码,C' 为 C 的反码3.帧第一帧和第二帧相同,二者之间有一个分隔码 S4.长度A B C 长度均为 8 位,故一帧长度为 48 位(不包含 L S)5.发送顺序高位先发,即 MSB 在先,LSB 在后6.B、C 含义如下表所示:BB7 B6 B5B4 B3 B2 B1 B0风速1 1 1 1 1CC7 C6
背景最近在研究红外收发,0/1信号延迟需要达到微秒级,而 time.sleep() 达不到这么高的精度,好在 time.time() 时间戳可以实现微秒级别,故采用此方式。代码原理非常简单,只是做个记录。def delay_us(t): start, end = 0, 0 start = time.time() offset = 10 t = (t - offset) / 1000000 while end - start < t: end = time.time()说明: offset 为修正值,根据实际情况修改。验证以延迟 30us 为例:注意事项仅 Linux 有效,Windows 下延迟最低 1000us,无法正常使用。
本篇文章是对之前的补充。开启密码验证编辑配置文件:vim /etc/mosquitto/mosquitto.conf将 allow_anonymous 设置为 false,禁止匿名登录。指定密码存储文件:password_file /etc/mosquitto/pwfile保存配置,随后创建密码存储文件。touch /etc/mosquitto/pwfile接下来添加一个用户。mosquitto_passwd -b /etc/mosquitto/pwfile 用户名 密码重启 mosquitto 服务。systemctl restart mosquitto使用TLS加密进入 /etc/mosquitto 目录。cd /etc/mosquitto创建一个名为 key 的文件夹,用于存储证书。mkdir key cd key生成 CA 的证书和密钥:生成 CA 密钥openssl genrsa -des3 -out ca.key 2048这里需要设置密码,请牢记,该命令将生成 ca.key 文件。生成 CA 证书openssl req -new -x509 -days 3650 -key
最近开发的项目中需要实现线程的暂停与恢复,但 Python 的 threading 模块并没有提供相关功能,看了一遍网上给出的例子,几乎都是用标志位显现,类似于:while flag: time.sleep(1) ...此方式并不能实现随时暂停随时恢复,只能是程序运行到这个代码块时才有效,同时在 while 循环里面延时,不是很简洁高效。于是从谷歌上找到了完美的解决方案,不需要标志位就能实现,代码如下:import ctypes from threading import Thread as _Thread class Thread(_Thread): def __init__(self, target = None, args = (), kwargs = None, name = ""): _Thread.__init__(self, target = target, args = args, kwargs = kwargs, name = name) self.kernel32 = ctypes.windll.
Scott Sloan