Advertisement
Guest User

Automatic Shiny Hunnter

a guest
Nov 20th, 2017
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.64 KB | None | 0 0
  1. #include <Servo.h>
  2. #include "Adafruit_TCS34725.h"
  3.  
  4. #define shinyLED 12
  5. #define switchDetector 13
  6.  
  7. const int NUM_MEASUREMENTS = 6;
  8.  
  9. int numLoops = 0;
  10.  
  11. Servo servoAX, servoBY, servoUL, servoDR, servoStart;
  12. bool useAX = false;
  13. bool useBY = false;
  14. bool useUL = false;
  15. bool useDR = false;
  16. bool useStart = false;
  17.  
  18. bool DEBUG = true;
  19.  
  20. int posAX[] = {90, 36, 165}; //A <-> X
  21. int posBY[] = {90, 30, 155};
  22. int posUL[] = {90, 70, 115};
  23. int posDR[] = {90, 65, 105};
  24. int posStart[] = {90, 55};
  25.  
  26. int delayDefault = 250;
  27. int delayScreenTransition = 2500;
  28.  
  29. #define commonAnode true
  30. Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_4X);
  31.  
  32. void resetServos() {
  33.   if (useAX) {servoAX.write(posAX[0]);}
  34.   if (useBY) {servoBY.write(posBY[0]);}
  35.   if (useUL) {servoUL.write(posUL[0]);}
  36.   if (useDR) {servoDR.write(posDR[0]);}
  37.   if (useStart) {servoStart.write(posStart[0]);}
  38.  
  39.   delay(delayDefault);
  40. }
  41.  
  42. void setup() {
  43.   if (DEBUG) {
  44.     Serial.begin(9600);
  45.   }
  46.  
  47.   pinMode(switchDetector, INPUT);
  48.   pinMode(shinyLED, OUTPUT);
  49.   digitalWrite(shinyLED, LOW);
  50.  
  51.   if (tcs.begin()) {
  52.     Serial.println("Found sensor");
  53.   } else {
  54.     Serial.println("No TCS34725 found ... check your connections");
  55.     while (1); // halt!
  56.   }
  57.  
  58. //  if (useAX) {servoAX.attach(5);}
  59. //  if (useBY) {servoBY.attach(6);}
  60. //  if (useUL) {servoUL.attach(8);}
  61. //  if (useDR) {servoDR.attach(7);}
  62. //  if (useStart) {servoStart.attach(9);}
  63.   servoAX.attach(5);
  64.   servoBY.attach(6);
  65.   servoUL.attach(8);
  66.   servoDR.attach(7);
  67.   servoStart.attach(9);
  68.   resetServos();
  69.  
  70.   //switchToTester();
  71.  
  72.   waitForStart();
  73.  
  74.   firstLoop();
  75. }
  76.  
  77. void firstLoop() {
  78.   loop();
  79.   detachUnused();
  80. }
  81.  
  82. void loop() {
  83.   numLoops++;
  84.   if (DEBUG) {
  85.     Serial.println(numLoops + " Loops Completed");
  86.   }
  87.   hyperspace_default();
  88. }
  89.  
  90. //=========================HUNTING LOOPS=========================//
  91. void horde_default() { //repeatedly running horde encounters, no ability on my end
  92.   x();
  93.   a();
  94.   delay(1600);
  95.   down();
  96.   a();
  97.   down();
  98.   a();
  99.   a();
  100.   delay(8000);
  101.   float startR, startG, startB;
  102.   measureLight(&startR, &startG, &startB);
  103.   delay(10750); //8500 for less laggy, bit of an issue, 9100 for laggier like vulpix
  104.   float endR, endG, endB;
  105.   measureLight(&endR, &endG, &endB);
  106.   if (!detectTransition(startR, startG, startB, endR, endG, endB)) {
  107.     digitalWrite(shinyLED, HIGH);
  108.     disengageServos();
  109.     while(1); //shiny omg!!!
  110.   }
  111.   left();
  112.   right();
  113.   a();
  114.   delay(7500); //6500 for lower levels, implement run away pokemon
  115. }
  116.  
  117. void latias_default() { //latias run/re-encounter, my pokemon has no ability
  118.   a();
  119.   delay(1500);
  120.   a();
  121.   delay(500);
  122.   float startR, startG, startB;
  123.   measureLight(&startR, &startG, &startB);
  124.   delay(8500);
  125.   float endR, endG, endB;
  126.   measureLight(&endR, &endG, &endB);
  127.   if (!detectTransition(startR, startG, startB, endR, endG, endB)) {
  128.     digitalWrite(shinyLED, HIGH);
  129.     disengageServos();
  130.     while(1); //shiny omg!!!
  131.   }
  132.   left();
  133.   right();
  134.   a();
  135.   delay(6500);
  136.   a();
  137. }
  138.  
  139. void latios_default() { //latias run/re-encounter, my pokemon has no ability
  140.   a();
  141.   delay(1500);
  142.   a();
  143.   delay(500);
  144.   float startR, startG, startB;
  145.   measureLight(&startR, &startG, &startB);
  146.   delay(9000);
  147.   float endR, endG, endB;
  148.   measureLight(&endR, &endG, &endB);
  149.   if (!detectTransition(startR, startG, startB, endR, endG, endB)) {
  150.     digitalWrite(shinyLED, HIGH);
  151.     disengageServos();
  152.     while(1); //shiny omg!!!
  153.   }
  154.   left();
  155.   right();
  156.   a();
  157.   delay(7000);
  158.   a();
  159. }
  160.  
  161. //approx 13.84 hrs per shiny
  162. void hyperspace_default() { //hyperspace hole SR, no ability on my end or on enemy end
  163.   a();
  164.   delay(2250);
  165.   a();
  166.   delay(4250);
  167.   a();
  168.   delay(3250);
  169.   a();
  170.   delay(750);
  171.   a();
  172.   delay(50);
  173.   a();
  174.   delay(50);
  175.   a();
  176.   delay(2000);
  177.   float startR, startG, startB;
  178.   measureLight(&startR, &startG, &startB);
  179.   delay(8300);
  180.   float endR, endG, endB;
  181.   measureLight(&endR, &endG, &endB);
  182.   if (!detectTransition(startR, startG, startB, endR, endG, endB)) {
  183.     digitalWrite(shinyLED, HIGH);
  184.     disengageServos();
  185.     while(1); //shiny omg!!!
  186.   }
  187.   softReset();
  188.   delay(11000);
  189. }
  190.  
  191. void hyperspace_ability() { //reshiram hyperspace hole SR, no ability on my end
  192.   a();
  193.   delay(2250);
  194.   a();
  195.   delay(4250);
  196.   a();
  197.   delay(3250);
  198.   a();
  199.   delay(750);
  200.   a();
  201.   delay(500);
  202.   a();
  203.   delay(500);
  204.   a();
  205.   delay(2000);
  206.   float startR, startG, startB;
  207.   measureLight(&startR, &startG, &startB);
  208.   delay(11500);
  209.   float endR, endG, endB;
  210.   measureLight(&endR, &endG, &endB);
  211.   if (!detectTransition(startR, startG, startB, endR, endG, endB)) {
  212.     digitalWrite(shinyLED, HIGH);
  213.     disengageServos();
  214.     while(1); //shiny omg!!!
  215.   }
  216.   softReset();
  217.   delay(11000);
  218. }
  219.  
  220. //=========================UTILITY=========================//
  221. void waitForStart() {
  222.   while (digitalRead(switchDetector) != HIGH) {}
  223. }
  224.  
  225. void switchToTester() {
  226.   waitForStart();
  227.   a();
  228.   delay(2250);
  229.   a();
  230.   delay(4250);
  231.   a();
  232.   delay(4250);
  233.   x();
  234.   delay(1500);
  235.   a();
  236.   delay(1500);
  237.   a();
  238.   up();
  239.   up();
  240.   a();
  241.   right();
  242.   a();
  243.   b();
  244.   delay(1500);
  245.   up();
  246.   a();
  247.   delay(2000);
  248.   a();
  249.   delay(8000);
  250.   softReset();
  251. }
  252.  
  253. bool detectTransition(float r, float g, float b, float _r, float _g, float _b) {
  254.   Serial.println();
  255.   float diffR = abs(r-_r)/((r+_r)/2);
  256.   float diffG = abs(g-_g)/((g+_g)/2);
  257.   float diffB = abs(b-_b)/((b+_b)/2);
  258.   int total = 0;
  259.   if (diffR  >= .1) {total++;}
  260.   if (diffG  >= .1) {total++;}
  261.   if (diffB  >= .1) {total++;}
  262.   return total > 1;
  263. }
  264.  
  265. float measureLight(float *totalR, float *totalG, float *totalB) {
  266.   *totalR = 0;
  267.   *totalG = 0;
  268.   *totalB = 0;
  269.   for (int i = 0; i < NUM_MEASUREMENTS; i++) {
  270.     uint16_t clr, red, green, blue;
  271.     tcs.setInterrupt(false);      // turn on LED
  272.     delay(60);  // takes 50ms to read
  273.     tcs.getRawData(&red, &green, &blue, &clr);
  274.     tcs.setInterrupt(true);  // turn off LED
  275.     float r, g, b;
  276.     uint32_t sum = clr;
  277.     r = red; r /= sum;
  278.     g = green; g /= sum;
  279.     b = blue; b /= sum;
  280.     r *= 256; g *= 256; b *= 256;
  281.  
  282.     *totalR += r;
  283.     *totalG += g;
  284.     *totalB += b;
  285.  
  286.     if (DEBUG) {
  287.       Serial.print("R: "); Serial.print(r); Serial.print(" G: ");Serial.print(g); Serial.print(" B: "); Serial.print(b); Serial.println();
  288.     }
  289.   }
  290.   *totalR /= NUM_MEASUREMENTS;
  291.   *totalG /= NUM_MEASUREMENTS;
  292.   *totalB /= NUM_MEASUREMENTS;
  293.  
  294.   if (*totalR != *totalR) {*totalR = 0;}
  295.   if (*totalG != *totalG) {*totalG = 0;}
  296.   if (*totalB != *totalB) {*totalB = 0;}
  297.  
  298.   if (DEBUG) {
  299.       Serial.print("AvgR: "); Serial.print(*totalR); Serial.print(" AvgG: ");Serial.print(*totalG); Serial.print(" AvgB: "); Serial.print(*totalB); Serial.println();
  300.   }
  301. }
  302.  
  303. void detachUnused() {
  304.   resetServos();
  305.   if (!useAX) {servoAX.detach();}
  306.   if (!useBY) {servoBY.detach();}
  307.   if (!useUL) {servoUL.detach();}
  308.   if (!useDR) {servoDR.detach();}
  309.   if (!useStart) {servoStart.detach();}
  310. }
  311.  
  312. void softReset() {
  313.   useStart = true;
  314.   servoStart.write(posStart[1]);
  315.   delay(delayDefault);
  316.   servoStart.write(posStart[0]);
  317.   delay(delayDefault);
  318. }
  319.  
  320. void disengageServos() {
  321.   resetServos();
  322. //  if (useAX) {servoAX.detach();}
  323. //  if (useBY) {servoBY.detach();}
  324. //  if (useUL) {servoUL.detach();}
  325. //  if (useDR) {servoDR.detach();}
  326. //  if (useStart) {servoStart.detach();}
  327.   servoAX.detach();
  328.   servoBY.detach();
  329.   servoUL.detach();
  330.   servoDR.detach();
  331.   servoStart.detach();
  332. }
  333.  
  334. //=========================ABXY=========================//
  335. void b() {
  336.   useBY = true;
  337.   servoBY.write(posBY[2]);
  338.   delay(delayDefault);
  339.   servoBY.write(posBY[0]);
  340.   delay(delayDefault);
  341. }
  342.  
  343. void y() {
  344.   useBY = true;
  345.   servoBY.write(posBY[1]);
  346.   delay(delayDefault);
  347.   servoBY.write(posBY[0]);
  348.   delay(delayDefault);
  349. }
  350.  
  351. void x() {
  352.   useAX = true;
  353.   servoAX.write(posAX[2]);
  354.   delay(delayDefault);
  355.   servoAX.write(posAX[0]);
  356.   delay(delayDefault);
  357. }
  358.  
  359. void a() {
  360.   useAX = true;
  361.   servoAX.write(posAX[1]);
  362.   delay(delayDefault);
  363.   servoAX.write(posAX[0]);
  364.   delay(delayDefault);
  365. }
  366.  
  367. //=========================D PAD=========================//
  368. void left() {
  369.   useUL = true;
  370.   servoUL.write(posUL[2]);
  371.   delay(delayDefault);
  372.   servoUL.write(posUL[0]);
  373.   delay(delayDefault);
  374. }
  375.  
  376. void down() {
  377.   useDR = true;
  378.   servoDR.write(posDR[1]);
  379.   delay(delayDefault);
  380.   servoDR.write(posDR[0]);
  381.   delay(delayDefault);
  382. }
  383.  
  384. void right() {
  385.   useDR = true;
  386.   servoDR.write(posDR[2]);
  387.   delay(delayDefault);
  388.   servoDR.write(posDR[0]);
  389.   delay(delayDefault);
  390. }
  391.  
  392. void up() {
  393.   useUL = true;
  394.   servoUL.write(posUL[1]);
  395.   delay(delayDefault);
  396.   servoUL.write(posUL[0]);
  397.   delay(delayDefault);
  398. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement