Tutorial: Stranger Things Mensagem Wall com Arduino

Se você está iniciando no mundo Maker ou já está nele a algum tempo e ainda curte Séries, mais especificamente Stranger Things, então este tutorial é para você! Aprenda a desenvolver um projeto que foi elaborado com base na cena conhecida como “Alphabet Wall” de Stranger Things.
Olá pessoas, tudo bem com vocês? Depois de algum tempo sem postar vídeos tutoriais, venho trazer pra vocês um projeto muito interessante envolvendo Arduíno, Android, Bluetooth e Eletrônica. Neste tutorial você aprenderá como escrever uma palavra ou frase pelo seu Smartphone e ela ser reproduzida através de 26 leds (cada um representa uma letra do alfabeto) que serão acesos de acordo com o que foi escrito. Este projeto foi desenvolvido por mim e com base na cena da Série Stranger Things em que o menino Wall se comunica com a mãe através de luzes colocadas na parede, cada uma indicando uma letra. O vídeo tutorial ficou com duração de quase 1 hora, mas adianto que vale a pena assistir porque cada passo foi muito bem detalhado, de forma que até mesmo pessoas sem conhecimento algum em eletrônica e programação possam reproduzi-lo. Sem mais delongas, fiquem com o vídeo:
Tutorial: Stranger Things Mensagem Wall com Arduino
Clique Aqui para fazer o Dowload de todos os arquivos utilizados no Vídeo
ou caso a opção acima não esteja funcionando: Clique Aqui para baixar
Esquemático
(Clique na Imagem para Ampliar)
Código Fonte
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 |
/* -------- Tutorial: Stranger Things Mensagem Wall com Arduino ------------ ========================================================================= == BLOG DA ROBOTICA - www.blogdarobotica.com == ========================================================================= Autor: Kleber Bastos E-mail: contato@blogdarobotica.com Fanpage: facebook.com/blogdarobotica YouTube: youtube.com/user/blogdarobotica */ //Definição de Pinos #define pin_A_I_R 2 #define pin_B_J_S 3 #define pin_C_K_T 4 #define pin_D_L_U 5 #define pin_E_M_V 6 #define pin_F_N_W 7 #define pin_G_O_X 8 #define pin_H_P_Y 9 #define pin_Q_Z 10 #define line_1 11 #define line_2 12 #define line_3 13 String text; //Variável do tipo string que receberá o texto void setup() { Serial.begin(9600); //Velocidade de comunicação pinMode(pin_A_I_R, OUTPUT); //Declarando o pino como saída pinMode(pin_B_J_S, OUTPUT); //Declarando o pino como saída pinMode(pin_C_K_T, OUTPUT); //Declarando o pino como saída pinMode(pin_D_L_U, OUTPUT); //Declarando o pino como saída pinMode(pin_E_M_V, OUTPUT); //Declarando o pino como saída pinMode(pin_F_N_W, OUTPUT); //Declarando o pino como saída pinMode(pin_G_O_X, OUTPUT); //Declarando o pino como saída pinMode(pin_H_P_Y, OUTPUT); //Declarando o pino como saída pinMode(pin_Q_Z, OUTPUT); //Declarando o pino como saída pinMode(line_1, OUTPUT); //Declarando o pino como saída pinMode(line_2, OUTPUT); //Declarando o pino como saída pinMode(line_3, OUTPUT); //Declarando o pino como saída inicializationEffect(); //Chamada da Função responsável pelo efeito inicial } void loop() { receiveText(); //Chamada da função responsável por receber o texto digitado } //Função que recebe o texto diitado void receiveText(){ while(Serial.available() > 0){ //Verifica se existe alguma informação na Serial char c = Serial.read(); //atribui cada caractere a variável c que é do tipo char if(c != '\n') text.concat(c); //verifica se a variável do tipo char recebeu uma quebra de linha que indica o fim da palavra ou frase e concatena todos os caracteres na String text delay(10); //aguarda 10 milissegundos } if(text.length() > 0){ //verifica se a string text tem tamanho maior que 0 text.toUpperCase(); //transforma tudo que estiver na string text para maiúsculo executeEffect(text); //chama a função executeEffect passando a string text como parâmetro } text = ""; //limpa a string text } //Função responsável por ativar linha que recebe como parâmetro o número da linha void lineActivation(int line){ if(line == 1){ //verifica se a linha recebida como parâmetro é a linha 1 e se for: digitalWrite(line_2, LOW); //coloca a linha 2 em estado lógico baixo digitalWrite(line_3, LOW); //coloca a linha 3 em estado lógico baixo digitalWrite(line_1, HIGH); //coloca a linha 1 em estado lógico alto }else if (line == 2){ //verifica se a linha recebida como parâmetro é a linha 2 e se for: digitalWrite(line_1, LOW); //coloca a linha 1 em estado lógico baixo digitalWrite(line_3, LOW); //coloca a linha 3 em estado lógico baixo digitalWrite(line_2, HIGH); //coloca a linha 2 em estado lógico alto }else if(line == 3){ //verifica se a linha recebida como parâmetro é a linha 3 e se for: digitalWrite(line_1, LOW); //coloca a linha 1 em estado lógico baixo digitalWrite(line_2, LOW); //coloca a linha 2 em estado lógico baixo digitalWrite(line_3, HIGH); //coloca a linha 3 em estado lógico alto } } //Função responsável por ativar a letra e recebe como parâmetro a letra, tempo que ficará ligada e tempo que ficará desligada void activateLetter(char letter, int on, int off){ if(letter == 'A' or letter == 'I' or letter == 'R'){ //verifica se a letra recebida é A, I ou R digitalWrite(pin_A_I_R, HIGH); //coloca o pino responsável pelas letras A, I, R em nível lógico alto delay(on); //mantém o pino em nível lógico alto durante o tempo que foi determinado no parâmetro da função digitalWrite(pin_A_I_R, LOW); //coloca o pino responsável pelas letras A, I, R em nível lógico baixo delay(off); //mantém o pino em nível lógico baixo durante o tempo que foi determinado no parâmetro da função }else if(letter == 'B' or letter == 'J' or letter == 'S'){ //verifica se a letra recebida é B, J ou S digitalWrite(pin_B_J_S, HIGH); //coloca o pino responsável pelas letras B, J, S em nível lógico alto delay(on); //mantém o pino em nível lógico alto durante o tempo que foi determinado no parâmetro da função digitalWrite(pin_B_J_S, LOW); //coloca o pino responsável pelas letras B, J, S em nível lógico baixo delay(off); }else if(letter == 'C' or letter == 'K' or letter == 'T'){ //verifica se a letra recebida é C, K ou T digitalWrite(pin_C_K_T, HIGH); //coloca o pino responsável pelas letras C, K, T em nível lógico alto delay(on); //mantém o pino em nível lógico alto durante o tempo que foi determinado no parâmetro da função digitalWrite(pin_C_K_T, LOW); //coloca o pino responsável pelas letras C, K, T em nível lógico baixo delay(off); //mantém o pino em nível lógico baixo durante o tempo que foi determinado no parâmetro da função }else if(letter == 'D' or letter =='L' or letter == 'U'){ //verifica se a letra recebida é D, L ou U digitalWrite(pin_D_L_U, HIGH); //coloca o pino responsável pelas letras D, L, U em nível lógico alto delay(on); //mantém o pino em nível lógico alto durante o tempo que foi determinado no parâmetro da função digitalWrite(pin_D_L_U, LOW); //coloca o pino responsável pelas letras D, L, U em nível lógico baixo delay(off); //mantém o pino em nível lógico baixo durante o tempo que foi determinado no parâmetro da função }else if(letter == 'E' or letter == 'M' or letter == 'V'){ //verifica se a letra recebida é E, M ou V digitalWrite(pin_E_M_V, HIGH); //coloca o pino responsável pelas letras E, M, V em nível lógico alto delay(on); //mantém o pino em nível lógico alto durante o tempo que foi determinado no parâmetro da função digitalWrite(pin_E_M_V, LOW); //coloca o pino responsável pelas letras E, M, V em nível lógico baixo delay(off); //mantém o pino em nível lógico baixo durante o tempo que foi determinado no parâmetro da função }else if(letter == 'F' or letter == 'N' or letter == 'W'){ //verifica se a letra recebida é F, N, W digitalWrite(pin_F_N_W, HIGH); //coloca o pino responsável pelas letras F, N, W em nível lógico alto delay(on); //mantém o pino em nível lógico alto durante o tempo que foi determinado no parâmetro da função digitalWrite(pin_F_N_W, LOW); //coloca o pino responsável pelas letras F, N, W em nível lógico baixo delay(off); //mantém o pino em nível lógico baixo durante o tempo que foi determinado no parâmetro da função }else if(letter == 'G' or letter == 'O' or letter == 'X'){ //verifica se a letra recebida é G, O, X digitalWrite(pin_G_O_X, HIGH); //coloca o pino responsável pelas letras G, O, X em nível lógico alto delay(on); //mantém o pino em nível lógico alto durante o tempo que foi determinado no parâmetro da função digitalWrite(pin_G_O_X, LOW); //coloca o pino responsável pelas letras G, O, X em nível lógico baixo delay(off); //mantém o pino em nível lógico baixo durante o tempo que foi determinado no parâmetro da função }else if(letter == 'H' or letter == 'P' or letter == 'Y'){ //verifica se a letra recebida é H, P, Y digitalWrite(pin_H_P_Y, HIGH); //coloca o pino responsável pelas letras H, P, Y em nível lógico alto delay(on); //mantém o pino em nível lógico alto durante o tempo que foi determinado no parâmetro da função digitalWrite(pin_H_P_Y, LOW); //coloca o pino responsável pelas letras H, P, Y em nível lógico baixo delay(off); //mantém o pino em nível lógico baixo durante o tempo que foi determinado no parâmetro da função }else if(letter == 'Q' or letter == 'Z'){ //verifica se a letra recebida é Q OU Z digitalWrite(pin_Q_Z, HIGH); //coloca o pino responsável pelas letras Q, Z em nível lógico alto delay(on); //mantém o pino em nível lógico alto durante o tempo que foi determinado no parâmetro da função digitalWrite(pin_Q_Z, LOW); //coloca o pino responsável pelas letras Q, Z em nível lógico baixo delay(off); //mantém o pino em nível lógico baixo durante o tempo que foi determinado no parâmetro da função } } //Função responsável por executar o efeito de acender as luzes reespectivas às letras da palavra contida na string text void executeEffect(String text){ for(int i = 0; i < text.length(); i++){ //laço responsável por percorrer toda os caracteres contidos na string text (text.length retorna o tamanho da string text) switch(text[i]){ //verifica se o caractere que está na posição i é: case 'A': //caso seja o caractere A lineActivation(1); //chama a função responsável por ativar linha e passa como parâmetro a linha 1 activateLetter('A', 1000, 200); //chama a função responável por ativar a letra, passando como parâmetro a letra A, tempo de 1000 milissegundos para ficar ligada e de 200 milissegundos desligada break; case 'B': //caso seja o caractere B lineActivation(1); //chama a função responsável por ativar linha e passa como parâmetro a linha 1 activateLetter('B', 1000, 200); //chama a função responável por ativar a letra, passando como parâmetro a letra B, tempo de 1000 milissegundos para ficar ligada e de 200 milissegundos desligada break; case 'C': //caso seja o caractere C lineActivation(1); //chama a função responsável por ativar linha e passa como parâmetro a linha 1 activateLetter('C', 1000, 200); //chama a função responável por ativar a letra, passando como parâmetro a letra C, tempo de 1000 milissegundos para ficar ligada e de 200 milissegundos desligada break; case 'D': //caso seja o caractere D lineActivation(1); //chama a função responsável por ativar linha e passa como parâmetro a linha 1 activateLetter('D', 1000, 200); //chama a função responável por ativar a letra, passando como parâmetro a letra D, tempo de 1000 milissegundos para ficar ligada e de 200 milissegundos desligada break; case 'E': //caso seja o caractere E lineActivation(1); //chama a função responsável por ativar linha e passa como parâmetro a linha 1 activateLetter('E', 1000, 200); //chama a função responável por ativar a letra, passando como parâmetro a letra E, tempo de 1000 milissegundos para ficar ligada e de 200 milissegundos desligada break; case 'F': //caso seja o caractere F lineActivation(1); //chama a função responsável por ativar linha e passa como parâmetro a linha 1 activateLetter('F', 1000, 200); //chama a função responável por ativar a letra, passando como parâmetro a letra F, tempo de 1000 milissegundos para ficar ligada e de 200 milissegundos desligada break; case 'G': //caso seja o caractere G lineActivation(1); //chama a função responsável por ativar linha e passa como parâmetro a linha 1 activateLetter('G', 1000, 200); //chama a função responável por ativar a letra, passando como parâmetro a letra G, tempo de 1000 milissegundos para ficar ligada e de 200 milissegundos desligada break; case 'H': //caso seja o caractere H lineActivation(1); //chama a função responsável por ativar linha e passa como parâmetro a linha 1 activateLetter('H', 1000, 200); //chama a função responável por ativar a letra, passando como parâmetro a letra H, tempo de 1000 milissegundos para ficar ligada e de 200 milissegundos desligada break; case 'I': //caso seja o caractere I lineActivation(2); //chama a função responsável por ativar linha e passa como parâmetro a linha 2 activateLetter('I', 1000, 200); //chama a função responável por ativar a letra, passando como parâmetro a letra I, tempo de 1000 milissegundos para ficar ligada e de 200 milissegundos desligada break; case 'J': //caso seja o caractere J lineActivation(2); //chama a função responsável por ativar linha e passa como parâmetro a linha 2 activateLetter('J', 1000, 200); //chama a função responável por ativar a letra, passando como parâmetro a letra J, tempo de 1000 milissegundos para ficar ligada e de 200 milissegundos desligada break; case 'K': //caso seja o caractere K lineActivation(2); //chama a função responsável por ativar linha e passa como parâmetro a linha 2 activateLetter('K', 1000, 200); //chama a função responável por ativar a letra, passando como parâmetro a letra K, tempo de 1000 milissegundos para ficar ligada e de 200 milissegundos desligada break; case 'L': //caso seja o caractere L lineActivation(2); //chama a função responsável por ativar linha e passa como parâmetro a linha 2 activateLetter('L', 1000, 200); //chama a função responável por ativar a letra, passando como parâmetro a letra L, tempo de 1000 milissegundos para ficar ligada e de 200 milissegundos desligada break; case 'M': //caso seja o caractere M lineActivation(2); //chama a função responsável por ativar linha e passa como parâmetro a linha 2 activateLetter('M', 1000, 200); //chama a função responável por ativar a letra, passando como parâmetro a letra M, tempo de 1000 milissegundos para ficar ligada e de 200 milissegundos desligada break; case 'N': //caso seja o caractere N lineActivation(2); //chama a função responsável por ativar linha e passa como parâmetro a linha 2 activateLetter('N', 1000, 200); //chama a função responável por ativar a letra, passando como parâmetro a letra N, tempo de 1000 milissegundos para ficar ligada e de 200 milissegundos desligada break; case 'O': //caso seja o caractere O lineActivation(2); //chama a função responsável por ativar linha e passa como parâmetro a linha 2 activateLetter('O', 1000, 200); //chama a função responável por ativar a letra, passando como parâmetro a letra O, tempo de 1000 milissegundos para ficar ligada e de 200 milissegundos desligada break; case 'P': //caso seja o caractere P lineActivation(2); //chama a função responsável por ativar linha e passa como parâmetro a linha 2 activateLetter('P', 1000, 200); //chama a função responável por ativar a letra, passando como parâmetro a letra P, tempo de 1000 milissegundos para ficar ligada e de 200 milissegundos desligada break; case 'Q': //caso seja o caractere Q lineActivation(2); //chama a função responsável por ativar linha e passa como parâmetro a linha 2 activateLetter('Q', 1000, 200); //chama a função responável por ativar a letra, passando como parâmetro a letra Q, tempo de 1000 milissegundos para ficar ligada e de 200 milissegundos desligada break; case 'R': //caso seja o caractere R lineActivation(3); //chama a função responsável por ativar linha e passa como parâmetro a linha 3 activateLetter('R', 1000, 200); //chama a função responável por ativar a letra, passando como parâmetro a letra R, tempo de 1000 milissegundos para ficar ligada e de 200 milissegundos desligada break; case 'S': //caso seja o caractere S lineActivation(3); //chama a função responsável por ativar linha e passa como parâmetro a linha 3 activateLetter('S', 1000, 200); //chama a função responável por ativar a letra, passando como parâmetro a letra S, tempo de 1000 milissegundos para ficar ligada e de 200 milissegundos desligada break; case 'T': //caso seja o caractere T lineActivation(3); //chama a função responsável por ativar linha e passa como parâmetro a linha 3 activateLetter('T', 1000, 200); //chama a função responável por ativar a letra, passando como parâmetro a letra T, tempo de 1000 milissegundos para ficar ligada e de 200 milissegundos desligada break; case 'U': //caso seja o caractere U lineActivation(3); //chama a função responsável por ativar linha e passa como parâmetro a linha 3 activateLetter('U', 1000, 200); //chama a função responável por ativar a letra, passando como parâmetro a letra U, tempo de 1000 milissegundos para ficar ligada e de 200 milissegundos desligada break; case 'V': //caso seja o caractere V lineActivation(3); //chama a função responsável por ativar linha e passa como parâmetro a linha 3 activateLetter('V', 1000, 200); //chama a função responável por ativar a letra, passando como parâmetro a letra V, tempo de 1000 milissegundos para ficar ligada e de 200 milissegundos desligada break; case 'W': //caso seja o caractere W lineActivation(3); //chama a função responsável por ativar linha e passa como parâmetro a linha 3 activateLetter('W', 1000, 200); //chama a função responável por ativar a letra, passando como parâmetro a letra W, tempo de 1000 milissegundos para ficar ligada e de 200 milissegundos desligada break; case 'X': //caso seja o caractere X lineActivation(3); //chama a função responsável por ativar linha e passa como parâmetro a linha 3 activateLetter('X', 1000, 200); //chama a função responável por ativar a letra, passando como parâmetro a letra X, tempo de 1000 milissegundos para ficar ligada e de 200 milissegundos desligada break; case 'Y': //caso seja o caractere Y lineActivation(3); //chama a função responsável por ativar linha e passa como parâmetro a linha 3 activateLetter('Y', 1000, 200); //chama a função responável por ativar a letra, passando como parâmetro a letra Y, tempo de 1000 milissegundos para ficar ligada e de 200 milissegundos desligada break; case 'Z': //caso seja o caractere A lineActivation(3); //chama a função responsável por ativar linha e passa como parâmetro a linha 3 activateLetter('Z', 1000, 200); //chama a função responável por ativar a letra, passando como parâmetro a letra Z, tempo de 1000 milissegundos para ficar ligada e de 200 milissegundos desligada break; case ' ': //caso seja o caractere espaço em branco delay(1000); //aguarda um tempo de 1000 milissegundos break; } } } //Função responsável pelo efeito de inicialização void inicializationEffect(){ lineActivation(1); //ativa a linha 1 activateLetter('A', 100, 10); //ativa a letra A por 100 milissegundos e desliga por 10 milissegundos activateLetter('B', 100, 10); //ativa a letra B por 100 milissegundos e desliga por 10 milissegundos activateLetter('C', 100, 10); //ativa a letra C por 100 milissegundos e desliga por 10 milissegundos activateLetter('D', 100, 10); //ativa a letra D por 100 milissegundos e desliga por 10 milissegundos activateLetter('E', 100, 10); //ativa a letra E por 100 milissegundos e desliga por 10 milissegundos activateLetter('F', 100, 10); //ativa a letra F por 100 milissegundos e desliga por 10 milissegundos activateLetter('G', 100, 10); //ativa a letra G por 100 milissegundos e desliga por 10 milissegundos activateLetter('H', 100, 10); //ativa a letra H por 100 milissegundos e desliga por 10 milissegundos lineActivation(2); //ativa a linha 2 activateLetter('I', 100, 10); //ativa a letra I por 100 milissegundos e desliga por 10 milissegundos activateLetter('J', 100, 10); //ativa a letra J por 100 milissegundos e desliga por 10 milissegundos activateLetter('K', 100, 10); //ativa a letra K por 100 milissegundos e desliga por 10 milissegundos activateLetter('L', 100, 10); //ativa a letra L por 100 milissegundos e desliga por 10 milissegundos activateLetter('M', 100, 10); //ativa a letra M por 100 milissegundos e desliga por 10 milissegundos activateLetter('N', 100, 10); //ativa a letra N por 100 milissegundos e desliga por 10 milissegundos activateLetter('O', 100, 10); //ativa a letra O por 100 milissegundos e desliga por 10 milissegundos activateLetter('P', 100, 10); //ativa a letra P por 100 milissegundos e desliga por 10 milissegundos activateLetter('Q', 100, 10); //ativa a letra Q por 100 milissegundos e desliga por 10 milissegundos lineActivation(3); //ativa a linha 3 activateLetter('R', 100, 10); //ativa a letra R por 100 milissegundos e desliga por 10 milissegundos activateLetter('S', 100, 10); //ativa a letra S por 100 milissegundos e desliga por 10 milissegundos activateLetter('T', 100, 10); //ativa a letra T por 100 milissegundos e desliga por 10 milissegundos activateLetter('U', 100, 10); //ativa a letra U por 100 milissegundos e desliga por 10 milissegundos activateLetter('V', 100, 10); //ativa a letra V por 100 milissegundos e desliga por 10 milissegundos activateLetter('W', 100, 10); //ativa a letra W por 100 milissegundos e desliga por 10 milissegundos activateLetter('X', 100, 10); //ativa a letra X por 100 milissegundos e desliga por 10 milissegundos activateLetter('Y', 100, 10); //ativa a letra Y por 100 milissegundos e desliga por 10 milissegundos activateLetter('Z', 100, 10); //ativa a letra Z por 100 milissegundos e desliga por 10 milissegundos } |
Não funcionou? Tem dúvidas? Acesse o Link para dúvidas relacionadas a este artigo lá no nosso fórum. O link é: Clique aqui para tirar dúvidas sobre este tutorial

Sobre Kleber Bastos
Graduado em Engenharia da Computação, Ex-BBB e apaixonado por Inovações Tecnológicas que visam ajudar as pessoas e o mundo em sua volta.
- Web |
- More Posts (13)