感谢 DFRobot 提供的自发电无线开关试用(TEL0146)。这个开关和其他模块最大的差别在于:它本身无需外部供电即可工作。基本原理是:在按下开关的时候,按键会推动磁铁在线圈中发电,虽然能量很小但是足以让CMT2156B这个OOK编码发射芯片进行工作(这个模块使用了CMT2156B芯片,它 是一款针对微能量收集并进行发射的单芯片,内嵌可配置编码的高性能OOK 射频发射器,支持240 至960 MHz 的能量收集无线发射的应用。该芯片集成的编码器兼容市面上最常用的527、1527、2262 和2240 等编码格式,还支持用户各种自定义编码)。这样就能够设计出完全不需要外部供电和电池的无线设备。
DFRobot快递包裹包装中还有一个接收模块(TEL0142)和一把PCB 格尺:
使用这个自发电无线开关的第一个作品是遥控台灯。除了无线开关,还用到了下面这个数字无线开关接收端(TEL0142)。
这个接收模块带有三个引脚,分别是 VCC/GND、SIGNAL。正常配对之后SIGNAL 会跟随自发电无线开关按键发生变化。收到数据后,SIGNAL Pin 会从低变高,之后会再次变低。这个模式称为“点动模式”。此外还有三个不同的模式,具体可以在 WIKI 上看到【参考1】。接收模块使用 IO2对ESP32输入。
模式 | 说明 |
锁存 | D0收到一次信号后就一直保持高电平,直到D1~D3收到信号 |
自锁 | D0每收到一次信号,对应的输出状态就反转一次,D1~D3同理 |
点动 | D0收到信号输出高电平,没有收到信号低电平,D1~D3同理 |
互锁 | D0收到信号,D0就保持高电平,其余全部低电平,D1~D3同理 |
实验试用 ESP32 FireBeetle 作为主控端。此外,还使用了一个淘宝上购买的433Mhz模块作为发送端,这个发送模块在另外一篇文章有所介绍【参考2】,模块使用 IO17作为发送数据Pin。
代码非常简单,当发现 IO2为低,并且距离上一次拉低超过2秒,就发送控制433Mhz无线开关的命令,从而达到自发电无线开关遥控的目的。
#include <RCSwitch.h>
RCSwitch mySend = RCSwitch();
void setup() {
pinMode(2,INPUT_PULLUP);
Serial.begin(115200);
mySend.enableTransmit(17);
// Optional set protocol (default is 1, will work for most outlets)
mySend.setProtocol(1);
}
long int Elsp=0;
boolean OnFlag=false;
void loop() {
if ((millis()-Elsp>2000)&&(digitalRead(2)==HIGH)) {
Serial.print("Fire");
if (OnFlag) {
// 开
mySend.send(16529064, 24);
Serial.println("Send on command");
}
else {
// 关
mySend.send(16529060, 24);
Serial.println("Send off command");
}
OnFlag=!OnFlag;
Elsp=millis();
}
}
参考:
- https://wiki.dfrobot.com.cn/_SKU_TEL0140orTEL0142_Gravity_%E6%95%B0%E5%AD%97%E9%87%8F%E6%97%A0%E7%BA%BF%E5%BC%80%E5%85%B3
- https://mc.dfrobot.com.cn/thread-313862-1-1.html