DIR-320 + Freeduino: выводим системную информацию на LCD

Аппаратный виджет

Я долго думал, как можно сделать простой и удобный мониторинг роутера, а именно нагрузку, свободную память, аптайм и др. В этой статье я расскажу как можно подключить Freeduino к D-Link DIR-320 для вывода системной информации на LCD-дисплей. Всё не так трудно, как может показаться на первый взгляд.
dscf3017

Роутер содержит внутренний последовательный порт, который можно использовать для сервисных функций и отладки.
dscf2807
Его-то мы и задействуем. Его распиновка следующая:

pins
Слева направо:

  • RX — приём
  • NC — не подключается (ключ)
  • VCC — питание (3.3 вольта)
  • GND — земля
  • TX — передача

Для наших нужд нужно только два контакта — GND и TX. Подключаем их к Freeduino: GND к GND, TX к RX (второй контакт).
connect_scheme
LCD подключим к цифровым пинам с 8 по 13.
У меня всё это выглядело так:
dscf2368
dscf2370
dscf2374

Теперь необходимо выяснить скорость порта роутера. Для этого в консоли по SSH/telnet даём команду:

root@Router-DIR320:/# cat /proc/tty/driver/serial

Должны увидеть что-то подобное:
serial_ports
Нас интересует строчка

0: uart:16550A port:B8000300 irq:3 baud:9585 tx:1009317 rx:0 CTS|DSR|CD

В данном случае скорость порта составляет 9585 бод.

Напишем скетч, который зальём в микроконтроллёр:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <LiquidCrystal.h>
 
// инициализируем библиотеку LCD
LiquidCrystal lcd(12, 13, 11, 10, 9, 8);
 
void ScreenSaver()
{
  int i;
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(" D-Link DIR-320 ");
  lcd.setCursor(0,1);
  lcd.print("  &  Freeduino  ");
  delay(3000);
  lcd.clear();
  for (i=0;i<8;i++)
  {
    lcd.setCursor(i,0);
    lcd.print("=");
    lcd.setCursor(16-i-1,0);
    lcd.print("=");
    delay(200);
  }
  lcd.clear();
}
 
void setup(){
  // устанавливаем параметры дисплея: 
  lcd.begin(16, 2);
  // инициализируем последовательный порт:
  Serial.begin(9585); //здесь не забываем указать скорость вашего порта роутера
}
 
void loop()
{
  char s;
  if (Serial.available()) 
  {
    delay(100);
    while (Serial.available() > 0) 
    {
      s=Serial.read();
 
      if (s=='^') {
        switch (Serial.read()) {
          case '1':  
            lcd.setCursor(0,1);
            Serial.read();
            break;
          case '0':
            lcd.setCursor(0,0); 
            Serial.read();
            break;
          case 'c':
            lcd.clear(); 
            Serial.read();
            break;
          case 's':
            Serial.read();
            ScreenSaver();
            break;
        } //switch
      }
      else {
        // Выводим каждый символ на LCD
        lcd.write(s);
      }
    }
  }
}

Команды, подаваемые на микроконтроллёр будут такими:
^c: — очистить дисплей
^0:text — вывести text на первой строке
^1:text — вывести text на второй строке
^s: — вывести небольшую заставочку 🙂

Проверим работу. Введём в консоли роутера команду:

echo "Hello, world!" > /dev/tts/0

На экране должна появиться надпись.
dscf2371
Уже хорошо:)
Теперь необходимо научить маршрутизатор выводить информацию о своём состоянии. Для этого служит следующий скрипт:
lcdduino.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#!/bin/sh
 
port="/dev/tts/0"
 
lcdWrite() {
  #Вывод на экран
  echo -n "^"${1}:$2 > $port
}
 
lcdClear() {
  #Очистка экрана
  echo -n "^c:" > $port
}
 
lcdScreenSaver() {
  #Запуск заставки
  echo -n "^s:" > $port
}
 
WidgetLoad() {
  #Отображение загрузки процессора
  s=`/usr/bin/uptime`
  s2=":"
  for i in 1 2 3 4 5 6
  do #Удаляем всё лишнее до последнего двоеточия
    n=`expr index "$s" "$s2"`
    s="${s:$n}"
  done
  s="${s:1}" #Удаляем первый символ (пробел)
  lcdClear
  lcdWrite 0 "Load CPU"
  lcdWrite 1 "$s"
}
 
