Сообщество - Arduino & Pi
Добавить пост

Arduino & Pi

1 378 постов 20 573 подписчика

Популярные теги в сообществе:

Создание автоматического долива воды в чайник — своими руками

Создание автоматического долива воды в чайник — своими руками Arduino, Своими руками, Самоделки, Электроника, Чайник, Эксперимент, Длиннопост

Во время наших ежедневных утренних ритуалов часто возникает момент, когда нужно включить кофемашину или чайник, и если не повезет, то можно услышать их молчаливую просьбу: «Пожалуйста, добавьте воды» И Вам приходится искать подходящую емкость, терпеливо ждать, пока она заполнится водой из фильтра, а потом аккуратно переливать воду из емкости в чайник, рискуя при этом разлить ее. Знакомая вам ситуация?

Большинство из нас уже привыкли к этому рутинному процессу, повторяя его каждое утро. Но я решил, что пришло время избавиться от этого безобразия и начал обдумывать безопасные способы автоматического долива воды.
После некоторых размышлений я пришел к выводу, что можно создать надежную и безопасную систему автодолива, используя мембранный электромагнитный клапан и в качестве дублирующей защиты поплавковый запорный механиз.

Видео

Для тех, кто не хочет погружаться в технические подробности, описанные в этой статье, могут посмотреть видео, где показана подробная работа моего устройства.

Водопровод

Наибольшие опасения у меня вызывала необходимость прокладывать водопровод к чайнику. Однако, когда я в очередной раз менял фильтры для воды, я осознал, что нет необходимости прокладывать масивную полипропиленовую трубу. Вместо этого можно использовать тонкую и гибкую трубку, которую можно легко спрятать за кухонной мебелью и которая почти не отличается от обычного электрического провода. Эта трубка надежная легко монтируется и не занимает много места. Для ее соединения я использовал проверенные временем быстросъемные соединители John Guest, которые позволяют соединять трубу без необходимости пайки или сварки. К ним можно подобрать большое количество различных фитингов.

Создание автоматического долива воды в чайник — своими руками Arduino, Своими руками, Самоделки, Электроника, Чайник, Эксперимент, Длиннопост

Чайник

Система долива воды без проблем работает с кофемашинами, увлажнителями и аквариумами. Однако, с чайниками с прямым нагревом воды ситуация сложнее. Поплавковый клапан, в котором будет постоянно подвергаться воздействию кипящей воды, скорее всего, быстро выйдет из строя. Я не проводил экспериментов в этом направлении и не могу, что-то утверждать.
У меня чайник с проточным нагревателем, который нагревает только необходимое количество воды. Такой чайник имеет ряд преимуществ: он экономичен, так как не нужно каждый раз кипятить всю воду и ждать несколько минут, чтобы выпить чашку чая, исключает многократное кипячение одной и той же воды и уменьшает вероятность опрокидывания чайника с кипятком.

Я все еще удивлен, почему его продавцы называют его термопотом? Это определенно не термопот. В термопоте сначала кипятится весь объем воды, а потом весь день поддерживается ее температура, тратя на это электроэнергию 30-70 Ватт в час.
Я бы назвал его чайником с проточным нагревом, но это звучит слишком сложно для среднестатистического человека. Возможно бы ему подошло название «Экочайник», но я не занимаюсь их продажей или производством, так что пусть они сами разбираются, как его правильно называть.

Создание автоматического долива воды в чайник — своими руками Arduino, Своими руками, Самоделки, Электроника, Чайник, Эксперимент, Длиннопост

Встроенный датчик уровня воды

Датчик нижнего уровня воды в чайнике, подобно многим бытовым приборам, включает в себя геркон и поплавок с магнитом.

Создание автоматического долива воды в чайник — своими руками Arduino, Своими руками, Самоделки, Электроника, Чайник, Эксперимент, Длиннопост

Магнит, интегрированный в поплавок, опускается вместе с уровнем воды. Когда магнитное поле достигает контактов геркона, они замыкаются, отправляя сигнал микроконтроллеру о том, что вода закончилась.

Создание автоматического долива воды в чайник — своими руками Arduino, Своими руками, Самоделки, Электроника, Чайник, Эксперимент, Длиннопост

Датчик минимального уровня соединен одним контактом геркона с GND, а другим — с микроконтроллером чайника и подключен через подтягивающий резистор к 5 В. Для соединения с Ардуино требуется лишь два провода. Однако, поскольку я для Arduino использую встроен

Создание автоматического долива воды в чайник — своими руками Arduino, Своими руками, Самоделки, Электроника, Чайник, Эксперимент, Длиннопост

Поплавковый клапан

Я приобрел поплавковый клапан, разработанный для поддержания уровня воды в аквариуме. Механизм его работы аналогичен работе клапана в туалетном бачке.

Создание автоматического долива воды в чайник — своими руками Arduino, Своими руками, Самоделки, Электроника, Чайник, Эксперимент, Длиннопост

Заполнение емкости продолжается до тех пор, пока поплавок, поднимаемый водой, не перекроет поток воды. Когда уровень воды понижается, устройство автоматически открывается.

Электромагнитный клапан

Электромагнитный клапан должен быть закрытым в неактивном состоянии. Я заказал модель на 12 В, но продавец отправил мне версию на 24 В. Чтобы избежать долгого ожидания нового клапана, я нашел для него у себя в запасах блок питания на 24 В. Так же возможно использование повышающего преобразователя XL6009, но в моем случае он был бы избыточным.

Ток потребления электромагнитного клапана в открытом состоянии составляет 200 мА.

Создание автоматического долива воды в чайник — своими руками Arduino, Своими руками, Самоделки, Электроника, Чайник, Эксперимент, Длиннопост

Механизм работы электромагнитного клапана усиливает уверенность в безопасности системы автоматического долива воды. Он почти всегда находится в закрытом положении и открыть его намного труднее, чем закрыть. Электромагнитное поле — единственное, что может открыть клапан, и никакие другие средства не могут этого сделать. Я попытался открыть его с помощью обычного неодимового магнита, но это мне не удалось.

Как это работает? На схеме изображено, что вода, поступающая через маленькое отверстие в диафрагме, оказывает давление на диафрагму сверху, прижимая резиновое кольцо запорного клапана к проходному отверстию. Чем выше давление воды, тем сильнее прижимается клапан. Если давление в водопроводе снижается, то на диафрагму также давит пружина сверху, и нет причин для беспокойства. Однако, если электромагнит поднимет подпружиненный стержень и откроет маленький обратный клапан в центре диафрагмы, то вода начнет вытекать через это отверстие, давление на диафрагму уменьшится, и она поднимется вверх, открывая проходное отверстие для воды.

Создание автоматического долива воды в чайник — своими руками Arduino, Своими руками, Самоделки, Электроника, Чайник, Эксперимент, Длиннопост

Источник питания для электроклапана

Поскольку я получил ЭМ-клапан на 24 В, то я нашел в своих запасах блок питания от старого настольного светильника, который подходит мне по напряжению и току. Ток, который он выдает, превышает максимальный ток нагрузки, которая будет подключена к нему, более чем в два раза, что очень благоприятно для надежности и долговечности. Более того, большую часть времени блок питания будет находиться в состоянии покоя, поскольку добавление воды не происходит слишком часто.

