Подключение LCD-дисплея к серверу с помощью Arduino

lcd к Ардуино



Как известно, у сервера обычно нет монитора, но иногда возникает необходимость оперативно получить информацию о его состоянии — температуру, загрузку и т.д.

В этой статье, рассказано как подключить lcd к Ардуино, как вывести на него информацию о сервере и как управлять этим всем через Веб-интерфейс.


На дисплей будут поочерёдно, с задержкой в 3 сек выводится данные о Загрузке процессораВремени работы компьютераСвободной памятиТемпературе процессораТемпературе hddСвободного места на hddВерсии ядраIP-адресе



Подключение LCD


Всё что потребуется — это собственно сама ардуина и любой LCD-дисплей (на контроллере HD44780). Я выбрал двустрочный, чтоб он поместился в заглушке ячейки для cdromа.

LCD-дисплей



Отверстие прорезается (любыми подручными средствами) таким образом, чтоб дисплей входил туда с усилием. Это избавит Вас от возни с крепежом.

И паяем гребёнку…





Подключаем дисплей к ардуине как нарисовано на схеме:


Потенциометр (переменный резистор) подойдёт любой, в диапазоне от 5 до 20кОм, он отвечает за контраст дисплея. Если такового нет, то можно просто прижать жёлтый провод к «земле».
15 и 16 — контакты отечают за подсветку, их можно не подключать.



Теперь проверим работу. Откройте в Arduino IDE пункт меню FileExamplesLiquidCrystalHelloWorld или просто используйте код приведённый ниже:


// Подключается библиотека для работы  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

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



Перезагружаем комп и любуемся проделаной работой.

Загрузка cpu









Веб-интерфейс


Веб-интерфейс для Ардуины

С его помощью будем управлять экранчиком.


Скачиваем архив и распаковываем его в корневую папку сервера (скорее всего это /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
  • 16016
Поддержать автора


Telegram-чат istarik

Задать вопрос по статье
Telegram-канал istarik

Известит Вас о новых публикациях






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

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