本帖最后由 云天 于 2022-1-22 17:40 编辑
最近某宝有活动,我用签到红包买了一个红灯笼和一个LED灯,可能价格实在是低,质量都一般。我接下来,把它们俩改造成可遥控灯。快过年了,喜庆一下。
【nrf24l01无线模块】
遥控使用的是两个nrf24l01的模块。nrf24l01采用SPI总线通信,虽然占引脚数多,但是收发速度快,模块通信速率可达2Mbps,而功耗控制在待机22uA,如果掉电模式可以仅900nA,如果其余传感器功耗控制合理,用干电池驱动整个模块工作数月了,这可是其他通信模块不具备的特性,高速低耗,2.4Ghz的抗干扰能力也不错,穿透性稍差,但是家庭环境使用还是够的。在数据传输方面实现相对WiFi距离更远,但传输数据量不如WiFi。(掉电模式和空闲模式)使节能设计更方便。
接线方式
NRF24L01 2.4G无线模块 Arduino
VCC <------> 3.3V
GND <------> GND
CSN <------> 8
CE <------> 7
SCK <------> 13
MOSI <------> 11
MISO <------> 12
每个arduino开发板都有不同的SPI引脚,CSN和CE引脚可以连接刀Arduino板的任何数字引脚,它们用于将模块设置为待机或活动模式,以及用于在发送或命令模式之间切换。
电压控制在3.3v,用5v容易烧坏。
【遥控器】
遥控器使用Arduino,遥杆Vry接A1引脚,Vrx接A0引脚(未分配功能),SW接引脚2(一定要上拉,不然电平不稳。SW 的值:1代表未按下,0代表按下。),左右摆动可开灯,按下遥杆关灯(为了练习遥杆按钮功能)。
【遥控程序】
-
- #include <SPI.h>
- #include <nRF24L01.h>
- #include <RF24.h> //NRF24L01 2.4G无线模块的库文件
- RF24 radio(7, 8); //创建一个RF24的对象CE=7, CSN=8
- const byte address[6] = "00001"; //创建一个数组,建立发送机地址,或者说两个模块将用于通信的“管道”
- int value=0;
- void setup() {
-
- pinMode(2, INPUT_PULLUP); //注意 Z 轴输入一定要上拉,不然电平不稳。SW 的值:1代表未按下,0代表按下。
- //Serial.begin(9600);
- radio.begin(); //初始化radio对象
- radio.openWritingPipe(address); //使用radio.openWritingPipe()函数设置的发送机地址
- radio.setPALevel(RF24_PA_MIN); //设置功率放大器级别,将其设置为最小值
- radio.stopListening(); // 使用radio.stopListening()函数将模块设置为发送机
- }
- void loop() {
- value=analogRead(A1);
- //Serial.println(value);
- if (value<10 ){ //遥杆向左
- const char text= 'f'; //创建一个字符数组,并为其分配消息f
- radio.write(&text, sizeof(text)); //使用radio.write()函数将消息发送给接收机,text是要发送的字符变量,
- // sizeof(text))设置了我们要从text变量中获取的字节数
-
- delay(300); //延迟等待0.3秒
- }
- else if(value>1000){ //遥杆向右
- const char text= 'b'; //创建一个字符数组,并为其分配消息b
- radio.write(&text, sizeof(text)); //使用radio.write()函数将消息发送给接收机,text是要发送的字符变量,
- // sizeof(text))设置了我们要从text变量中获取的字节数
- delay(300); //延迟等待0.3秒
- }
-
- value = digitalRead(2);
- if(value==0){//按下遥杆
- const char text= 's'; //创建一个字符数组,并为其分配消息s
- radio.write(&text, sizeof(text)); //使用radio.write()函数将消息发送给接收机,,text是要发送的字符变量,
- // sizeof(text))设置了我们要从text变量中获取的字节数
- delay(300); //延迟等待0.3秒
- }
- }
复制代码
【组装红灯笼】
【改造LED灯】
将接灯其中一条线中间剪断
连上电磁继电器
装进灯笼
【接收器】
电磁继电器接在引脚2上。
【接收器程序】
- #include <SPI.h>
- #include <nRF24L01.h>
- #include <RF24.h> //NRF24L01 2.4G无线模块的库文件
- RF24 radio(7, 8); //创建一个RF24的对象CE=7, CSN=8
- const byte address[6] = "00001"; //创建一个数组,建立接收机地址,或者说两个模块将用于通信的“管道”
- void setup() {
- pinMode(2, OUTPUT); //定义2号引脚为输出
-
- Serial.begin(9600);
- radio.begin(); //初始化radio对象
- radio.openReadingPipe(0, address); //使用radio.openReadingPipe()函数设置的接收机地址
- radio.setPALevel(RF24_PA_MIN); //设置功率放大器级别,将其设置为最小值
- radio.startListening(); // 使用radio..startListening()将模块设置为接收机
- }
- void loop() {
- if (radio.available()) { //判断是否有要接收的数据
- char text = 0; //创建一个空的字符变量text
- radio.read(&text, sizeof(text)); //读取数据,并将其存储到text变量中
- Serial.println(text);
- if (text == 'f') { //如果接收到的数据是f,那么开灯
- digitalWrite(2,HIGH);
- }
- else if(text == 'b') { //如果接收到的数据是b,那么开灯
- digitalWrite(2,HIGH);
- }
- else if(text == 's') { //如果接收到的数据是s,那么关灯
复制代码
【演示视频】
|