Skip to content

Commit

Permalink
criação do repositório
Browse files Browse the repository at this point in the history
  • Loading branch information
LelePG committed May 27, 2023
0 parents commit 19721e5
Show file tree
Hide file tree
Showing 7 changed files with 172 additions and 0 deletions.
Binary file added Gerber.zip
Binary file not shown.
Binary file added Project.zip
Binary file not shown.
31 changes: 31 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# PCB Simon-Says (Gênio)
<p align="center"><img src = "imagens/simonSaysGif.gif" width = "425" alt = "Gif da placa em visualização 3d">
<img src = "imagens/simonSaysTop.png" width = "200" alt = "Visualização 2d do top da placa"></p>

## O que é este projeto?
Este projeto se trata de uma placa de circuito impresso (PCB) na forma de um shield para arduino uno para o jogo Gênio (ou simon says) onde uma sequência aleatória é gerada e o usuário deve repetir a sequência apertando os botões.

O projeto foi desenvolvido com o software **Easy EDA** e está disponível no compartilhamento da PCB way. Para acessá-lo, [clique aqui](https://www.pcbway.com/project/shareproject/Simon_Says_Arduino_Uno_Shield_13ca4bec.html).

## Como este projeto está estruturado?
* Gerber.zip: arquivos gerber do projeto;
* Project.zip: arquivos de desenvolvimento do projeto;
* Pasta imagens: contém imagens do projeto;
* Pasta genio: Código fonte do projeto

## Componentes necessários para o projeto
A lista de componentes detalhada deste projeto pode ser encontrada na Mouser na forma de um carrinho de compras [clicando aqui.](https://www.mouser.com/ProjectManager/ProjectDetail.aspx?AccessID=DD460456D2)

Optei pela utilização de componentes PTH neste projeto porque o processo de solda é mais simples.

|Componente|Quantidade|Observação|
|:----------:|:----------:|:----------:|
| [Arduino Uno](https://br.mouser.com/ProductDetail/782-A000073) | 1 | |
| [LED azul](https://www.mouser.com/ProductDetail/941-C503BBASCX0B0461) | 1 | |
| [LED vermelho](https://www.mouser.com/ProductDetail/941-C503BRCNCW0X0AA1)| 1 | | |
| [LED verde](https://www.mouser.com/ProductDetail/941-C503BGANCB0F0791) | 1 | |
| [LED amarelo](https://www.mouser.com/ProductDetail/941-C503BAANCY0B0251) | 1 | |
| [Resistor de 100 ohms](https://www.mouser.com/ProductDetail/594-5043ED100R0F) | 5 | usado nos leds e no botão |
| [Piezo Buzzer](https://www.mouser.com/ProductDetail/497-IE122303-1) | 1 | |
| [Chave tátil](https://www.mouser.com/ProductDetail/506-1-1825910-4) | 4 | |

141 changes: 141 additions & 0 deletions genio/genio.ino
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
/*Simon-Says (Gênio)
O jogo pode ser rodado com opção de alocação dinâmica ou estática de memória. A alocação estática, consome 11% de storage e 4% de memória dinâmica, enquanto a alocação dinâmica consome 15% de storage e
2% de memória dinâmica (Arduino Uno). As linhas de código referente a opção de memória estão marcadas com um comentáio, logo depois dos defines, (declaração do vetor que vai armazenar a sequência) e inicio da
função adicionaNovo() (inserção de um novo item na sequência). O jogo está originalmente setado com alocação estática.
Letícia Pegoraro Garcez 2019
*/
//entradas
#define led1 8
#define led2 9
#define led3 10
#define led4 11
#define btn1 7
#define btn2 6
#define btn3 5
#define btn4 4
#define sb 12
//sounds for each led and one for the wrong function.
#define SOUND1 1047
#define SOUND2 1175
#define SOUND3 1319
#define SOUND4 1397
#define SOUND_WRONG 2093

int posicoes;
//int *sequencia = (int*)malloc(sizeof(int));//ALOCAÇÃO DINÂMICA
int sequencia[30];//ALOCAÇÃO ESTÁTICA
void adicionaNovo (void);
void piscaLed(int n);
void playSequencia(void);
void confere(void);
void playWrong(void);

void setup() {
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(btn1, INPUT);
pinMode(btn2, INPUT);
pinMode(btn3, INPUT);
pinMode(btn4, INPUT);
pinMode(sb, OUTPUT);
Serial.begin(9600);
}

void loop() {
adicionaNovo();//Insere a sequência
delay(700);
confere();//Confere a sequência.
delay(800);

}

void adicionaNovo(void) {
/*
sequencia = (int*) realloc (sequencia,(posicoes+1)*sizeof(int));
if(sequencia == NULL){//caso ocorra algum problema
playWrong();
}
*///ALOCAÇÃO DINÂMICA

if (posicoes != 0) { //Exibir o que tenho armazenado no vetor
playSequencia();
}
randomSeed(millis());//A seed do random vira o tempo atual de execução, o que faz com que as sequencias possam ser diferentes
sequencia[posicoes] = random(1, 5); //Gera um random entre 1 e 4
piscaLed(sequencia[posicoes]);
posicoes++;

}

void piscaLed (int n) { //Os valores 1,2,3,4 são associados ás saídas.
switch (n) {
case 1:
digitalWrite(led1, HIGH);
tone(sb, SOUND1);
delay(500);
noTone(sb);
digitalWrite(led1, LOW);
break;
case 2:
digitalWrite(led2, HIGH);
tone(sb, SOUND2);
delay(500);
digitalWrite(led2, LOW);
noTone(sb);
break;
case 3:
digitalWrite(led3, HIGH);
tone(sb, SOUND3);
delay(500);
digitalWrite(led3, LOW);
noTone(sb);
break;
case 4:
digitalWrite(led4, HIGH);
tone(sb, SOUND4);
delay(500);
noTone(sb);
digitalWrite(led4, LOW);
}
}

void playSequencia(void) { //sem o que explicar aqui.
for (int contador = 0; contador < posicoes; contador++) {
piscaLed(sequencia[contador]);
delay(500);
}
}

void confere(void) {
int contador = 0;
while (contador < posicoes) { //Enquanto eu não tiver dado entrada para todos os elementos da sequência ele continua esperando.
if ((digitalRead(btn1) && sequencia[contador] == 1) || (digitalRead(btn2) && sequencia[contador] == 2) || (digitalRead(btn3) && sequencia[contador] == 3) || (digitalRead(btn4) && sequencia[contador] == 4)) {
//Se o botão apertado corresponder a cor certa, ele fica esperando a entrada da próxima posição.
piscaLed(sequencia[contador]);//Acende o led correto
contador++;
}
else if ((digitalRead(btn1) && sequencia[contador] != 1) || (digitalRead(btn2) && sequencia[contador] != 2) || (digitalRead(btn3) && sequencia[contador] != 3) || (digitalRead(btn4) && sequencia[contador] != 4)) {
//Aqui precisa ser else if é pro programa esperar a entrada, do contrário simplesmente toca o wrong assim que o primeiro led correto é apertado.
playWrong();//Se o botão é diferente do que ele estava esperando ele roda a função de finalizar o jogo. Nessa função ele zera a quantidade de posições, o que sai do loop automaticamente.
}
}
}

void playWrong (void) {
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
digitalWrite(led3, HIGH);
digitalWrite(led4, HIGH);
tone(sb, SOUND_WRONG);
delay(1500);//Deixa os leds e o som ligados um pouco
noTone(sb);
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
posicoes = 0;//Zera o número de posições, então ele vai começar a preencher o vetor novamente do zero na próxima iteração do void loop
}
Binary file added imagens/simonSaysBottom.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added imagens/simonSaysGif.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added imagens/simonSaysTop.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 19721e5

Please sign in to comment.