Espruino:Примеры/Электронные кости с помощью Espruino Pico

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Электронные кости с помощью Espruino Pico[1]

В этом руководстве мы создадим простые электронные кости, которые при тряске будут генерировать случайное число в диапазоне между 1 и 6.

Нам понадобятся

Подсоединение

Подключение осуществляется очень просто:

  • Просто поместите Espruino Pico на макетную плату так, чтобы её USB-коннектор смотрел влево.
  • Поместите LCD-дисплей прямо над Pico и выровняйте его контакты по правому контакту Pico – так, чтобы самый левый контакт Pico (тот, что ближе всего к USB-коннектору) оказался свободен.
  • Наконец, подключите датчик вибрации в 3 и 4 контактам слева на макетной плате под Espruino Pico. Датчик можно подключать любой стороной. Будьте аккуратны, потому что один из контактов датчика очень хрупкий и очень легко гнётся.

Код

Во-первых, скопируйте код ниже – в нём объединён код из руководства «Печать надписи «Hello World!» на LCD-дисплее с помощью Espruino Pico» и код из руководства «Датчик вибрации с помощью Espruino Pico» – вставьте его в правую часть IDE и кликните на кнопку загрузки кода.

A5.write(0); // контакт GND
A7.write(1); // контакт VCC
A6.write(1); // контакт для включения подсветки

var g; // глобально задаём переменную «g»,
       // чтобы её можно было использовать в других функциях

function onInit() {
  // Настраиваем SPI:
  var spi = new SPI();
  spi.setup({ sck:B1, mosi:B10 });
  // Инициализируем LCD-дисплей:
  g = require("PCD8544").connect(spi,B13,B14,B15, function() {
    // После инициализации очищаем дисплей и пишем на нём текст:
    g.clear();
    g.drawString("Hello World!",0,0);
    // Отправляем графику на дисплей:
    g.flip();
  });
}

var on = false;
function shaken() {
  if (on) return; // если таймаут не истёк, игнорируем это
  // В противном случае включаем светодиод:
  on = true;
  digitalWrite(LED1, on);
  // Теперь задаём таймаут на выключение светодиода
  // через 200 мс (1/5 секунды):
  setTimeout(function() {
    on = false;
    digitalWrite(LED1, on);
  }, 200);
}

pinMode(B3,"input_pulldown"); // включаем стягивающий резистор
// Начинаем прослушивать контакт B3 на предмет тряски:
setWatch(shaken, B3, {repeat:true, edge:"rising"});

onInit();

Теперь экран будет показывать «Hello World!», и если потрясти плату, на ней на долю секунды загорится светодиод.

Теперь давайте просто отредактируем функцию shaken(), чтобы она показывала случайное число – замените её на следующее:

function showRandom() {
  // Генерируем случайное число в диапазоне между 1 и 6:
  var n = 1 + Math.floor(Math.random()*6);
  // Очищаем экран:
  g.clear();
  // Большой шрифт – высотой во весь экран:
  g.setFontVector(g.getHeight());
  // Рисуем число в середине экрана:
  g.drawString(n, (g.getWidth()-g.stringWidth(n))/2, 0);
  // отправляем графику на LCD-дисплей:
  g.flip();
}

function shaken() {
  if (on) return; // если таймаут ещё не истёк, игнорируем это
  // В противном случае включаем светодиод:
  on = true;
  digitalWrite(LED1, on);
  showRandom();
  // Теперь задаём таймаут на выключение светодиода
  // через 200 мс (1/5 секунды):
  setTimeout(function() {
    on = false;
    digitalWrite(LED1, on);
  }, 200);
}

Вот и всё, мы сделали простейшие электронные кости!

Мы даже можем нарисовать сами кости (в смысле, точки граней «кубика»), отредактировав функцию showRandom().

// Точки для каждой грани кубика:
var dots = [
  undefined,
  [ [0,0] ],
  [ [-1,-1],[1,1] ],
  [ [1,-1],[0,0],[-1,1] ],
  [ [-1,-1],[1,1],[1,-1],[-1,1] ],
  [ [-1,-1],[1,1],[1,-1],[-1,1],[0,0] ],
  [ [-1,-1],[0,-1],[1,-1],[-1,1],[0,1],[1,1] ],
];

var on = false;
function showRandom() {
  // Генерируем случайное число в диапазоне между 1 и 6:
  var n = 1 + Math.floor(Math.random()*6);
  // Очищаем экран:
  g.clear();
  // Большой шрифт – высотой во весь экран:
  g.setFontVector(g.getHeight());
  // Рисуем число:
  g.drawString(n, (g.getWidth()/2-g.stringWidth(n))/2, 0);
  // Рисуем кости:
  dots[n].forEach(function(coords) {
    var x = g.getWidth()*3/4 + coords[0]*12;
    var y = g.getHeight()/2 + coords[1]*12;
    g.fillRect(x-3,y-2,x+3,y+2);
    g.fillRect(x-2,y-3,x+2,y+3);
  });
  // Отправляем графику на LCD-дисплей:
  g.flip();
}

См.также

Внешние ссылки