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

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

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


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

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

Код

  1 /* Управление зуммером через браузерный интерфейс (Webduino) */
  2 
  3 #include "SPI.h"
  4 #include "Ethernet.h"
  5 #include "WebServer.h"
  6 
  7 /* ПОСТАВЬТЕ ЗДЕСЬ СОБСТВЕННОЕ ЗНАЧЕНИЕ. MAC-адрес должен отличаться 
  8  * от других девайсов в сети. Если MAC-адрес Ethernet-модуля совпадет 
  9  * с другим MAC-адресом, это повлечет проблемы с получением пакетов.
 10  */
 11 static uint8_t mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
 12 
 13 /* ВЫСТАВЬТЕ ТУТ ЗНАЧЕНИЕ, СООТВЕТСТВУЮЩЕЕ СЕТИ ВАШЕГО ХОСТА. 
 14  * Большинство сетей находятся в диапазонах 192.168.0.XXX 
 15  * или 192.168.1.XXX. Выберите адрес, который не используется 
 16  * и не присваивается автоматически DHCP-сервисом, к которому 
 17  * подключен ваш роутер. */
 18 static uint8_t ip[] = { 192, 168, 1, 210 };
 19 
 20 /* Все URL этого сервера будут начинаться с /buzz, потому что именно
 21  * так мы определили значение PREFIX. Мы также будем прослушивать 
 22  * порт 80, стандартный порт для HTTP */
 23 #define PREFIX "/buzz"
 24 WebServer webserver(PREFIX, 80);
 25 
 26 /* Пьезодинамик подключен к 3-ому контакту Ethernet-модуля */
 27 #define BUZZER_PIN 3 
 28 
 29 /* Это количество микросекунд, в течение которых будет работать 
 30  * динамик после включения и до выключения */
 31 int buzzDelay = 0;
 32 
 33 /* Переключатель, используемый только для включения динамика при 
 34  * каждом проходе через блок loop() */ 
 35 char toggle = 0; 
 36 
 37 /* Это команда, используемая сервером по умолчанию. Она обрабатывает 
 38  * запросы GET и POST. При запросе GET она возвращает простую страницу 
 39  * с несколькими кнопками. При запросе POST она сохраняет полученное 
 40  * значение в переменную buzzDelay, тем самым меняя продолжительность 
 41  * звука, издаваемого динамиком */
 42 void buzzCmd(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete)
 43 {
 44   if (type == WebServer::POST)
 45   {
 46     bool repeat;
 47     char name[16], value[16];
 48     do
 49     {
 50       /* Если данных, доступных для считывания, нет, то функция 
 51        * readPOSTparam() возвращает «false». Мы указываем в ней 
 52        * буферы для хранения строковых значений «name» и «value», 
 53        * а также длину этих буферов. */
 54       repeat = server.readPOSTparam(name, 16, value, 16);
 55 
 56       /* Это стандартная функция для сравнения строк. При точном 
 57        * соответствии она возвращает «0». Мы обращаемся к ней, 
 58        * спрашивая соответствие с параметром «buzz» */
 59       if (strcmp(name, "buzz") == 0)
 60       {
 61 	/* Используем функцию strtoul(), чтобы преобразовать числовую  
 62 	 * строку в целое число для переменной buzzDelay */
 63         buzzDelay = strtoul(value, NULL, 10);
 64       }
 65     } while (repeat);
 66     
 67     // Обработав данные запроса POST, приказываем браузеру 
 68     // перезагрузить страницу при помощи метода GET:
 69     server.httpSeeOther(PREFIX);
 70     return;
 71   }
 72 
 73   /* при запросе GET или HEAD отправляем стандартное сообщение, что запрос был успешным. */ 
 74   server.httpSuccess();
 75 
 76   /* при запросе HEAD не показываем контент страницы */
 77   if (type == WebServer::GET)
 78   {
 79     /* сохраняем HTML в программной памяти при помощи макроса P() */ 
 80     P(message) = 
 81       "<html><head><title>Webduino Buzzer Example</title>"
 82       "<body>"
 83       "<h1>Test the Buzzer!</h1>"
 84       "<form action='/buzz' method='POST'>"
 85       "<p><button name='buzz' value='0'>Turn if Off!</button></p>"
 86       "<p><button name='buzz' value='500'>500</button></p>"
 87       "<p><button name='buzz' value='1975'>1975</button></p>"
 88       "<p><button name='buzz' value='3000'>3000</button></p>"
 89       "<p><button name='buzz' value='8000'>8000</button></p>"
 90       "</form></body></html>";
 91 
 92     server.printP(message);
 93   }
 94 }
 95 
 96 void setup()
 97 {
 98   // задаем контакт для зуммера и выставляем его в режим OUTPUT:
 99   pinMode(BUZZER_PIN, OUTPUT);
100 
101   // инициируем коммуникацию между библиотекой Ethernet и платой Wiznet:
102   Ethernet.begin(mac, ip);
103 
104   /* регистрируем команду, вызываемую по умолчанию (активируется при запросе http://x.x.x.x/buzz). */   
105   webserver.setDefaultCommand(&buzzCmd);
106 
107   /* приказываем серверу ждать подключений */
108   webserver.begin();
109 }
110 
111 void loop()
112 {
113   // вечно обрабатываем входящие соединения (по одному за раз):
114   webserver.processConnection();
115 
116   /* если задержка не выставлена на «0», при каждом проходе через
117    * блок loop() включаем и выключаем динамик. */
118   if ((++toggle & 1) && (buzzDelay > 0))
119   {
120     digitalWrite(BUZZER_PIN, HIGH);
121     delayMicroseconds(buzzDelay);
122     digitalWrite(BUZZER_PIN, LOW);
123   }
124 }

См.также

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