今天接着對遙控器打碼進行完善。
目前已經可以實現遙控器的顯示及選擇,其中用到了旋轉編碼器選擇;
操作界面設計如下:
通過代碼完善不斷實現以下功能:
操作方法爲:
1 按鍵 SW1 和 SW2爲確認鍵;
2 F鍵爲返回鍵,E鍵爲回主頁;
3 電動時,DB控制左右,AC控制上下,EF控住旋轉;同時搖桿也可控,值越大速度越快;
4 旋鈕和按鍵控制光標上下。
代碼如下:
// RF24 - Version: 1.3.4
#include <RF24.h>
#include <RF24_config.h>
#include <nRF24L01.h>
#include <printf.h>
#include <Arduino.h>
#include <A4988.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
//無線需要的頭文件
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
#define clk A2
#define data A3
#define sw 8
//無線接口定義如下:
/*nRF24L01 Arduino UNO
VCC <-> 3.3V
GND <-> GND
CE <-> D9
CSN <-> D10
MOSI<-> D11
MISO<-> D12
SCK <-> D13
IRQ <-> 不接
*/
volatile boolean TurnDetected;
volatile boolean up;
int dir;
int arrow;
int mode;
int rpm;
int minutes;
int minrpm;
int State;
int counter;
int LastState;
LiquidCrystal_I2C lcd(0x27, 16, 2);
byte customChar1[8] = {
0b10000,
0b11000,
0b11100,
0b11110,
0b11110,
0b11100,
0b11000,
0b10000
};
byte customChar2[8] = {
0b00100,
0b01110,
0b11111,
0b00000,
0b00000,
0b11111,
0b01110,
0b00100,
};
void setup() {
lcd.init();
lcd.backlight();
lcd.begin(16, 2);
lcd.createChar(0, customChar1);
lcd.createChar(1, customChar2);
Serial.begin(9600);
pinMode(clk, INPUT);
pinMode(data, INPUT);
pinMode(sw, INPUT);
mode = 0;
arrow = 0;
rpm = 100;
dir = 0;
minutes = 1;
minrpm = 100;
LastState=digitalRead(clk);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" WELCOME! ");
delay(1000);
lcd.setCursor(0,0);
lcd.print(" DESIGN BY WEN ");
lcd.setCursor(0,1);
lcd.print(" Camera SLIDER ");
delay(2000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Homing ");
/*while (!digitalRead(end_stop))
{
digitalWrite(Enable, LOW); //Negative enabled
digitalWrite(Direction, LOW); //Low for Left
digitalWrite(Step,HIGH);
delay(1);
digitalWrite(Step,LOW);
delay(1);
}*/
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" READY! ");
delay(1000);
lcd.clear();
//以下爲無線發送配置
Serial.begin(9600);
Mirf.cePin = 9; //設置CE引腳爲D9
Mirf.csnPin = 10; //設置CE引腳爲D10
Mirf.spi = &MirfHardwareSpi;
Mirf.init(); //初始化nRF24L01
//設置接收標識符"Sen01"
Mirf.setRADDR((byte *)"Sen01");
//設置一次收發的字節數,這裏發一個整數,寫sizeof(unsigned int),實際等於2字節
Mirf.payload = sizeof(unsigned int);
//發送通道,可以填0~128,收發必須一致。
Mirf.channel = 3;
Mirf.config();
//注意一個Arduino寫Sender.ino,另一個寫Receiver.ino。
//這裏標識寫入了Sender.ino
Serial.println("I'm Sender...");
}
int Rotary_encoder()
{
State = digitalRead(clk); // Reads the "current" state of the clock pin
// If the previous and the current state of the clock are different, that means a step has occured
if (State != LastState){
TurnDetected = true;
//delay (100);
// If the data state is different to the clock state, that means the encoder is rotating clockwise
if (digitalRead(data) != State) {
counter ++;
return 1;
//delay (100);
} else {
counter --;
return 0;
//delay (100);
}
Serial.print("Position: ");
Serial.println(counter);
}
LastState = State; // Updates the previous state of the clock with the current state
}
unsigned int adata = 0;
void loop() {
//讀取A0值到adata
adata = analogRead(A0);
//由於nRF24L01只能以byte單字節數組形式發送Mirf.payload個數據,
//所以必須將所有需要傳輸的數據拆成byte。
//下面定義byte數組,存放待發數據,因爲Mirf.payload = sizeof(unsigned int);
//實際下面等於byte data[2];
byte data[Mirf.payload];
//adata是unsigned int雙字節數據,必須拆開。
//將adata高低八位拆分:
data[0] = adata & 0xFF; //低八位給data[0],
data[1] = adata >> 8; //高八位給data[1]。
//設置向"serv1"發送數據
Mirf.setTADDR((byte *)"Rec01");
Mirf.send(data);
//while死循環等待發送完畢,才能進行下一步操作。
while(Mirf.isSending()) {}
delay(20);
up=Rotary_encoder();
if (mode == 0) { // Home Screen
// Rotary_encoder();
if (TurnDetected) {
lcd.clear();
// up=Rotary_encoder();
if (up) {
arrow = !arrow;
}
else {
arrow = !arrow;
}
TurnDetected = false;
}
lcd.setCursor(1, 0);
lcd.print("RPM Mode");
lcd.setCursor(1, 1);
lcd.print("Time Mode");
if (arrow == 0) {
lcd.setCursor(0, 0);
lcd.write((uint8_t)0);
}
else {
lcd.setCursor(0, 1);
lcd.write((uint8_t)0);
}
}
if (!(digitalRead(sw))) {
lcd.clear();
if (arrow == 0) { // RPM Mode
mode = 1;
delay(200);
}
else { // Time Mode
mode = 2;
delay(200);
}
arrow = 0;
}
if (mode == 1) { // RPM Screen
// Rotary_encoder();
if (TurnDetected) {
lcd.clear();
//up=Rotary_encoder();
if (up) {
arrow = arrow + 1;
if (arrow > 2) {
arrow = 0;
}
}
else {
arrow = arrow - 1;
if (arrow < 0) {
arrow = 2;
}
}
TurnDetected = false;
}
lcd.setCursor(1, 0);
lcd.print("RPM:");
lcd.print(rpm);
lcd.setCursor(1, 1);
lcd.print("Start");
lcd.setCursor(8, 1);
lcd.print("Back");
if (arrow == 0) {
lcd.setCursor(0, 0);
lcd.write((uint8_t)0);
}
if (arrow == 1) {
lcd.setCursor(0, 1);
lcd.write((uint8_t)0);
}
if (arrow == 2) {
lcd.setCursor(7, 1);
lcd.write((uint8_t)0);
}
if (!(digitalRead(sw))) {
if (arrow == 0) {
lcd.clear();
mode = 11;
delay(200);
}
if (arrow == 1) {
lcd.clear();
mode = 12;
delay(200);
}
if (arrow == 2) {
lcd.clear();
rpm = 100;
mode = 0;
delay(200);
}
arrow = 0;
}
}
if (mode == 11) { // Choose RPM, Motor Off
// Rotary_encoder();
if (TurnDetected) {
lcd.clear();
// up=Rotary_encoder();
if (up) {
if (rpm < 20) {
rpm = rpm + 1;
}
else {
rpm = rpm + 5;
}
if (rpm >= 400) {
rpm = 400;
}
}
else {
if (rpm <= 20) {
rpm = rpm - 1;
}
else {
rpm = rpm - 5;
}
if (rpm <= 1) {
rpm = 1;
}
}
TurnDetected = false;
}
lcd.setCursor(1, 0);
lcd.print("RPM:");
lcd.print(rpm);
lcd.setCursor(1, 1);
lcd.print("Start");
lcd.setCursor(8, 1);
lcd.print("Back");
lcd.setCursor(9, 0);
lcd.write((uint8_t)1);
if (!(digitalRead(sw))) {
lcd.clear();
mode = 1;
delay(200);
}
}
if (mode == 12) { // Motor ON
// Rotary_encoder();
if (TurnDetected) {
lcd.clear();
//up=Rotary_encoder();
if (up) {
arrow = !arrow;
}
else {
arrow = !arrow;
}
TurnDetected = false;
}
lcd.setCursor(1, 0);
lcd.print("RPM:");
lcd.print(rpm);
lcd.setCursor(1, 1);
lcd.print("Stop");
if (arrow == 0) {
lcd.setCursor(0, 0);
lcd.write((uint8_t)0);
}
if (arrow == 1) {
lcd.setCursor(0, 1);
lcd.write((uint8_t)0);
}
if (!(digitalRead(sw))) {
if (arrow == 0) {
lcd.clear();
mode = 13;
delay(200);
}
if (arrow == 1) {
lcd.clear();
arrow = 0;
mode = 1;
delay(200);
}
}
}
if (mode == 13) { // Choose RPM, Motor ON
//Rotary_encoder();
if (TurnDetected) {
lcd.clear();
//up=Rotary_encoder();
if (up) {
if (rpm < 20) {
rpm = rpm + 1;
}
else {
rpm = rpm + 5;
}
if (rpm >= 400) {
rpm = 400;
}
}
else {
if (rpm <= 20) {
rpm = rpm - 1;
}
else {
rpm = rpm - 5;
}
if (rpm <= 1) {
rpm = 1;
}
}
TurnDetected = false;
}
lcd.setCursor(1, 0);
lcd.print("RPM:");
lcd.print(rpm);
lcd.setCursor(1, 1);
lcd.print("Stop");
lcd.setCursor(9, 0);
lcd.write((uint8_t)1);
if (!(digitalRead(sw))) {
lcd.clear();
mode = 12;
delay(200);
}
}
if (mode == 2) { // Time Screen
//Rotary_encoder();
if (TurnDetected) {
lcd.clear();
//up=Rotary_encoder();
if (up) {
arrow = arrow + 1;
if (arrow > 2) {
arrow = 0;
}
}
else {
arrow = arrow - 1;
if (arrow < 0) {
arrow = 2;
}
}
TurnDetected = false;
}
lcd.setCursor(1, 0);
lcd.print("Time:");
lcd.print(minutes);
lcd.setCursor(8, 0);
lcd.print("min");
lcd.setCursor(1, 1);
lcd.print("Start");
lcd.setCursor(8, 1);
lcd.print("Back");
if (arrow == 0) {
lcd.setCursor(0, 0);
lcd.write((uint8_t)0);
}
if (arrow == 1) {
lcd.setCursor(0, 1);
lcd.write((uint8_t)0);
}
if (arrow == 2) {
lcd.setCursor(7, 1);
lcd.write((uint8_t)0);
}
if (!(digitalRead(sw))) {
if (arrow == 0) {
lcd.clear();
mode = 21;
delay(200);
}
if (arrow == 1) {
lcd.clear();
mode = 22;
delay(200);
}
if (arrow == 2) {
lcd.clear();
minutes = 1;
mode = 0;
delay(200);
}
arrow = 0;
}
}
if (mode == 21) { // Choose Time, Motor Off
//Rotary_encoder();
if (TurnDetected) {
lcd.clear();
// up=Rotary_encoder();
if (up) {
if (minutes < 20) {
minutes = minutes + 1;
}
else {
minutes = 20;
}
}
else {
if ( minutes > 1) {
minutes = minutes - 1;
}
else {
minutes = 1;
}
}
TurnDetected = false;
}
lcd.setCursor(1, 0);
lcd.print("Time:");
lcd.print(minutes);
lcd.setCursor(8, 0);
lcd.print("min");
lcd.setCursor(1, 1);
lcd.print("Start");
lcd.setCursor(8, 1);
lcd.print("Back");
lcd.setCursor(12, 0);
lcd.write((uint8_t)1);
if (!(digitalRead(sw))) {
lcd.clear();
mode = 2;
delay(200);
}
}
if (mode == 22) { // Right to Left, Left to Right
// Rotary_encoder();
if (TurnDetected) {
lcd.clear();
// up=Rotary_encoder();
if (up) {
arrow = !arrow;
}
else {
arrow = !arrow;
}
TurnDetected = false;
}
lcd.setCursor(1, 0);
lcd.print("Right to Left");
lcd.setCursor(1, 1);
lcd.print("Left to Right");
if (arrow == 0) {
lcd.setCursor(0, 0);
lcd.write((uint8_t)0);
}
if (arrow == 1) {
lcd.setCursor(0, 1);
lcd.write((uint8_t)0);
}
if (!(digitalRead(sw))) {
if (arrow == 0) {
lcd.clear();
mode = 24;
delay(200);
}
if (arrow == 1) {
lcd.clear();
arrow = 0;
mode = 23;
delay(200);
}
arrow = 0;
}
}
if (mode == 23) { // Right to Left, Motor ON
lcd.setCursor(1, 0);
lcd.print("Time:");
lcd.print(minutes);
lcd.setCursor(8, 0);
lcd.print("min");
lcd.setCursor(1, 1);
lcd.print("Stop");
if (arrow == 0) {
lcd.setCursor(0, 1);
lcd.write((uint8_t)0);
}
if (!(digitalRead(sw))) {
lcd.clear();
mode = 2;
delay(200);
}
}
if (mode == 24) { // Left to Right, Motor ON
lcd.setCursor(1, 0);
lcd.print("Time:");
lcd.print(minutes);
lcd.setCursor(8, 0);
lcd.print("min");
lcd.setCursor(1, 1);
lcd.print("Stop");
if (arrow == 0) {
lcd.setCursor(0, 1);
lcd.write((uint8_t)0);
}
if (!(digitalRead(sw))) {
lcd.clear();
mode = 2;
delay(200);
}
}
}
繼續更新中未完。。。。