一 目的
此文章记录了arduino与陶晶驰串口屏实现联动,电机屏幕双态开关远程控制arduino2560板载的LED点亮和熄灭。
二 接线
2.1串口屏接线
串口屏与Arduino UNO接线如下:
————————————————
RX <-> TX0(D1) //此种接线必须在串口屏下载时断开连接,arduino通讯时断开串口屏下载工 具,因为串口不能一对多。同样此链接无法实现连接串口屏时串口监视。
TX <-> RX0(D0) //可以通过软串口进行,比如示例图片中接线D6和D7。
GND <-> GND
VCC <-> VCC
————————————————
2.2 nRF24L01与arduino uno接线
nRF24L01 与Arduino UNO接线如下:
————————————————
/*nRF24L01 Arduino UNO
VCC <-> 3.3V
GND <-> GND
CE <-> D9
CSN <-> D10
MOSI <-> D11
MISO <-> D12
SCK <-> D13
IRQ <-> 不接
————————————————
2.3 nRF24L01与arduino 2560接线
nRF24L01 与Arduino MEGA接线如下:
————————————————
/*nRF24L01 Arduino MEGA
VCC <-> 3.3V
GND <-> GND
CE <-> D53
CSN <-> D49
MOSI <-> D51
MISO <-> D50
SCK <-> D52
IRQ <-> 不接
————————————————
三 代码
3.1 发射端代码
#define lenth 6
#include <SoftwareSerial.h>//防止串口冲突,模拟串口方便串口调试
#include <SPI.h>
#include "printf.h"
#include "RF24.h"
#define CE_PIN 9
#define CSN_PIN 10
//#define LED_BUILTIN 13
// 定义引脚
RF24 radio(CE_PIN, CSN_PIN);
const byte addresses[][6]={"66666","88888"};//为双向通信创建两个通道地址,6为写通道,8为读取通道
bool radioNumber = 1; //接收机和发射机区分标志,可不用 ,本案例保留
bool role = false; // 接收机和发射机区分转换位,可不用 ,本案例保留 true = TX role, false = RX role
float payload = 0.0;//发射成功,标记
const char text[32] ={0};//用于存放接收到的数据
SoftwareSerial TJC(6,7);//7接 串 口 屏 或 串 口 工 具 的RX, arduino的6接 串 口 屏 或 串 口 工 具 的TX
void sendend()//结束代码
{
TJC.write(0xff);
TJC.write(0xff);
TJC.write(0xff);
}
// the setup function runs once when you press reset or power the board
void setup() {
Serial.begin(9600);//串口屏采用相同的波特率
while (!Serial) {
// some boards need to wait to ensure access to serial over USB
}//等待串口准备好
Serial.println(F("串口准备就绪"));
if (!radio.begin()) {
Serial.println(F("发射器无应答!!"));
while (1) {} // hold in infinite loop
}//等待发射器回应
radio.setChannel(114);//设置信道(0-127),114号通道
radio.openWritingPipe(addresses[0]);//88888
radio.openReadingPipe(1, addresses[1]); // 66666
radio.setPALevel(RF24_PA_HIGH);
Serial.println(F("发射器准备就绪"));
pinMode(LED_BUILTIN, OUTPUT);
TJC.begin(115200);//串口屏采用相同的波特率
}
// the loop function runs over and over again forever
void loop() {
char str[100];
int m = 0;
//以下判断接收到的串口的信息
while (TJC.available() >= lenth)
{
unsigned char comd[lenth];
unsigned char head = TJC.peek();
if (head == 0x55)
{
TJC.readBytes(comd,lenth);
if (comd[3] == 0xff && comd[4] == 0xff && comd[5] == 0xff)
{
if (comd[1] == 0x00)
{
if (comd[2] == 0x01)
{
sprintf(str, "t0.txt=\"open\"");//屏幕输出打开
TJC.print(str);//给串口屏反馈
sendend();
//digitalWrite(LED_BUILTIN, HIGH); // 板载LED点亮,灯不亮LED在13引脚,与SCK冲突
Serial.println("开灯");//给串口反馈状态
//将指令发射出去
radio.stopListening();
const char text2[] = {"open"};
radio.write(&text2, sizeof(text2));
delay(100);
Serial.println("状态已发送给MAGA:");
Serial.println("接收通道打开");
radio.startListening();
delay(100);
}
if (comd[2]==0x00)
{
sprintf(str, "t0.txt=\"close\"");//屏幕输出关闭
TJC.print(str);
sendend();
//digitalWrite(LED_BUILTIN, LOW); // 板载LED熄灭
Serial.println("关灯");
//将指令发射出去
radio.stopListening();
const char text2[] = {"close"};
radio.write(&text2, sizeof(text2));
delay(100);
Serial.println("状态已发送给MAGA:");
Serial.println("接收通道打开");
radio.startListening();
delay(100);
}
}
}
} else
{
TJC.read();
}
}
}
3.2 串口屏代码
串口屏代码:弹起事件
printh 55
printh 00
prints bt0.val,1
printh ff ff ff
3.3 接收端代码
//arduino maga 接收端代码,接收到open 打开LED灯,接收到close 关闭LED灯。
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#define SCK_PIN 52
#define MOSI_PIN 51
#define MISO_PIN 50
//#define
RF24 radio(53, 49);// CE, CSN
const char text[32]={0};//用于存放接收到的数据
const byte addresses[][6]={"66666","88888"};//为双向通信创建两个通道地址,6为写通道,8为读取通道
int led=13;//2560上的LED为D13.
void setup()
{
Serial.begin(9600);
while (!Serial) {
// some boards need to wait to ensure access to serial over USB
}//等待串口准备好
Serial.println(F("串口准备就绪"));
if (!radio.begin()) {
Serial.println(F("接收器无应答!!"));
while (1) {} // hold in infinite loop
}//等待发射器回应
radio.begin();
radio.setChannel(114);//设置信道(0-127),114号通道
radio.openWritingPipe(addresses[1]);//66666
radio.openReadingPipe(1, addresses[0]); // 88888
radio.setPALevel(RF24_PA_HIGH);
Serial.println(F("接收器准备就绪"));
radio.startListening();
}
void loop()
{
Serial.println("代码在这里执行");
//uint8_t pipe;
//if (radio.available(&pipe))
if (radio.available()>0) // 是否有有效数据可以读取
{
Serial.println("接收到数据1");
radio.read(&text,sizeof(text));
// delay(500);
String comdata = "";
comdata += text;
Serial.println("接收到数据:");
Serial.println(comdata);
if (comdata == "open")
{
Serial.print("01接收到:");
Serial.println(comdata);
digitalWrite(led,HIGH);
radio.stopListening();
radio.startListening();
}
if (comdata == "close")
{
Serial.print("01接收到:");
Serial.println(comdata);
digitalWrite(led,LOW);
radio.stopListening();
radio.startListening();
}
else
{
radio.startListening();
Serial.println("未收到数据");
}
}
}