Создание автоматического долива воды в чайник — своими руками Arduino, Своими руками, Самоделки, Электроника, Чайник, Эксперимент, Длиннопост

Микроконтроллер

Я выбрал для использования Arduino Pro Mini, потому что у меня их много и я доверяю микроконтроллерам больше, чем дискретной логике. В микроконтроллере можно включить режим WDT (Watchdog Timer), который в случае любой непредвиденной ситуации немедленно восстановит его работу из зависшего состояния.
Конечно для такой простой задачи, можно было бы использовать и Attiny, но, как я уже упоминал, у меня есть много Arduino, и было бы неразумно их не использовать.

Создание автоматического долива воды в чайник — своими руками Arduino, Своими руками, Самоделки, Электроника, Чайник, Эксперимент, Длиннопост

Многие новички боятся прошивать Arduino Pro Mini из-за отсутствия в ней USB-UART моста. Но хочу вас успокоить, если использовать USB-TTL мост FTDI FT232, то даже соединительные провода не понадобятся. Просто соедините две платы, как показано на изображении. Чтобы обеспечить надежный контакт, немного придавите их друг к другу и нажмите кнопку «Прошить» в Arduino IDE. Это все, ничего сложного.

Создание автоматического долива воды в чайник — своими руками Arduino, Своими руками, Самоделки, Электроника, Чайник, Эксперимент, Длиннопост

Алгоритм работы автодолива

Основные шаги работы можно представить следующим образом:
Вода подключается через тройник к выходу водоочистного фильтра с использованием трубки диаметром 1/4". Эта трубка протягивается к чайнику и подключается к электромагнитному клапану.
Когда штатный датчик минимального уровня воды сигнализирует о необходимости долить воду, электромагнитный клапан открывается. Важно, чтобы он открылся на время, достаточное для долива половины объема емкости чайника. Это предотвращает случайный перелив и исключает необходимость использования датчика максимального уровня воды.
Если электромагнитный клапан не сработал или не закрылся, в системе предусмотрено механическое запирание воды с помощью поплавкового клапана. Это обеспечивает дополнительную защиту от протечек.
Также, чтобы обеспечить безопасность, долив воды осуществляется только в присутствии человека. Для определения наличия человека можно использовать датчик наличия воды. Если в чайнике вода заканчивается, то это происходит из-за того, что кто-то хочет выпить чай, и система будет оповещена о необходимости долить воду.
Для обеспечения дополнительной защиты, можно так же установить датчик протечки воды с управляемым электромеханическим клапаном на водопроводной трубе. В случае обнаружения протечки, датчик отправит сигнал электромагнитному клапану для перекрытия водопровода. Однако, учитывая надежную защиту чайника, использование этого датчика может быть необязательным.

Таким образом, можно использовать 5 степеней защиты:
1. Электромагнитный клапан.
2. Уменьшенный в 2 раза объем долива воды.
3. Механический, поплавковый запорный клапан.
4. Присутствие человека при срабатывании долива воды.
5. Датчик протечки воды с исполнительным клапаном на стояке.

Если сопоставить безопасность с другими массово производимыми бытовыми устройствами, то я могу привести свой собственный опыт с ПММ. В посудомоечной машине основная защита зависит от единственного электромагнитного клапана. Если он заклинил или не закрылся из-за заедания реле, пробоя симистора или куска ржавчины из водопровода, то риск затопления становится высоким. У меня был эпизод, когда ПММ затопила кухню, так как не сработал датчик уровня воды (прессостат), а затем и аварийный датчик в дренажном поддоне. Пенопластовый поплавок просто прилип к поддону и не смог оторваться от него под воздействием воды. В результате, контакты остались разомкнутыми, и входной клапан продолжал лить воду. К счастью, у меня был установлен датчик протечки воды, который сработал вовремя, иначе было бы невозможно избежать серьезных проблем.

Создание автоматического долива воды в чайник — своими руками Arduino, Своими руками, Самоделки, Электроника, Чайник, Эксперимент, Длиннопост

Схема

Я осознаю, что задача достаточно простая и можно было бы использовать схему одновибратора на микросхеме NE555, модифицировав реле с таймером под эти нужды. Однако, для меня более простым и экономичным вариантом было использование Arduino Pro mini. Во-первых, у меня их достаточно много. Во-вторых, мне не нужно будет ничего сверлить, травить или переделывать.

Так как питание микроконтроллера Arduino будет происходить от встроенного в чайник стандартного линейного стабилизатора, идеи о Wi-Fi отпали сами собой. Впрочем, эти функции не особо нужны, я планирую использовать их в следующем проекте при модернизации кофемашины. Для снижения нагрузки на уже загруженный штатный линейный стабилизатор, я удалил светодиод «Power» с Ардуино и программно перевожу контроллер в спящий режим. В этом режиме он потребляет всего 2 мА и почти не влияет на общее потребление тока заводских плат в чайнике.

Керамический конденсатор 0,22 мкФ защищает не только от дребезга контактов геркона, но и от ложных срабатываний, поскольку помехи от мотора помпы слегка зашумляют линию питания. Конечно, можно было бы установить LC фильтр питания, но, как показывает практика, все работает отлично и без него.

Диод 1N4007 защищает от выбросов ЭДС самоиндукции электромагнитного клапана.

Резистор 10 кОм, подключенный к GND и базе транзистора, блокирует транзистор, на случай, когда в спящем режиме вывод микроконтроллера находится в третьем состоянии и любая мощная электромагнитная помеха может его открыть.

Резистор 1 кОм защищает управляющий выход микроконтроллера.

Транзистор КТ972 работает в режиме ключа и управляет электромагнитным клапаном.

Создание автоматического долива воды в чайник — своими руками Arduino, Своими руками, Самоделки, Электроника, Чайник, Эксперимент, Длиннопост

Реализация

Прокладываю трубку в пустых пространствах за кухонной мебелью. Со стороны фильтра для воды подсоединяю тройник: одним концом к фильтру, вторым — к крану для питьевой воды и третьим — к трубке, которая ведет к чайнику. Для большей надежности устанавливаю кран для ручного перекрытия подачи воды.

К чайнику прикрепляю коробку с электроклапаном и подсоединяю к нему вход и выход воды.

Создание автоматического долива воды в чайник — своими руками Arduino, Своими руками, Самоделки, Электроника, Чайник, Эксперимент, Длиннопост

Поплавковый клапан устанавливаю в заводское отверстие, предназначенное для перелива излишков воды, которое должно было бы обеспечивать его защиту от залития электроники.

Внутри корпуса чайника достаточно места. Я без труда размещаю в нем источник питания 24В для электромагнитного клапана. Там же находит свое место и микроконтроллер Arduino pro mini.

Создание автоматического долива воды в чайник — своими руками Arduino, Своими руками, Самоделки, Электроника, Чайник, Эксперимент, Длиннопост

Код для Ардуино

