Arduino:Примеры/ShellCommands: различия между версиями

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
м (Замена текста — «<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">» на «<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">»)
 
Нет описания правки
Строка 25: Строка 25:
Подключаем к скетчу класс '''Process'''.
Подключаем к скетчу класс '''Process'''.


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
#include <Process.h>
#include <Process.h>
</syntaxhighlight>
</syntaxhighlight>
Строка 31: Строка 31:
В секции setup() инициализируем '''Bridge''' и начинаем последовательную передачу данных. Перед тем, как заняться оставшейся частью скетча, ждем активации последовательного соединения.
В секции setup() инициализируем '''Bridge''' и начинаем последовательную передачу данных. Перед тем, как заняться оставшейся частью скетча, ждем активации последовательного соединения.


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
void setup() {
void setup() {
   Bridge.begin();
   Bridge.begin();
Строка 42: Строка 42:
Создаем процесс под названием '''«p»''' – для запуска скрипта, проверяющего '''WiFi-статус''', и команды '''grep'''.
Создаем процесс под названием '''«p»''' – для запуска скрипта, проверяющего '''WiFi-статус''', и команды '''grep'''.


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
void loop() {
void loop() {
   Process p;
   Process p;
Строка 49: Строка 49:
В функции runShellCommand() указываем путь к скрипту, который вы хотите запустить, а также дополнительную команду. В данном случае это '''«grep Signal»''' – команда, извлекающая информацию об уровне сигнала '''WiFi-соединения'''.
В функции runShellCommand() указываем путь к скрипту, который вы хотите запустить, а также дополнительную команду. В данном случае это '''«grep Signal»''' – команда, извлекающая информацию об уровне сигнала '''WiFi-соединения'''.


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
p.runShellCommand("/usr/bin/pretty-wifi-info.lua | grep Signal");
p.runShellCommand("/usr/bin/pretty-wifi-info.lua | grep Signal");
</syntaxhighlight>
</syntaxhighlight>
Строка 55: Строка 55:
Ждем завершения процесса, чтобы получить весь результат полностью.  
Ждем завершения процесса, чтобы получить весь результат полностью.  


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
while(p.running());
while(p.running());
</syntaxhighlight>
</syntaxhighlight>
Строка 61: Строка 61:
После завершения процесса вписываем функцию parseInt() для поиска целого числа, отвечающего за уровень сигнала – оно должно быть в диапазоне '''от 0 до 100.''' Затем при помощи функции map() адаптируем этот результат под диапазон '''от 0 до 255''', чтобы передать это значение на светодиод при помощи функции analogWrite(). Далее выводим информацию об уровне сигнала на '''Serial Monitor''' и ждем несколько секунд, чтобы начать снова.
После завершения процесса вписываем функцию parseInt() для поиска целого числа, отвечающего за уровень сигнала – оно должно быть в диапазоне '''от 0 до 100.''' Затем при помощи функции map() адаптируем этот результат под диапазон '''от 0 до 255''', чтобы передать это значение на светодиод при помощи функции analogWrite(). Далее выводим информацию об уровне сигнала на '''Serial Monitor''' и ждем несколько секунд, чтобы начать снова.


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
while (p.available()) {
while (p.available()) {
     int result = p.parseInt();           
     int result = p.parseInt();           
Строка 74: Строка 74:
В результате светодиод должен поменять свою яркость в соответствии с изменением уровня '''WiFi-сигнала'''.
В результате светодиод должен поменять свою яркость в соответствии с изменением уровня '''WiFi-сигнала'''.


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
/*
/*
Запуск shell-команд при помощи класса Process
Запуск shell-команд при помощи класса Process

Версия от 12:33, 20 мая 2023

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


Shell-команды[1]

Этот пример демонстрирует запуск shell-команд Linux на Arduino Yun.

Он запускает на процессоре Linux скрипт wifiCheck (расположен по пути /usr/bin/pretty-wifi-info.lua), а затем при помощи команды grep извлекает информацию об уровне сигнала.

Кроме того, на процессоре 32U4 скетч использует функцию parseInt() для того, чтобы сосчитать данные об уровне WiFi-сигнала в целочисленную переменную. Далее эти данные при помощи функции analogWrite() передаются на светодиод.

Необходимое оборудование

  • Плата Arduino Yun;
  • 220-омовый резистор;
  • Светодиод;

Цепь

Yun подключена к беспроводной сети. Светодиод через 220-омовый резистор подключен к 9-ому цифровому контакту.

Код

Подключаем к скетчу класс Process.

#include <Process.h>

В секции setup() инициализируем Bridge и начинаем последовательную передачу данных. Перед тем, как заняться оставшейся частью скетча, ждем активации последовательного соединения.

void setup() {
  Bridge.begin();
  Serial.begin(9600);

  while (!Serial);
}

Создаем процесс под названием «p» – для запуска скрипта, проверяющего WiFi-статус, и команды grep.

void loop() {
  Process p;

В функции runShellCommand() указываем путь к скрипту, который вы хотите запустить, а также дополнительную команду. В данном случае это «grep Signal» – команда, извлекающая информацию об уровне сигнала WiFi-соединения.

p.runShellCommand("/usr/bin/pretty-wifi-info.lua | grep Signal");

Ждем завершения процесса, чтобы получить весь результат полностью.

while(p.running());

После завершения процесса вписываем функцию parseInt() для поиска целого числа, отвечающего за уровень сигнала – оно должно быть в диапазоне от 0 до 100. Затем при помощи функции map() адаптируем этот результат под диапазон от 0 до 255, чтобы передать это значение на светодиод при помощи функции analogWrite(). Далее выводим информацию об уровне сигнала на Serial Monitor и ждем несколько секунд, чтобы начать снова.

while (p.available()) {
    int result = p.parseInt();          
    int signal = map(result, 0, 100, 0, 255);   
    analogWrite(9, signal);     
    Serial.println(result);     
  } 
  delay(5000); 
}

В результате светодиод должен поменять свою яркость в соответствии с изменением уровня WiFi-сигнала.

/*
Запуск shell-команд при помощи класса Process
Этот скетч демонстрирует, как при помощи Arduino Yun запускать shell-команды Linux. 
Он запускает скрипт WifiCheck на Linux-части Yun, а затем использует команду grep,
чтобы извлечь информацию о мощности сигнала. 
После этого он использует функцию parseInt(), 
чтобы записать данные об уровне сигнала в целочисленную переменную и, 
наконец, использует это число, чтобы изменить яркость светодиода при помощи функции analogWrite().

Цепь:
* Светодиод, подключенный к 9-ому цифровому контакту

Создан 12 июня 2013 Кристианом Мэгли (Cristian Maglie),
модифицирован 26 июня 2013 Томом Иго (Tom Igoe).

Этот код не защищен авторским правом. 

 */

#include <Process.h>

void setup() {
  Bridge.begin();   // инициализируем Bridge
  Serial.begin(9600);   // инициализируем последовательную передачу данных

  // Ждем подключения Serial Monitor:
  while(!Serial);
}

void loop() {
  Process p;
  // Эта команда запускает скрипт WifiStatus (/usr/bin/pretty-wifi-info.lua), 
  // а затем отсылает результат команде grep,
  // которая будет искать строку со словом «Signal:»
  p.runShellCommand("/usr/bin/pretty-wifi-info.lua | grep Signal");

  // Ничего не делаем, пока процесс не завершится, чтобы получить весь результат полностью:
  while(p.running());  

  // Считываем результат, извлеченный командой grep. 
  // Он должен выглядеть примерно так: «Signal: xx&»:
  while (p.available()) {
    int result = p.parseInt();          // ищем целое число
    int signal = map(result, 0, 100, 0, 255);   // адаптируем диапазон 0-100 под диапазон 0-255
    analogWrite(9, signal);         // задаем яркость для светодиода, подключенного к 9-ому цифровому контакту
    Serial.println(result);         // выводим результат на Serial Monitor
  } 
  delay(5000);  // ждем 5 секунд до того, как начать снова 
}

См.также

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