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

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
м (Замена текста — «<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">»)
 
Нет описания правки
Строка 29: Строка 29:
Подключаем библиотеки '''Bridge''', '''YunServer''' и '''YunClient'''.
Подключаем библиотеки '''Bridge''', '''YunServer''' и '''YunClient'''.


<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 <Bridge.h>
#include <Bridge.h>
#include <YunServer.h>
#include <YunServer.h>
Строка 37: Строка 37:
Инстанцинируем сервер, с помощью которого '''Yun''' будет '''«прослушивать»''' подключающихся клиентов.
Инстанцинируем сервер, с помощью которого '''Yun''' будет '''«прослушивать»''' подключающихся клиентов.


<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">
YunServer server;
YunServer server;
</syntaxhighlight>
</syntaxhighlight>
Строка 43: Строка 43:
Создаем строку, в которой будем хранить информацию о времени начала работы скетча, а также переменную, в которой будем хранить число, отображающее количество посещений страницы.
Создаем строку, в которой будем хранить информацию о времени начала работы скетча, а также переменную, в которой будем хранить число, отображающее количество посещений страницы.


<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">
String startString;
String startString;
long hits = 0;
long hits = 0;
Строка 50: Строка 50:
В секции setup() начинаем последовательную передачу данных и инициализируем '''Bridge'''. Будет нелишним воспользоваться здесь встроенным светодиодом, оповещающим о начале и завершении активации '''Bridge'''.
В секции setup() начинаем последовательную передачу данных и инициализируем '''Bridge'''. Будет нелишним воспользоваться здесь встроенным светодиодом, оповещающим о начале и завершении активации '''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() {
   Serial.begin(9600);
   Serial.begin(9600);
Строка 62: Строка 62:
Задаем '''0-ой''' и '''2-ой''' аналоговые контакты в качестве питающего и заземляющего контактов для датчика '''TMP36''' (благодаря этому можно обойтись без макетной платы '''Breadboard''').
Задаем '''0-ой''' и '''2-ой''' аналоговые контакты в качестве питающего и заземляющего контактов для датчика '''TMP36''' (благодаря этому можно обойтись без макетной платы '''Breadboard''').


<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">
pinMode(A0, OUTPUT);
pinMode(A0, OUTPUT);
   pinMode(A2, OUTPUT);
   pinMode(A2, OUTPUT);
Строка 71: Строка 71:
Далем так, чтобы сервер прослушивал входящие подключения только от локального хоста, а затем запускаем его.
Далем так, чтобы сервер прослушивал входящие подключения только от локального хоста, а затем запускаем его.


<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">
server.listenOnLocalhost();
server.listenOnLocalhost();
   server.begin();
   server.begin();
Строка 78: Строка 78:
Создаем экземпляр класса '''Process''', с помощью которого будем получать информацию о времени начала скетча. Для этого запускаем команду '''date''', а результат записываем созданную ранее строку.
Создаем экземпляр класса '''Process''', с помощью которого будем получать информацию о времени начала скетча. Для этого запускаем команду '''date''', а результат записываем созданную ранее строку.


<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">
Process startTime;
Process startTime;
   startTime.runShellCommand("date");
   startTime.runShellCommand("date");
Строка 90: Строка 90:
В секции loop() инстанцинируем класс '''YunClient''', чтобы получать информацию о клиентах, идущих от сервера.
В секции loop() инстанцинируем класс '''YunClient''', чтобы получать информацию о клиентах, идущих от сервера.


<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">
YunClient client = server.accept();
YunClient client = server.accept();
</syntaxhighlight>
</syntaxhighlight>
Строка 96: Строка 96:
Если подключился новый клиент, то считываем присланную им команду, а затем выводим ее на '''Serial Monitor'''.
Если подключился новый клиент, то считываем присланную им команду, а затем выводим ее на '''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">
if (client) {
if (client) {
     String command = client.readString();
     String command = client.readString();
Строка 105: Строка 105:
Если команда – это '''«temperature»''', фиксируем время и считываем данные с температурного датчика.  
Если команда – это '''«temperature»''', фиксируем время и считываем данные с температурного датчика.  


<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">
if (command == "temperature") {
if (command == "temperature") {


Строка 121: Строка 121:
Конвертируем данные датчика в градусы Цельсия.
Конвертируем данные датчика в градусы Цельсия.


<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">
// конвертируем считанные данные в милливольты:
// конвертируем считанные данные в милливольты:
       float voltage = sensorValue *  (5000/ 1024);  
       float voltage = sensorValue *  (5000/ 1024);  
Строка 130: Строка 130:
Выводим на '''Serial Monitor''' данные о текущем времени, температуре, времени начала работы скетча и количестве посещений страницы – все это при помощи функции client.print().
Выводим на '''Serial Monitor''' данные о текущем времени, температуре, времени начала работы скетча и количестве посещений страницы – все это при помощи функции client.print().


<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">
client.print("Current time on the Yun: "); // "Текущее время на Yun: "
client.print("Current time on the Yun: "); // "Текущее время на Yun: "
       client.println(timeString);
       client.println(timeString);
Строка 145: Строка 145:
Закрываем соединение, чтобы освободить все неиспользованные ресурсы, а затем поднимаем значение счетчика посещений страницы.  
Закрываем соединение, чтобы освободить все неиспользованные ресурсы, а затем поднимаем значение счетчика посещений страницы.  


<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">
client.stop();
client.stop();
     hits++;
     hits++;
Строка 153: Строка 153:
Делаем небольшую паузу перед тем, как начать снова.  
Делаем небольшую паузу перед тем, как начать снова.  


<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">
delay(50); // пауза в 50 миллисекунд
delay(50); // пауза в 50 миллисекунд
}
}
Строка 160: Строка 160:
Весь скетч полностью – ниже:
Весь скетч полностью – ниже:


<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">
/*
/*
Температурный веб-интерфейс
Температурный веб-интерфейс

Версия от 18:20, 14 мая 2023

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


Температурная веб-панель[1]

Этот пример показывает, как при помощи библиотеки Bridge и встроенного веб-сервера Arduino Yun отобразить данные, полученные от аналогового датчика.

Подготовьте вашу SD-карту, создав в ее корневой директории пустую папку под названием «arduino», а в ней подпапку под названием «www». Благодаря этому Yun создаст связь с SD-картой по пути «/mnt/sd».

В этой папке будет находиться простая веб-страница и копия zepto.js (мини-версии jQuery). Когда вы загрузите свой скетч, эти файлы будут размещены в папке «/arduino/www/TemperatureWebPanel» на вашей SD-карте.

Чтобы увидеть результат работы этого скетча, надо пройти по ссылке «http://arduino.local/sd/TemperatureWebPanel».

Во время работы Linux и скетча SD-карту можно вынуть, но не стоит делать этого в тот момент, когда система будет записывать на нее необходимые данные.

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

  • Плата Arduino Yun;
  • Температурный датчик TMP36;
  • SD-карта;

Цепь

Компьютер и Yun должны находиться в одной беспроводной сети. Температурный датчик подключите к 1-ому аналоговому контакту, а карту microSD вставьте в SD-слот на Yun.

Код

Подключаем библиотеки Bridge, YunServer и YunClient.

#include <Bridge.h>
#include <YunServer.h>
#include <YunClient.h>

Инстанцинируем сервер, с помощью которого Yun будет «прослушивать» подключающихся клиентов.

YunServer server;

Создаем строку, в которой будем хранить информацию о времени начала работы скетча, а также переменную, в которой будем хранить число, отображающее количество посещений страницы.

String startString;
long hits = 0;

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

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

  pinMode(13,OUTPUT);
  digitalWrite(13, LOW);
  Bridge.begin();
  digitalWrite(13, HIGH);

Задаем 0-ой и 2-ой аналоговые контакты в качестве питающего и заземляющего контактов для датчика TMP36 (благодаря этому можно обойтись без макетной платы Breadboard).

pinMode(A0, OUTPUT);
  pinMode(A2, OUTPUT);
  digitalWrite(A0, HIGH);
  digitalWrite(A2, LOW);

Далем так, чтобы сервер прослушивал входящие подключения только от локального хоста, а затем запускаем его.

server.listenOnLocalhost();
  server.begin();

Создаем экземпляр класса Process, с помощью которого будем получать информацию о времени начала скетча. Для этого запускаем команду date, а результат записываем созданную ранее строку.

Process startTime;
  startTime.runShellCommand("date");
  while(startTime.available()) {
    char c = startTime.read();
    startString += c;
  }
}

В секции loop() инстанцинируем класс YunClient, чтобы получать информацию о клиентах, идущих от сервера.

YunClient client = server.accept();

Если подключился новый клиент, то считываем присланную им команду, а затем выводим ее на Serial Monitor.

if (client) {
    String command = client.readString();
    command.trim();        //удаляем пробельные символы
    Serial.println(command);

Если команда – это «temperature», фиксируем время и считываем данные с температурного датчика.

if (command == "temperature") {

      Process time;
      time.runShellCommand("date");
      String timeString = "";
      while(time.available()) {
        char c = time.read();
        timeString += c;
      }
      Serial.println(timeString);
      int sensorValue = analogRead(A1);

Конвертируем данные датчика в градусы Цельсия.

// конвертируем считанные данные в милливольты:
      float voltage = sensorValue *  (5000/ 1024); 
      // конвертируем милливольты в градусы Цельсия:
      float temperature = (voltage - 500)/10;

Выводим на Serial Monitor данные о текущем времени, температуре, времени начала работы скетча и количестве посещений страницы – все это при помощи функции client.print().

client.print("Current time on the Yun: "); // "Текущее время на Yun: "
      client.println(timeString);
      client.print("<br>Current temperature: "); // "<br>Температура сейчас: "
      client.print(temperature);
      client.print(" degrees C"); // " градусов Цельсия"
      client.print("<br>This sketch has been running since "); // "<br>Этот скетч работает с "
      client.print(startString);
      client.print("<br>Hits so far: "); // "<br>Количество посещений страницы на данный момент: "
      client.print(hits);
    }

Закрываем соединение, чтобы освободить все неиспользованные ресурсы, а затем поднимаем значение счетчика посещений страницы.

client.stop();
    hits++;
  }

Делаем небольшую паузу перед тем, как начать снова.

delay(50); // пауза в 50 миллисекунд
}

Весь скетч полностью – ниже:

/*
Температурный веб-интерфейс
Этот пример показывает, как посредством библиотеки Bridge и встроенного веб-сервиса Yun обрабатывать данные от аналогового датчика.
Цепь:
 * Температурный датчик TMP36 подключен к 1-ому аналоговому контакту
 * SD-карта, подсоединенная к SD-слоту Arduino Yún

Подготовьте SD-карту, создав в корневой директории 
пустую папку под названием «arduino» и подпапку под названием «www».
Благодаря этому Yun создаст связь с SD-картой по пути «/mnt/sd».

В этой папке будет находиться простая веб-страница и копия zepto.js (мини-версии jQuery). 
Когда вы загрузите скетч, эти файлы будут размещены в папке «/arduino/www/TemperatureWebPanel» на SD-карте.

Чтобы увидеть результат работы скетча, пройдите по ссылке http://arduino.local/sd/TemperatureWebPanel.

Во время работы Linux и скетча SD-карту можно вынуть, но не стоит делать этого в тот момент, когда система будет записывать на нее необходимые данные. 
Создан 6 июля 2013 Томом Иго (Tom Igoe).
Этот код не защищен авторским правом.

 */
#include <Bridge.h>
#include <YunServer.h>
#include <YunClient.h> 

// Прослушиваем порт 5555 (это порт по умолчанию).
// Веб-сервер Yun будет перенаправлять туда все HTTP-запросы. 
YunServer server;
String startString;
long hits = 0;

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

  // Инициализируем Bridge
  pinMode(13,OUTPUT);
  digitalWrite(13, LOW);
  Bridge.begin();
  digitalWrite(13, HIGH);

  // Делаем 0-ой и 2-ой аналоговые контакты питанием и «землей» для датчика TMP36:
  pinMode(A0, OUTPUT);
  pinMode(A2, OUTPUT);
  digitalWrite(A0, HIGH);
  digitalWrite(A2, LOW);

  // Делаем так, чтобы прослушивать только те входящие соединения,
  // которые идут от локального хоста (т.е. не от внешней сети):
  server.listenOnLocalhost();
  server.begin();

  // Фиксируем время начала работы скетча:
  Process startTime;
  startTime.runShellCommand("date");
  while(startTime.available()) {
    char c = startTime.read();
    startString += c;
  }
}

void loop() {
  // «Берем» клиентов, идущих от сервера:
  YunClient client = server.accept();

  // Есть ли новый клиент?
  if (client) {
    // Считываем команду
    String command = client.readString();
    command.trim();        // удаляем пробельные символы
    Serial.println(command);
    // Эта команда – «temperature»?
    if (command == "temperature") {

      // Запрашиваем у сервера и фиксируем текущее время:
      Process time;
      time.runShellCommand("date");
      String timeString = "";
      while(time.available()) {
        char c = time.read();
        timeString += c;
      }
      Serial.println(timeString);
      int sensorValue = analogRead(A1);
      // конвертируем считанные данные в милливольты:
      float voltage = sensorValue *  (5000/ 1024); 
      // конвертируем милливольты в градусы Цельсия:
      float temperature = (voltage - 500)/10;
      // Выводим данные на Serial Monitor:
      client.print("Current time on the Yun: ");  // "Текущее время на Yun: "
      client.println(timeString);
      client.print("<br>Current temperature: ");  // "<br>Температура сейчас: "
      client.print(temperature);
      client.print(" degrees C");  // " градусов Цельсия"
      client.print("<br>This sketch has been running since ");
      client.print(startString);  // "<br>Этот скетч работает с "
      client.print("<br>Hits so far: ");  // "<br>Количество посещений страницы на данный момент: "
      client.print(hits);
    }

    // Закрываем соединение и высвобождаем ресурсы:
    client.stop();
    hits++;
  }

  delay(50); // Пауза каждые 50 миллисекунд
}

См.также

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