Arduino+nRF24L01多按键远程无线控制(发送端)(二)

Arduino+nRF24L01多按键远程无线控制(发送端)(二)

本次选用的库是采用:Mirf库
开发板用的还是arduino nano
本程序移植前面的RF24库的程序。使用Mirf库,发现接收和发送数据不会改变,发送端发什么接收到的就是什么,本文只验证了int类型数据类型的接收和发送。
实现的功能:发送端按下按键4或者5,io口上的按键,就通过nrf24l01发送对应的int类型(111和222,这个自行设置0-255任意)数据给接收端,接收端收到什么数据就做判断,如果接收到111,就执行对应的4号io口动作。
同理:理论上可以并入很多按键来实现远程控制更多的接收端单片机上的io设备,不过接入的按键越多,程序运行执行的判断会增加,从而导致程序响应时间会延长。
注意事项:一定要在发送端各个按键的控制的io口接一个10K的下拉电阻,防止误发送数据。为了消除干扰:建议在nrf24l01的电源正负之间加一个2.2μf的电容。

代码:

//发射端程序

#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>


#define buttonPin 4 //发射器触发数据1引脚-按钮
#define buttonPin2 5 //发射器触发数据2引脚-按钮

int buttonstate = 0;
int buttonstate2 = 0;

int buttonPushCounter = 0;
int buttonPushCounter2 = 0;

int lastButtonState = 0;
int lastButtonState2 = 0;

int value = 222;
int value2 = 111; 
void setup()
{
  pinMode(buttonPin, INPUT);//设置4号引脚为输入引脚
  pinMode(buttonPin, LOW);

  pinMode(buttonPin2, INPUT);//设置5号引脚为输入引脚
  pinMode(buttonPin2, LOW);

  Serial.begin(9600);
 Mirf.cePin = 7;
 Mirf.csnPin = 8; //在这里自定义CE和CSN引脚
  Mirf.spi = &MirfHardwareSpi;
  Mirf.init();
  Mirf.setRADDR((byte *)"00001"); //设置自己的地址(发送端地址),使用5个字符
  Mirf.payload = sizeof(value);
  Mirf.channel = 90;              //设置所用信道
  Mirf.config();
}

void loop()
{
  Mirf.setTADDR((byte *)"00005");           //设置接收端地址

  buttonstate = digitalRead(buttonPin);
  buttonstate2 = digitalRead(buttonPin2);

  if (buttonstate != lastButtonState)
  {
    if (buttonstate == HIGH)
    {
      buttonPushCounter++;//按键检测
      if (buttonPushCounter % 4 == 0) //如果循环累计4次都检测按键就为真。
      {
              
        Mirf.send((byte *)&value);                //发送指令,发送随机数value
        while (Mirf.isSending()) 
        delay(500);        //直到发送成功,退出循环
       Serial.println(value);
      }
    }
  }
  else {
    Serial.println("4号引脚未触发");
    delay(500);
  }
 if (buttonstate2 != lastButtonState)
  {
    if (buttonstate2 == HIGH)
    {
      buttonPushCounter2++;//按键检测
      if (buttonPushCounter2 % 4 == 0) //如果循环累计4次都检测按键就为真。
      {
                             //0-255的随机数
        Mirf.send((byte *)&value2);                //发送指令,发送随机数value
        while (Mirf.isSending()) 
        delay(500);        //直到发送成功,退出循环
        Serial.println(value2);
      }
    }
  }
else {
    Serial.println("5号引脚未触发");
    delay(500);
  }
  while (Serial.read() >= 0) {} //清空串口缓存
}
上一篇:使用STM32F103C8T6驱动NRF24L01具体步骤


下一篇:nRF24L01+组网方式及防撞(防冲突)机制的实战分享