CraftDuino v2.0
  • - это CraftDuino - наш вариант полностью Arduino-совместимой платы.
  • CraftDuino - настоящий конструктор, для очень быстрого прототипирования и реализации идей.
  • Любая возможность автоматизировать что-то с лёгкостью реализуется с CraftDuino!
Просто добавьте CraftDuino!

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

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

Комментарии (2)

RSS свернуть / развернуть
+
0
Спасибо! Отличная статья!
avatar

admin

  • 24 мая 2010, 21:00
+
0
>>По результатам теста (время отклика — аналог ping)

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

mazzay

  • 14 января 2012, 15:01

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.