Espruino:Примеры/Дисплейное регистрирующее устройство при помощи Pixl.js

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

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


Дисплейное регистрирующее устройство при помощи Pixl.js[1]

DIY Counting and Graphing with Pixl.js

В этом руководстве мы расскажем, как создать простое устройство, которое будет ежедневно подсчитывать что-то, генерировать график и экспортировать результат. Мы также расскажем, как подключать к этому устройству внешние датчики и дистанционно модифицировать счётчик при помощи Puck.js.

Это может пригодиться, к примеру, если вы выращиваете помидоры и хотите вести подсчёт того, сколько плодов собираете ежедневно, или, возможно, вам нужно подсчитать то, сколько раз ваш коллега делает что-то раздражающее.

Для этого просто возьмите Pixl.js, подключитесь к нему при помощи IDE Espruino, скопируйте код ниже в правую часть IDE и нажмите на кнопку загрузки кода.

Когда программа будет запущена, просто воспользуйтесь кнопками «Вверх» и «Вниз», чтобы уменьшать и увеличивать значение счётчика. Каждый день в полночь счётчик обнуляется, а к графику добавляется ещё одна полоска.

Чтобы экспортировать данные, снова подключитесь к Pixl.js при помощи Web IDE и напечатайте toCSV() в левой части IDE. Это напечатает в консоли список разделённых запятыми дат и чисел, которые затем можно будет вставить в Excel или какую-то другую электронную таблицу.

Хранение данных

Этот код хранит данные только в RAM-памяти, поэтому при отключении питания они будут утеряны. Вы, впрочем, можете воспользоваться для хранения этих данных модулем Storage, но этот метод плох тем, что данные о текущем времени всё равно будут утеряны.

Другие платы

Этот код можно легко запустить не только на Pixl.js, но и на других платах Espruino. Нужно лишь, чтобы переменная g содержала экземпляр класса Graphics, через который будет выполняться работа с дисплеем, а BTN2 и BTN3 указывали на контакты, подсоединённые к кнопкам платы.

var days = [0];
var today = days.length-1;
var currentDay = (new Date()).getDay();

function count(dir) {
  days[today] += dir;
  if (days[today]<0) days[today]=0;
  draw();
}

function draw() {
  g.clear();
  var mid = 22;
  g.setFontAlign(0,-1);
  g.setFontVector(30);
  g.drawString(days[today],mid,15);
  g.setFontBitmap();
  g.drawString("Count",mid,10);
  g.drawString((new Date()).toString().substr(0,10).trim(),mid,50);
  require("graph").drawBar(g, days, {
    x : mid*2, y : 5,
    miny: 0,
    axes : true,
    gridy : 5
  });
  g.flip();
}

setWatch(x=>count(1), BTN2, {repeat:true});
setWatch(x=>count(-1), BTN3, {repeat:true});

function checkDay() {
  var day = (new Date()).getDay();
  if (currentDay != day) {
    days.push(0);
    today = days.length-1;
    currentDay = day;
    draw();
  }
}
setInterval(checkDay, 1000*60*60);

function toCSV() {
  var start = Date.now() - 1000*60*60*24*(days.length-1);
  for (var i=0;i<days.length;i++) {
    var date = new Date(start + i*1000*60*60*24);
    var dateStr = date.toString().substr(0,10).trim();
    console.log(dateStr + "," + days[i]);
  }
}

draw();

Увеличение значения счётчика

В примере выше счётчик запускается лишь кнопками, находящимися на боковой стороне Pixl.js. Но мы можем делать это и при помощи сигнала от внешнего устройства – он вызовет функцию count(1), которая, собственно, и увеличит значение счётчика.

Remote Logging with Pixl.js

Проводной пироэлектрический датчик движения

Просто подключите пироэлектрический датчик движения к контактам Vin и GND на Pixl.js, а сигнальный провод подключите к любому входному контакту (в примере ниже используется A0).

Теперь, чтобы увеличивать значение счётчика при срабатывании датчика, нам надо лишь добавить в код вот эту строчку:

setWatch(x=>count(1), A0, {repeat:true, edge:"rising"});

Беспроводной датчик Puck.js

Для создания беспроводного соединения вам надо запустить на Pixl.js функцию Bluetooth.setConsole(true), чтобы информация о Bluetooth-соединении не печаталась на LCD-дисплее.

Затем возьмите Puck.js и подключитесь к нему при помощи Web IDE. Код ниже осуществляет подключение к Pixl.js при нажатии на кнопку (не забудьте вписать правильное название Pixl.js вместо Pixl.js 6155).

function count() {
  LED3.set();
  NRF.requestDevice({ filters: [{ name: 'Pixl.js 6155' }] }).then(function(device) {
    return require("ble_simple_uart").write(device, "count(1)\n");
  }).then(function() {
    LED3.reset();
    print('Готово!');
  }).catch(function() {
    LED3.reset();
    digitalPulse(LED1, 1, 1000);
    setTimeout(count, 1000);
  });
}

setWatch(count, BTN, {repeat:true,edge:"rising"});
Примечание

В данный момент Espruino поддерживает только одно активное соединение одновременно, поэтому вы не можете вызвать count() до завершения предыдущего вызова count(), т.е. до момента пока не погаснет синий светодиод. Чтобы исправить это, можно добавить новую переменную и с её помощью отслеживать, занята ли Espruino или нет.

С помощью этого метода вы можете использовать в Pixl.js внешние сигналы и от других устройств. Или вы можете, к примеру, при помощи кода из этого руководства использовать сигнал от магнетометра.

var zero = Puck.mag();
var doorOpen = false;
function onMag(p) {
  p.x -= zero.x;
  p.y -= zero.y;
  p.z -= zero.z;
  var s = Math.sqrt(p.x*p.x + p.y*p.y + p.z*p.z);
  var open = s<1000;
  if (open!=doorOpen) {
    doorOpen = open;
    if (!open) count();
  }
}
Puck.on('mag', onMag);
Puck.magOn();

См.также

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