Arduino stop loop

6 Ways to Stop an Arduino Running (resets, loops and more)

An Arduino can be stopped from running by unplugging the power, pressing the reset button, triggering an external reset, or by executing certain commands in a sketch such as sleep. Any of these approaches can be used to stop an LED blinking, stop a sketch running, or generally stop any Arduino program from processing data.

In this guide I’ve put together a list of all the different ways you can stop an Arduino running, including some out-of-the-box ideas such as using the watchdog timer.

1. Turn off the power by unplugging the Arduino safely

An Arduino can be safely disconnected from a power supply typically at any time. When disconnected, it will stop running its current program and lose nearly all of its memory. Only data saved to the EEPROM and program memory will be preserved. When power is restored, the Arduino will commence running its last sketch from the setup() function.

The only situation so far I’ve found unsafe to unplug an Arduino is when it’s being programmed. Even then, I have removed the power when the IDE is programming it and it seems to still be OK. I imagine if you’re uploading a new bootloader, that might be a time to be careful about unplugging it.

When the power is restored to an Arduino:

  • It runs the setup() function again
  • All variables and data are gone (unless saved safely – see below)
  • Any peripherals will have to be set up again

Variables and data can be safely saved when the power is shut off by using the EEPROM, which does not lose memory when power to the Arduino is disconnected. EEPROM is a section of memory that is not lost when an Arduino is reset or loses power. It can be thought of as a small SD card for an Arduino.

Please enable JavaScript

There is a limit on how many times the EEPROM can be written to: Approximately 100,000 writes per address. I’ve never seen what happens when this limit is exceeded, though I imagine the Arduino will eventually get to the point where writing to the used-up address does nothing.

Want to know more about how to use the different types of memory on an Arduino (EEPROM, flash, etc.)? Check out the guide I wrote here: chipwired.com/arduino-memory-amount-guide

Here’s some basic code to save a measurement to the first byte of EEPROM:

If it seems like the Arduino is hanging or crashing, check out my guide on different ways an Arduino can crash or hang (I did them to my own Arduino to show you what can happen), it’s over here: chipwired.com/arduino-crash-hang-guide/

2. Reset the Arduino via the button (or code)

Pressing the reset button on an Arduino stops the microcontroller executing code by activating its external reset pin. Once the reset button is released, the Arduino microcontroller will start running its last sketch from the setup() function. As the button does not disconnect power from the board, peripherals such as the WiFi chip, will still be in their last state and should be initialised again.

Similarly to removing the power, any data that’s not in the EEPROM or program memory will be lost when the microcontroller is reset.

It is also possible to trigger this reset using code in a sketch. From the research I conducted, it seems the best way to do this is to use the watchdog timer.

An example of how to reset an Arduino from a sketch (using the watchdog timer) is included below:

3. Stop a loop from running by using break

If your Arduino gets stuck in an infinite loop that you need to stop running, there is a command that can be used in a sketch to break free of the loop.

An Arduino can break from a loop using the break keyword. When writing a sketch that uses an infinite loop, including the break keyword will give the Arduino a path to exit the loop. This does not apply to the loop() function which can be broken using the return keyword.

Here’s an example of how to break an infinite loop:

4. Trap an Arduino in a loop to stop it executing other code

If your goal is to stop the Arduino executing something else, such as if you want it to wait while a peripheral is getting ready, you can trip the Arduino in an infinite loop.

To make an infinite loop in Arduino, use one of the following:

Either of these loops will never exit. To have the Arduino exit the loop, the break keyword can be used.

An Arduino can stop executing its current sketch forever by being put into an infinite loop. As an Arduino is typically always running within an infinite (the loop() function), using an infinite loop is typically only required while waiting for something.

5. Put the Arduino to sleep with Sleep Mode

An Arduino can stop running most of its functions and significantly reduce its power consumption by entering Sleep Mode. The method to wake up the Arduino can be chosen before putting it in sleep mode; typically an Arduino is configured to wake up by timer or by external interrupt.

A variety of sleep modes are available depending on which board you’re using. A sample of code I tested on my UNO WiFi Rev 2 is included below on how to put it to sleep:

