Espruino:Примеры/Дистанционный мониторинг с помощью Pixl.js и SMS
Дистанционный мониторинг с помощью Pixl.js и SMS[1]
Если вам нужно настроить мониторинг там, где нет интернет-соединения – например, на садовом участке или в сарае – то для отправки данных можно воспользоваться мобильной связью. Очевидным решением было бы воспользоваться мобильным интернетом (и для этого понадобятся те же компоненты, что используются в этом руководстве), но подойдут и простые текстовые SMS-сообщения. То есть вам будет достаточно обычной SIM-карты, позволяющей отправлять текстовые и голосовые сообщения, и на счету которой будет какое-то количество денег – стоит это очень дёшево и обычно не требует месячной подписки.
Кроме того, у вас, возможно, есть датчики, которые вы не хотите подключать к главной мобильной связи. И в этой статье мы как раз сделаем из Puck.js хаб для этих датчиков.
Этот проект очень похож на тот, что создается в руководстве «Управление устройствами с помощью Puck.js и SMS», но с тем отличием, что здесь будет меньше возни с подключением устройств друг к другу, и мы также сможем показывать информацию на экране Pixl.js.
Нам понадобятся
- Espruino Pixl.js
- Arduino-шилд SIM900 (или же вы можете вручную подсоединить GSM/LTE-модуль)
- Литий-полимерная батарея
- Другие BLE-устройства (вроде Puck.js), которые будут играть роль датчиков
Подсоединение
Здесь всё просто – просто подключите Arduino-шилд SIM900 к задней стороне Pixl.js. Единственная проблема в питании. SIM900 очень требователен к энергопотреблению, поэтому маловероятно, что USB-коннектора Pixl.js будет достаточно.
Поэтому вы можете:
- Воспользоваться коннектором SIM900 для внешнего питания – рядом с ним есть переключатель, с помощью которого можно выбрать нужный источник питания.
- Припаять JST-коннектор батареи к Pixl.js, а также спаять на Pixl.js перемычку, соединяющую Vin и 5V, чтобы направить питание на SIM900.
Далее убедитесь, что перемычки на SIM900 стоят в позиции Xduino, подключите батарею, зажмите кнопку питания на SIM900, чтобы включить его, и готово!
Код
На Esruino-устройства, которыми будет управлять Pixl.js, нужно будет загрузить следующее:
function updateAdvertising() {
/* Здесь будут заданы рассылаемые BLE-данные,
и мы можем задать тут двоичные данные,
но давайте всё же зададим JSON,
так как это будет всего несколько символов */
var data = JSON.stringify({
t:Math.round(E.getTemperature()),
l:Mathg});
NRF.setAdvertising({},{
manufacturer:0x590, // ID производителя,
// который числится за Espruino
manufacturerData:data,
showName: false, // не показываем название
connectable: false, // не разрешаем никому подключаться
interval:1000 // делаем так, чтобы данные рассылались редко,
// чтобы сэкономить питание
});
}
setInterval(updateAdvertising, 30000);
function onInit() {
// Отправляем данные, задав максимальную мощность сигнала:
NRF.setTxPower(4);
}
Если вам нужно отправлять обратно какие-то другие данные, вы тоже можете воспользоваться кодом выше, но его нужно будет немного подредактировать. Рассылать слишком много символов не получится, но эту проблему можно решить, преобразовав данные в двоичный формат.
Далее копируем и вставляем код ниже в правую часть IDE:
/* Список устройств – их адреса и названия.
Чтобы получить этот список,
напечатайте функцию NRF.findDevices(print,10000) */
var devices = {
"c7:59:51:ec:90:54 random" : "Garden",
"da:34:7c:4c:5a:47 random" : "Shed",
};
var sms;
function onInit() {
Terminal.setConsole();
g.clear();
Terminal.println("Инициализация...");
// Подключаемся к последовательному устройству:
Serial1.setup(115200, { rx: D0, tx : D1 });
Serial1.removeAllListeners(); // на случай, если ранее
// какие-то обработчики событий
// уже были заданы
var ATSMS = require("ATSMS");
sms = new ATSMS(Serial1);
// Здесь можно воспользоваться sms.at.debug();
// если вам нужна печать отладочных сообщений
sms.init(function(err) {
if (err) throw err;
Terminal.println("Инициализировано!");
sms.list("ALL", function(err,list) {
if (err) throw err;
if (list.length) {
Terminal.println(list.length+" Messages");
} else
Terminal.println("Нет сообщений");
});
});
}
// Обрабатываем все входящие сообщения:
sms.on('message', function(msgIndex) {
Terminal.println("Новое сообщение #"+msgIndex);
sms.get(msgIndex, function(err, msg) {
if (err) throw err;
// Удаляем все сообщения, чтобы не допустить переполнения:
sms.delete("ALL");
// if (msg.oaddr!="+441234567890") throw "Неизвестный номер!";
var txt = msg.text.trim().toLowerCase();
Terminal.println("<< ", txt);
// Сканируем и возвращаем результат:
if (txt=="scan") doScan(msg.oaddr);
// Меняем значение на контакте D3 у Pixl.js:
if (txt=="on") D3.set();
if (txt=="off") D3.reset();
});
});
// Сканируем рассылаемые объявления:
function doScan(sendMessageToNumber) {
Terminal.print("Сканирование...");
NRF.findDevices(function(devs) {
// Оставляем только те устройства,
// которые соответствуют заданному ID производителя:
devs = devs.filter(x => x.manufacturer==0x590);
// Скроллим, чтобы избавиться от всего, что есть на экране:
Terminal.print("\n\n\n\n\n\n\n\n\n");
// Что отправим?
var textMessage = "";
// Теперь выполняем итерацию и показываем на экране:
devs.forEach(function(dev, idx) {
var name = devices[dev.id];
if (!name) {
// Игнорируем все устройства, которых нет в списке:
Terminal.println("Неизвестное устройство "+dev.id);
return;
}
try {
var j = JSON.parse(E.toString(dev.manufacturerData));
Terminal.println(name+" "+JSON.stringify(j));
textMessage += name+" "+JSON.stringify(j)+", ";
} catch (e) {
Terminal.println(name+": плохие данные");
}
});
if (!devs.length) {
textMessage = "Устройств не найдено!";
Terminal.println("Устройств не найдено!");
}
if (sendMessageToNumber) {
Terminal.println("Отправляем сообщение");
sms.send(sendMessageToNumber, textMessage, function() {
Terminal.println("Сообщение отправлено!");
});
}
}, 10000 /* Сканируем 10 секунд */);
}
onInit();
Скорее всего, вам нужно будет поменять список знакомых устройств в devices в самом начале кода. После этого загрузите код на Pixl.js.
Использование
После включения Pixl.js вы сможете отправлять ему вот такие команды:
- scan – это запустит сканирование устройств поблизости и отправит обратно текст со всей полученной информацией.
- on / off – это включит и выключит контакт D3.
Что дальше?
В коде можно задать и многие другие команды. Например, с помощью библиотеки «ble_uart» команды можно отправлять напрямую на другие Puck.js (но в этом случае вам также нужно будет удалить connectable:false и увеличить интервал рассылки объявлений на всех подключенных устройствах).
Кроме того, Pixl.js можно настроить так, чтобы он отправлял текстовые сообщения автоматически. Например, раз в день или при возникновении некоторого события (вроде движения, обнаруженного датчиком).
Также можно сделать так, чтобы Pixl.js, используя переключатель питания, автоматически при включении подавал питание на SIM900, чтобы в случае сбоя питания Pixl.js мог коммуницировать при помощи GSM. Кроме того, благодаря этому SIM900 можно держать выключенным большую часть времени, тем самым снижая нагрузку на энергопотребление.
См.также
Внешние ссылки