通用遙控器_自動攝影滑軌_發射端代碼(一)

 

 

 

今天接着對遙控器打碼進行完善。

目前已經可以實現遙控器的顯示及選擇,其中用到了旋轉編碼器選擇;

操作界面設計如下:

 

通過代碼完善不斷實現以下功能:

操作方法爲:

 

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

}


 

繼續更新中未完。。。。

 

 

 

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