«Админский светофор» :: Сигнализатор загруженности интернет-канала.


В предыдущем примере мы управляли светодиодом через локальную сеть — это полезно, но довольно скучно. Давайте сделаем с помощью 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 комментариев на «“«Админский светофор» :: Сигнализатор загруженности интернет-канала.”»

  1. >>По результатам теста (время отклика — аналог ping)

    хм. Ну как показательный пример — отлично.
    Но для более объективного контроля за состоянием канала все же лучше использовать пинг.

Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Android Arduino Bluetooth CraftDuino DIY IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна конкурс манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение