Освой Arduino играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Управление объектами на OLED-дисплее при помощи джойстика

Решил объединить пример джойстика и OLED-дисплея в одном месте. Можно придумать какую-нибудь игру.

Выводы OLED-дисплея соединяются с цифровыми выводами платы 8, 9, 11, 12, 13. Джойстик соединяем с аналоговыми выводами A0 и A1, кнопку джойстика соединяем с выводом 7.

Перед запуском скетча следует установить библиотеки Adafruit GFX Library, Adafruit SSD1306.

Для начала нарисуем ограничивающий прямоугольник, который послужит игровым полем. Затем нарисуем круг, который будет управляться джойстиком. Показания джойстика от 0 до 1024 нужно уместить в промежуток от -5 до 5. Это позволит двигать круг с заданной скоростью. В начале запуска установим круг в центре экрана. Также позаботимся, чтобы круг не выходил за рамки ограничивающего прямоугольника (не забываем, что прямоугольник имеет толщину 1 пиксель, который тоже следует учесть).


#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

// software SPI:
#define OLED_MOSI   11
#define OLED_CLK   13
#define OLED_DC    9
#define OLED_CS    12
#define OLED_RESET 8

// Новый конструктор с указанием размеров экрана
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
                         OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

// Width of our display - used as the maximum stack value
const int MAXSTACK = 128;

// Analoguejoystick connections for X and Y
const int JOYY = A0;
const int JOYX = A1;

// Digital input for the Joystick switch
const int SWITCH_PIN = 7;

int ballX, ballY;

void setup() {
  display.begin(SSD1306_SWITCHCAPVCC);
  display.clearDisplay();
  ballX = 64;
  ballY = 32;
}

void displayBall(int x, int y) {
  display.fillCircle(x, y, 8, WHITE);
}

void updateBall() {
  int xValue, yValue;
  xValue = map(analogRead(JOYX), 0, 1024, 5, -5);
  yValue = map(analogRead(JOYY), 0, 1024, -5, 5);

  ballX = ballX + xValue;
  ballY = ballY + yValue;

  if (ballX < 9)
    ballX = 9;
  if (ballY < 9)
    ballY = 9;
  if (ballX > display.width() - 10)
    ballX = display.width() - 10;
  if (ballY > display.height() - 10)
    ballY = display.height() - 10;
}

void loop()
{
  display.drawRect(0, 0, 128, 64, WHITE);
  updateBall();
  displayBall(ballX, ballY);

  display.display();
  delay(1);
  display.fillScreen(BLACK);
}

После запуска скетча можно двигать шарик в любом направлении.

OLED-дисплей с джойстиком

Можно добавить на экран другие объекты и описать условия столкновения и других взаимодействий. Сделал простейший пример столкновения по одному условию (в реальной игре условие будет гораздо сложнее), когда круг оказывается слева от квадрата, то квадрат можно сдвинуть в правый край.


#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

// software SPI:
#define OLED_MOSI   11
#define OLED_CLK   13
#define OLED_DC    9
#define OLED_CS    12
#define OLED_RESET 8

// Новый конструктор с указанием размеров экрана
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
                         OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

// Width of our display - used as the maximum stack value
const int MAXSTACK = 128;

// Analoguejoystick connections for X and Y
const int JOYY = A0;
const int JOYX = A1;

// Digital input for the Joystick switch
const int SWITCH_PIN = 7;

int ballX, ballY;
int boxX, boxY;

void setup() {
  display.begin(SSD1306_SWITCHCAPVCC);
  display.clearDisplay();
  ballX = 1;
  ballY = 32;
  boxX = 17;
  boxY = 17;
}

void displayBall(int x, int y) {
  display.fillCircle(x, y, 8, WHITE);
}

void displayBox(int x, int y) {
  int size = 16;
  display.fillRect(x, y, size, size, WHITE);
}

void updateBall() {
  int xValue, yValue;
  xValue = map(analogRead(JOYX), 0, 1024, 5, -5);
  yValue = map(analogRead(JOYY), 0, 1024, -5, 5);

  ballX = ballX + xValue;
  ballY = ballY + yValue;

  if (ballX < 9)
    ballX = 9;
  if (ballY < 9)
    ballY = 9;
  if (ballX > display.width() - 10)
    ballX = display.width() - 10;
  if (ballY > display.height() - 10)
    ballY = display.height() - 10;

  collide();  
}

void updateBox() {
//  int xValue, yValue;
//  xValue = map(analogRead(JOYX), 0, 1024, 5, -5);
//  yValue = map(analogRead(JOYY), 0, 1024, -5, 5);

//  boxX = boxX + xValue;
//  boxY = boxY + yValue;

  if (boxX < 9)
    boxX = 9;
  if (boxY < 9)
    boxY = 9;
  if (boxX > display.width() - 17)
    boxX = display.width() - 17;
  if (boxY > display.height() - 17)
    boxY = display.height() - 17;
}

void collide(){
  if((boxX - ballX) < 16){
    boxX = boxX + 1;
    //ballX = ballX + 1;
  }
}

void loop()
{
  display.drawRect(0, 0, 128, 64, WHITE);
  displayBox(boxX, boxY);
  updateBall();
  updateBox();
  displayBall(ballX, ballY);

  display.display();
  delay(1);
  display.fillScreen(BLACK);
}

OLED-дисплей с джойстиком

Космический корабль

На Гитхабе нашёл игру, в которой управляя джойстиком космическим кораблём, нужно уворачиваться от препятствий.

OLED-дисплей с джойстиком

Реклама