El juego Arduino más simple con una pantalla 1602 - Parte # 1


Eso es lo que tenemos que conseguir, bueno, él todavía sabe cómo saltar, caminar y vencer a los cactus malvados que lo atacan, pero iremos paso a paso :)

PARTE # 1 conceptos básicos


Me ordené un arduino, "un juguete regular", pensé, un pequeño kit (para probar), que luego lamenté. Quería liberar el potencial, pero debido a la falta de módulos adicionales esto no funcionó, tuve que experimentar, puse el arduino en el sistema de seguridad y vi cómo los sensores hacen su trabajo, luego decidí hacer una alarma de audio (usando el chirrido práctico del kit), así que destete a los perros en voz alta o de repente ladrando :) y luego mis manos llegaron a la pantalla 1602. "Hmm ... esta es una pantalla real", pensé, pero me decepcionó descubrir que se come casi la mitad de todos los contactos del arduino. Rebusqué y encontré un tablero extraño en el kit "i2C" y ¡sospechaba mucho de eso! Que el número de agujeros coincidió con el número de proxenetas en la pantalla. "Hmm, no es fácil ..." pensé, y decidí soldarlos. Un poco más tarde, me di cuenta de que había hecho lo correcto y ahora mi pantalla solo consume dos canales. Comenzó a estudiar qué tipo de exhibición era y qué podía hacer. Habiendo estudiado suficiente material, descubrí que la pantalla es puramente textual, ¡pero he aquí! Puede manejar 8 nuevos caracteres con dimensiones de 5x8 píxeles. Bueno, entonces, ¡comencemos a escribir un juego! Primero, debes averiguar qué tipo de juego será, decidí hacerlo parecer un dinosaurio gugl chrome, pero con un par de fichas, por así decirlo, para empezar, creo que funcionará :) pero aún tiene que administrar algo, y los botones múltiples no tuvieron que pensar mucho. Tomé el control remoto IR del kit.

imagen

"Esa es la palanca de mando", murmuré sospechosamente por lo bajo, pensando en el retraso del control remoto, la claridad del sensor de infrarrojos y, en general, sobre la idoneidad de esta idea, pero no había nada que hacer, pude entrenar a Arduino para que trabajara con el teclado de la computadora, pero fue realmente pereza para hacerlo Entonces comencé a escribir los códigos de control remoto, para poder trabajar con ellos en el futuro. El código para el microcontrolador es el más simple aquí:

"--------------------------------------------------------------------------" //   IRremote #include <IRremote.h> decode_results results; IRrecv irrecv (A0); //      void setup () { Serial.begin(9600); //   com  irrecv.enableIRIn(); //    } void loop () { if (irrecv.decode( &results )) //      ,    { Serial.println( results.value, HEX ); //          irrecv.resume(); //            } } "--------------------------------------------------------------------------" 

El código de la señal del control remoto se ve así: "FF18E7" sus códigos serán diferentes, pero debe comprender la esencia, y cuando apela a este código, agregamos "0x" al principio y obtenemos (0xFF18E7).

Después de llenar esto en arduino y conectarlo como debería, podemos comenzar a grabar desde el puerto de registro de la tsiforka, después de hacer clic en los botones del dispositivo IR. Pero aquí solo quiero aclararle cómo conectar el sensor IR.

Si miramos el sensor, vemos tres patas, izquierda (señal analógica), media (tierra), derecha (más 5V).

imagen

Como todavía tenía poca idea de cómo funcionaría, comencé a experimentar. Al principio hice el código del boceto paso a paso, a través de (retraso (tiempo)) al principio no sospeché que era una mala idea :)
¿Cuál es la jamba principal? Este microcontrolador no puede realizar multitareas. Considera el código de arriba a abajo, pasando por todas las ramas y funciones, y después de completarlo, comienza de nuevo. Y ahora, cuando tenemos muchos de estos "retrasos" en el código, comenzamos a notar retrasos obvios. Por cierto, sí, ¿por qué necesitamos tanto "retraso"? Cuando hacemos un juego, el número de controles e interacciones comienza a crecer. Por ejemplo, un enemigo se mueve hacia nosotros y quiero saltar sobre él, presiono el "salto" y de acuerdo con el plan, tengo que colgar en el aire por ejemplo 0.8f segundos en el aire, y este es todo el juego y se congela durante estos 0.8f segundos. "Cant" pensé y comencé a pensar en una solución. La solución se encontró rápidamente. El microcontrolador mismo puede leer rápidamente el código de principio a fin (si no le molesta) y también sabe cómo contar el tiempo desde el principio de su inclusión. Esto es lo que necesitamos. Ahora solo creamos variables que almacenarán el tiempo para esta o aquella acción y una variable que compara la diferencia de qué hora es ahora y cuánto se tarda en activar el código. Arduino por segundo, lleva 1000 milisegundos, bastante conveniente. Aquí hay un fragmento cuando se vuelve más claro:

 "--------------------------------------------------------------------------" //    ,  ,        //  long ClearTime = 150; // 150 = 0.15f   ~6    long ClearTimeCheck = 0; // ,       long currentMillis = 0; //   void loop () { currentMillis = millis(); //   =    } void clearscreen () //   { // if (currentMillis - ClearTimeCheck >= ClearTime) //  (  -     0.15f    { ClearTimeCheck = currentMillis; //       lcd.clear(); //   ,     } } "--------------------------------------------------------------------------" 

