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

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

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

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

Контакты:

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


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

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

Код

  1. /* Управление зуммером через браузерный интерфейс (AJAX)(Webduino) */
  2.  
  3. #include "SPI.h"
  4. #include "Ethernet.h"
  5. #include "WebServer.h"
  6.  
  7. // ПОСТАВЬТЕ ЗДЕСЬ СОБСТВЕННОЕ ЗНАЧЕНИЕ:
  8. static uint8_t mac[6] = { 0x02, 0xAA, 0xBB, 0xCC, 0x00, 0x22 };
  9.  
  10. // ВЫСТАВЬТЕ ТУТ ЗНАЧЕНИЕ, СООТВЕТСТВУЮЩЕЕ СЕТИ ВАШЕГО ХОСТА:
  11. static uint8_t ip[4] = { 192, 168, 1, 210 }; // area 51!
  12.  
  13. /* Все URL этого сервера будут начинаться с /buzz, потому что именно
  14.  * так мы определили значение PREFIX. Мы также будем прослушивать
  15.  * порт 80, стандартный порт для HTTP */
  16. #define PREFIX "/buzz"
  17. WebServer webserver(PREFIX, 80);
  18.  
  19. /* Пьезодинамик подключен к 3-ому контакту Ethernet-модуля */
  20. #define BUZZER_PIN 3
  21.  
  22. /* Это количество микросекунд, в течение которых будет работать
  23.  * динамик после включения и до выключения */
  24. int buzzDelay = 0;
  25.  
  26. /* Переключатель, используемый только для включения динамика при
  27.  * каждом проходе через блок loop() */
  28. char toggle = 0;
  29.  
  30. /* Это команда, используемая сервером по умолчанию. Она обрабатывает
  31.  * запросы GET и POST. При запросе GET она возвращает простую страницу
  32.  * с несколькими кнопками. При запросе POST она сохраняет полученное
  33.  * значение в переменную buzzDelay, тем самым меняя продолжительность
  34.  * звука, издаваемого динамиком */
  35. void buzzCmd(WebServer &server, WebServer::ConnectionType type, char *, bool)
  36. {
  37.   if (type == WebServer::POST)
  38.   {
  39.     bool repeat;
  40.     char name[16], value[16];
  41.     do
  42.     {
  43.       /* Если данных, доступных для считывания, нет, то функция
  44.        * readPOSTparam() возвращает «false». Мы указываем в ней
  45.        * буферы для хранения строковых значений «name» и «value»,
  46.        * а также длину этих буферов. */
  47.       repeat = server.readPOSTparam(name, 16, value, 16);
  48.  
  49.       /* Это стандартная функция для сравнения строк. При точном
  50.        * соответствии она возвращает «0». Мы обращаемся к ней,
  51.        * спрашивая соответствие с параметром «buzz» */
  52.       if (strcmp(name, "buzz") == 0)
  53.       {
  54.         /* Используем функцию strtoul(), чтобы преобразовать числовую  
  55.          * строку в целое число для переменной buzzDelay */
  56.         buzzDelay = strtoul(value, NULL, 10);
  57.       }
  58.     } while (repeat);
  59.    
  60.     // Обработав данные запроса POST, приказываем браузеру
  61.     // перезагрузить страницу при помощи метода GET:
  62.     server.httpSeeOther(PREFIX);
  63.     return;
  64.   }
  65.  
  66.   /* при запросе GET или HEAD отправляем стандартное сообщение, что запрос был успешным. */
  67.   server.httpSuccess();
  68.  
  69.   /* при запросе HEAD не показываем контент страницы */
  70.   if (type == WebServer::GET)
  71.   {
  72.     /* сохраняем HTML в программной памяти при помощи макроса P() */
  73.     P(message) =
  74. "<!DOCTYPE html><html><head>"
  75.   "<title>Webduino AJAX Buzzer Example</title>"
  76.   "<link href='http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/themes/base/jquery-ui.css' rel=stylesheet />"
  77.   //"<meta http-equiv='Content-Script-Type' content='text/javascript'>"
  78.   "<script src='http://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js'></script>"
  79.   "<script src='http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/jquery-ui.min.js'></script>"
  80.   "<style> #slider { margin: 10px; } </style>"
  81.   "<script>"
  82.     "function changeBuzz(event, ui) { $('#indicator').text(ui.value); $.post('/buzz', { buzz: ui.value } ); }"
  83.     "$(document).ready(function(){ $('#slider').slider({min: 0, max:8000, change:changeBuzz}); });"
  84.   "</script>"
  85. "</head>"
  86. "<body style='font-size:62.5%;'>"
  87.   "<h1>Test the Buzzer!</h1>"
  88.   "<div id=slider></div>"
  89.   "<p id=indicator>0</p>"
  90. "</body>"
  91. "</html>";
  92.  
  93.     server.printP(message);
  94.   }
  95. }
  96.  
  97. void setup()
  98. {
  99.   // задаем контакт для зуммера и выставляем его в режим OUTPUT:
  100.   pinMode(BUZZER_PIN, OUTPUT);
  101.  
  102.   // инициируем коммуникацию между библиотекой Ethernet и платой Wiznet:
  103.   Ethernet.begin(mac, ip);
  104.  
  105.   /* регистрируем команду, вызываемую по умолчанию (активируется при запросе http://x.x.x.x/buzz). */
  106.   webserver.setDefaultCommand(&buzzCmd);
  107.  
  108.   /* приказываем серверу ждать подключений */
  109.   webserver.begin();
  110. }
  111.  
  112. void loop()
  113. {
  114.   // вечно обрабатываем входящие соединения (по одному за раз):
  115.   webserver.processConnection();
  116.  
  117.   /* если задержка не выставлена на «0», при каждом проходе через
  118.    * блок loop() включаем и выключаем динамик. */
  119.   if ((++toggle & 1) && (buzzDelay > 0))
  120.   {
  121.     digitalWrite(BUZZER_PIN, HIGH);
  122.     delayMicroseconds(buzzDelay);
  123.     digitalWrite(BUZZER_PIN, LOW);
  124.   }
  125. }

См.также

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

  1. github.com - Web_AjaxBuzzer.ino