I had to read the code of the sleep library to figure out the sleep mode constants to use, it seems to be:

  • For idle (slight reduction in power): SLEEP_MODE_IDLE
  • For standby (more reduction in power): SLEEP_MODE_STANDBY
  • For power-down (most reduction in power): SLEEP_MODE_PWR_DOWN

When I ran the earlier code snipped with IDLE or STANDBY sleep modes, the LED still blinked. Only SLEEP_MODE_PWR_DOWN stopped code from running (the LEDs no longer blinked when the Arduino was put to sleep).

If you’re interested in how much power an Arduino uses while it’s in sleep mode, this is one of the tests I conducted when figuring out how much power an Arduino actually uses. Check out my test results here for more details: chipwired.com/arduino-power-use

6. Use an external relay to cut the power

It is possible to connect the Arduino’s own power supply to a relay, and then control that relay from an Arduino sketch. This allows the Arduino to turn itself off or reset itself using a relay it controls.

To use a relay to reset an Arduino:

  • Connect the power supply to the back contacts of the relay, so that the energising the relay coil breaks the Arduino power supply circuit
  • Connect the coil to one of the output pins on the Arduino
  • Configure the sketch to start the output pin as LOW, and then set it to HIGH when you want to reset the Arduino

Disclaimer: I haven’t tried this myself! Please get in touch and let me know if this actually works for you. The steps above are based on my knowledge of relay circuits and Arduino capability, and not the result of an experiment I’ve run.

The Arduino output pins may toggle between high and low when the chip first turns on, so I’d recommend trying a slow to pick configuration. These may also be referred to as “timed open” relays.

References

Here are the references I use to put this together

Chris likes to experiment with Arduino code – sometimes that means it gets stuck! These are some of the ways to get it stuck on purpose, and to reset it whenever it does get stuck.

Engineer and electronics enthusiast. Enjoys solving problems with electronics and programming.

When working with small computers it can be important to monitor the amount of memory and storage space that is available to the programs running on the device. Small and embedded computers often.

«If it fits, it works» — this is not a philosophy that I’ve found to put your Raspberry Pi project at risk of not working. Even though the Raspberry Pi uses a USB connector for its power source, it.

About

Unleashing the power of small computers. I believe cheap small computers have incredible potential and I want to help unleash that potential with you.

Hi! My name’s Chris, I’m an engineer, a consultant, and I enjoy getting things done with electronics. I’m here to help you unlock the value of small computers and embedded computer systems. report this ad

report this ad

Источник

Stop a Loop Arduino

This tutorial will discuss methods to stop a loop in Arduino. There are two kinds of loops in Arduino; one is the void loop() which is provided by default and the other one which user creates there own. User-created loops can be ended easily using break method. To end the void loop() of Arduino, you can use the following methods.

Stop the void loop() Using Sleep_n0m1 Library

The above method may work for all Arduino boards, but the Arduino will continue to use power. Using Sleep_n0m1 library, you can put your Arduino CPU to permanent sleep until you reset it manually or using a timer. Please note that this may not work for all Arduino boards.

Please make sure to use Sleep_n0m1 library after you have finished with your code. This method will draw only a little power. Use this link for more details.

Stop the void loop() Using exit(0)

The void loop() of Arduino can be ended using the exit(0) method after your code, but note that Arduino.cc does not provide any method to end this loop, so that this method may not work for all Arduino boards.

Please note that after exit(0) , your Arduino will stop working until you reset it manually. So make sure you use this method after the code has finished its task.

Stop the void loop() Using an Infinite Loop

The above method may not work for all Arduino boards, so we have to use another method. The infinite loop method will work for all the Arduino boards, but the Arduino will stay awake and will continue consuming power. In this method, you can insert an infinite loop after your code. Arduino will process your code, enter an infinite loop and stay there until you reset it manually.

If Arduino enters the infinite loop, it will not return until you reset it, so make sure to use an infinite loop after you have finished with your code.

Источник

how to stop a loop arduino

I have this loop, how would I end the loop?

6 Answers 6

This isn’t published on Arduino.cc but you can in fact exit from the loop routine with a simple exit(0);

This will compile on pretty much any board you have in your board list. I’m using IDE 1.0.6. I’ve tested it with Uno, Mega, Micro Pro and even the Adafruit Trinket

