Espruino:Примеры/Дистанционный мониторинг с помощью Pixl.js и SMS: различия между версиями

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
(Новая страница: «{{Espruino/Панель перехода}} {{Перевод от Сubewriter}} {{Myagkij-редактор}} =<ref>[ www.espruino.com - ]</ref>= <syntaxhighlight...»)
 
 
(не показано 6 промежуточных версий 2 участников)
Строка 3: Строка 3:
{{Myagkij-редактор}}
{{Myagkij-редактор}}


=<ref>[ www.espruino.com - ]</ref>=
=Дистанционный мониторинг с помощью Pixl.js и SMS<ref>[https://www.espruino.com/Pixl.js+SMS+Remote+Monitoring www.espruino.com - Pixl.js SMS Remote Monitoring]</ref>=


<syntaxhighlight lang="javascript" enclose="div">
[[File:Pixl.js_SMS_Remote_Monitoring.jpg|center]]
 
Если вам нужно настроить мониторинг там, где нет интернет-соединения – например, на садовом участке или в сарае – то для отправки данных можно воспользоваться мобильной связью. Очевидным решением было бы воспользоваться мобильным интернетом (и для этого понадобятся те же компоненты, что используются в этом руководстве), но подойдут и простые текстовые SMS-сообщения. То есть вам будет достаточно обычной SIM-карты, позволяющей отправлять текстовые и голосовые сообщения, и на счету которой будет какое-то количество денег – стоит это очень дёшево и обычно не требует месячной подписки.
 
Кроме того, у вас, возможно, есть датчики, которые вы не хотите подключать к главной мобильной связи. И в этой статье мы как раз сделаем из [[Puck.js]] хаб для этих датчиков.
 
Этот проект очень похож на тот, что создается в [https://www.espruino.com/Puck.js+SMS руководстве «Управление устройствами с помощью Puck.js и SMS»], но с тем отличием, что здесь будет меньше возни с подключением устройств друг к другу, и мы также сможем показывать информацию на экране [[Pixl.js]].
 
== Нам понадобятся ==
 
* Espruino [https://www.espruino.com/Pixl.js Pixl.js]
* [https://www.espruino.com/arduino-sim900 Arduino-шилд SIM900] (или же вы можете вручную подсоединить GSM/LTE-модуль)
* [https://www.espruino.com/Battery Литий-полимерная батарея]
* Другие BLE-устройства (вроде [https://www.espruino.com/Puck.js Puck.js]), которые будут играть роль датчиков
 
== Подсоединение ==
 
Здесь всё просто – просто подключите [[Arduino-шилд SIM900]] к задней стороне [[Pixl.js]]. Единственная проблема в питании. [[SIM900]] очень требователен к энергопотреблению, поэтому маловероятно, что USB-коннектора [[Pixl.js]] будет достаточно.
 
Поэтому вы можете:
* Воспользоваться коннектором [[SIM900]] для внешнего питания – рядом с ним есть переключатель, с помощью которого можно выбрать нужный источник питания.
* [https://www.espruino.com/Pixl.js#powering Припаять JST-коннектор батареи к Pixl.js], а также спаять на [[Pixl.js]] перемычку, соединяющую '''Vin''' и '''5V''', чтобы направить питание на SIM900.
 
Далее убедитесь, что перемычки на [[SIM900]] стоят в позиции [[Xduino]], подключите батарею, зажмите кнопку питания на [[SIM900]], чтобы включить его, и готово!
 
{{Примечание1|Используемый нами модуль [[SIM900]] подключен только к контактам '''D0''' и '''D1'''. Но если вам нужно, например, измерить что-либо или управлять чем-то напрямую с [[Pixl.js]], то вы можете смело использовать другие входные и выходные контакты.}}
 
== Код ==
 
На [[Esruino-устройства]], которыми будет управлять [[Pixl.js]], нужно будет загрузить следующее:
 
<syntaxhighlight lang="javascript">
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);
}
</syntaxhighlight>
 
Если вам нужно отправлять обратно какие-то другие данные, вы тоже можете воспользоваться кодом выше, но его нужно будет немного подредактировать. Рассылать слишком много символов не получится, но эту проблему можно решить, преобразовав данные в двоичный формат.
 
Далее копируем и вставляем код ниже в правую часть [[IDE]]:
 
<syntaxhighlight lang="javascript">
/* Список устройств – их адреса и названия.
  Чтобы получить этот список,
  напечатайте функцию 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();
</syntaxhighlight>
 
Скорее всего, вам нужно будет поменять список знакомых устройств в '''devices''' в самом начале кода. После этого загрузите код на [[Pixl.js]].
 
== Использование ==
 
После включения [[Pixl.js]] вы сможете отправлять ему вот такие команды:
* '''scan''' – это запустит сканирование устройств поблизости и отправит обратно текст со всей полученной информацией.
* '''on / off''' – это включит и выключит контакт '''D3'''.
 
== Что дальше? ==
 
В коде можно задать и многие другие команды. Например, с помощью библиотеки [http://wikihandbk.com/wiki/Espruino:Примеры/Использование_UART-портов_(NUS)_при_помощи_BLE «ble_uart»] команды можно отправлять напрямую на другие [[Puck.js]] (но в этом случае вам также нужно будет удалить '''connectable:false''' и увеличить интервал рассылки объявлений на всех подключенных устройствах).
 
Кроме того, Pixl.js можно настроить так, чтобы он отправлял текстовые сообщения автоматически. Например, раз в день или при возникновении некоторого события (вроде движения, обнаруженного датчиком).
 
Также можно сделать так, чтобы [[Pixl.js]], используя переключатель питания, автоматически при включении подавал питание на [[SIM900]], чтобы в случае сбоя питания [[Pixl.js]] мог коммуницировать при помощи [[GSM]]. Кроме того, благодаря этому [[SIM900]] можно держать выключенным большую часть времени, тем самым снижая нагрузку на энергопотребление.


=См.также=
=См.также=


{{ads}}
 


=Внешние ссылки=
=Внешние ссылки=
Строка 15: Строка 192:
<references />
<references />


{{Навигационная таблица/Espruino}}
{{Навигационная таблица/Портал/Espruino}}
{{Навигационная таблица/Телепорт}}

Текущая версия от 20:47, 22 мая 2023

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


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

См.также

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