【ポケモン剣盾】Arduinoを用いた自動ワット稼ぎ(しんそく版)

##0.はじめに
・某掲示板ではArduinoを使用する方法はマイノリティとなっております。なのでArduino IDEを用いて作成したポケモン剣盾自動化プログラムを個人的なメモ書き程度ですがテンプレートの１つになればと思い投稿させて頂きます

・マイコンの導入方法に関しては既に多くの方が分かりやすく説明されてますので省略します
##1.概要
しんそく版(て呼ぶんですかね？)自動ワットは1週10秒強と短いですがワットのカンストまでにはそれなりに時間がかかります。そのためスピードが追及されており、31日→1日のワットが復活しないタイミングの対処には各々の工夫が見られます。
よく見るテンプレートでは1日進めて戻す方法が取られています。本記事ではそれとは異なる方法をArduinoにおけるテンプレートの一つとして紹介できればと思います。(自動ワットは既にありふれていると思いますが...)

##2.スケッチ

####◯使い方
・31日ある月の1日からスタート
・巣穴の前で開始

```
#include <SwitchControlLibrary.h>

void setup(){

//起動時ズレ調整
  PressButtonR();
  PressButtonR();
  PressButtonR();
  
//巣穴の前で開始
//1日～2日

  NextDate(); //巣穴の前～日付変更～巣穴の前
  PickUpWatt(); //ワット回収

}

void loop() {

//2日～31日
//29回日付を進める
  for(int i = 0 ; i < 29 ; i++){
    
  NextDate(); //巣穴の前～日付変更～巣穴の前
  PickUpWatt(); //ワット回収～巣穴の前
  }

//31日→2日
  PressButtonHome(400);
  MoveHat(4,75); // down
  MoveHat(2,75); // right
  MoveHat(2,75); // right
  MoveHat(2,75); // right
  MoveHat(2,75); // right
  PressButtonA(850);
  //設定画面
  SwitchControlLibrary().MoveHat(4); // down
  delay(1300);
  SwitchControlLibrary().MoveHat(8); // center
  delay(50);
  MoveHat(2,50); // right
  MoveHat(4,50); // down
  MoveHat(4,50); // down
  MoveHat(4,50); // down
  MoveHat(4,50); // down
  PressButtonA(260);
  //時間設定
  MoveHat(4,50); // down
  MoveHat(4,50); // down
  PressButtonA(300);
  //時間の変更 31日→1日
  MoveHat(2,50); // right
  MoveHat(2,50); // right
  MoveHat(0,110); // up
  PressButtonA(50);
  PressButtonA(50);
  PressButtonA(50);
  PressButtonA(125);

//時間の変更　1日→2日
  PressButtonA(325);
  MoveHat(6,50); // left
  MoveHat(6,50); // left
  MoveHat(6,50); // left
  MoveHat(0,110); // up
  PressButtonA(50);
  PressButtonA(50);
  PressButtonA(50);
  PressButtonA(125);

  PressButtonHome(750);
  PressButtonA(800); //ゲーム画面へ戻る

  PickUpWatt(); //ワット回収～巣穴の前
}



//以下省略用

//十字キー
void MoveHat(int direction,int time){
  
  SwitchControlLibrary().MoveHat(direction);
  delay(50);
  SwitchControlLibrary().MoveHat(8);
  delay(time);
}

//Aボタン
void PressButtonA(int time){
  SwitchControlLibrary().PressButtonA();
  delay(50);
  SwitchControlLibrary().ReleaseButtonA();
  delay(time);
}

//Bボタン
void PressButtonB(int time){
  SwitchControlLibrary().PressButtonB();
  delay(50);
  SwitchControlLibrary().ReleaseButtonB();
  delay(time);
}

//Rボタン
void PressButtonR(){
  SwitchControlLibrary().PressButtonR();
  delay(500);
  SwitchControlLibrary().ReleaseButtonR();
  delay(500);
}

//Homeボタン
void PressButtonHome(int time){
  SwitchControlLibrary().PressButtonHome();
  delay(50);
  SwitchControlLibrary().ReleaseButtonHome();
  delay(time);
}

//1日進める
void NextDate(){

  PressButtonHome(400);
  MoveHat(4,75); // down
  MoveHat(2,75); // right
  MoveHat(2,75); // right
  MoveHat(2,75); // right
  MoveHat(2,75); // right
  PressButtonA(850);
  //設定画面
  SwitchControlLibrary().MoveHat(4); // down
  delay(1300);
  SwitchControlLibrary().MoveHat(8); // center
  delay(50);
  MoveHat(2,50); // right
  MoveHat(4,50); // down
  MoveHat(4,50); // down
  MoveHat(4,50); // down
  MoveHat(4,50); // down
  PressButtonA(260);
  //時間設定
  MoveHat(4,50); // down
  MoveHat(4,50); // down
  PressButtonA(300);
  //時間の変更
  MoveHat(2,50); // right
  MoveHat(2,50); // right
  MoveHat(0,110); // up
  PressButtonA(50);
  PressButtonA(50);
  PressButtonA(50);
  PressButtonA(125);

  PressButtonHome(750);
  PressButtonA(800);

}

//ワット回収
void PickUpWatt(){
  PressButtonA(300);
  PressButtonA(300);
  PressButtonA(650);
  PressButtonB(1050);
}

```