I use this in projects where I wire in a button to the reset pin. Basically your loop runs until exit(0); and then just persists in the last state. I’ve made some robots for my kids, and each time the press a button (reset) the code starts from the start of the loop() function.

Arduino specifically provides absolutely no way to exit their loop function, as exhibited by the code that actually runs it:

Besides, on a microcontroller there isn’t anything to exit to in the first place.

The closest you can do is to just halt the processor. That will stop processing until it’s reset.

Matti Virkkunen said it right, there’s no «decent» way of stopping the loop. Nonetheless, by looking at your code and making several assumptions, I imagine you’re trying to output a signal with a given frequency, but you want to be able to stop it.

If that’s the case, there are several solutions:

If you want to generate the signal with the input of a button you could do the following

In this case we’re using a button pin as an INPUT_PULLUP . You can read the Arduino reference for more information about this topic, but in a nutshell this configuration sets an internal pullup resistor, this way you can just have your button connected to ground, with no need of external resistors. Note: This will invert the levels of the button, LOW will be pressed and HIGH will be released.

The other option would be using one of the built-ins hardware timers to get a function called periodically with interruptions. I won’t go in depth be here’s a great description of what it is and how to use it.

The three options that come to mind:

1st) End void loop() with while(1) . or equally as good. while(true)

This option runs your code once and then kicks the Ard into an endless «invisible» loop. Perhaps not the nicest way to go, but as far as outside appearances, it gets the job done.
The Ard will continue to draw current while it spins itself in an endless circle. perhaps one could set up a sort of timer function that puts the Ard to sleep after so many seconds, minutes, etc., of looping. just a thought. there are certainly various sleep libraries out there. see e.g., Monk, Programming Arduino: Next Steps, pgs., 85-100 for further discussion of such.

2nd) Create a «stop main loop» function with a conditional control structure that makes its initial test fail on a second pass.
This often requires declaring a global variable and having the «stop main loop» function toggle the value of the variable upon termination. E.g.,

Granted, this might not be especially pretty, but it also works.
It kicks the Ard into another endless «invisible» loop, but this time it’s a case of repeatedly checking the if(stop_it == false) condition in stop_main_loop() which of course fails to pass every time after the first time through.

3rd) One could once again use a global variable but use a simple if (test == blah)<> structure instead of a fancy «stop main loop» function.

There are certainly other ways to «stop» that pesky endless main loop but these three as well as those already mentioned should get you started.

Источник

Arduino.ru

как остановить Loop ??

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

Ребя помогите не множко подсказкой . Нужно при подачи тока на Д2 — Ардуина делала один определенный эффект и после этого Д2 — он остается под нагрузкой , но нужно, что бы она эффект сделала только один раз при самой подачи, а после выключила и не повторяла.

Затем снова при новой подачи Д2 — она вновь делает тот же эффект и вновь забывает о нем до след. раза

Эффект прописан, пробовал прописывать эффект в void — не работает. В лупе — повторяет постояяно. Может есть комада через луп, дабы она его останавливала ?

Спасибо большое вам!! за ответы)

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

При чем тут void я честно говоря не понял.

Ребя помогите не множко подсказкой . Нужно при подачи тока на Д2 — Ардуина делала один определенный эффект и после этого Д2 — он остается под нагрузкой , но нужно, что бы она эффект сделала только один раз при самой подачи, а после выключила и не повторяла.

задействуйте флаг процедуры

Достаточно одного while() ;) Или двух. Мозг уж гонит прочь программный код.

как остановить Loop ??

Как остановить тёщу, когда она «завелась»? Никак! Только выключением питания.

Впрочем, можно ещё попробоавать что-нибудь прописать в struct.

ого) спасибо за ответы , ребят !) буду думать!)

а нельзя сделать на пример так по алгоритму?

делает цикл один раз

снова проверяет , если всё еще HIGH

1) «Ждал» низкого уровня на входе (нажатие кнопки);
2) Что-то делал;
3) «Ждал» высокого уровня на входе (отпускание);
4) Заходил на новый круг.

С while (LOW == digitalRead(2)); МК ждет низкого уровня. Дальше разберетесь, думаю.

«Да что тут думать! Трясьти надо.»

ибо простой вариант прописать эффект В setup if — D2 HIGH и сам эффект — не работает к сожалению :/

