Arduino:Примеры/TemperatureWebPanel

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

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


Температурная веб-панель[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.

1 #include <Bridge.h>
2 #include <YunServer.h>
3 #include <YunClient.h>

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

1 YunServer server;

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

1 String startString;
2 long hits = 0;

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

1 void setup() {
2   Serial.begin(9600);
3 
4   pinMode(13,OUTPUT);
5   digitalWrite(13, LOW);
6   Bridge.begin();
7   digitalWrite(13, HIGH);

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

1 pinMode(A0, OUTPUT);
2   pinMode(A2, OUTPUT);
3   digitalWrite(A0, HIGH);
4   digitalWrite(A2, LOW);

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

1 server.listenOnLocalhost();
2   server.begin();

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

1 Process startTime;
2   startTime.runShellCommand("date");
3   while(startTime.available()) {
4     char c = startTime.read();
5     startString += c;
6   }
7 }

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

1 YunClient client = server.accept();

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

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

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

 1 if (command == "temperature") {
 2 
 3       Process time;
 4       time.runShellCommand("date");
 5       String timeString = "";
 6       while(time.available()) {
 7         char c = time.read();
 8         timeString += c;
 9       }
10       Serial.println(timeString);
11       int sensorValue = analogRead(A1);

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

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

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

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

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

1 client.stop();
2     hits++;
3   }

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

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

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

  1 /*
  2 Температурный веб-интерфейс
  3 Этот пример показывает, как посредством библиотеки Bridge и встроенного веб-сервиса Yun обрабатывать данные от аналогового датчика.
  4 Цепь:
  5  * Температурный датчик TMP36 подключен к 1-ому аналоговому контакту
  6  * SD-карта, подсоединенная к SD-слоту Arduino Yún
  7 
  8 Подготовьте SD-карту, создав в корневой директории 
  9 пустую папку под названием «arduino» и подпапку под названием «www».
 10 Благодаря этому Yun создаст связь с SD-картой по пути «/mnt/sd».
 11 
 12 В этой папке будет находиться простая веб-страница и копия zepto.js (мини-версии jQuery). 
 13 Когда вы загрузите скетч, эти файлы будут размещены в папке «/arduino/www/TemperatureWebPanel» на SD-карте.
 14 
 15 Чтобы увидеть результат работы скетча, пройдите по ссылке http://arduino.local/sd/TemperatureWebPanel.
 16 
 17 Во время работы Linux и скетча SD-карту можно вынуть, но не стоит делать этого в тот момент, когда система будет записывать на нее необходимые данные. 
 18 Создан 6 июля 2013 Томом Иго (Tom Igoe).
 19 Этот код не защищен авторским правом.
 20 
 21  */
 22 #include <Bridge.h>
 23 #include <YunServer.h>
 24 #include <YunClient.h> 
 25 
 26 // Прослушиваем порт 5555 (это порт по умолчанию).
 27 // Веб-сервер Yun будет перенаправлять туда все HTTP-запросы. 
 28 YunServer server;
 29 String startString;
 30 long hits = 0;
 31 
 32 void setup() {
 33   Serial.begin(9600);
 34 
 35   // Инициализируем Bridge
 36   pinMode(13,OUTPUT);
 37   digitalWrite(13, LOW);
 38   Bridge.begin();
 39   digitalWrite(13, HIGH);
 40 
 41   // Делаем 0-ой и 2-ой аналоговые контакты питанием и «землей» для датчика TMP36:
 42   pinMode(A0, OUTPUT);
 43   pinMode(A2, OUTPUT);
 44   digitalWrite(A0, HIGH);
 45   digitalWrite(A2, LOW);
 46 
 47   // Делаем так, чтобы прослушивать только те входящие соединения,
 48   // которые идут от локального хоста (т.е. не от внешней сети):
 49   server.listenOnLocalhost();
 50   server.begin();
 51 
 52   // Фиксируем время начала работы скетча:
 53   Process startTime;
 54   startTime.runShellCommand("date");
 55   while(startTime.available()) {
 56     char c = startTime.read();
 57     startString += c;
 58   }
 59 }
 60 
 61 void loop() {
 62   // «Берем» клиентов, идущих от сервера:
 63   YunClient client = server.accept();
 64 
 65   // Есть ли новый клиент?
 66   if (client) {
 67     // Считываем команду
 68     String command = client.readString();
 69     command.trim();        // удаляем пробельные символы
 70     Serial.println(command);
 71     // Эта команда – «temperature»?
 72     if (command == "temperature") {
 73 
 74       // Запрашиваем у сервера и фиксируем текущее время:
 75       Process time;
 76       time.runShellCommand("date");
 77       String timeString = "";
 78       while(time.available()) {
 79         char c = time.read();
 80         timeString += c;
 81       }
 82       Serial.println(timeString);
 83       int sensorValue = analogRead(A1);
 84       // конвертируем считанные данные в милливольты:
 85       float voltage = sensorValue *  (5000/ 1024); 
 86       // конвертируем милливольты в градусы Цельсия:
 87       float temperature = (voltage - 500)/10;
 88       // Выводим данные на Serial Monitor:
 89       client.print("Current time on the Yun: ");  // "Текущее время на Yun: "
 90       client.println(timeString);
 91       client.print("<br>Current temperature: ");  // "<br>Температура сейчас: "
 92       client.print(temperature);
 93       client.print(" degrees C");  // " градусов Цельсия"
 94       client.print("<br>This sketch has been running since ");
 95       client.print(startString);  // "<br>Этот скетч работает с "
 96       client.print("<br>Hits so far: ");  // "<br>Количество посещений страницы на данный момент: "
 97       client.print(hits);
 98     }
 99 
100     // Закрываем соединение и высвобождаем ресурсы:
101     client.stop();
102     hits++;
103   }
104 
105   delay(50); // Пауза каждые 50 миллисекунд
106 }

См.также

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