Arduino:Примеры/TemperatureWebPanel: различия между версиями
Myagkij (обсуждение | вклад) м (Замена текста — «<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 | <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 | <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 | <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 | <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 | <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 | <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 | <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 | <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 | <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 | <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 | <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 | <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 | <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 | <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 | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
/* | /* | ||
Температурный веб-интерфейс | Температурный веб-интерфейс |
Версия от 18:20, 14 мая 2023
Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Температурная веб-панель[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 миллисекунд
}