Я представляю два скетча. Первый является более надежным, так как в нем постоянно активен WDT, но, к сожалению, при этом Arduino потребляет 15 мА, так как работает без перехода в спящий режим. Учитывая, что я использую уже достаточно загруженный встроенный в чайник стабилизатор, для меня важно не перегружать его и по этому я использую другой скетч.

#include <avr/wdt.h>

#define valve 3 // выход управления электроклапаном

#define INT0_PIN 2 // вход прерывания INT0

#define interval 10000 // Интервал времени долива в ms (рассчитывается опытным путем)

void setup()

{

wdt_enable(WDTO_4S); // включаем WDT

pinMode (valve, INPUT); // На всякий случай для безопасности отключаем управление электроклапаном.

pinMode (INT0_PIN, INPUT_PULLUP); // Подтягиваем вход INT0 внутренним резистором

attachInterrupt(INT0, myISR, FALLING); // Настраиваем прерывание на срабатывание при смене значения с HIGH на LOW (FALLING)

}

void loop()

{

wdt_reset(); // кормим собаку

}

void myISR() // Обработчик внешнего прерывания INT0

{

detachInterrupt(INT0); // запрещаем обработку внешнего прерывания INT0 //*****************************

pinMode (valve, OUTPUT); // назначаем выход для управление электроклапаном

digitalWrite(valve, HIGH); // открываем клапан для долива воды

for(uint16_t i=0; i<interval; i++) // выдерживаем заданный интервал, для требуемого объема долива

{

delayMicroseconds(500); // примерно 1 ms

wdt_reset(); // кормим собаку

}

pinMode (valve, INPUT); // отключаем управление электроклапаном и переводим выход в 3-е состояние на всякий случай

//*****************************

attachInterrupt(INT0, myISR, FALLING); // Настраиваем прерывание на срабатывание при смене значения с HIGH на LOW (FALLING) }



Второй скетч является гибридным. Он использует два режима: WDT и Sleep. В коде перед переходом микроконтроллера в спящий режим отключается режим Watchdog Timer (WDT), и контроллер можно пробудить только изменением сигнала от встроенного магнитного датчика «Закончилась вода». После пробуждения контроллера в коде немедленно запускается WDT. Такой режим не представляет опасности при зависании из-за невозможности пробуждения, так как управляющий выход после каждого включения клапана перепрограммируется на вход, исключая его случайное включение от проходящих через него высокоэнергетических частиц, прилетевших из космоса.

#include <avr/sleep.h>

#include <avr/wdt.h>

#define valve 3 // выход управления электроклапаном

#define interval 10000 // Интервал времени долива в 1:10ms. Интервал рассчитывается опытным путем

#define int0_pin 2 // вход внешнего прерывания INT0

void setup()

{

wdt_enable(WDTO_4S); // включаем WDT с интервалом 4 сек

pinMode (valve, INPUT); // Для безопасности отключаем управление электроклапаном. pinMode (int0_pin, INPUT_PULLUP); // Подтягиваем вход INT0 внутренним резистором attachInterrupt(INT0, myISR, FALLING); // Настраиваем прерывание. Сработает при изменении сигнала на входе D2 с HIGH на LOW

}

void loop()

{

set_sleep_mode(SLEEP_MODE_PWR_DOWN); // SLEEP_MODE_PWR_DOWN - самый экономичный режим

sleep_enable(); // разрешить режим сна wdt_disable(); // отключаем WDT перед сном sleep_mode(); // Переводим МК в сон и ждем когда в чайнике закончится вода

}

void myISR() // Обработчик внешнего прерывания INT0

{

detachInterrupt(INT0); // запрещаем обработку внешнего прерывания

wdt_enable(WDTO_4S); // включаем WDT с интервалом 4 сек //***************************** pinMode (valve, OUTPUT); // Активируем вывод для управление электроклапаном digitalWrite(valve, HIGH); // открывем клапан для долива воды

for(uint16_t i=0; i<interval; i++) // выдерживаем заданный интервал, для требемого объема долива

{

delayMicroseconds(5000); // примерно 10 ms

wdt_reset(); // кормим собаку

}

pinMode (valve, INPUT); // отключаем управление электроклапаном (переводим пин в 3-е состояние)

//*****************************

attachInterrupt(INT0, myISR, FALLING); // Настраиваем прерывание 0 на срабатывание при смене значения с HIGH на LOW (FALLING) }

Заключение

На момент создания этого материала, моя семья и я уже более двух месяцев успешно использует этот самодельный девайс. За это время никаких проблем не возникло. Устройство работает безотказно. Даже когда мы уезжаем из дома на пару дней, я не беспокоюсь о перекрытии воды, полностью доверяя надежности системы. Теперь у нас больше нет споров и догадок о том, чья очередь наливать воду в чайник.

Сейчас я также переделываю кофемашину, чтобы проект был легко повторим. Я создал устройство без необходимости подключения к штатным платам аппарата. Это позволит подключить систему долива к ней без необходимости вскрытия.

Благодарю вас за то, что дочитали материал до конца! Я надеюсь, что эта статья была вам интересна и вы сможете применить мою DIY самоделку в своих проектах. Если у вас есть какие-либо вопросы, не стесняйтесь задать их в комментариях. Я с удовольствием на них отвечу.

Ссылка на оригинал статьи

Читайте также:

Переделываем настенное зеркало во многофункциональное устройство

Домофон, который знает, как вас зовут — своими руками

Открываем дверь домофона при помощи голосового ассистента

Ардуино робот играет музыку на винных бокалах

Беспроводная гирлянда на новогоднюю ёлку без батареек

Показать полностью 16

Пол – это лава

Тег [моё], т.к я полностью сам разработал, спаял и запрограммировал эту штуку, готов ответить на ваши вопросы.

А для тех, кому интересно последить за развитием проекта, оставлю ссылку на мой телеграм канал: Pixel Quest – канал о разработке. Пишу там исключительно сам и не чаще одного раза в 4-7 дней, маркетинговой информации и рекламы не будет, больше планирую рассказывать про техническую составляющую проекта с постепенным уклоном в IT.

Показать полностью

Нестандартные дисплеи и Raspberry Pi 3B

Есть у меня три штуки одинаковых Raspberry Pi 3B и разные дисплеи от смартфонов, ноутбука....Кто-то знает, можно ли их прицепить на DSI разъём, не через скалеры HDMI и прочее?

Нестандартные дисплеи и Raspberry Pi 3B Raspberry pi, Жк-дисплей, Arduino
Показать полностью 1

Выключатель для света со смартфона своими руками за 5 минут

В данном ролике расскажем замечательной аудитории Пикабу о том, как с помощью разработанной нами универсальной платы ENJOY BOARD (на базе микроконтроллера ESP32) создать простое автономное устройство для управления светом в доме с помощью смартфона.

Программный код можно написать как в Arduino IDE (если вы уже опытный разработчик), так и в среде программирования ENJOY BLOCK (если вы начинающий пользователь), которую мы уже успешно опробовали на тысячах наших учеников в лагере робототехники «Инкубатор изобретателей».

Благодаря возможности встроить аккумулятор в плату, можно таким образом организовать автономную работу устройства без дополнительных проводов от источников питания. Аккумуляторной батареи может хватить на несколько дней без подзарядки.

#enjoyrobotics

Пол – это лава: залипательный таймлапс сборки светодиодного пола

И небольшой бонус специально для Пикабу, пиу-пиу:

Кто догадается, откуда звук?)

Да и простят меня староверы Пикабу, но исключительно для тех, кому интересно последить за проектом, оставлю ссылку на наш телеграм канал: Pixel Quest – канал о разработке.
Пишу там исключительно сам и не чаще одного раза в 4-7 дней, маркетинговой информации и рекламы не будет, больше планирую писать про техническую составляющую проекта с постепенным уклоном в IT.

Показать полностью 1

Домофон, который знает, как вас зовут — своими руками

Домофон, который знает, как вас зовут — своими руками Домофон, СКУД, Озвучка, Arduino, Своими руками, Электроника, Яндекс Алиса, Длиннопост

Вы кто такие? Я вас не звал! Пошли на х...

Вступление

Мне всегда было интересно изучать системы автоматизации домофонов. Казалось бы, в них уже внедрено все возможное: видеозапись, связь с владельцем через мобильный телефон, управление открытием дверей с помощью голосового ассистента. Но что это? Звук зуммера, который изобрели еще в 1831 году? Мы живем в эпоху передовых технологий, а здесь такой простецкий звуковой сигнал. Я решил избавиться от этого устаревшего элемента и заменить его на более приятное для слуха голосовое сопровождение. В этой статье речь пойдет не о самом домофоне, а о его важной составляющей - системе контроля доступа (СКУД), а точнее - бесконтактном считывателе меток для открытия дверей. Я пошел дальше и добавил несколько функций, которые сделают эту систему немного современной.

Видео

Всем у кого нет желания вдаваться в технические подробности описанные в этой статье, могут посмотреть видео. В котором показана подробная работа моей самоделки

Схема

Система контроля доступа имеет несколько режимов работы:

  • Режим контроля доступа: считывание меток и открывание дверей

  • Мастер-режим для добавления новых ключей

  • Режим сброса ключей

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

Мой светодиод имеет общий анод, поэтому в коде он включается сигналом "LOW".

Питание 12 В для устройства берется с вызывной панели домофона и подключается через понижающий преобразователь, на выходе которого напряжение равно 5 В. Открытие двери происходит стандартным для домофона способом - замыканием линии "Audio" с "+12V". В схеме для этого предусмотрен оптрон, при подключении которого важно соблюдать полярность.

Домофон, который знает, как вас зовут — своими руками Домофон, СКУД, Озвучка, Arduino, Своими руками, Электроника, Яндекс Алиса, Длиннопост

схема

Необходимые компоненты

RFID RC522

В данном проекте используется наиболее распространенный модуль бесконтактной идентификации RFID Mifare RC522. Это устройство предназначено для бесконтактного считывания RFID меток. Считыватель MFRC-522 работает на частоте 13.56 МГц. Для подключения к ардуино буду использовать SPI интерфейс, так как он надежнее чем UART и I2C. Поддерживаемые считывателем типы карт: MIFARE S50, MIFARE S70, MIFARE UltraLight, MIFARE Pro, MIFARE DESfire.

Питание для модуля беру с 3,3В пина ардуино. Это питание идет от микросхемы CH340, которая имеет встроенный преобразователь. Однако, максимальный ток составляет всего 80 мА. Алекс Гайвер в своем блоге отмечал, что с таким питанием считыватель работает нестабильно. Вероятно, проблема заключается в недостаточном пиковом токе. Он также включил максимальное усиление для большего радиуса действия передатчика, что тоже увеличило потребление. Кроме того, ни на ардуино, ни на модуле RC-522. В цепи питания нет электролитических конденсаторов которые бы могли компенсировать все пиковые токи, которые, как я понимаю, и вызывают зависание модуля. Я сразу подключил в эту цепь конденсатор на 47 мкФ, и все работает без сбоев. Тестировал модуль в течение недели, никаких зависаний не замечено. Но так как для СКУД важна надежность и безотказность, я все равно использую идею Гайвера, в коде которого периодически сбрасывается модуль RFID.

Домофон, который знает, как вас зовут — своими руками Домофон, СКУД, Озвучка, Arduino, Своими руками, Электроника, Яндекс Алиса, Длиннопост

RFID

MP3 проигрыватель

DFPlayer - это компактный, но многофункциональный модуль звука, способный читать звуковые файлы с TF или микро SD карт и воспроизводить их через встроенный усилитель на динамике. Управление Arduino MP3 плеером можно осуществлять автономно, подключив к его выводам кнопки. Кроме того, MP3 модулем можно управлять через интерфейс UART, подключив его к Ардуино или другому микроконтроллеру. DFPlayer выпускается на различных чипах, я насчитал 5 модификаций. В этом проекте используется плеер на микросхеме MH2024K-24SS.

Домофон, который знает, как вас зовут — своими руками Домофон, СКУД, Озвучка, Arduino, Своими руками, Электроника, Яндекс Алиса, Длиннопост

DFPlayer

Борьба с цифровыми шумами

Во время паузы между воспроизведением треков в динамике ясно слышны цифровые шумы, создаваемые встроенным в плеер контроллером. Фильтрация питания с помощью LC-фильтров и установка линейного стабилизатора почти не помогли. Так как в плеере нет отдельного питания для усилителя и ЦАП, то эту проблему невозможно решить аппаратным способом. Вероятно, между внутренним контроллером, ЦАП и УНЧ нет встроенных LC или RC фильтров питания. А если они есть, то они не справляются со своей задачей.

Я нашел способ решить эту проблему программно. Для этого я написал отдельную функцию воспроизведения треков. Как работает эта функция? После воспроизведения трека я уменьшаю громкость до нуля, а перед воспроизведением она восстанавливается до уровня, заданного пользователем. Этот трюк существенно помог решить проблему, но в звуковой тракт в паузах все равно оставался слабый жужжащий звук. Эту проблему мне помог решить мой знакомый, ардуино-энтузиаст Герман. Он выяснил, что это жужжание исходит от UART и чтобы от него избавиться, достаточно было перепрограммировать порт TX Ардуино с выхода на вход, при этом подтянув его внутренним сопротивлением к плюсу питания.

Теперь, после применения этих решений, когда проигрыватель находится в режиме ожидания, никакие посторонние шумы не слышны. Если приложить ухо к динамику, можно услышать только едва уловимый белый шум, создаваемый переходными процессами в полупроводниках на первичных стадиях усиления. И то, что сначала запускается воспроизведение, а потом устанавливается громкость, это не ошибка, а особенность этого модуля.

Код этой функции выглядит следующим образом:

void mp3play(uint16_t track, uint16_t time)

{

pinMode(TX, OUTPUT); // восстанавливаем выход TX

mp3_play(track); // проиграть трек

mp3_set_volume (volume); //восстанавливаем громкость

delay(time); // длительность проигрывания трека

mp3_set_volume (0); // выключаем звук, уменьшаем цифровой шум

pinMode(TX, INPUT_PULLUP); // Отключаем TX убираем жужжание

}

Проблема со статусом Busy

Для отслеживания в DFPlayer статуса проигрывания трека, я сначала использовал сигнал BUSY, но он оказался непредсказуемым. В зависимости от различных факторов, после завершения воспроизведения трека на этом выводе может не появиться ожидаемая логическая единица, и плеер уходит в зависание, так как для ожидания завершения воспроизведения используется цикл while (!digitalRead(BUSY_PIN)). По этой причине для ожидания завершения проигрывания трека пришлось использовать delay().

Проблема неполного воспроизведения

Плеер может воспроизводить треки не до конца и обрывать фразы на полуслове без видимых на то причин. При этом плеер продолжает исправно принимать команды по UART. Поэтому я решил выполнять сброс плеера каждые 10 минут.

Динамик

Громкоговоритель от мягкой игрушки показал себя очень хорошо, но для моего корпуса он оказался слишком большим, поэтому пришлось использовать динамическую головку от мобильного телефона.

Для оптимальной работы динамика важно исключить короткое акустическое замыкание. Это происходит, когда давление воздуха с одной стороны головки абсорбируется разрежением с противоположной стороны диффузора. Другими словами, акустические волны взаимно нейтрализуют друг друга в противофазе. Чтобы избежать этого, необходимо обеспечить надежную герметичность громкоговорителя в корпусе. К счастью, динамик от телефона уже хорошо герметизирован и не страдает от вышеупомянутых проблем.

При установке модулей в корпус считывателя следует учесть, что неправильно закрепленные платы могут дребезжать из-за вибрации громкоговорителя. Использование силикона или термоклея должно решить эту проблему.

Домофон, который знает, как вас зовут — своими руками Домофон, СКУД, Озвучка, Arduino, Своими руками, Электроника, Яндекс Алиса, Длиннопост

Динамики

Создание аудиофайлов

Я считаю наиболее подходящим TTS для создания озвучки голос Яндекс Алисы, хотя это мое субъективное мнение. Для записи фраз от Алисы я использовал колонку Яндекс Станция Мини-2, которая обладает разъемом линейного аудио выхода. Это позволяет записывать любую звуковую информацию с этой колонки. Для этого достаточно подключить аудиовыход от Яндекс.станции к линейному входу звуковой карты с помощью аудиокабеля.

Для создания голосовых фраз я использовал программу Audacity. Чтобы заставить колонку произносить нужные фразы, нужно в мессенджере Telegram добавить бота Алиса (alice_speaker_bot). Затем, в меню бота выбираем пункт "сказать колонкой что-нибудь" и отправляем ему сообщение с подготовленным текстом, который Алиса произнесет.

Для того чтобы фразы звучали как в научно-фантастических фильмах, в аудиоредакторе к звуковому файлу можно добавить эффект "Эхо". Настройки этого эффекта представлены на скриншоте ниже.

Домофон, который знает, как вас зовут — своими руками Домофон, СКУД, Озвучка, Arduino, Своими руками, Электроника, Яндекс Алиса, Длиннопост

audacity

Корпус считывателя и его особенности

Корпус оказался немного мал по размерам, поэтому вместо стандартного RFID-ридера мне пришлось заказать в Китае его компактную версию. К сожалению, устройство прибыло в неисправном состоянии.

Домофон, который знает, как вас зовут — своими руками Домофон, СКУД, Озвучка, Arduino, Своими руками, Электроника, Яндекс Алиса, Длиннопост

RFID

В корпусе отсутствует встроенная подсветка. Использование светодиода, светящего внутри коробки, не представляется возможным, поскольку свечение графического индикатора получается бледным и неравномерным. Кроме того, на этом месте должен быть установлен модуль RFID, и светодиод будет ему мешать. Поэтому я извлек подсветку из старого разбитого экрана от тестера LCR-T4, размер которой идеально подошел под мою задачу.

Домофон, который знает, как вас зовут — своими руками Домофон, СКУД, Озвучка, Arduino, Своими руками, Электроника, Яндекс Алиса, Длиннопост

Подсветка

В итоге результат оказался весьма впечатляющим. Камера не может передать реальный цвет, в реальности выглядит гораздо красивее.

Домофон, который знает, как вас зовут — своими руками Домофон, СКУД, Озвучка, Arduino, Своими руками, Электроника, Яндекс Алиса, Длиннопост

Так выглядит итоговый вариант

Сборка

Для отладки устройства я собрал проект на макетной плате. После успешного тестирования, я спаял все платы между собой проводами (навесным монтажом). Признаю, что это не лучший вариант из существующих, но у меня нет ни времени, ни желания рисовать и травить кросс-плату. На фотографии ниже приведен пример того, как будут размещены платы, но они еще не закреплены в корпусе, так как RFID-модуль нужно будет заменить на исправный, когда приедет.

Домофон, который знает, как вас зовут — своими руками Домофон, СКУД, Озвучка, Arduino, Своими руками, Электроника, Яндекс Алиса, Длиннопост

Внутренности в корпусе считывателя

Код для Ардуино

По скетчу особо нечего сказать. Весь код подробно закомментирован.

#include <avr/wdt.h>

#include <MFRC522.h>

#include <DFPlayer_Mini_Mp3.h>

#define BUSY_PIN 4 // Пин BUSY для MP3 пдеера

#define RST_PIN 9 // Пин RST для rfid модуля

#define SS_PIN 10 // Пин SS для rfid модуля

#define RX 2 // назначить пин RX SoftSerial

#define TX 3 // назначить пин TX SoftSerial

#define modeRes 11 // пин для сброса памяти ключей

#define look_PIN 5 // номер пина для подключения к нему реле открытия замка

#define blue_PIN 8

#define green_PIN 7

#define red_PIN 6

#define interval 2000 // интервал сброса RFID модуля в мкс

#define time_reset_mp3 600000 // интервал сброса MP3 плеера

#define volume 25 // громкость MP3 от 0 до 30

#define equalizer 0 // эквалайзер(POP=1) от 0 до 5 Normal/Pop/Rock/Jazz/Classic/Bass

#define sumName 7 // количество имен пользователей записанных на флешке начинаются с 0001.mp3, 0002.mp3 ... и т.д.

uint32_t rebootTimer=0, oldTime=0; // Переменная для таймера MFRC522 rfid(SS_PIN, RST_PIN); // Назначить пины SS и RST SoftwareSerial mySerial(RX, TX); // назначить пины RX, TX

SoftSerial

void setup()

{

// pinMode(look_PIN, OUTPUT); // пин для подключения реле открытия замка

// digitalWrite(look_PIN, LOW);

pinMode(red_PIN, OUTPUT);

pinMode(green_PIN, OUTPUT);

pinMode(blue_PIN, OUTPUT);

pinMode(modeRes, INPUT_PULLUP); // пин сброса памяти ключей mySerial.begin (9600); // Инициализация

Soft Serial mp3_set_serial (mySerial);

delay (1000);

mp3Reset(); // инициализация плеера

uint8_t memClear = digitalRead(modeRes); // проверяем состояние пина сброса памяти

if(!memClear) // Если установлена перемычка на GND и пин D11

{

digitalWrite (green_PIN, HIGH);

digitalWrite (red_PIN, HIGH);

eeprom_write_byte(0, 255); // то обнуляем счетчик ключей

mp3play (113, 13000); // память обнулена

while(true); // зависаем и ждем нажатия reset

}

SPI.begin(); // Инициализация

SPI firstStart(); // проверка наличия Мастер ключа и добавление его mp3play (109, 9500); // система активирована //

Serial.begin(115200); // Инициализация Serial //

wdt_enable(WDTO_8S); }

void loop()

{

digitalWrite (green_PIN, HIGH);

digitalWrite (red_PIN, HIGH);

digitalWrite (blue_PIN, HIGH);

uint8_t sumKey = eeprom_read_byte(0); // считываем из EEPROM с адреса 0 информацию о количестве сохраненных ключей

uint32_t master = ReadEEPROM_Long(1); // читаем из EEPROM uid мастер ключа

uint32_t uid_tmp = ReadUID(); // ждем когда приложат ключ к считывателю и Читаем UID ключа

//Serial.println(sumKey);

//Serial.println(master);

//Serial.println(uid_tmp);

if(uid_tmp == master)

{

digitalWrite (red_PIN, LOW);

digitalWrite (blue_PIN, LOW);

addKey(sumKey); // если к считывателю поднесли мастер ключ, то переходим в режим добавления новых ключей

}

if(sumKey>=0 && uid_tmp != master) // если в EEPROM больше 1 ключа и UID прочитан с RFID то сравниваем все имеющиеся в EEPROM ключи со считанным 1

{

uint8_t nameKey = searchKey(sumKey, uid_tmp); // считываем все ключи по очереди из EEPROM и сравниваем их с UID приложенного к считывателю ключа

if(nameKey > 0) // в nameKey номер(индекс) ключа

{

sumKey = eeprom_read_byte(nameKey*5); // читаем из EEPROM привязанное к uid имя пользователя //

digitalWrite (look_PIN, HIGH); // открываем замок

digitalWrite (green_PIN, LOW);

mp3play (106, 1480); // фраза "Здравствуйте"

mp3play (sumKey, 1200); // проигрываем привязанное имя пользователя к uid

mp3play (107, 5000); // фраза "Добро пожаловать"

//digitalWrite (look_PIN, LOW); // закрываем замок

} else {

digitalWrite (red_PIN, LOW);

mp3play(104, 6500); } // фраза "Доступ запрещен, Ключ не найден"

}

if (millis() - oldTime > time_reset_mp3) // интервал таймера для сброс плеера

{

oldTime = millis();

} }

//*********************************************

uint32_t ReadUID(void) // опрашиваем считыватель каждую 0,2сек

{ for (;;) // бесконечный цикл

{

ResetRFID(); // перезагружаем RFID модуль каждые 2 секунды delay(100);

if (rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()) // Если метка найдена и она прочитана

{ return uidTolong(); // прервать цикл и возвратить UID

} } }

//-----------------------------------------

uint8_t searchKey( uint8_t sumKey, uint32_t uid ) // поиск ключа в EEPROM. sumKey-количество сохраненных ключей вEEPROM

{

for (uint8_t i = 1; i <= sumKey; i++)

{

uint32_t tmp=ReadEEPROM_Long(i*5+1); //читаем по очереди все сохраненные UID и сравниваем их с UID полученным c

RFID if(tmp == uid) { return i; } // сравниваем считанный из памяти UID с прочитанным UID и если найден, то возвращаем номер совпавшего ключа

}

return 0; // если в базе нет такого ключа то возвращаем 0

}

//---------------------------------------

void addKey(uint8_t sumKey) // sumKey-количество сохраненных ключей в EEPROM

{

mp3play(101, 15000); // для добавления нового UID после того как услышите имя которое нужно привязать к UID поднесите ключ к считывателю RFID

for (uint8_t i = 1; i <= sumName; i++) // перебираем все имена по очереди

{

mp3play(110, 1000); // проигрывание звука next

ResetRFID();

pinMode(TX, OUTPUT); // восстанавливаем выход для TX

mp3_play (i); // проигрываем в фоновом режиме в порядке возрастания все записанные на флешку имена

mp3_set_volume (volume); // устанавливаем заданную громкость

for (uint8_t ti = 0; ti < 20; ti++) // цикл таймер, 20*100мс=2 сек на опрос считывателя RFID пока проигрывается имя пользователя

{

if (rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()) // Если определена метка и она прочитана

{ uint32_t uid = uidTolong(); // преобразуем uid из массива в ulong uint8_t dub = searchKey(sumKey, uid); // ищем в EEPROM совпадение, проверяем ключ на дубли

if(dub == 0) // если такого ключа нет в памяти то добавляем его { // или если ключ есть то в dub номер ключа

sumKey++; // инкрементируем счетчик ключей

eeprom_write_byte(0, sumKey); // счетчик ключей в EEPROM eeprom_write_byte(sumKey*5, i); // сохраняем в EEPROM привязанное к ключу имя

WriteEEPROM_Long (sumKey*5+1, uid); // сохраняем UID ключа в EEPROM delay(500); // для того,что бы имя проигралось до конца mp3play(103, 4500); // фраза "новый ключ сохранен" mp3play(112, 9000); // фраза "мастер режим завершен" return; } else { digitalWrite (blue_PIN, HIGH); delay(1000);

mp3play(111, 9000); // прочитанный ключ уже имеется в системе digitalWrite (red_PIN, HIGH);

mp3play(112, 9000); // фраза "мастер режим завершен" return; } } delay(100);

} }

mp3play(108, 9000); // Время ожидание ключа истекло.

}

//----------------------------------------

void firstStart(void) { uint8_t tmp = eeprom_read_byte(0); // проверяем записан ли мастер ключ в EEPROM if(tmp==255) // если его там нет, то нужно добавить { mp3play(100, 12500); // фраза добавить мастер ключ uint32_t uid_tmp = ReadUID(); // прочитать UID мастер ключа со считывателя RFID if( uid_tmp > 0 ) // если ключ прочитан то записываем его в EEPROM { eeprom_write_byte (0, 0); // по адресу 000 записываем счетчик ключей не более 51 шт.------------------ WriteEEPROM_Long (1, uid_tmp); // по адресу 001 может быть записан только мастер ключ mp3play(102, 3500); // фраза мастер ключ добавлен } } }

//----------------------------------------

void ResetRFID(void) // Таймер сброса RFID защита от зависания

{

if (millis() - rebootTimer > interval) // интервал таймера

{

rebootTimer = millis(); // Обновляем таймер

digitalWrite(RST_PIN, HIGH); // Сбрасываем модуль delayMicroseconds(100); // длительность сброса 100 мкс digitalWrite(RST_PIN, LOW); // Отпускаем сброс

rfid.PCD_Init(); // Инициализируем

RFID rfid.PCD_AntennaOn(); // Включаем антенну

} }

//---------------------------------------

void mp3Reset(void) // можно так же использовать как остановку трека { mp3_reset (); delay (1000);

// mp3_set_device(2); // 2-работа с SD Card. 1/2/3/4/5 U/SD/AUX/SLEEP/FLASH

// mp3_DAC (true); mp3_set_EQ (equalizer); // эквалайзер Normal/Pop/Rock/Jazz/Classic/Bass

delay (100);

mp3_set_volume (volume); // устанавливаем громкость

delay (200);

pinMode(TX, INPUT_PULLUP); // Отключаем TX, что бы в динамике исчез шум/наводка

}

//---------------------------------------

void mp3play(uint16_t track, uint16_t time)

{

pinMode(TX, OUTPUT); // восстанавливаем выход TX

mp3_play(track); // проиграть трек //

mp3_set_volume (volume); // устанавливаем заданную громкость //wdt_reset(); delay(time); // длительность проигрывания // mp3_set_volume (0); // выключаем звук, что бы не было шума в динамике

pinMode(TX, INPUT_PULLUP); // Отключаем TX, что бы в динамике исчез шум/наводка

}

//---------------------------------------

uint32_t uidTolong(void)

{

uint32_t uid_l

uid_l // преобразуем uid массив в тип uint32_t uid_l << 8) | rfid.uid.uidByte[2]); uid_l << 8) | rfid.uid.uidByte[1]);

return (uid_l << 8) | rfid.uid.uidByte[0])); //прервать цикл и передать UID

}

