通用遥控器_自动摄影滑轨_发射端代码(一)

 

 

 

今天接着对遥控器打码进行完善。

目前已经可以实现遥控器的显示及选择,其中用到了旋转编码器选择;

操作界面设计如下:

 

通过代码完善不断实现以下功能:

操作方法为:

 

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);
    }
  }

}


 

继续更新中未完。。。。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章