В setup if — D2 HIGH и сам эффект — не работает к сожалению :/

Ужас! Это у сетапа такие ограничения? Буду знать.

В сетапе можно запустить цикл, из сетапа можно запустить функцию с циклом и вернуться обратно, а можно loop оставить пустым — тогда система остановится и больше ничего выполнять не будет. Объясните толком чего Вы хотите в целом. Вы вырываете из общей задачи Вашу мелкую хотелку и пытаетесь ее куда-то засунуть. Или это у Вас экзерсис такой?

ибо простой вариант прописать эффект В setup if — D2 HIGH и сам эффект — не работает к сожалению :/

ибо простой вариант прописать эффект В setup if — D2 HIGH и сам эффект — не работает к сожалению :/

Именно так мне посоветовал кто то на этом форуме :)

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

Как красиво называется тема:) А еще красивее было бы спросить — как порвать этот порочный круг.
Попробуйте «return» !

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

Код простой — при подаче на контакт (вставка ключа в зажигание) Д2 на ардуино нано — Лента загорелась буквально на секунды 3 , затем Д2 все еще находится под напряжением ибо выключается только , когда выбираешь ключ из машины . Потом опять вставляю ключ в машине — питание подалось на Д2 сработал эффект и погас ,напруга останется на Д2 до тех пор, пока не выберешь ключ. Но нужно,что бы лента гасла и не загоралась больше , пока есть питание на Д2. То есть срабатывала только в начале.. ВСе вроде бы просто , но на этой самой же ленте имеются и другие циклы не заивисмые от Д2. То есть нужно завершить цикл и что бы ардуинка забыла о нем :) до следующий подачи тока

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

Спасибо еще раз.

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

Ну, простой или сложный — выкладывайте.

Загрузи этот скетч и посмотри что у тебя печатается в Мониторе Порта

Загрузи этот скетч и посмотри что у тебя печатается в Мониторе Порта

Мессадж в том, что бы посмотреть что у тебя с портом происходит.

Ну не хочешь грузить — не надо. За сим откланиваюсь.

я бы посоветовал вынести разовую процедуру в setup

Мессадж в том, что бы посмотреть что у тебя с портом происходит.

Ну не хочешь грузить — не надо. За сим откланиваюсь.

я бы посоветовал вынести разовую процедуру в setup

я бы посоветовал вынести разовую процедуру в setup

Loop, стой! раз-два.

abort() остановит всё что хочешь, включая loop, только принесет ли это радость?

А зачем видеть, доп. устройства подключаются через контакт 30 замка зажигания или аналогично, вытащили ключ, обесточили всё, кроме штатных устройств, у приятеля авто сгорело от замыкания + провода прикуривателя на массу, предохранитель был заменён на вставку (в автосервисе однако), так как перед этим три раза перегорал, а приятель приезжал по гарантии (((

А зачем видеть, доп. устройства подключаются через контакт 30 замка зажигания или аналогично, вытащили ключ, обесточили всё, кроме штатных устройств, у приятеля авто сгорело от замыкания + провода прикуривателя на массу, предохранитель был заменён на вставку (в автосервисе однако), так как перед этим три раза перегорал, а приятель приезжал по гарантии (((

Вообще идея не плоха как факт реализации придумал так:

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

Тогда вопрос . Идет контакт на ардуинку от магнитолы при вставки ключа — (я приобрел УСБ преобразователь ну с 12 волт на 5 волт он работает с 22в макс на 3А) ардуинка будет питаться через усб а запитка на магнитоле, и туда же проведу фазу от аварийки (дабы ардуинка запитывалась от аварийки, когда та работает) тут у меня глупые предположения ибо забыл банальный курс напряжния и его закон :)) будет ли это как то сказываться или конфликтовать ток от зажигания и аварийки, если одновременно включить аварийку? диоды как бы поставлю же.. собвственно, если нет останется найти фазу аварийек и все) думаю это в кнопке)

Как вы думаете? теоретически же адекватно ?

ну если ключ уже на д2, запустите наконец в прерывании по фронту свою хотелку

Как вы думаете? теоретически же адекватно ?

Мне кажется, всё неадекватно… определитесь, что хотите вообще. Название темы одно, по факту хотели другое, на эту хотелку код вам привёл, а теперь вообще разговор о третьем…

Не, всё норм. Просто, приколы палаты номер 6.)))