void WriteEEPROM_Long(uint8_t addr, uint32_t data) //преобразовать из long и сохранить в

EEPROM { eeprom_write_byte((uint8_t*)addr, data & 0xFF); eeprom_write_byte((uint8_t*)addr+1, (data & 0xFF00) >> 8); eeprom_write_byte((uint8_t*)addr+2, (data & 0xFF0000) >> 16); eeprom_write_byte((uint8_t*)addr+3, (data & 0xFF000000) >> 24); } uint32_t ReadEEPROM_Long(uint8_t addr) // считываем значение из EEPROM и преобразуем в long { uint32_t ir_code = eeprom_read_byte((uint8_t*)addr+3); ir_code = (ir_code << 8) | eeprom_read_byte((uint8_t*)addr+2); ir_code = (ir_code << 8) | eeprom_read_byte((uint8_t*)addr+1); return ((ir_code << 8) | eeprom_read_byte((uint8_t*)addr)); }

Фразы

Для отладки кода, я выкладываю фразы. Вернее их текстовый вариант.

1 - 50 - Имена пользователей

100 - В памяти устройства нет сохраненных ключей. Для начала добавьте мастер ключ. Для этого поднесите к считывателю любой ключ который вы хотите сделать основным.

101 - Вы зашли в мастер режим добавления ключей. Что бы добавить новый ключ поднесите его к считывателю.

