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), которая, собственно, и увеличит значение счётчика.
Проводной пироэлектрический датчик движения
Просто подключите пироэлектрический датчик движения к контактам 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"});
С помощью этого метода вы можете использовать в 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();
См.также
Внешние ссылки