##3.1 解説
今回はソースコードが長くなりすぎたのでボタンを押して離す動作や繰り返し行う動作を以下のように短くしています。

```
//Aボタン
void PressButtonA(int time){
  SwitchControlLibrary().PressButtonA();
  delay(50);
  SwitchControlLibrary().ReleaseButtonA();
  delay(time);
}
```
Aボタンを離す際のdelayがまちまちだったので(int time)の数値を代入できるようにしました。Bボタン・Homeボタンも同様です。

```
//十字キー
void MoveHat(int direction,int time){

  SwitchControlLibrary().MoveHat(direction);
  delay(50);
  SwitchControlLibrary().MoveHat(8);
  delay(time);
}
```
次に十字キーですが方向とdelayの2つを変数にしました。
int directionは0,2,4,6,8の方向が、int timeは中央に戻す際のdelayが対応しています。

```
PickUpWatt() 
NextDate()
```
ワットの回収、1日進める動作です。
どちらも巣穴の前から動作し巣穴の前に戻ります。


##3.2 スケッチの流れの解説
```
//1日～2日

  NextDate(); //巣穴の前～日付変更～巣穴の前
  PickUpWatt(); //ワット回収
```
まず31日ある月の1日から開始し、setupで1日進めます


```
//2日～31日
//29回日付を進める
  for(int i = 0 ; i < 29 ; i++){

  NextDate(); //巣穴の前～日付変更～巣穴の前
  PickUpWatt(); //ワット回収～巣穴の前
  }
```
次に回数を指定して31日まで進めます

```
  //時間の変更 31日→1日
  MoveHat(2,50); // right
  MoveHat(2,50); // right
  MoveHat(0,110); // up
  PressButtonA(50);
  PressButtonA(50);
  PressButtonA(50);
  PressButtonA(125);

//時間の変更　1日→2日
  PressButtonA(325);
  MoveHat(6,50); // left
  MoveHat(6,50); // left
  MoveHat(6,50); // left
  MoveHat(0,110); // up
  PressButtonA(50);
  PressButtonA(50);
  PressButtonA(50);
  PressButtonA(125);
```
31日→1日はワットが復活しないのでそのまま2日まで進めます


以上の様に2日→31日→2日を繰り返す流れとなっています。
2日開始でもよかったのですがキリがいい方が良いのでsetupで1日進めました。



####◯参考
9.8秒/周, 74万ワット/h程度です
細かいところはもっと詰められるのでもっと早くすることも可能です

##4.おわりに
目指せ夢の9秒台‼みたいな感じのモチベーションで10秒切ったあたりで妥協してしまったのでまだまだ早くできると思います。事実75万ワット/hと言ってる人も見かけました。ですがこれ以上は極端に早くなることはないと思うのである程度万満足しています。外出時に起動したらズレたことがあるのですがすれ違いなどが原因でずれることもあるんですかね？


長くなりましたがこの記事を開いてくれた方、最後まで読んでくれた方、ありがとうございました。

何か御座いましたらコメント欄、もしくはTwitter @mega_ringuma までお願いします