102 - Мастер ключ добавлен!

103 - Новый ключ добавлен!

104 - Доступ заблокирован! Используемый Вами ключ отсутствует в системе.

105 - Доступ разрешен!

106 - Добрый день!

107 - Добро пожаловать!

108 - Время ожидание ключа истекло. Система бесконтактной идентификации переходит в стандартный режим работы.

109 - Система бесконтактной идентификации готова к работе.

110 - Звуковой сигнал next

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

112 - Мастер режим завершен!

113 - Включен режим обнуления памяти ключей. Все ключи удалены из памяти. Для возврата в стандартный режим не забудьте удалить перемычку и нажать кнопку сброса.

Заключение

К сожалению, я так и не смог завершить проект до конца. Компактный RFID RC522 модуль оказался неисправным. Я заказал два таких же модуля у разных продавцов, в надежде, что хотя бы один из них приедет в исправном состоянии и заработает. Но когда посылки приедут, пока неизвестно, поскольку на текущий момент они еще не отправлены. Когда я установлю считыватель на дверь и испытаю его в реальных условиях, то сниму короткий видеоотчет.

Благодарю вас за то, что дочитали до конца! Надеюсь, что эта статья вам понравилась и вы сможете использовать мои наработки в своих проектах. Если у вас есть вопросы, вы можете задать их в комментариях. Я с удовольствием на них отвечу.

