В предыдущем примере мы управляли светодиодом через локальную сеть — это полезно, но довольно скучно. Давайте сделаем с помощью Arduino действительно полезную в работе вещь. Я работаю администратором локальной сети и приходится следить за работой интернет канала. Для быстрой сигнализации о загруженности интернет канала или о отсутствии интернета мы соберем, так называемый, «Админский светофор». Объясню что это такое. Идея очень проста — с помощью Arduino мы проверяем время за которое наш Ethernet shield сможет соединиться с удаленным интернет-сервером. По результатам теста (время отклика — аналог ping) мы зажигаем или красный или желтый или зеленый светодиоды. Отдельно ставим маленький красный светодиод, обозначающий что невозможно соединиться с удаленным сервером (или нет интернета, или удаленный сервер умер).
Что нам понадобится:
1. Arduino, или другой аналог.
2. Ethernet shield.
3. Библиотеки для работы скрипта. Библиотека Ethernet — входит в состав arduino-0018.
4. 4 светодиода (2-красных, 1 желтый, 1 зеленый )и резисторы с рассчитанным сопротивлением под светодиоды.
Внимание! Arduino использует цифровые порты 10, 11, 12 и 13 для обмена информацией с модулем Ethernet shield, и они не могут использоваться для других целей. Подключать светодиод без ограничивающего резистора не рекомендуется. Весь монтаж проводить на обесточенной плате.
Приступаем к работе:
1. По характеристикам светодиодов рассчитываем резисторы для включения в схему. Для расчета я использовал следующий ресурс — Калькулятор расчета сопротивления резистора.
2. Подключаем к Arduino модуль Ethernet shield, устанавливаем светодиоды в 2(зеленый),4(желтый),6(красный),8 (красный — сигнализация что мы не смогли соединиться с сервером) пины, подключаем USB и Ethernet кабель к плате.
3. Загружаем скетч в Arduino.
4. Наблюдаем как в зависимости от нагрузки на интернет-канал у нас будут включаться разные светодиоды. Результаты замеров в миллисекундах и текущий статус светодиодов выдаются в «Serial monitor».
Ниже представлен скетч «Админский светофор».
#include <Ethernet.h>
/*"Админский светофор"*/
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 88, 25 }; // IP-адрес Ethernet shield`a
byte subnet[] = { 255, 255, 255, 0 }; //маска подсети
byte server[] = {194, 87, 0, 50}; // IP-адрес жертвы, шучу. Адрес удаленного интернет-сервера (www.ru)
byte gateway[] = { 192,168, 88, 1 }; // Шлюз с локальной сети
int redfPin = 8; // красный светодиод (ошибка соединения)на 8 пине
int redPin = 6; // красный светодиод на 6 пине
int yellowPin = 4; // желтый светодиод на 4 пине
int greenPin = 2; // зеленый светодиод на 2 пине
int low = 50 ; // нижняя планки величины пинга что меньше значения low - это нормально
int middle = 200 ; // средняя планка величины пинга что меньше значения low - это средняя наггрузка
Client client(server, 80); // порт по которому мы будем соединяться с удаленным сервером
boolean send_request()
{
int sc_start=millis(); // замеряем время до начала подключения
if (client.connect()) {
int sc_stop=millis(); // после успешного соединения замеряем время окончатния соединения
rtime=(rtime+(sc_stop-sc_start))/2; // считаем сколько времени ушло на соединение - среднее значение
// Время отклика привысило критический предел - зажигаем красный светодиод
if (rtime > middle){
digitalWrite(redfPin, 0);
digitalWrite(redPin, 1);
digitalWrite(yellowPin, 0);
digitalWrite(greenPin, 0);
Serial.print("Red status ->");
}
// Время отклика в среднем диапазоне - зажигаем желтый светодиод
if ((rtime > low) && (rtime < middle)){
digitalWrite(redfPin, 0);
digitalWrite(redPin, 0);
digitalWrite(yellowPin, 1);
digitalWrite(greenPin, 0);
Serial.print("Yellow status ->");
}
// Время отклика в минимальном диапазоне - зажигаем зеленый светодиод
if ((rtime > 1) && (rtime < low)){
digitalWrite(redfPin, 0);
digitalWrite(redPin, 0);
digitalWrite(yellowPin, 0);
digitalWrite(greenPin, 1);
Serial.print("Green status ->");
}
Serial.print("average response time = ");
Serial.println(rtime);
// Serial.print("Debug: response time = ");
// Serial.println(sc_stop-sc_start);
}else{
// Не удалось соединиться - зажигаем красный светодиод (ошибка соединения)
digitalWrite(redfPin, 1);
digitalWrite(redPin, 0);
digitalWrite(yellowPin, 0);
digitalWrite(greenPin, 0);
Serial.println("Red status -> response time = Timeout");
rtime=rtime+middle;
}
}
void setup()
{
Ethernet.begin(mac, ip, gateway, subnet);
Serial.begin(9600);
pinMode(redfPin, OUTPUT);
pinMode(redPin, OUTPUT);
pinMode(yellowPin, OUTPUT);
pinMode(greenPin, OUTPUT);
// Проводим тест всех светодиодов при запуске
digitalWrite(redfPin, 1);
delay(1000);
digitalWrite(redPin, 1);
delay(1000);
digitalWrite(yellowPin, 1);
delay(1000);
digitalWrite(greenPin, 1);
delay(2000);
//Сбрасываем состояние светодиодов на выкл.
digitalWrite(redfPin, 0);
digitalWrite(redPin, 0);
digitalWrite(yellowPin, 0);
digitalWrite(greenPin, 0);
}
void loop()
{
send_request();
client.stop();
delay(10000);
}

0 комментариев на «“«Админский светофор» :: Сигнализатор загруженности интернет-канала.”»
Спасибо! Отличная статья!
>>По результатам теста (время отклика — аналог ping)
хм. Ну как показательный пример — отлично.
Но для более объективного контроля за состоянием канала все же лучше использовать пинг.