Arduino:Примеры/Web Buzzer

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

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


Управление зуммером через браузерный интерфейс[1]

Этот пример показывает, как воспроизводить звуки с помощью библиотеки Webduino, Ethernet-модуля и зуммера. Продолжительность звука задается пользователем через интерфейс в браузере.

Код

/* Управление зуммером через браузерный интерфейс (Webduino) */

#include "SPI.h"
#include "Ethernet.h"
#include "WebServer.h"

/* ПОСТАВЬТЕ ЗДЕСЬ СОБСТВЕННОЕ ЗНАЧЕНИЕ. MAC-адрес должен отличаться 
 * от других девайсов в сети. Если MAC-адрес Ethernet-модуля совпадет 
 * с другим MAC-адресом, это повлечет проблемы с получением пакетов.
 */
static uint8_t mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

/* ВЫСТАВЬТЕ ТУТ ЗНАЧЕНИЕ, СООТВЕТСТВУЮЩЕЕ СЕТИ ВАШЕГО ХОСТА. 
 * Большинство сетей находятся в диапазонах 192.168.0.XXX 
 * или 192.168.1.XXX. Выберите адрес, который не используется 
 * и не присваивается автоматически DHCP-сервисом, к которому 
 * подключен ваш роутер. */
static uint8_t ip[] = { 192, 168, 1, 210 };

/* Все URL этого сервера будут начинаться с /buzz, потому что именно
 * так мы определили значение PREFIX. Мы также будем прослушивать 
 * порт 80, стандартный порт для HTTP */
#define PREFIX "/buzz"
WebServer webserver(PREFIX, 80);

/* Пьезодинамик подключен к 3-ому контакту Ethernet-модуля */
#define BUZZER_PIN 3 

/* Это количество микросекунд, в течение которых будет работать 
 * динамик после включения и до выключения */
int buzzDelay = 0;

/* Переключатель, используемый только для включения динамика при 
 * каждом проходе через блок loop() */ 
char toggle = 0; 

/* Это команда, используемая сервером по умолчанию. Она обрабатывает 
 * запросы GET и POST. При запросе GET она возвращает простую страницу 
 * с несколькими кнопками. При запросе POST она сохраняет полученное 
 * значение в переменную buzzDelay, тем самым меняя продолжительность 
 * звука, издаваемого динамиком */
void buzzCmd(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete)
{
  if (type == WebServer::POST)
  {
    bool repeat;
    char name[16], value[16];
    do
    {
      /* Если данных, доступных для считывания, нет, то функция 
       * readPOSTparam() возвращает «false». Мы указываем в ней 
       * буферы для хранения строковых значений «name» и «value», 
       * а также длину этих буферов. */
      repeat = server.readPOSTparam(name, 16, value, 16);

      /* Это стандартная функция для сравнения строк. При точном 
       * соответствии она возвращает «0». Мы обращаемся к ней, 
       * спрашивая соответствие с параметром «buzz» */
      if (strcmp(name, "buzz") == 0)
      {
	/* Используем функцию strtoul(), чтобы преобразовать числовую  
	 * строку в целое число для переменной buzzDelay */
        buzzDelay = strtoul(value, NULL, 10);
      }
    } while (repeat);
    
    // Обработав данные запроса POST, приказываем браузеру 
    // перезагрузить страницу при помощи метода GET:
    server.httpSeeOther(PREFIX);
    return;
  }

  /* при запросе GET или HEAD отправляем стандартное сообщение, что запрос был успешным. */ 
  server.httpSuccess();

  /* при запросе HEAD не показываем контент страницы */
  if (type == WebServer::GET)
  {
    /* сохраняем HTML в программной памяти при помощи макроса P() */ 
    P(message) = 
      "<html><head><title>Webduino Buzzer Example</title>"
      "<body>"
      "<h1>Test the Buzzer!</h1>"
      "<form action='/buzz' method='POST'>"
      "<p><button name='buzz' value='0'>Turn if Off!</button></p>"
      "<p><button name='buzz' value='500'>500</button></p>"
      "<p><button name='buzz' value='1975'>1975</button></p>"
      "<p><button name='buzz' value='3000'>3000</button></p>"
      "<p><button name='buzz' value='8000'>8000</button></p>"
      "</form></body></html>";

    server.printP(message);
  }
}

void setup()
{
  // задаем контакт для зуммера и выставляем его в режим OUTPUT:
  pinMode(BUZZER_PIN, OUTPUT);

  // инициируем коммуникацию между библиотекой Ethernet и платой Wiznet:
  Ethernet.begin(mac, ip);

  /* регистрируем команду, вызываемую по умолчанию (активируется при запросе http://x.x.x.x/buzz). */   
  webserver.setDefaultCommand(&buzzCmd);

  /* приказываем серверу ждать подключений */
  webserver.begin();
}

void loop()
{
  // вечно обрабатываем входящие соединения (по одному за раз):
  webserver.processConnection();

  /* если задержка не выставлена на «0», при каждом проходе через
   * блок loop() включаем и выключаем динамик. */
  if ((++toggle & 1) && (buzzDelay > 0))
  {
    digitalWrite(BUZZER_PIN, HIGH);
    delayMicroseconds(buzzDelay);
    digitalWrite(BUZZER_PIN, LOW);
  }
}

См.также

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