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) {} //清空串口缓存
}