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

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

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


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

См.также

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