Мониторинг параметров компьютера на ардуино
Мониторинг параметров компьютера на Arduino
Недавно на http://cxem.net обнаружил интересную статью, в которой описывалось создание устройства для мониторинга параметров ПК. Сразу захотелось что-то подобное. Но так как опыта программирования PIC контроллеров у меня маловато, зато имеется Arduino, решил собирать на нем.
Основа устройства – Freeduino, в качестве индикатора применен LCD (16х2) дисплей с контроллером H44780 на борту, для подачи звукового сигнала использован пьезоэлектрический капсуль, снятый с китайского мультиметра. Связь полученного устройства и ПК осуществляется посредством USB.
Фото «готового» устройства:
Вот полный список деталей для сборки:
– Arduino Uno, Freeduino и т. п.
– LCD дисплей с контроллером H44780
– Пьезоэлектрический излучатель (подойдет любой, даже тот, что используется в китайских игрушках)
– Резистор 10-30 Ом
– Подстроечный резистор 10кОм
Соединяем детали по такой схеме:
Загружаем в Arduino скетч под названием “Lcd_Ram.ino” (лежит в прикрепленном к статье архиве), подключаем к ПК через кабель USB.
На дисплее устройства должна появиться такая картинка:
Если картинка не появилась, то существует четыре причины:
1) Нет питания (поврежден USB шнур);
2) Поврежден шлейф LCD (дисплей не прошел инициализацию);
3)Неисправен Arduino;
4) Недостаточная контрастность дисплея (эта причина устраняется путем изменения сопротивления подстроечного резистора);
Данное устройство способно выводить на LCD информацию о загрузке оперативной памяти и процессора (больше не позволил размер самого LCD).
Если оперативная память загружена более чем на 70%, то устройство будет подавать звуковой сигнал, а на LCD будет выводиться такой значок:
Подача звукового сигнала может выключаться из программы на Windows. Если звук включен, то на LCD выводится иконка:
Но так как просто взять и считать значения таких параметров как процент загрузки ЦП и оперативной памяти с USB порта нельзя, то мной была написана программа для «отлова» этих значений и последующей передачи их в порт.
Главное окно данной программы:
Так же в программе есть возможность установить ее в автозагрузку Windows. Причем она будет запускаться автоматически только на той учетной записи, на которой вы выполнили установку в автозапуск.
Удачи в сборке, всем пожеланиям и замечаниям буду только рад!
Система мониторинга и записи сигналов для Arduino и не только
Всем привет. Еще одна попытка сделать нормальную систему для отображения графика значений данных.
Представляю свою разработку — ПО «SVisual» — мониторинг сигналов онлайн и запись архива на диск. Смотреть/записывать можно любые сигналы, не только с ардуино.
Идея начала витать лет 7 назад, когда еще занимался автоматизацией. Силы появились как в разработку на высоком ушел.
Проекту год с лишним. Писалось все по ходу дела и наличию времени, сначала монолит — сервер и только просмотр, потом архив, монитор… Так до ардуинки добрался.
Хотел копейку с этого дела поиметь сначала, но продвижение другая тема совсем, да и до продукта, за который не стыдно что-то брать, далеко. Поэтому решил сделать вклад в opensrc, чуть-чуть хотя бы рассчитаться.
ПО частично кросплатформенное — Windows и Linux (CentOS). Написано все на С++, визуализация на Qt. Интерфейс и мануал на русском. На английский начал переводить, да…
Система SVisual состоит из трех частей:
Возможности SVMonitor:
— подключение к МК по COM порту (usb для arduino), по сети Ethernet или Wi-Fi протокол TCP;
— опрос значений сигналов в реальном времени с частотой от 100 Гц (вниз, те 100 Гц — максимум, по умолчанию 10Гц), количество устройств и сигналов выбирается пользователем;
— допустимое количество сигналов для записи 2048, кол-во модулей 8 (при превышении ничего страшного не произойдет, будет только предупреждение, запас предусмотрен);
— вывод значений выбранных сигналов на экран монитора в реальном времени;
— запись архива сигналов на жесткий диск ПК;
— просмотр архива с помощью дополнительного ПО SVViewer;
— возможность установки оповещений о возникшем событии (триггеров), запуск пользовательского процесса при срабатывании триггера;
— добавление сигнала для просмотра/записи только клиентом, никаких дополнительные движений не требуются.
Архитектура ПО
Здесь в принципе думаю все понятно. Пару слов скажу.
Клиенты передают данные на монитор, монитор передает в сервер обработки данных (SVServer.dll). Сервер занимается буферизацией, записью на диск, обработкой триггеров — пользовательских меток. Внутри все асинхронно.
Данные на диск попадают каждые 10 минут, сжимаются с помощью zlib. Архивные файлы получаются в часах, по умолчанию 2 часа файл.
Сервер обработки данных может использоваться независимо от монитора, например, чисто как сервис для записи архива.
Бюджетный мониторинг температуры: Arduino + Zabbix
У нас в организации развёрнут сервер Zabbix для мониторинга работоспособности серверов и АРМов. Из-за особенностей техпроцесса оборудование «размазано» по нескольким помещениям и разнесено по территории предприятия. Естественно, вместе с основными параметрами компьютеров (работает/не работает) хочется контролировать и микроклимат в серверных. При этом, как обычно, возможности весьма ограничены, и «выбить» значительные средства на сложные системы мониторинга температуры (к ним я отношу и платы управления с термодатчиками для стоечных ИБП APC) — это отдельный квест.
В основной серверной всё просто — установлена одна такая плата (закуплена давным-давно предшественником вместе с основным оборудованием), воткнут APC-шный термодатчик, заведён агент в Заббиксе, всё работает по SNMP. Скучно 🙂 На мониторинг удалённой аппаратной оборудования нет, средств тоже — см. выше. Поэтому было решено проявить смекалку, сэкономить бюджет и заодно прокачать новый навык путём конструирования простого и дешёвого «наколенного» решения, вписывающегося, тем не менее, в существующую инфраструктуру мониторинга Zabbix.
Необходимые компоненты:
Сборка устройства не составляет труда. Сетевой модуль надевается на основную плату «бутербродом», термодатчик припаивается к его пинам. Подключение датчика: красный +5 В, чёрный — земля, жёлтый — данные; между +5V и Data припаиваем подтягивающий резистор 4,7 кОм.
Пин для данных выбирается с учётом пинов, используемых сетевым модулем (D10 – SS; D11 – MOSI; D12 – MISO; D13 – SCK; D2 – IRQ).
Грабли: в прототипе устройства столкнулся с конфликтом — данные о температуре выдавались случайным образом, «через два на третий». Причиной оказалось то, что я прицепил термодатчик на пин 2, который, как потом нашёл на просторах интернета, используется сетевым модулем для генерации прерывания при поступлении пакета. Переставил на 4-й — заработало как часы.
После сборки аппаратной части переходим к программной.
Устройство будет работать в сети и притворяться заббикс-агентом, для этого ему нужен MAC и IP-адрес. Решаем, как удобнее — жёстко зашить при программировании, генерировать MAC из адреса температурного датчика и получать IP по DHCP, и т.д. Я пошёл по простейшему пути и захардкодил оба параметра.
Протокол обмена с заббикс-сервером описан в документации. Наше устройство будет откликаться на две команды — agent.ping и env.temp (здесь оставлен простор для дальнейшего творчества, можно привязать любой из модулей расширения, доступных для ардуино — хоть датчик влажности, хоть освещённости — да что душе угодно). На все остальные команды оно будет ругаться отвечать стандартным ответом, понятным заббикс-серверу.
Для тех, кто начинает с нуля (как я) — программирование Arduino выполняется с помощью Arduino IDE, установка и настройка которой элементарны. Для работы компонентов необходимы библиотеки UIPEthernet и OneWire, которые устанавливаются и подключаются к проекту через меню Скетч — Подключить библиотеку — Управлять библиотеками…
Если у вас будут другие компоненты (например, сетевой модуль не на enc28j60, а на другом чипе) — понадобятся и другие библиотеки!
Код работы с сетевым модулем и с датчиком температуры — типовой, из интернета, с некоторыми допущениями и упрощениями.
После заливки кода в контроллер и подключения ethernet-кабеля проверяем из консоли:
Грабли: выложенная на zabbix.com скомпилированная версия zabbix_get для Windows устарела и использует другой протокол (с заголовком ZBXD\x01 в запросе сервера). Линуксовая версия актуальна и протокол соответствует приведенному коду.
Всё работает, как и задумано. В админке заббикса создаём новый хост с выбранным IP, в нём — два ключа, Numeric (unsigned) agent.ping и Numeric (float) env.temp, наслаждаемся работой. Графики, триггеры — всё как обычно.
Питание устройства — через родной USB. Корпус — по желанию: подходящая пластиковая коробочка, термоусадка, синяя изолента.
Разрешение датчика — примерно 0.06 (точнее, 1/16) °С, точность — при погружении в таящий снег показал 0.19 °С (может, опустился бы и ниже, но снега было мало и он весь быстро растаял). Считаю, для устройства стоимостью 10 долларов и описанных целей — более чем достаточно.
Монитор порта, отладка
Как мы с вами знаем из урока “О платформе“, на платах Ардуино стоит USB-TTL конвертер, позволяющий микроконтроллеру в текстовом режиме “консоли” общаться с компьютером по последовательному интерфейсу, Serial. На компьютере создаётся виртуальный COM порт, к которому можно подключиться при помощи программ-терминалов порта, и принимать-отправлять текстовые данные. Через этот же порт загружается прошивка, т.к. поддержка Serial является встроенной в микроконтроллер на “железном” уровне, и USB-TTL преобразователь подключен именно к этим выводам микроконтроллера. На плате Arduino Nano это кстати пины D0 и D1.
К этим же пинам можно подключаться при помощи отдельных плат “программаторов”, например на чипах CP2102 или том же CH340 с целью загрузки прошивки или просто общения с платой. В самой Arduino IDE тоже есть встроенная “консоль” – монитор порта, кнопка с иконкой лупы в правом верхнем углу программы. Нажав на эту кнопку мы откроем сам монитор порта, в котором будут настройки:
Если с отправкой, автопрокруткой, отметками времени и кнопкой “очистить вывод” всё понятно, то конец строки и скорость мы рассмотрим подробнее:
Объект Serial
Запустить связь по Serial на скорости speed (baud rate, бит в секунду). Скорость можно поставить любую, но есть несколько “стандартных”. Список скоростей для монитора порта Arduino IDE:
Отправляет в порт значение val – число или строку. В отличие от write выводит именно символы, т.е. отправив 88 вы получите 88: Serial.print(88); выведет 88. Также метод print/println имеет несколько настроек для разных данных, что делает его очень удобным инструментом отладки:
format позволяет настраивать вывод данных: BIN, OCT, DEC, HEX выведут число в соответствующей системе исчисления, а цифра после вывода float позволяет настраивать выводимое количество знаков после точки
Читает данные из буфера и ищет набор символов target (тип char), опционально можно указать длину length. Возвращает true, если находит указанные символы. Ожидает передачу по таймауту
Плоттер
Помимо монитора последовательного порта, в Arduino IDE есть плоттер – построитель графиков в реальном времени по данным из последовательного порта. Достаточно отправить значение при помощи команды Serial.println(значение) и открыть плоттер по последовательному соединению, например построим график значения с аналогового пина A0:

Вывод значений происходит каждые 10 миллисекунд, а каждые 300 миллисекунд значения обновляются. Получаем вот такой график: 
Использование пинов
Как я писал выше, аппаратный Serial имеет выводы на ноги микроконтроллера, для Nano/Uno/Mini это выводы D0 и D1. Можно ли работать с этими пинами, как с обычными цифровыми пинами? При отключенном Serial – можно, при включенном – нет. После вызова Serial.begin() ноги перестают функционировать как цифровые пины в ручном режиме, но после вызова Serial.end() можно снова ими пользоваться!
Отправка и парсинг
Рассмотрим самый классический пример для всех языков программирования: Hello World! 
Вывод: 0 50 68 85 15 214 63 254 – элементы массива, разделённые пробелами! Проблемы возникают при попытке принять данные в порт. Дело в том, что метод read() читает один символ, даже если вы отправите длинное число – программа получит его по одной цифре, и составлять число из цифр придётся вручную. Проблема усугубляется тем, что read() читает именно символ, то есть код символа в таблице ASCII. 
Так как же принять именно цифру? Есть хитрость – вычитать из полученного кода символа код цифры 0, либо сам 0 в виде символа: ‘0’
Также для принятия одиночных чисел у нас есть готовый метод – parseInt() / parseFloat() – для целочисленных и рациональных чисел соответственно. Процесс приёма и расшифровки данных называется парсинг (parsing). Давайте примем в порт число 1234, используя готовый метод парсинга.
Теперь после отправки цифры программа будет ждать всего 50 мс, и сразу же вам ответит. Остальные алгоритмы отправки и парсинга, в том числе обмена разнотипными данными между Ардуинами и другими платами смотри в уроке общение по Serial.
Управляющие символы
Существуют так называемые управляющие символы, позволяющие форматировать вывод. Их около десятка, но вот самые полезные из них
Также если для вывода вы захотите использовать одинарные ‘ или двойные кавычки, “ или обратный слэш \ – нужно выводить их при помощи соответствующего спецсимвола, иначе ваш вывод “поломается”, я думаю, не нужно объяснять, почему:
Как использовать? Просто писать в вывод. Например комбинация \r\n переведёт строку и вернёт курсор в левое положение:
Результат скопируем и вставим в excel 
Видео
Arduino.ru
Мониторинг железа ПК
Здравствуйте. На просторах интернета наткнулся на один проект который меня заинтересовал.https://alexgyver.ru/pcdisplay/
Но так как в проекте много(по моему мнению) лишних функций, хотелось бы его доработать и добавить, то что действительно полезно. Из проекта хотелось бы оставить мониторинг показателей ПК (показатели загруженности и температуры ПК “проц, мать, видюха, оперативка, HDD темпетура” это 1-я и 2-я страница вывода на дисплей). А все графики и внешние датчики с реобасом и лентой убрать из кода. Добавть 4 RGB светодиода с адресной ленты на 5В(просто есть в наличии) и запитать все от ардуинки (если это возможно), сделать настройку яркости светодидов, что бы не слепили. https://ru.aliexpress.com/item/1m-4m-5m-WS2812B-Smart-led-pixel-strip-Black-White-PCB-30-60-144-leds-m/2036819167.html?spm=a2g0s.9042311.0.0.274233edZJCw85
Свеотодиоды должны менять свой цвет при определенной температуре показателей, например проц до 50 градусов зеленый, от 51-80 желтый, 81-100 красный. Каждый светодиод реагирует на свою температуру(один на проц, один на мать и т.д.).
Я в программировании полный ноль, вот и подумал, может мне кто нибудь из программистов “с большими я..цами” согласится помочь полному “нубу”.
Ни разу по Дискавери не видел, чтобы кто-то с большими яйцами помогал нубам. Нет таких законов в природе.
Всем спасибо за комменты, буду пробовать сам разбираться в коде, как будет время. Моможет что нибудь и наколдую. Постараюсь оставить первые 2 экрана вывода на дисплей и если повезет приляпаю светодиды. В коде есть уже управление светодиодами, только они подъвязаны к внешним датчикам. Если получиться определить в какой переменной храниться температура проца, видюхи, жесткого и матери, то думаю смогу и сам поменять.











