Arduino:Примеры/ShellCommands

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

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


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 секунд до того, как начать снова 
}

См.также

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