Может ли Arduino работать круглосуточно?
Я делаю простой веб-сервер Arduino и хочу, чтобы он был включен постоянно. Поэтому он должен выдерживать непрерывную работу.
Я использую Arduino Uno с Ethernet Shield. Питание осуществляется от простого блока питания 5 В при 1 А.
Мои вопросы:
- Возникнут ли проблемы, если оставить Arduino постоянно включенным?
- Есть ли какая-то другая плата Arduino, которая лучше подойдет для этого?
- Существуют ли какие-либо меры предосторожности, которые мне следует соблюдать в связи с этим?
@Butzke, 👍49
Обсуждение11 ответов
Лучший ответ:
У вас не должно возникнуть никаких проблем с его постоянным включением, однако следует учитывать наличие счетчиков, например использование millis().
Из документации Arduino по millis:
Это число переполнится (вернется к нулю) примерно через 50 дней.
Таким образом, в проектах, которые выполняются в течение длительного времени, вы можете не заметить проблему сразу, но что-то подобное может возникнуть и привести к ошибкам в будущем.
Если быть точным, millis — это переменная uint32_t, поэтому она переполнится («вернется к нулю») через 4 294 967 296 миллисекунд, что составляет ~49,7 дней, ~1193 часа или ~71 582 минуты., @Connor Wolf
Тогда все, что вам нужно сделать, это использовать еще один uint32_t, который увеличивается при достижении первого значения. Тогда между переносами выплат пройдет примерно 5,846×10^8 лет., @80HD
Зачастую переворот функции mills() не представляет особой проблемы, поскольку пользователи склонны использовать millis() как относительный метод. Они берут разницу между двумя вызовами millis() или берут начальное время и проверяют, больше ли millis() значения start+Time. Арифметические перевороты и перевороты millis() часто взаимно компенсируются, так что значение time2-time1 является точным, даже если между ними есть переворот, при условии, что переворотов нет. Часто, если ваш код использует абсолютные значения millis(), его можно рефакторить для использования относительной логики millis()., @EternityForest
Если вы выполните millis()-startTime (с начальным временем как беззнаковым длинным числом, то есть uint32_t), вы всегда получите правильный результат, если только не произойдет более одного переполнения., @Lesto
Если быть точнее, переполнение происходит через 49 дней, 17 часов, 2 минуты, 47 секунд и 295 миллисекунд., @Memet Olsen
Переполнение функции millis() **никогда** не должно быть проблемой. Подробнее см. [переполнение функции millis()... это плохо?](http://www.gammon.com.au/millis). В принципе, если вы вычисляете временные интервалы вычитанием, используя соответствующие типы данных, проблем не возникнет., @Nick Gammon
Даже если не использовать millis напрямую, интересно, можно ли быть уверенным, что ни одна из импортированных библиотек этого не делает., @Michael
Пару вещей, которые следует иметь в виду (помимо упоминания @Sachleen о millis()):
Как и любая электроника, тепло может быть разрушительным. Сам микроконтроллер вряд ли будет большой проблемой с точки зрения тепла, но другие компоненты, такие как блок питания, могут вызывать проблемы.
Если ваш код использует
EEPROM.write(), имейте в виду, что EEPROM в ATmega328P вашего Uno рассчитана только на 100 000 записей.
Работа Arduino 24/7 не должна быть проблемой.
Но убедитесь, что у вас есть корпус, который обеспечивает вентиляцию, и вы держите его в хорошо проветриваемом месте. Так же, как и компьютеры, если вы не держите их в среде, которая может поддерживать их прохладу, они не будут оставаться прохладными.
Также следует учитывать нагрузку на сервер: чем больше нагрузка на сервер, тем больше обработки ему приходится выполнять и тем больше тепла он будет выделять.
У ATmega нет традиционных режимов энергосбережения, как у обычных компьютеров, поэтому нагрузка не имеет значения. Если вы не выполняете активные вычисления, он просто находится в режиме ожидания вращения. Потребляемая мощность во время работы практически стабильна (за исключением таких процессов, как запись в EEPROM/флэш-память), по крайней мере, для микроконтроллера ATmega. Потребляемая мощность интерфейса Ethernet может варьироваться в зависимости от нагрузки, но вряд ли она будет выделять достаточно тепла, чтобы создать проблему, если только устройство не находится в идеальном вакууме или на нагревателе., @Connor Wolf
[Atmega328p](http://www.atmel.com/Images/Atmel-8271-8-bit-AVR-Microcontroller-ATmega48A-48PA-88A-88PA-168A-168PA-328-328P_datasheet.pdf) имеет энергосберегающий режим сна, потребляющий ~0,1 мкА., @JRobert
Это будет иметь значение только в том случае, если код действительно переводит процессор в спящий режим., @Chris Stratton
Arduino может работать без проблем в течение очень долгого времени, хотя в зависимости от местных условий и интенсивности вычислений вам, возможно, придется прикрепить радиаторы.
Кроме того, хорошо проветривайте помещение.
Это также зависит от используемой программы: если ваш сервер время от времени обслуживает страницу, это не должно быть проблемой, но если вы ожидаете постоянный трафик, то Arduino может быстро нагреваться.
Вам также следует обеспечить стабильность электропитания. При проведении настольных экспериментов с Arduino это не является большой проблемой, но может стать проблемой при преобразовании питания из сети в постоянное устройство.
Нет никаких оснований ожидать, что вычислительная нагрузка приведёт к перегреву Arduino. Как уже отмечалось в ответах, основанных на фактах, **нормальным** случаем является работа на полной нагрузке. Если и есть компонент, который может перегреться, то это регулятор напряжения, но это в первую очередь функция входного напряжения, поскольку он и так работает на максимальном ожидаемом токе без нагрузки., @Chris Stratton
@ChrisStratton Ethernet-шилд может менять мощность в зависимости от нагрузки. Кроме того, Arduino может находиться в состоянии низкого энергопотребления (например, в спящем режиме с 00:00 до 5:00)., @Anonymous Penguin
Помните, что флэш-память и EEPROM имеют ограниченный срок службы (около 10 000 и 100 000 циклов записи соответственно), поэтому если вы много записываете в них, они могут быть повреждены. В моем тесте внешнему EEPROM потребовалось около 3 дней, чтобы начать портиться.
Хотя в документации может быть указано 10 тыс. циклов, многочисленные тесты показали, что проблемы начинаются уже при ~100 тыс. циклов., @Ron
Срок службы EEPROM, согласно техническому описанию, составляет минимум 100 000 циклов записи. Кажется, я читал об одном тесте, где повреждение начиналось примерно при миллионе циклов записи., @user2973
Я никогда не запускал Arduino так долго, но проблем быть не должно. Единственное, на что следует обратить внимание, — это входное напряжение.
Хотя Arduino может обрабатывать 7-20 В в качестве входного напряжения, все, что выше 12 В, может перегреться через более длительные периоды времени и привести к повреждению платы. В качестве краткой рекомендации, чтобы избежать перегрева Arduino, я бы рекомендовал поддерживать напряжение как можно ближе к 7 В.
Я хотел бы упомянуть проблему, которая возникает нечасто, но может вызвать долгосрочные проблемы. Утечки памяти и фрагментация кучи. Почти никто не делает malloc во встроенных вещах, но если вы это делаете, делайте это правильно.
Вы меня опередили, +1., @Alex Shroyer
Я считаю, что класс String использует malloc, и это довольно распространено., @user2973
Согласен. Особенно с веб-сервером: убедитесь, что вы не делаете ничего, что может привести к фрагментации памяти, например, используете класс String. Однако этого легко избежать. У меня Arduino работает как веб-сервер, чтобы сообщать, закрыты ли ворота гаража. Он работает уже много лет., @Nick Gammon
Я построил простой монитор питания с моим первым Arduino. Он питается через USB от веб-сервера, который в свою очередь питается от довольно мощной резервной батареи (которая не имеет возможности оповещения).
Он также подключен к зарядному устройству мобильного телефона, подключенному к розетке, не являющейся источником бесперебойного питания.
Так что если отключается питание, Arduino отправляет сообщение небольшой программе, работающей на сервере. Серверная программа в свою очередь отправляет мне уведомление по электронной почте.
Он был установлен в конце сентября 2013 года, а 23 марта 2014 года я получил свое первое электронное письмо!
Поэтому я не увидел проблемы (он не использует millis()), но он делает выборку мощности каждые 5 секунд.
Мы используем нашу систему доступа RFID на базе Arduino в Bloominglabs Hackerspace в Блумингтоне, штат Индиана, с конца 2011 года, и, за исключением пары отключений электроэнергии и обновлений программного обеспечения, она работает круглосуточно, без проблем. Совсем недавно мы добавили сетевой термостат, то же самое — она работает круглосуточно.
У меня тоже есть система доступа RFID, работающая круглосуточно. Она выходит из строя только при отключении питания, поскольку работает от сети. Работает с 2011 года без проблем., @Nick Gammon
Ха-ха, привет, Стив!, @deltaray
@NickGammon Да, ваша система классная, но почему аутентификация основана не на данных карты, а только на UID токена? Пожалуйста, покажите нам разумное решение., @user2497
в чем твоя суть? это не имеет отношения к вопросу автора поста., @sdcharle
Может ли Arduino работать круглосуточно?
Это вопрос надежности. В надежности нужно учитывать множество факторов.
- Программное обеспечение. Есть более надежное программное обеспечение. Есть менее надежное программное обеспечение. Например, для критических приложений, динамических Распределение памяти не рекомендуется, так как это может привести к потере памяти фрагментация. К сожалению, Arduino в значительной степени полагается на динамические Распределение памяти. Эта проблема усугубляется тем, что большинство Плата Arduino имеет очень ограниченный объем оперативной памяти.
- Библиотеки. Во многих библиотеках Arduino есть ошибки (даже в тех, встроенный в пакет Arduino, такой же простой, как WString!). В обычном режиме эксплуатации, такие ошибки могут вообще не проявиться. Однако, вы не можете надеяться что «все будет хорошо» и что «пользователь» (или подсистема) будет действовать так, как и предсказывалось. Библиотеки также могут иметь свои ограничения (т.е. не совсем ошибки). Например, многие пользователи уже ссылались на Функция millis(), которая сбрасывается через 50 дней. Это, если не обработано правильно, может привести к серьезным ошибкам.
- Надежность оборудования (даже не говоря о дешевом
Клоны Arduino...). Здесь открывается новый класс подвопросов. Я буду
цитируют лишь очень ограниченную подгруппу.
- Разработаны ли платы Arduino с расчетом на надежность? (например, что такое
надежность используемых конденсаторов? и других компонентов?) - Устойчивость к электромагнитным помехам? Я бы не стал на это полагаться: большинство плат Arduino имеют всего два слоя и не имеют надлежащего заземления/питания.
- EEPROM (это и программное, и аппаратное обеспечение). Использует ли ваше программное обеспечение EEPROM? Реализует ли какой-либо алгоритм для предотвращения цикличности (повторной записи/стирания в одних и тех же ячейках)?
- Время хранения флэш-памяти. Время хранения уменьшается с температурой, а также с количеством циклов программирования.
- Ионизирующее излучение. Да, даже если вероятность ОЧЕНЬ мала, по крайней мере на уровне моря, вероятность единичного сбоя, вызванного радиацией, не равна нулю, и в критических приложениях следует принимать адекватные контрмеры (особенно учитывая, что ОЗУ не имеет аппаратного обнаружения ошибок).
- Качество электропитания.
- Операционная среда. Контролируемая среда с температурой 25°C или черный ящик над крышей (70°C под солнцем летом)? Чем выше температура, тем быстрее все механизмы деградации.
- ...
- Разработаны ли платы Arduino с расчетом на надежность? (например, что такое
Тем не менее, вы не должны удивляться, если ваш arduino будет работать безупречно в течение многих лет. Но это не гарантирует, что каждый arduino будет работать так же.
Некоторые контрмеры повысят надежность:
- Используйте сторожевой таймер: лучше сбросить неотзывчивую систему, чем имея застрявшего/нехорошо себя ведущего.
- Избегайте использования любых библиотек, использующих выделение памяти.
- Реализуйте (если вы используете EEPROM) алгоритм для его сохранения!
- Хороший блок питания.
- Избегайте суровых условий (высокая температура, высокая влажность, большие и непрерывные тепловые циклы и т. д.).
Он, конечно, может работать 24/7. Я использую либо 5 В на выводе 5 В, либо 7808 на выводе Vin, чтобы разгрузить vreg. В идеале это было бы 6,5 В, но у меня нет таких источников. Вам может понадобиться развязывающий конденсатор на 5 В, чтобы смягчить любые незначительные скачки при включении питания.
Любое подключенное оборудование, работающее от 5 В, я питаю от 7805. Вы можете использовать LM317 или LM350 вместо 78XX, но для них вам понадобятся несколько резисторов, возможно, подстроечные резисторы.
- Отправка данных Arduino через Ethernet на сервер PHP.
- Простая веб-страница с Ethernet-шилдом Arduino на SD-карте
- Проблема с Ethernet shield/WebServer: «сервер находится по адресу 0.0.0.0». Есть предложения по отладке?
- Подключить Arduino Uno к веб-серверу видеокамеры через Ethernet (не работает)
- Ethernet Shield не подключается
- Как получить данные из базы данных моего сервера в переменную в моем Arduino?
- Клиент MQTT на Arduino + SIM900
- Удаленная загрузка кода на плату Arduino через интернет
Первый вопрос!, @TheDoctor
**Примечание модератора:** похоже, мы получаем много ответов, в которых утверждается, что это сработало в их ситуации. Если у вас есть технические дополнения к вопросу, не стесняйтесь ответить. Однако, технические ответы, похоже, говорят о том, что это работает. Если вы *абсолютно* обязаны подтвердить, что в вашей ситуации это сработало, лучше оставить комментарий., @Anonymous Penguin