Ссылка на оригинал статьи

Показать полностью 9

Где то я уже это видел?

Увидел недавно новость о том , что в Яндекс сделали новую чудо колонку Яндекс Станция Дуо Макс. Посмотрел на ее фото и подумал, где то я уже это видел? И тут прихожу я вчера на Почту России. Таа-дааааа, бинго!!! Вот же она ...

Где то я уже это видел? Юмор, Жизнь, Почта России, Дизайн, Яндекс Алиса, Длиннопост, Яндекс колонка
Где то я уже это видел? Юмор, Жизнь, Почта России, Дизайн, Яндекс Алиса, Длиннопост, Яндекс колонка

Аппарат электронной очереди "Почта России"

Где то я уже это видел? Юмор, Жизнь, Почта России, Дизайн, Яндекс Алиса, Длиннопост, Яндекс колонка
Показать полностью 2

Мониторинг UPS APC и EATON

В предыдущемпосте была показана реализация аппаратной riktak-коробочки на esp8266 со smart протоколом для APC. По реакции мнения разделились: Кто-то сказал "купи сетевую плату за 3 рубля" или добавь еще что-то, или "нафига это, когда есть то". Но в общем есть, то что есть. И да, по работе мне приходится мониторить бесперебойники, и да, в них есть сетевые карты - они разные и не все идеально работают.

