Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

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

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

Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

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


Управление зуммером через браузерный интерфейс[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. }

См.также

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

  1. github.com - Web_Buzzer.ino