Как вы думаете? теоретически же адекватно ?

Есть цель, а каким способом — не важно , скетч не работает да и кто му же я и половины ваших сленгов тут не понимаю. Почему я не могу найти обходной путь,если не получается таким путем ? Я же написал я не прогер.

скетч не работает

я и половины ваших сленгов тут не понимаю.

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

скетч не работает

я и половины ваших сленгов тут не понимаю.

все очень даже понятно, только вот у меня 4 ленты :) и с этим возникли сложности. Результат был таков — я включаю на ХАЙ — загораются на 1 ленте пару диодов. Выключаю — загораются дополнительно пару диодов и предыдущие не выключаются. Включаю снова — вновь загораются еще новые диоды, предыдущие не гаснут. Выключаю — еще плюсуются. Так вот скажите мне, не выглядит ли это бредом ? выглядит :) я не отрицаю, что скетч рабочий, мейби я где то накосячил, но результат был именно таким . Я ну оочень много чего перепробывал , есть мысли может просто заплатить кому денюжку , но с переводом денег будут проблемы :) проблема не в деньгах а в переводе.

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

ВестернЮнион есть везде кроме, наверное Антарктиды. Вы же не оттуда, полагаю, пишете. А задачу такую (или схожую) тут почти каждый решал раз по ндцать — всякие там подсветки спидометров, дверей и пр.

Так что, ситуация тут вовсе не безвыходная и с кучей альтернативных обходных путей.

«ну если ключ уже на д2, запустите наконец в прерывании по фронту» — откуда мне новичку вообще понять о чем он говорит ? вот умничать мастера, ибо вы мастера. Может быть вы будучи новечком уже понимали о чем речь ? Единственный совет, что я переворил и понял это про разовую процедуру в сетап. Именно по нему я и комбинирую.

беда в том, что вы совершенно не умеете напрягать свой ум и не способны даже при наличии КЛЮЧЕВЫХ слов сформировать банальный запрос в поисковик типа «ардуино прерывание по фронту»

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

остальное вам коллеги уже написали

«ну если ключ уже на д2, запустите наконец в прерывании по фронту» — откуда мне новичку вообще понять о чем он говорит ? вот умничать мастера, ибо вы мастера. Может быть вы будучи новечком уже понимали о чем речь ? Единственный совет, что я переворил и понял это про разовую процедуру в сетап. Именно по нему я и комбинирую.

беда в том, что вы совершенно не умеете напрягать свой ум и не способны даже при наличии КЛЮЧЕВЫХ слов сформировать банальный запрос в поисковик типа «ардуино прерывание по фронту»

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

остальное вам коллеги уже написали

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

Однако за помощь спасибо

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

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

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

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

Дорогой, Вас никто не троллит. Попробуйте понять, что я сейчас скажу.

Если Вы хоть в чём-то специалист, то должны понимать, что чайник может задать вопросы, на которые ответить невозможно, т.к. вопросы являются полным, абсолютным, рафинированным бредом.

Вот если бы Вы были специалистом, скажем в автомобилях, а я бы спросил: «Какую свечу мне надо поставить в тормозную колодку, чтобы карбюратор ремня безопасности обеспечил правильный угол развала?» Что бы Вы ответили? Если бы Вы меня послали, я бы сказал, что Вы сноб, которому влом помочь новичку. А если бы начали что-то объяснять, я бы ничерта не понял, и сказал бы, что Вы меня троллите, и издеваетесь, вместо того чтобы просто и понятно объяснить «какой суппорт нужно засунуть в бензобак, чтобы в дворниках была правильная компрессия наклона фар?», вопрос-то для специалиста простой, а некоторые умники надувают щёки и цену себе набивают.

Так вот, если Вы хоть в чём-то специалист, то поверьте мне (говорю Вам как специалист специалисту) в этой области Вы задаёте именно такого типа вопросы, как я привёл выше. Т.е. у Вас не хватает знаний ни на то, чтобы задать вопрос, ни на то, чтобы понять ответ.

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

Если что, то всё это написано абсолютно без стёба и доброжелательно. Цели унизить или обидеть не было – отвечаю.

Источник

Adblock
detector