No es difícil, ¿verdad?

Después de reescribir todo el código de una manera nueva, el juego comenzó a funcionar rápida y claramente, para simular acciones multitarea :) Recorrí un largo camino. Después de todo, aún necesitamos crear un personaje, una especie de interfaz y animación. Dado que solo podemos crear ocho nuevos personajes, necesitamos de alguna manera desordenarlo de manera inteligente. No planeo hacer muchos objetos en la pantalla hasta ahora, por lo tanto, se puede hacer para tener solo ocho objetos activos en la pantalla en un procesamiento de código. Que sera Bueno, naturalmente el personaje principal, un golpe, un villano, un corazón y un indicador de salud. Para empezar, esto es suficiente. Sí, y tengo tres objetos únicos más en stock.

El personaje principal se verá así:



El proceso de ingresar un nuevo personaje, lo produzco en código binario (me siento muy cómodo)
se verá así:

01110
01110
00100
01110
10101
00100
01110
01010

Si miras de cerca, entonces, desde uno, veremos a nuestro personaje, pero para que no permanezca inactivo, hagámoslo una animación.



Ahora a nuestro código, se agrega un conjunto más de números binarios, a saber, este:

00000
01110
01110
00100
11111
00100
01110
01010

Cómo hacer animación en esta pantalla, indiqué la lógica anterior, y ahora practiquemos, por el momento, colóquelo en el centro de la pantalla y déjelo quieto, y recuerde, nuestra tarea es usar solo una celda de memoria para dos sprites de animación. Esto es más fácil de lo que parece:

 "--------------------------------------------------------------------------" #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x3F,16,2); //   long AnimatedTime = 300; //     long AnimatedTimeCheck = 0; //   (    ) int AnimPlayer = 1; //    int GGpozX = 8; //   int GGpozY = 1; //   1  2   0    long currentMillis = 0; //   //   ,     ,    :) enum { SYMBOL_HEIGHT = 8 }; byte Player_1[SYMBOL_HEIGHT] = {B01110,B01110,B00100,B01110,B10101,B00100,B01110,B01010,}; //  1 byte Player_2[SYMBOL_HEIGHT] = {B00000,B01110,B01110,B00100,B11111,B00100,B01110,B01010,}; //  2 void setup() { lcd.init(); lcd.backlight();//    loop(); PlAn(); } void loop() { if (AnimPlayer != 50) { //    ,       :) // --------------------------- Animated -> // -------------------- Player -> if (AnimPlayer == 1){lcd.createChar(0, Player_1);} //  1   1 //(lcd.createChar(    0  7,   )) if (AnimPlayer == 2){lcd.createChar(0, Player_2);} //  2   2 } // --------------------------- <- Animated currentMillis = millis(); //   =    PlAn(); } void PlAn () { if (AnimPlayer == 1) //   1  { lcd.setCursor(GGpozX, GGpozY); //  ""      lcd.write(0); //          "" } if (AnimPlayer == 2) //  №1 { lcd.setCursor(GGpozX, GGpozY); lcd.write(0); } if (currentMillis - AnimatedTimeCheck >= AnimatedTime) //       { AnimatedTimeCheck = currentMillis; //     if (AnimPlayer == 2){AnimPlayer = 1; return;} //  2   1      if (AnimPlayer == 1){AnimPlayer = 2;} // 1  2           ,         } } "--------------------------------------------------------------------------" 

Después de comenzar, vemos al hombrecillo, que está en el centro de la pantalla, en la segunda línea y se balancea, por así decirlo.

Conclusión: hoy hablé sobre cómo encontrar datos a través del puerto de infrarrojos, cómo evitar el retraso del código del microcontrolador y cómo hacer la animación inicial.

El resto llegará pronto :) Todavía tengo mucho que escribir, así que veré cómo será interesante para ustedes y, de ser así, mañana comenzaré a escribir una secuela.

¡Gracias a todos por su atención, chao cacao!

La segunda parte del artículo -> habr.com/post/425367

Source: https://habr.com/ru/post/es424859/


All Articles