Espruino:Примеры/Дистанционный мониторинг с помощью Pixl.js и SMS

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

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


Дистанционный мониторинг с помощью Pixl.js и SMS[1]

Если вам нужно настроить мониторинг там, где нет интернет-соединения – например, на садовом участке или в сарае – то для отправки данных можно воспользоваться мобильной связью. Очевидным решением было бы воспользоваться мобильным интернетом (и для этого понадобятся те же компоненты, что используются в этом руководстве), но подойдут и простые текстовые SMS-сообщения. То есть вам будет достаточно обычной SIM-карты, позволяющей отправлять текстовые и голосовые сообщения, и на счету которой будет какое-то количество денег – стоит это очень дёшево и обычно не требует месячной подписки.

Кроме того, у вас, возможно, есть датчики, которые вы не хотите подключать к главной мобильной связи. И в этой статье мы как раз сделаем из Puck.js хаб для этих датчиков.

Этот проект очень похож на тот, что создается в руководстве «Управление устройствами с помощью Puck.js и SMS», но с тем отличием, что здесь будет меньше возни с подключением устройств друг к другу, и мы также сможем показывать информацию на экране Pixl.js.

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

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

Здесь всё просто – просто подключите Arduino-шилд SIM900 к задней стороне Pixl.js. Единственная проблема в питании. SIM900 очень требователен к энергопотреблению, поэтому маловероятно, что USB-коннектора Pixl.js будет достаточно.

Поэтому вы можете:

  • Воспользоваться коннектором SIM900 для внешнего питания – рядом с ним есть переключатель, с помощью которого можно выбрать нужный источник питания.
  • Припаять JST-коннектор батареи к Pixl.js, а также спаять на Pixl.js перемычку, соединяющую Vin и 5V, чтобы направить питание на SIM900.

Далее убедитесь, что перемычки на SIM900 стоят в позиции Xduino, подключите батарею, зажмите кнопку питания на SIM900, чтобы включить его, и готово!

Примечание

Используемый нами модуль SIM900 подключен только к контактам D0 и D1. Но если вам нужно, например, измерить что-либо или управлять чем-то напрямую с Pixl.js, то вы можете смело использовать другие входные и выходные контакты.

Код

На 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 можно держать выключенным большую часть времени, тем самым снижая нагрузку на энергопотребление.

См.также

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