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

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

Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


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

Pixl.js SMS Remote Monitoring.jpg

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

См.также

Ссылки на полезные ресурсы

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