В предыдущем примере мы управляли светодиодом через локальную сеть — это полезно, но довольно скучно. Давайте сделаем с помощью 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)
хм. Ну как показательный пример — отлично.
Но для более объективного контроля за состоянием канала все же лучше использовать пинг.