Выбрать главу

// http://bildr.org/2011/06/arduino-ethernet-pin-control/

#include <Ethernet.h>

#include <SPI.h>

const int BLUE =5;

const int GREEN =6;

- 310 -

const int RED =7;

const int SPEAKER =3;

// Для управления RGB-светодиодом и динамиком

// Если вы хотите использовать дополнительные устройства,

// добавляйте переменные сюда

int freq = 0;

int pin;

// MAC-адрес устройства

// Должен быть написан на этикетке вашего устройства

// или можете использовать этот

byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x4A, 0xE0 };

// Сервер на порту 80

EthernetServer server = EthernetServer(80); //Порт 80

boolean receiving = false; // Отслеживание данных GET

void setup()

{

Serial.begin(9600);

pinMode(RED, OUTPUT);

pinMode(GREEN, OUTPUT);

pinMode(BLUE, OUTPUT);

// Соединение с DHCP

if ( !Ethernet.begin (mac))

{

Serial.println("Could not Configure Ethernet with DHCP.");

return;

}

else

{

Serial.println("Ethernet Configured!");

}

// Запуск сервера

server.begin();

Serial.print("Server Started.\nLocal IP: ");

Serial.println(Ethernet.localIP());

}

void loop()

{

EthernetClient client

server.available();

if (client)

{

// Запрос НТТР заканчивается пустой строкой

boolean currentLineisBlank

true;

boolean sentHeader = false;

- 311 -

while (client.connected())

{

if (client.available())

{

char с = client.read(); // Чтение из буфера

if(receiving && с == ' ') receiving = false;

//Окончание передачи

if(c == '?') receiving = true; // Поиск символа?

// Ожидание данных GET

if(receiving)

// Данные управления светодиодом (переменная L)

if (с == 'L')

Serial.print ( "Toggling Pin ");

pin = client.parseInt();

Serial.println(pin);

digitalWrite(pin, !digitalRead(pin));

break;

}

// Команда управления динамиком (переменная S)

else if (с == 'S')

{

Serial.print("Setting Frequency to ");

freq = client.parseInt();

Serial.println(freq);

if (freq == 0)

noTone(SPEAKER);

else

tone(SPEAKER, freq);

break;

}

// Код для управления дополнительными устройствами

// добавляем сюда

}

// Отправка заголовка ответа

if ( ! sentHeader)

{

// Отправить стандартный заголовок НТТР ответа

client.println("HTTP/1.1 200 ОК");

client.println ( "Content-Type: text/html \n");

// Кнопка переключения красного для RGB

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>");

- 312 -

// кнопка переключения зеленого для RGB

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>");

// кнопка переключения синего для RGB

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 Freq.' />");

client.println("</form>");

// Добавить формы для управления

// дополнительными устройствами

sentHeader = true;

}

if (с=='\n' && currentLineisBlank) break;

if (с=='\n')

{

currentLineisBlank=true;

}

else if (с ! = '\r')

{

currentLineisBlank=false;

}

}

}

// Дать время веб-браузеру на получение данных

delay(5);

client.stop(); // Закрыть соединение

}

}

Приведенная программа выполняет все функции, описанные в предыдущих разделах. Измените MAC-адрес на значение, указанное на этикетке вашего Ethemet-адаптера. Если вы не найдете этот адрес, возьмите значение из листинга 14.2. Загрузите программу на плату Arduino и запустите монитор последовательного порта.

Убедитесь, что плата Arduino подключена к сети и в маршрутизаторе включен

DHCP. Через несколько секунд в мониторе последовательного порта появится сообщение о назначенном IP-адресе (рис. 14.4).

В случае, показанном на рис. 14.4, Arduino был назначен локальный IP-адрес 192.168.0.9. В вашей сети почти наверняка будет другой адрес. Зная IP-адрес, можно использовать его для доступа к веб-интерфейсу.

- 313 -

Рис. 14.4. Вывод в последовательный порт полученного по DHCP IP-адреса

14.3. Управление платой Arduino по сети

Теперь, когда код сервера работает, и ваша плата Arduino подключена к сети с действительным IP-адресом, вы можете с помощью браузера получить к ней доступ и осуществлять управление. Сначала сделаем это по локальной сети, а затем воспользуемся переадресацией портов на вашем роутере для доступа к плате Arduino из внешней сети.

14.3.1. Управление платой Arduino по локальной сети

Чтобы убедиться, что веб-интерфейс работает должным образом, проверьте, что ваш компьютер подключен к той же сети, что и плата Arduino (через Wi-Fi или Ethemet). Откройте ваш браузер и введите в адресную строку IP-адрес из предыдущего раздела. В результате должна открыться HTML-страница, созданная ранее.

Попробуйте нажать кнопки для включения/выключения цветов RGB-светодиода.