Arduino:Примеры/Управление RGB-светодиодом и динамиком по сети

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

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



Управление RGB-светодиодом и динамиком по сети

Данный пример демонстрирует управление RGB-светодиодом и динамиком по сети с помощью платы Arduino Uno и платы расширения Arduino Ethernet Shield

Необходимые компоненты

Монтажная схема

Соедините Arduino Uno и плату расширения Arduino Ethernet Shieldи после этого подключите RGB-светодиод и динамик согласно монтажной схеме.

Код

#include <Ethernet.h>                                                                                     // Подключение библиотеки Ethernet
#include <SPI.h>                                                                                          // Подключение библиотеки SPI

#define BLUE    5                                                                                         // Синий вывод RGB-светодиода подключен к 5 цифровому контакту
#define GREEN   6                                                                                         // Зеленый вывод RGB-светодиода подключен к 6 цифровому контакту
#define RED     7                                                                                         // Красный вывод RGB-светодиода подключен к 7 цифровому контакту
#define SPEAKER 3                                                                                         // Вывод динамика подключен к 3 цифровому контакту

int freq = 0;                                                                                             // Частота звука по умолчанию 
int pin;                                                                                                  // Контакт светодиода для управления

byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x4A, 0xE0 };                                                      // MAC-адрес вашего Ethernet шилда
                                                                                                          // если вы его не знаете, можете оставить этот

EthernetServer server = EthernetServer(80);                                                               // Создаем сервер прослушивающий 80 порт

boolean receiving = false;                                                                                // Отслеживание получаемых данных от клиента

void setup()
{
  Serial.begin(9600);                                                                                     // Инициализация последовательного соединения на скорости 9600 бод

  pinMode(RED, OUTPUT);
  pinMode(GREEN, OUTPUT);
  pinMode(BLUE, OUTPUT);

  // Соединение с DHCP
  if (!Ethernet.begin(mac))
  {
    Serial.println("Could not Configure Ethernet with DHCP.");                                            // Вывод в монитор порта "Could not Configure Ethernet with DHCP."
                                                                                                          // ("Не удалось настроить Ethernet с помощью DHCP")
    return;
  }
  else
  {
    Serial.println("Ethernet Configured!");                                                               // Вывод в монитор порта "Ethernet Configured!"
                                                                                                          // "Ethernet настроен!"
  }

  // Запускаем сервер
  server.begin();
  Serial.print("Server Started.\nLocal IP: ");                                                            // Вывод в монитор порта "Server Started.\nLocal IP:"
                                                                                                          // (
                                                                                                          // Сервер запущен
                                                                                                          // Локальный IP: <здесь будет указан IP адрес>
                                                                                                          // )
  Serial.println(Ethernet.localIP());                                                                     // Вывод в монитор порта IP адреса
 
}

void loop()
{
  EthernetClient client = server.available();

  if (client)
  {

   // HTTP запрос заканчивается пустой строкой
   boolean currentLineIsBlank = true;
   boolean sentHeader = false;

   while (client.connected())
   {
     if (client.available())
     {
       char c = client.read();                                                                             // Читаем данные из входящего буфера

       if(receiving && c == ' ') receiving = false;                                                        // Данные получены
       if(c == '?') receiving = true;                                                                      // Поиск аргументов переданных GET-запросом(аргументы после символа "?")

       // Обработка GET-запроса
       if(receiving)
       {
         // Если полученн аргумент 'L' - то управляем светодиодом
         if (c == 'L')
         {
           Serial.print("Toggling Pin ");                                                                  // Вывод в монитор порта "Toggling Pin" ("Переключаем контакт ")
           pin = client.parseInt();                                                                        // Ищем следующее корректное целое число во входящем потоке данных и сохраняем в переменной
           Serial.println(pin);                                                                            // Вывод в монитор порта номер контакта RGB-светодиода
           digitalWrite(pin, !digitalRead(pin));                                                           // Включаем/выключаем светодиод
           break;  
         }
         // Если получен аргумент 'S' - то управляем динамиком
         else if (c == 'S')
         {
           Serial.print("Setting Frequency to ");                                                          // Вывод в монитор порта "Setting Frequency to "("Настройка частоты на ")
           freq = client.parseInt();                                                                       // Ищем следующее корректное целое число во входящем потоке данных и сохраняем в переменной
           Serial.println(freq);                                                                           // Вывод в монитор порта выбранной частоты
           if (freq == 0)
             noTone(SPEAKER);                                                                              // Выключаем воспроизведение звука
           else
             tone(SPEAKER, freq);                                                                          // Включаем воспроизведение звука
           break;
         }
       }
    
       // Отправляем заголовок ответа и HTML-код
       if(!sentHeader)
       {
          // Отправляем стандартный заголовок ответа HTTP
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html\n");
     
          // Красная кнопка переключения
          client.println("<form action='' method='get'>");
          client.println("<input type='hidden' name='L' value='7' />");
          client.println("<input type='submit' value='Toggle Red' />");
          client.println("</form>");
     
          // Зеленая кнопка переключения
          client.println("<form action='' method='get'>");
          client.println("<input type='hidden' name='L' value='6' />");
          client.println("<input type='submit' value='Toggle Green' />");
          client.println("</form>");
     
          // Синяя кнопка переключения
          client.println("<form action='' method='get'>");
          client.println("<input type='hidden' name='L' value='5' />");
          client.println("<input type='submit' value='Toggle Blue' />");
          client.println("</form>");
     
          // Ползунок частоты для динамика
          client.println("<form action='' method='get'>");
          client.print("<input type='range' name='S' min='0' max='1000' step='100' value='0'/>");
          client.println("<input type='submit' value='Set Frequency' />");
          client.println("</form>");
     
          sentHeader = true;
        }

        if (c == '\n' && currentLineIsBlank) break;

        if (c == '\n')
        {
          currentLineIsBlank = true;
        }
        else if (c != '\r')
        {
          currentLineIsBlank = false;
        }
      }
    }
    delay(5);                                                                                             // Даём веб-браузеру время для получения данных
    client.stop();                                                                                        // Закрываем соединение
  }
}

См.также

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