Сейчас хотелось бы поделиться скриптом на PHP для мониторинга бесперебойников APC и EATON по snmp.

Предупреждая комментарии, я знаю что такое ZABBIX и также им всё мониторю и я знаю, что такое APC powerChute - это всё громоздко и ресурсоёмко. Свести визуально воедино ни заббиксом и чем-то другим не получилось.

Скрипт написал для собственного удобства - может кому-то сгодится.

Требования: apache/nginx + php + php-snmp и включенный snmp1 на чтение в устройствах.

Возможности:

1- показ состояния бесперебойников, всяких температур, напряжений, оставшегося времени в одной таблице - красоту сами наводите.

2 - с аргументом dailyreport отправляет на почту (нужное исрпавить).

Должно получиться примерно следующее

Мониторинг UPS APC и EATON Apc, PHP, Системное администрирование, Длиннопост

Мониторинг UPS APC и EATON

Требуется отредактировать массивы $urls и $urls2, добавив список свйих УПС, а также почтовые адреса, если нужны рассылки.

Сильно не пинайте, чукча - не чукча и тд..

Источник или немного кода ниже:

<?php

// apt-get install php-snmp

// snmp 1 public readonly

$urls = array( // eatons

"192.168.1.55",
"192.168.1.57",
"192.168.1.16",
"192.168.1.60"
);

$urls2 = array( // APC

"192.168.1.25", "192.168.1.239",
"192.168.1.230",
"192.168.1.231" );