WidgetWiFiClientsCount() {
  #Виджет, показывающий количество подключенных WiFi клиентов
  s=`wl assoclist | wc -l`
  lcdClear
  lcdWrite 0 "Wi-Fi Clients"
  lcdWrite 1 "$s"
}
 
WidgetUptime() {
  #Аптайм роутера
  s=`/usr/bin/uptime`
  s2="l"
  n=`expr index "$s" "$s2"`
  n=`expr $n - 3`
  s="${s:0:$n}"
  s2="u"
  n=`expr index "$s" "$s2"`
  n=`expr $n + 2`
  s="${s:$n}"
  lcdClear
  lcdWrite 0 "Uptime"
  lcdWrite 1 "$s"
}
 
WidgetRAM() {
  #Свободная память
  set `cat /proc/meminfo | grep "Mem:"`
  n=`expr $4 + $6 + $7`
  p=`expr 100 '*' $n / $2`
  n=`expr $n / 1024`
  lcdClear
  lcdWrite 0 "FreeRAM"
  lcdWrite 1 "$n Kb ${p}%"
}
 
WidgetHDD() {
  #Свободное место в /opt
  set `df | grep "/opt"`
  p=`expr 100 '*' $3 / $1`
  n=`expr $3 / 1024`
  lcdClear
  lcdWrite 0 "Free HDD"
  lcdWrite 1 "$n Mb ${p}%"
}
 
WidgetDateTime() {
  #Дата и время
  set `date`
  lcdClear
  lcdWrite 0 "$3 $2 $6"
  lcdWrite 1 "$4"
}
 
#Main script
while [ : ]
do
  WidgetRAM
  sleep 3
  WidgetLoad
  sleep 3
  WidgetUptime
  sleep 3
  WidgetWiFiClientsCount
  sleep 3
  WidgetHDD
  sleep 3
  WidgetDateTime
  sleep 3
done

Запускаем скрипт, проверяем.

Скрипт добавляем в автозагрузку. Например, в файл /opt/etc/init.d/rc.firewall , который мы создали ранее.

/opt/etc/scripts/lcdduino.sh &

Похожие записи:

17 Комментарии “DIR-320 + Freeduino: выводим системную информацию на LCD

    1. Модель правильно написана? О нём никакого упоминания в Интернете… Надо смотреть даташит на него. Для дисплеев с интерфейсом HD44780 библиотеки готовые.

  1. Привет

    здорово получилось, но у меня вопрос — нельзя ли arduino подключить сразу к USB роутера?

    я вот пробую именно так сделать, но что-то не получается — не видит openwrt ардуину как usb-устройство.

    1. Я тоже пробовал подключать через USB, ставил драйвер. Но вместо символов выводились кракозябры. Если надо, могу скинуть на мыло драйвер, может что у Вас получится.

  2. А какие данные можно выводить вообще (именно о роутере)? Здесь представлен полный список?

    1. Выводить можно всё что угодно, это уж зависит от того, как вы дополните скрипт: время работы, количество оперативной памяти, место на флэшке, объём трафика, скорость передачи данных, MAC-адреса клиентов и многое другое.

  3. Я не совсем понимаю в линуксе. Помогите дополнить скрипт для вывода следующих параметров:
    занятое место на флешке\ HDD,
    свободное место на флешке\ HDD,
    скорость передачи данных на прием и отдачу.
    Заранее благодарен за помощь.

  4. Сайт просто находка. Хотел ардуиной пинговать сервер гугла например и выводить результат на двухстрочный дисплей. А тут такое… еще и dir-320 как раз есть. Подскажите если не трудно как будет выглядеть скрипт пингующий сервер например: google и отправляющий на ардуину адрес пингуемого сервера и размер пакета с временем отклика (в идеале еще кол-во потерянных пакетов) во второй строке. Ну или подскажите где искать.

  5. Не подскажите в чем может быть дело? добавляю скрипт в автозагрузку в rc.local, все шлет в сериал, но роутер перестает инет раздавать на порты, убираю с автозагрузки — все норм работает. openWrt стоит.

  6. не пойму то ли ардуинка виновата то ли openwrt, с экраном по i2c шине подключил а вот с роутером подружить не удается при выполнении скрипта вылезает ошибка
    ./lcdduino.sh: line 103: can’t create /dev/tts/0: nonexistent directory

    как я понял дело в порте, можно поподробнее поснить как подружить,?

    1. Значит нет такого устройства «/dev/tts/0». Видимо в openwrt последовательные порты по-другому называются. Попробуйте «/dev/ttyS0». Это в скрипте lcdduino.sh

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *