本帖最后由 云天 于 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,那么关灯
 
  复制代码 【演示视频】 
 
 
 |