$pr="<html><body><table width= \"100%\" border=\"1\" cellpadding='5' cellspacing=\"0\"> <tr bgcolor=\"#ddd\" style=\"background-color:#ddd\"> <td>IP</td> <td>Расположение</td> <td>Модель</td> <td>Источник питания</td> <td>Нагрузка<br />%</td> <td>Зарядка<br />%</td> <td>Оставшееся<br>время</td> <td>Состояние<br />батареи</td> <td>Температура <br />(вн/нар)/Влажн.</td> </tr>";

for ($i = 0; $i<count($urls); $i++)

{

$pr.="<tr><td><a href=\"http://".$urls[$i]."/\" target=\"_blank\">".$urls[$i]."</a></td>";

$session = new SNMP(SNMP::VERSION_1, $urls[$i], "public");

$session->valueretrieval = SNMP_VALUE_PLAIN; $s = $session->walk("1.3.6.1.2.1.1.5.0", TRUE);

foreach ($s as $val)

{

$pr.= "<td><b>$val</b></td>";

}

$s = $session->walk("1.3.6.1.2.1.33.1.1.2.0", TRUE);

foreach ($s as $val)

{

$pr.= "<td><b><font color=\"#00f\" style=\"color:#00f;\">$val</font></b></td>"; }

$s = $session->walk("1.3.6.1.4.1.534.1.3.4.1.2.1", TRUE);

foreach ($s as $val) { $pr.= "<td>$val Volt</b></td>"; }

$s = $session->walk("1.3.6.1.4.1.534.1.4.1.0", TRUE); foreach ($s as $val) { $pr.= "<td align='right'></b>$val %</td>"; }

$s = $session->walk("1.3.6.1.4.1.534.1.2.4.0", TRUE); foreach ($s as $val) { $pr.= "<td align='right'>$val %</td>"; } $s = $session->walk("1.3.6.1.4.1.534.1.2.1.0", TRUE); foreach ($s as $val) {

$pr.= "<td>".round($val/60)." min</td>"; }

$s = $session->walk("1.3.6.1.4.1.705.1.5.9.0", TRUE); foreach ($s as $val) if($val=="2") $res1 = 2; else $res1 = 1; $s = $session->walk("1.3.6.1.4.1.705.1.5.15.0", TRUE); foreach ($s as $val) if($val=="2") $res2 = 2; else $res2 = 1; $s = $session->walk("1.3.6.1.4.1.705.1.5.11.0", TRUE); foreach ($s as $val) if($val=="2") $res3 = 2; else $res3 = 1; if($res1==2 && $res2==2 && $res3==2)

$pr.="<td bgcolor=\"#9d9\" style=\"background-color:#9d9\">OK</td>";

else

$pr.="<td bgcolor=\"#d99\" style=\"background-color:#d99\">fault</td>"; $s = $session->walk("1.3.6.1.4.1.534.1.6.1.0", TRUE); foreach ($s as $val) { $pr.= "<td>$val &deg;C / "; } $s = $session->walk("1.3.6.1.4.1.534.1.6.5.0", TRUE); foreach ($s as $val) { $pr.= " $val &deg;C /"; } $s = $session->walk("1.3.6.1.4.1.534.1.6.6.0", TRUE); foreach ($s as $val) { $pr.= " $val %</td>"; }

$session->close();

$pr.="</tr>\r\n";

}

for ($i = 0; $i<count($urls2); $i++)

{

$pr.="<tr><td><a href=\"http://".$urls2[$i]."/\" target=\"_blank\">".$urls2[$i]."</a></td>";

$session = new SNMP(SNMP::VERSION_1, $urls2[$i], "public");

$session->valueretrieval = SNMP_VALUE_PLAIN; $s = $session->walk("1.3.6.1.4.1.318.1.1.1.1.1.2.0", TRUE); foreach ($s as $val)

{

$pr.= "<td><b>$val</font></b></td>"; }

$s = $session->walk("1.3.6.1.4.1.318.1.1.1.1.1.1.0", TRUE); foreach ($s as $val) { $pr.= "<td><b><font color=\"#f00\" style=\"color:#f00;\">$val</font></b></td>"; }

$s = $session->walk("1.3.6.1.4.1.318.1.1.1.3.2.1.0", TRUE); foreach ($s as $val) { $pr.= "<td>$val Volt</b></td>"; }

$s = $session->walk("1.3.6.1.4.1.318.1.1.1.4.2.3.0", TRUE); foreach ($s as $val) { $pr.= "<td align='right'></b>$val %</td>"; }

$s = $session->walk("1.3.6.1.4.1.318.1.1.1.2.2.1.0", TRUE); foreach ($s as $val) { $pr.= "<td align='right'>$val %</td>"; } $s = $session->walk("1.3.6.1.4.1.318.1.1.1.2.2.3.0", TRUE); foreach ($s as $val)

{ $pr.= "<td>".($val/100/60)." min</td>"; }

$s = $session->walk("1.3.6.1.4.1.318.1.1.1.2.2.4.0", TRUE); foreach ($s as $val) if($val=="1")

{ $pr.= "<td bgcolor=\"#9d9\" style=\"background-color:#9d9\">OK</td>"; }

else

{ $pr.= "<td bgcolor=\"#d99\" style=\"background-color:#d99\">fault</td>"; }

$s = $session->walk("1.3.6.1.4.1.318.1.1.1.2.2.2.0", TRUE); foreach ($s as $val) { $pr.= "<td>$val &deg;C /"; }

$s = $session->walk("1.3.6.1.4.1.318.1.1.25.1.2.1.6", TRUE); foreach ($s as $val) { $pr.= "$val &deg;C /"; }

$s = $session->walk("1.3.6.1.4.1.318.1.1.25.1.2.1.7", TRUE); foreach ($s as $val) { $pr.= "$val %</td>"; }

$s = $session->walk("1.3.6.1.4.1.318.1.1.1.3.2.5.0", TRUE);

foreach ($s as $val)

{ $pr.= "<td>LTtB:$val</td>"; }

$session->close();

$pr.="</tr>\r\n";

}

$pr.="</table>";

$pr.="<br /><font color=\"#00f\" style=\"color:#00f;\">EATON</font> <font color=\"#f00\" style=\"color:#f00;\">APC</font><br />";

$pr.="APC reason for last transfer (LTtB) to battery power<br /> <p>1 No events<br /> 2 High line voltage<br /> 3 Brownout<br /> 4 Loss of mains power<br /> 5 Small temporary power drop<br /> 6 Large temporary power drop<br /> 7 Small spike<br /> 8 Large spike<br /> 9 UPS self test<br /> 10 Excessive input voltage fluctuation</p><br /> <a href=\"#\">Обновить скрипт УПС</a></body></html>";

if($act=='') echo $pr;

if($act=='dailyreport')

{

$to="admin@domain.ru";

$subject="UPSs daily report";

$body="$pr";

$headers = "Content-type: text/html; charset=utf-8\r\n"; $headers .= "From: ups@domain.ru ";

mail($to, $subject, $body, $headers);

}

?>

Показать полностью 1
Отличная работа, все прочитано!