Подключение LCD-дисплея к серверу с помощью Arduino
Как известно, у сервера обычно нет монитора, но иногда возникает необходимость оперативно получить информацию о его состоянии — температуру, загрузку и т.д.
В этой статье, рассказано как подключить lcd к Ардуино, как вывести на него информацию о сервере и как управлять этим всем через Веб-интерфейс.
На дисплей будут поочерёдно, с задержкой в 3 сек выводится данные о Загрузке процессора ⇨ Времени работы компьютера ⇨ Свободной памяти ⇨ Температуре процессора ⇨ Температуре hdd ⇨ Свободного места на hdd ⇨ Версии ядра ⇨ IP-адресе
Подключение LCD
Всё что потребуется — это собственно сама ардуина и любой LCD-дисплей (на контроллере HD44780). Я выбрал двустрочный, чтоб он поместился в заглушке ячейки для cdromа.
Отверстие прорезается (любыми подручными средствами) таким образом, чтоб дисплей входил туда с усилием. Это избавит Вас от возни с крепежом.
И паяем гребёнку…
Подключаем дисплей к ардуине как нарисовано на схеме:
Потенциометр (переменный резистор) подойдёт любой, в диапазоне от 5 до 20кОм, он отвечает за контраст дисплея. Если такового нет, то можно просто прижать жёлтый провод к «земле».
15 и 16 — контакты отечают за подсветку, их можно не подключать.
Теперь проверим работу. Откройте в Arduino IDE пункт меню File ⇨ Examples ⇨ LiquidCrystal ⇨ HelloWorld или просто используйте код приведённый ниже:
// Подключается библиотека для работы LCD
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup()
{
// Инициализация дисплея: 2 строки по 16 символов, если у Вас другой, то укажите нужное
lcd.begin(16, 2);
// Выводит на дисплей традиционную фразу
lcd.print("hello, world!");
}
void loop()
{
// Устанавливает курсор в 1 столбец 2й строки. Нумерация начинается с нуля
lcd.setCursor(0, 1);
// Выводит число секунд, прошедших с момента старта
lcd.print(millis() / 1000);
}
Как то так...
Если всё работает, тогда заливаем в ардуину приведённый ниже код:
Ардуина будет считывать строку посылаемую php-скриптом, разбирать её, и выводить на дисплей.
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
String inString;
void setup()
{
Serial.begin(57600);
lcd.begin(16, 2);
lcd.setCursor(5, 0);
lcd.print("SERVER");
lcd.setCursor(7, 1);
lcd.print("OK");
delay(5000);
}
void loop()
{
while (Serial.available()) # приём идёт пока в буфере что-то есть
{
char inChar = Serial.read(); # чтение посимвольно
if (inChar != '\n') # если не конец строки
{
inString += inChar; # тогда прибавляем символы к строке
}
else # этот блок сработает когда будет получен признак конца строки (\n)
{
# Поскольку у нас двустрочный дисплей, то php-скрипт (см. ниже)
# будет отправлять строчку с данными разделённую запятой,
# по этой запятой, принятая строка будет разделяться на две
# и они будут выводится в первой и второй строчке дисплея
int commaIndex = inString.indexOf(',');
int secondCommaIndex = inString.indexOf(',', commaIndex+1);
String firstValue = inString.substring(0, commaIndex);
String secondValue = inString.substring(commaIndex+1);
lcd.clear(); # очистить дисплей
lcd.print(firstValue); # выводим первую часть полученой строки с данными
lcd.setCursor(0, 1); # ставим курсор на вторую строчку дисплея
lcd.print(secondValue); # выводим вторую часть полученой строки с данными
inString = ""; # очищаем переменную String
}
}
}
Устанавливаем всё в сервер и подключаем ардуину в usb-порт.
Сервер
На всякий случай про установку сервера...
Действия производятся на ubuntu-server
Проверяем как опредилилась ардуина:
ls /dev/tty*
В зависимости от того какая у Вас ардуина, она должна опредилится как /dev/ttyUSB0 либо /dev/ttyACM0 (если нет других устройств)
Теперь надо установить пару программ:
sudo apt-get install sensord
Эта прога считывает информацию с различных сенсоров.
После установки надо дать команду:
sudo sensors-detect
… и ответить на все вопросы YES
Эта команда прверит всё датчики которые есть на материнской плате.
Может так случится, что не опредилится ни одного датчика:
Тогда из php-скрипта надо будет удалить вот этот блок:
//////////////////////////sensors/////////////////////////////////////////
$cp = shell_exec("sensors -A"); // получаем температуру первого процессора от "sensors"
list($cps0, $cps1, $cps2, $cps3, $cps4) = preg_split("/[\s.]+/", $cp); //разбор строки с неопределённым количеством пробелов и точек, полученой от "sensors"
fwrite($fp, "CPU Temp".",".$cps3." C"."\n"); //запись в ардуину значения
sleep(3); // пауза для показа
Смотрите ниже...
Вторая программа измеряет температуру винчестера.
Устанавим её:
sudo apt-get install hddtemp
Будут заданы несколько вопросов:
Со всем соглашаемся.
Поскольку речь идёт о сервере, то скорее всего php у Вас установлен. Если нет, то устанавливаем:
sudo apt-get install php5
Создадим скрипт, который будет считывать информацию и отправлять её ардуине:
sudo nano /etc/ardulcd.php
… вставляем в него вот это:
<?php
$i = 1;
$fp = fopen("/dev/ttyUSB0", "w+"); // открываем USB-устройство (ардуина) У Вас может быть другой /dev
while ($i == 1)
{
////////////////////////////ps aux///////////////////////////////////////
$psaux = exec("ps aux | awk '{s += $3} END {print s}'"); // получаем загрузку cpu в процентах "ps aux"
fwrite($fp, "CPU Load".",".$psaux." %"."\n"); //запись в ардуину
sleep(3); // пауза для показа
////////////////////////////uptime///////////////////////////////////////
$uptime = shell_exec("uptime"); // получаем текущее время и время работы компьютера "uptime"
list($ut0, $ut1, $ut2, $ut3) = explode(",", $uptime); //разбор строки полученой от "uptime"
list($prob0, $prob1, $prob2, $prob3, $prob4) = explode(" ", $ut0); //разбор первой части строки, полученой от "uptime"
fwrite($fp, "Time ".$prob1.","." ".$prob3." Days".$ut1."\n"); //запись в ардуину
sleep(3); // пауза для показа
////////////////////////////free///////////////////////////////////////
$free = shell_exec("free | grep Mem"); // Будет выводится объём свободной памяти от "free"
list($fr0, $fr1, $fr2) = preg_split("/[\s]+/", $free); //разбор строки с неопределённым количеством пробелов, полученой от "free"
fwrite($fp, "Used Memory".",".$fr2."\n"); //запись в ардуину
sleep(3); // пауза для показа
//////////////////////////sensors/////////////////////////////////////////
$cp = shell_exec("sensors -A"); // получаем температуру первого процессора от "sensors"
list($cps0, $cps1, $cps2, $cps3, $cps4) = preg_split("/[\s.]+/", $cp); //разбор строки по пробелам и точкам неопределённого количества, полученой от "sensors"
fwrite($fp, "CPU Temp".",".$cps3." C"."\n"); //запись в ардуину значения
sleep(3); // пауза для показа
//////////////////////////hddtemp/////////////////////////////////////////
$fphdd = fsockopen("localhost", 7634, $errno, $errstr, 1); // открываем порт от "hddtemp"
$buffhdd = fgets($fphdd); // получаем строку с данными
fclose($fphdd); // закрываем порт "hddtemp"
list($hd0, $hd1, $hd2, $hd3) = explode("|", $buffhdd); //разбор строки полученой от "hddtemp"
fwrite($fp, "HDD Temp".",".$hd3." C"."\n"); //запись в ардуину температуры первого винчестера
sleep(3);
//////////////////////////df -h/////////////////////////////////////////
$df = shell_exec("df -h"); // получаем размер дискового пространства, выводится будут размер винчестера и оставшееся свободное место
list($df0, $df1, $df2, $df3, $df4, $df5, $df6, $df7, $df8, $df9, $df10, $df11, $df12) = preg_split("/[\s.]+/", $df); //разбор строки по пробелам неопределённого количества, полученой от "df -h"
fwrite($fp, "HDD".",".$df8." ".$df10."\n"); //запись в ардуину значения (первое - общий размер, второе - свободное место)
sleep(3); // пауза для показа
//////////////////////////uname/////////////////////////////////////////
$uname = shell_exec("uname -a"); // uname -a Будет выводится версия ядра
list($uname0, $uname1, $uname2, $uname3) = preg_split("/[\s]+/", $uname); //разбор строки по пробелам неопределённого количества, полученой от "uname -a"
fwrite($fp, "Core info".",".$uname2."\n"); //запись в ардуину
sleep(3); // пауза для показа
//////////////////////////ifconfig/////////////////////////////////////////
$ifconfig = shell_exec("ifconfig"); // ifconfig Будет выводится ip-адрес
list($ifconfig0, $ifconfig1, $ifconfig2, $ifconfig3, $ifconfig4, $ifconfig5, $ifconfig6) = preg_split("/[\s]+/", $ifconfig); //разбор строки с неопределённым количеством пробелов, полученой от "ifconfig"
list($ifcon0, $ifcon1) = explode(":", $ifconfig6);
fwrite($fp, "IP-address".",".$ifcon1."\n"); //запись в ардуину
sleep(3); // пауза для показа
}
?>
Сохраняем...
подсказка nano
Сохранить______Выйти
Сохранить______Выйти
Данные считываются и отправляются в ардуину последовательно, блок за блоком.
Ненужные блоки можно смело удалять или добавлять свои. При добавлении своих функций, не забывайте про разделительную запятую в строке.
Суть работы такова:
Скрипт запускаясь из автозагрузки, начинает в бесконечном цикле запрашивать различные данные о системе, формировать их в строку и отправлять в ардуину с интервалом в 3 сек.
Данные отправляются одной строкой разделённой запятой.
С помощью этой запятой ардуина разбирает принятую строку на две и выводит их на дисплей.
Для лучшего понимания работы, можно попробовать команды использующиеся
в скрипте:
Загрузка cpu
Текущее время и время работы компьютера
Объём свободной памяти
Температура процессора
Температура hdd
Дисковое пространство
Версия ядра
IP-адрес
ps aux | awk '{s += $3} END {print s}'
Текущее время и время работы компьютера
uptime
Объём свободной памяти
free | grep Mem
Температура процессора
sensors -A
Температура hdd
telnet localhost 7634
Дисковое пространство
df -h
Версия ядра
uname -a
IP-адрес
ifconfig
Теперь проверим работу запустив скрипт вручную.
Дадим права устройству:
sudo chmod 777 /dev/ttyUSB0
Настроим порт утилитой stty
sudo stty -F /dev/ttyUSB0 cs8 57600 ignbrk -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts -hupcl
Запустим скрипт:
sudo php /etc/ardulcd.php
На дисплее должны отобразится данные.
Если какие-то строки не выводятся, то придётся подправить скрипт.
Если не выводится ничего, то может быть что-то с правами на файлы.
Вот так можно проверить передачу данных.
sudo echo 'hello,hello' > /dev/ttyUSB0
Если всё работает, то добавляем скрипт и утилиту в автозагрузку:
sudo nano /etc/rc.local
В конец файла (перед exit 0) вписываем это:
# Утилита stty настраивает порт, обратите внимание на /dev/tty...
stty -F /dev/ttyUSB0 cs8 57600 ignbrk -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts -hupcl
# пауза 1 сек, на всякий случай
sleep 1
# скрипт
php /etc/ardulcd.php
Перезагружаем комп и любуемся проделаной работой.
Веб-интерфейс
С его помощью будем управлять экранчиком.
Скачиваем архив и распаковываем его в корневую папку сервера (скорее всего это /var/www/) чтоб получилось так /var/www/lcd/
Открываем раннее созданый файл ardulcd.php
sudo nano /etc/ardulcd.php
Всё удаляем и вставляем это:
<?php
$sec = 3; // на случай, если не прочитается файл настроек (lcd.conf)
$psa = 1;
$upt = 1;
$fre = 1;
$sens = 1;
$fphd = 1;
$dfh = 1;
$unam = 1;
$ifcon = 1;
$fplcd=fopen('/var/www/lcd/lcd.conf', 'r'); // читаем файл настроек. Обратите внимание на путь к файлу.
$dannie = fgets($fplcd); // прочли строку
fclose($fplcd); // закрыли файл
list($sec, $psa, $upt, $fre, $sens, $fphd, $dfh, $unam, $ifcon) = explode(",", $dannie); //разобрали строку и засунули в переменные
$i = 1;
$fp = fopen("/dev/ttyUSB0", "w+"); // открываем USB-устройство (ардуина)
while ($i == 1)
{
if($psa == 1) // Если получена 1, то выводим этот блок, а если 0, то не выводим и так для всех блоков
{
$psaux = exec("ps aux | awk '{s += $3} END {print s}'"); // получаем загрузку cpu "ps aux"
fwrite($fp, "CPU Load".",".$psaux." %"."\n"); //запись в ардуину
sleep($sec); // пауза для показа
}
if($upt == 1)
{
$uptime = shell_exec("uptime"); // получаем "uptime"
list($ut0, $ut1, $ut2, $ut3) = explode(",", $uptime); //разбор строки полученой от "uptime"
list($prob0, $prob1, $prob2, $prob3, $prob4) = explode(" ", $ut0); //разбор первой части строки полученой от "uptime"
fwrite($fp, "Time ".$prob1.","." ".$prob3." Days".$ut1."\n"); //запись в ардуину
sleep($sec); // пауза для показа
}
if($fre == 1)
{
$free = shell_exec("free | grep Mem"); // получаем объём свободной памяти от "free"
list($fr0, $fr1, $fr2) = preg_split("/[\s]+/", $free); //разбор строки с неопределённым количеством пробелов, полученой от "free"
fwrite($fp, "Used Memory".",".$fr2."\n"); //запись в ардуину значения "used"
sleep($sec); // пауза для показа
}
if($sens == 1)
{
$cp = shell_exec("sensors -A"); // получаем температуру первого процессора от "sensors"
list($cps0, $cps1, $cps2, $cps3, $cps4) = preg_split("/[\s.]+/", $cp); //разбор строки с неопределённым количеством пробелов и точек, полученой от "sensors"
fwrite($fp, "CPU Temp".",".$cps3." C"."\n"); //запись в ардуину значения
sleep($sec); // пауза для показа
}
if($sens == 1)
{
$cp = shell_exec("sensors -A"); // получаем температуру первого процессора от "sensors"
list($cps0, $cps1, $cps2, $cps3, $cps4) = preg_split("/[\s.]+/", $cp); //разбор строки с неопределённым количеством пробелов и точек, полученой от "sensors"
fwrite($fp, "CPU Temp".",".$cps3." C"."\n"); //запись в ардуину значения
sleep($sec); // пауза для показа
}
if($fphd == 1)
{
$fphdd = fsockopen("localhost", 7634, $errno, $errstr, 1); // открываем порт от "hddtemp"
$buffhdd = fgets($fphdd); // получаем строку с данными
fclose($fphdd); // закрываем порт "hddtemp"
list($hd0, $hd1, $hd2, $hd3) = explode("|", $buffhdd); //разбор строки полученой от "hddtemp"
fwrite($fp, "HDD Temp".",".$hd3." C"."\n"); //запись в ардуину температуры первого винчестера
sleep($sec);
}
if($dfh == 1)
{
$df = shell_exec("df -h"); // получаем размер дискового пространства
list($df0, $df1, $df2, $df3, $df4, $df5, $df6, $df7, $df8, $df9, $df10, $df11, $df12) = preg_split("/[\s.]+/", $df); //разбор строки с неопределённым количеством пробелов, полученой от "df -h"
fwrite($fp, "HDD".",".$df8." ".$df10."\n"); //запись в ардуину значения (первое - общий размер, второе - использовано)
sleep($sec); // пауза для показа
}
if($unam == 1)
{
$uname = shell_exec("uname -a"); // uname -a Будет выводится версия ядра
list($uname0, $uname1, $uname2, $uname3) = preg_split("/[\s]+/", $uname); //разбор строки по пробелам неопределённого количества, полученой от "uname -a"
fwrite($fp, "Core info".",".$uname2."\n"); //запись в ардуину
sleep($sec); // пауза для показа
}
if($ifcon == 1)
{
$ifconfig = shell_exec("ifconfig"); // ifconfig
list($ifconfig0, $ifconfig1, $ifconfig2, $ifconfig3, $ifconfig4, $ifconfig5, $ifconfig6) = preg_split("/[\s]+/", $ifconfig); //разбор строки с неопределённым количеством пробелов, полученой от "ifconfig"
list($ifcon0, $ifcon1) = explode(":", $ifconfig6);
fwrite($fp, "IP-address".",".$ifcon1."\n"); //запись в ардуину
sleep($sec); // пауза для показа
}
}
?>
Сохраняем...
Перегружаем компьютер и заходим по адресу ваш сайт/lcd
Должно получится так...
Кнопки вниз-вверх уменьшают-увеличивают интервал времени показа на одну секуну.
Нажимая на тот или иной пункт, активируется (зелёный цвет) или деактивируется (красный цвет) показ его на дисплее и меняется цвет надписи.
Работает следующим образом:
При старте, файл ardulcd.php считывает настройки из lcd.conf.
Когда открывается веб-интерфес, html-файл через ajax-запрос (страничка не перегружается) обращается к файлу lcd.php, который в свою очередь обращается к lcd.conf.
Нажатия в веб-интерфейсе изменяют настройки в lcd.conf, которые вступают в силу после перезагруки.
Файл lcd.conf представляет из себя строку с цифрами, первая цифра — это интервал в секундах, а последующие — это единицы (вкл) и нули (откл), включающие-отключающие блоки в ardulcd.php
На этом пожалуй всё… Надеюсь что у Вас всё получилось
Вот тут можно посмотреть онлаин...
Телеграм-чат istarik
- +872
- stD
16530
Поддержать автора
Комментарии (1)