Advertisement
RuiViana

TicTac.ino

Aug 27th, 2018
328
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 15.01 KB | None | 0 0
  1. //
  2. /*Uso do sketch
  3.   Ao ligar e depois do teste dos LEDs o primeiro LED fica piscando.
  4.   O jogador 1 inicia jogando. O jogo inicia posicionado na "casa" 0,0.
  5.   Ao apertar o botão por um tempo maior que 100 mseg e menor
  6.   que 1000 mseg, (1 segundo) e libera-lo, a "casa" de jogada avança.
  7.   Ao segurar o botão pressionado por mais que 1000 mseg,
  8.   o valor jogado é salvo, e ao soltar o botão os LEDs acendem,
  9.   e a casa avança, e abre para o jogador 2.
  10.   A opção de jogo não para em uma casa que já esteja ocupada.
  11.   Ao completar 3 casas do mesmo jogador, em qq combinação de linha, coluna
  12.   ou diagonal, o jogo termina.
  13.   Só inicia novamente com reset do Arduíno.
  14.   Os LEDS do jogador  1 não piscam
  15.   Os LEDS do jogador 2 piscam com velocidade = metade da velocidade do "cursor".
  16.   Ao terminar o jogo, os LEDs do jogador 1 não piscam e o do jogador 2 piscam mais rápidos.
  17.   Botão ligado ao port A0 e Gnd
  18.   Cada Leds ligados a cada port através de um resistor de 470 ohms e Gnd.
  19. */
  20. #define LA0 2                                           // Ports para os LEDs
  21. #define LA1 3
  22. #define LA2 4
  23. #define LB0 5
  24. #define LB1 6
  25. #define LB2 7
  26. #define LC0 8
  27. #define LC1 9
  28. #define LC2 10
  29. #define botU A0                                         // Botao de jogadas
  30. byte mMat1[5][5] =                                      // Matriz para as entradas do jogador 1 e calculos
  31. {
  32.   {0, 0, 0, 0, 0},
  33.   {0, 0, 0, 0, 0},
  34.   {0, 0, 0, 0, 0},
  35.   {0, 0, 0, 0, 0},
  36.   {0, 0, 0, 0, 0}
  37. };
  38. byte mMat2[5][5] =                                      // Matriz para as entradas do jogador 2 e calculos
  39. {
  40.   {0, 0, 0, 0, 0},
  41.   {0, 0, 0, 0, 0},
  42.   {0, 0, 0, 0, 0},
  43.   {0, 0, 0, 0, 0},
  44.   {0, 0, 0, 0, 0}
  45. };
  46. byte mMat3[3][3] =                                      // Matriz temporaria para display
  47. {
  48.   {0, 0, 0},
  49.   {0, 0, 0},
  50.   {0, 0, 0},
  51. };
  52. bool ticTac   = 0;                                      // variavel para controle dos LEDs
  53. bool salvaMat = LOW;                                    // Controle do qual jogador está ativo
  54. byte linha    = 0;                                      // Enderecamento das linhas da matriz
  55. byte coluna   = 0;                                      // Enderecamento das colunas da matriz
  56. byte botOn    = 0;                                      // Botao foi pressionado
  57. int  valor    = 0;                                      // Calculo de celula ocupada
  58. int total     = 0;                                      // Contador de passadas para evitar loop continuo
  59. unsigned long tempo     = 0;                            // Controle do tempo de botao acionado
  60. unsigned long grava     = 800;                          // Controle do tempo de botão acionado
  61. unsigned long phase1    = 0;                            // Controle pisca
  62. unsigned long phase2    = 0;                            // Controle pisca
  63. unsigned long phase3    = 0;                            // Controle pisca
  64. unsigned long phase4    = 0;                            // Controle pisca
  65. unsigned long phase5    = 0;                            // Controle pisca
  66. unsigned long phase6    = 0;                            // Controle pisca
  67. unsigned long phase7    = 0;                            // Controle pisca
  68. unsigned long phase8    = 0;                            // Controle pisca
  69. unsigned long tPisca1   = 70;                           // Tempo do pisca ON
  70. unsigned long tPisca2   = 50;                           // Tempo do pisca OFF
  71. unsigned long lampteste = 50;                           // Tempo de teste dos LEDs
  72. unsigned long endGame   = 40;                           // Tempo de pisca no fim do jogo
  73. //-----------------------------
  74. void setup()
  75. {
  76.   Serial.begin(9600);                                   // Inicializacao da serial
  77.   pinMode(botU, INPUT_PULLUP);                          // Botao como entrada e em pullup
  78.   pinMode(LA0, OUTPUT);                                 // Ports como saida
  79.   pinMode(LA1, OUTPUT);
  80.   pinMode(LA2, OUTPUT);
  81.   pinMode(LB0, OUTPUT);
  82.   pinMode(LB1, OUTPUT);
  83.   pinMode(LB2, OUTPUT);
  84.   pinMode(LC0, OUTPUT);
  85.   pinMode(LC1, OUTPUT);
  86.   pinMode(LC2, OUTPUT);
  87.   ticTac = 1;                                           // ticTac em HIGH para acender LEDS
  88.   testaLeds();                                          // Lamp teste dos LEDs
  89.   ticTac = 0;                                           // ticTac em LOW para apagar LEDS
  90.   testaLeds();                                          // Lamp teste dos LEDs
  91.   phase1 = millis();
  92. }
  93. //-----------------------------
  94. void loop()
  95. {
  96.   piscaLED();                                           // Mostra resultado nos LEDs
  97.   ckResult();                                           // Verifica se alguem ganhou
  98.   while (valor != 0)                                    // Verifica se casa esta ocupada
  99.   {
  100.     ckPos();                                            // Avanca para uma vaga
  101.   }
  102.   if (digitalRead(botU) == LOW)                         // Se botao foi pressionado
  103.   {
  104.     delay(40);                                          // Debouncing
  105.     tempo = millis();                                   // Atualiza variavel para medir tempo de botão prescionado
  106.     while (digitalRead(botU) == LOW)                    // Enquanto o botao estiver pressionado
  107.     {
  108.       botOn = 1;                                        // Informa que foi pressionado
  109.       if (millis() - tempo >= grava)                    // Verifica se ficou muito tempo pressionado
  110.       {
  111.         if (salvaMat == LOW)                            // Seleciona jogador
  112.           mMat1[linha][coluna] = 1;                     // Salva a casa Matriz 1
  113.         else                                            // Seleciona jogador
  114.           mMat2[linha][coluna] = 1;                     // Salva a casa Matriz 2
  115.         salvaMat = !salvaMat;                           // Troca jogador
  116.         ckPos();                                        // Avanca para uma vaga
  117.         ckVago();                                       // Verifica se esta vazia
  118.         while (digitalRead(botU) == LOW)                // Enquanto botão estiver pressionado
  119.           ticTacDisp();                                 // Mostra leds
  120.         phase1 = millis();
  121.         botOn = 0;                                      // Libera indicador de botao pressionado
  122.       }
  123.     }
  124.     if (botOn == 1)                                     // Se indicador informa botao pressionado
  125.     {
  126.       ckPos();                                          // Avanca para uma vaga
  127.       ckVago();                                         // Verifica se esta vazia
  128.       botOn = 0;                                        // Libera indicador de botao pressionado
  129.       phase1 = millis();
  130.     }
  131.     if (total >= 9)                                     // Se contador for maior que 9
  132.       piscaGeral();
  133.   }
  134. }
  135. //-----------------------------------------------------
  136. void ckVago()
  137. {
  138.   total = 0;                                            // Zera contador de passadas
  139.   while (valor != 0)                                    // Verifica se tem alguma vaga
  140.   {
  141.     total++;                                            // Incrementa contador
  142.     ckPos();                                            // Avanca para uma vaga
  143.     if (total >= 9)                                     // Se contador for maior que 9
  144.       valor = 0;                                        // Sai do while
  145.   }
  146. }
  147. //----------------------------------------------------
  148. void ckPos()                                            // verifica se tem alguma vaga
  149. {
  150.   coluna++;                                             // Incrementa contador de coluna
  151.   if (coluna > 2)                                       // Se a coluna for maior que a matriz de dados
  152.   {
  153.     coluna = 0;                                         // inicia nova linha
  154.     linha++;                                            // Incrementa a linha
  155.     if (linha > 2)                                      // Se a linha for maior que a matriz de dados
  156.       linha = 0;                                        // inicia nova coluna
  157.   }
  158.   valor = mMat1[linha][coluna] + mMat2[linha][coluna];  // Soma valores das casas atuais
  159. }
  160. //-----------------------------------------------------
  161. void cntlPisca1()
  162. {
  163.   for (int i = 0; i < 3; i++)                           // Seleciona 3 linhas
  164.   {
  165.     for (int j = 0; j < 3; j++)                         // Seleciona 3 colunas
  166.     {
  167.       mMat3[i][j] = mMat1[i][j] || mMat2[i][j];         // Salva copia de OR das jogadas das matrizes
  168.     }
  169.   }
  170. }
  171. //-----------------------------------------------------
  172. void cntlPisca2()
  173. {
  174.   for (int i = 0; i < 3; i++)                           // Seleciona 3 linhas
  175.   {
  176.     for (int j = 0; j < 3; j++)                         // Seleciona 3 colunas
  177.     {
  178.       mMat3[i][j] = mMat1[i][j] ;                       // Salva copia das jogadas da matriz1
  179.     }
  180.   }
  181. }
  182. //-----------------------------
  183. void ticTacDisp()
  184. {
  185.   digitalWrite(LA0,  mMat3[0][0]);                      // Le matriz 3 Liga ou desliga o LED conforme
  186.   digitalWrite(LA1,  mMat3[1][0]);
  187.   digitalWrite(LA2,  mMat3[2][0]);
  188.   digitalWrite(LB0,  mMat3[0][1]);
  189.   digitalWrite(LB1,  mMat3[1][1]);
  190.   digitalWrite(LB2,  mMat3[2][1]);
  191.   digitalWrite(LC0,  mMat3[0][2]);
  192.   digitalWrite(LC1,  mMat3[1][2]);
  193.   digitalWrite(LC2,  mMat3[2][2]);
  194. }
  195. //------------------------------------
  196. void testaLeds()                                        // Testa todos LEDs
  197. {
  198.   digitalWrite(LA0,  ticTac);
  199.   delay(lampteste);
  200.   digitalWrite(LA1,  ticTac);
  201.   delay(lampteste);
  202.   digitalWrite(LA2,  ticTac);
  203.   delay(lampteste);
  204.   digitalWrite(LB0,  ticTac);
  205.   delay(lampteste);
  206.   digitalWrite(LB1,  ticTac);
  207.   delay(lampteste);
  208.   digitalWrite(LB2,  ticTac);
  209.   delay(lampteste);
  210.   digitalWrite(LC0,  ticTac);
  211.   delay(lampteste);
  212.   digitalWrite(LC1,  ticTac);
  213.   delay(lampteste);
  214.   digitalWrite(LC2,  ticTac);
  215.   delay(lampteste);
  216. }
  217. //-----------------------------
  218. void ckResult()
  219. {
  220.   checkMatriz();                                        // Verifica dados lidos das matrizes
  221.   for (int i = 0; i < 5; i++)
  222.   {
  223.     for (int j = 0; j < 5; j++)
  224.     {
  225.       if (mMat1[i][j]  == 3  || mMat2[i][j] == 3)       // Se tiver algum valor igual a 3
  226.       {
  227.         piscaGeral();
  228.       }
  229.     }
  230.   }
  231. }
  232. //----------------------------------------------------
  233. void piscaGeral()
  234. {
  235.   while (1)                                       // Fica em loop mostrando resultado final
  236.   {
  237.     cntlPisca1();
  238.     ticTacDisp();
  239.     delay(endGame);
  240.     cntlPisca2();
  241.     ticTacDisp();
  242.     delay(endGame);
  243.   }
  244. }
  245. //-----------------------------------------------------
  246. void checkMatriz()
  247. {
  248.   for (int i = 0; i < 3; i++)                                 // Scan de linhas matriz1
  249.   {
  250.     mMat1[i][3] = mMat1[i][0] + mMat1[i][1] + mMat1[i][2];    // Salva soma dos valores lidos
  251.   }
  252.   for (int i = 0; i < 3; i++)                                 // Scan de coliunas matriz1
  253.   {
  254.     mMat1[3][i] = mMat1[0][i] + mMat1[1][i] + mMat1[2][i];    // Salva soma dos valores lidos
  255.   }
  256.   mMat1[4][0] = mMat1[0][0] + mMat1[1][1] + mMat1[2][2];      // Salva soma dos valores lidos diagonal
  257.   mMat1[4][1] = mMat1[0][2] + mMat1[1][1] + mMat1[2][0];      // Salva soma dos valores lidos diagonal
  258.  
  259.   for (int i = 0; i < 3; i++)                                 // Scan de linhas matriz2
  260.   {
  261.     mMat2[i][3] = mMat2[i][0] + mMat2[i][1] + mMat2[i][2];    // Salva soma dos valores lidos
  262.   }
  263.   for (int i = 0; i < 3; i++)                                 // Scan de coliunas matriz1
  264.   {
  265.     mMat2[3][i] = mMat2[0][i] + mMat2[1][i] + mMat2[2][i];    // Salva soma dos valores lidos
  266.   }
  267.   mMat2[4][0] = mMat2[0][0] + mMat2[1][1] + mMat2[2][2];      // Salva soma dos valores lidos diagonal
  268.   mMat2[4][1] = mMat2[0][2] + mMat2[1][1] + mMat2[2][0];      // Salva soma dos valores lidos diagonal
  269. }
  270. //-----------------------------------------------------
  271. void piscaLED()
  272. {
  273.   if (millis() - phase1 < tPisca1)
  274.   {
  275.     cntlPisca1();                                         // Salva Or de 2 matrizes na 3a matriz
  276.     mMat3[linha][coluna] = 1;                             // Acende Led da jogada
  277.     ticTacDisp();                                         // Mostra nos LEDs
  278.     phase2 = millis();
  279.   }
  280.   else
  281.   {
  282.     if (millis() - phase2 < tPisca2)
  283.     {
  284.       cntlPisca1();                                         // Salva Or de 2 matrizes na 3a matriz
  285.       mMat3[linha][coluna] = 0;                             // Apaga Led da jogada
  286.       ticTacDisp();                                         // Mostra nos LEDs
  287.       phase3 = millis();
  288.     }
  289.     else
  290.     {
  291.       if (millis() - phase3 < tPisca1)
  292.       {
  293.         cntlPisca1();                                         // Salva Or de 2 matrizes na 3a matriz
  294.         mMat3[linha][coluna] = 1;                             // Acende Led da jogada
  295.         ticTacDisp();                                         // Mostra nos LEDs
  296.         phase4 = millis();
  297.       }
  298.       else
  299.       {
  300.         if (millis() - phase4 < tPisca2)
  301.         {
  302.           cntlPisca1();                                         // Salva matriz jogador 1 na 3a matriz
  303.           mMat3[linha][coluna] = 0;                             // Apaga Led da jogada
  304.           ticTacDisp();                                         // Mostra nos LEDs
  305.           phase5 = millis();
  306.         }
  307.         else
  308.         {
  309.           if (millis() - phase5 < tPisca1)
  310.           {
  311.             cntlPisca2();                                         // Salva matriz jogador 1a matriz
  312.             mMat3[linha][coluna] = 1;                             // Acende Led da jogada
  313.             ticTacDisp();                                         // Mostra nos LEDs
  314.             phase6 = millis();
  315.           }
  316.           else
  317.           {
  318.             if (millis() - phase6 < tPisca2)
  319.             {
  320.               cntlPisca2();                                         // Salva matriz jogador 1a matriz
  321.               mMat3[linha][coluna] = 0;                             // Apaga Led da jogada
  322.               ticTacDisp();                                         // Mostra nos LEDs
  323.               phase7 = millis();
  324.             }
  325.             else
  326.             {
  327.               if (millis() - phase7 < tPisca1)
  328.               {
  329.                 cntlPisca2();                                         // Salva matriz jogador 1a matriz
  330.                 mMat3[linha][coluna] = 1;                             // Acende Led da jogada
  331.                 ticTacDisp();                                         // Mostra nos LEDs
  332.                 phase8 = millis();
  333.               }
  334.               else
  335.               {
  336.                 if (millis() - phase8 < tPisca2)
  337.                 {
  338.                   cntlPisca2();                                         // Salva matriz jogador 1a matriz
  339.                   mMat3[linha][coluna] = 0;                             // Apaga Led da jogada
  340.                   ticTacDisp();                                         // Mostra nos LEDs
  341.                 }
  342.                 else
  343.                 {
  344.                   phase1 = millis();
  345.                 }
  346.               }
  347.             }
  348.           }
  349.         }
  350.       }
  351.     }
  352.   }
  353. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement