本文将测试近期制作的遥控器及接收器之间无线数据传输。
实现功能:
遥控器端按下按键,LCD显示相应的键名,同时发送键值到接收器;
接收器在接到键值后,相应在其LCD上显示键名。
遥控器和接收器合影:
发射器及按键说明
接收器:
发射器代码如下:
//LCD控制的头文件
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
//无线需要的头文件
#include <SPI.h>
#include <RF24.h>
#include <RF24_config.h>
#include <nRF24L01.h>
//旋转编码器接线
#define clk A2
#define data A3
#define sw 8
#define A 2
#define B 3
#define C 4
#define D 5
#define E 6
#define F 7
#define X A0
#define Y A1
//无线接口定义如下:
/*nRF24L01 Arduino UNO
VCC <-> 3.3V
GND <-> GND
CE <-> D9
CSN <-> D10
MOSI<-> D11
MISO<-> D12
SCK <-> D13
IRQ <-> 不接
*/
//按键定义如下
/*
• Button A – Connects to D2
• Button B – Connects to D3
• Button C – Connects to D4
• Button D – Connects to D5
• Button E – Connects to D6
• Button F – Connects to D7
*/
//LCD接口定义如下
/*
• GND – Connects to GND
• VCC – Connects to 5V
• SDA – Connects to A4
• SCL – Connects to A5
*/
//Joystick接口定义如下
/*
• X axis – Connects to A0
• Y axis – Connects to A1
• SW2 – Connects to D8
*/
volatile boolean TurnDetected;//编码器检测标识
volatile boolean up;//编码器检测
int State;
int counter;
int LastState;
LiquidCrystal_I2C lcd(0x27, 16, 2);
RF24 radio(9, 10); // CE, CSN
const byte address[6] = "00001";//无线发射器配码,需要接收及发射使用相同的六位字符
void setup() {
int x,y;
int z=1;
//LCD 初始化
lcd.init();
lcd.backlight();
lcd.begin(16, 2);
//串口初始化,用于测试,成功后去除
Serial.begin(9600);
//旋转编码器接口定义
pinMode(clk, INPUT);
pinMode(data, INPUT);
pinMode(sw, INPUT);
pinMode(A, INPUT);
pinMode(B, INPUT);
pinMode(C, INPUT);
pinMode(D, INPUT);
pinMode(E, INPUT);
pinMode(F, INPUT);
pinMode(A0, INPUT);
pinMode(A1, INPUT);
//变量定义
LastState=digitalRead(clk);//旋转编码器变化检测标识
//初始界面显示内容
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" WELCOME! ");
delay(1000);
lcd.setCursor(0,0);
lcd.print("Wireless Control");
lcd.setCursor(0,1);
lcd.print(" Design By Wen ");
delay(2000);
//复位后,显示准备就绪内容
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" READY! ");
delay(1000);
lcd.clear();
//无线发射器初始化
radio.begin();
radio.openWritingPipe(address);
radio.setPALevel(RF24_PA_MIN);
radio.stopListening();
}
//旋转编码器检测函数
int Rotary_encoder()
{
State = digitalRead(clk); // 读取CLK的状态
// 如果现在的状态和之前的不一样,说明旋钮转了一格
if (State != LastState){
TurnDetected = true;
//delay (100);
if (digitalRead(data) != State) { //如果data的状态和clock的状态不一样,说明编码器顺时针旋转
counter ++;
return 1;
//delay (100);
} else { //如果data的状态和clock的状态一样,说明编码器逆时针旋转
counter --;
return 0;
//delay (100);
}
//以下代码用于测试编码器是否正常工作,最终需要删掉,避免占用资源和增加功耗
Serial.print("Position: ");
Serial.println(counter);
}
LastState = State; //更新编码器标识状态
}
void loop() {
int x=49;
int y=49;
int z=1;
//const char tex[] = "Hello World";
// radio.write(&tex, sizeof(tex));
Serial.println("finsh send