Два способа перезагрузить Arduino на программном уровне
Для того, чтобы перезагрузить ваш Arduino не нажимая кнопку Reset, существует два варианта. Ниже рассмотрены оба.
Для их реализации потребуется минимум дополнительной электрической обвязки.
Используем провод, подключенный к 12 контакту
В этом случае светодиод на 13 пине Arduino (можно использовать и встроенный светодиод), мигает. 12 пин подключается к контакту Reset с помощью одного проводника.

Без дополнительных ухищрений на программном уровне не обойтись, так как в начале работы нашего скетча, все пины на Arduino принимают значение LOW. В результате мы отключим наш контроллер. Но! Трюк заключается в том, что первое, что происходит в пределах функции setup(): мы подаем HIGH на контакт 12, который вызывает наш пин reset (digitalWrite(resetPin, HIGH), и таким образом обеспечивает сигнал HIGH на контакте Arduino RESET.
int led = 13;//пин 13 будет работать в качестве пина OUTPUT
int resetPin = 12;
// функция setup отработате один раз, после того как вы нажмете reset:
void setup() {
digitalWrite(resetPin, HIGH);
delay(200);
// инициализируем цифровой пин в качестве выхода
pinMode(led, OUTPUT);
pinMode(resetPin, OUTPUT);
Serial.begin(9600);// инициализируем подключение по серийному порту
Serial.println("reset");// отображаем строку reset, чтобы знать, что была произведена перезагрузка и
// опять отрабатывает функция setup
delay(200);
}
// цикл loop отрабатывает вновь и вновь:
void loop() {
delay(10);
digitalWrite(led, HIGH); // зажигаем светодиод (HIGH – это подача напряжение)
Serial.println("on");
delay(1000); // ждем одну секунду
digitalWrite(led, LOW); // отключаем светодиод, подав команду LOW
Serial.println("off");
delay(1000); // ждем одну секунду
Serial.println("resetting");
delay(10);
digitalWrite(resetPin, LOW);
Serial.println("this never happens");
// этого никогда не произойдет, так как Arduino перезагружается
}
Используем исключительно программную перезагрузку

В примере, который приведен ниже, вам не понадобится никакого дополнительного подключения. Мы просто инициализируем функцию reset и после вызываем reset.
void(* resetFunc) (void) = 0;//объявляем функцию reset с адресом 0
...
resetFunc(); //вызываем reset
Вся программа для перезагрузки Arduino:
int led = 13;
// функция setup отрабатывает один раз после нажатия reset:
void setup() {
// инициализируем цифровой пин в качестве выхода.
pinMode(led, OUTPUT);
Serial.begin(9600);// инициализируем серийный порт
}
void(* resetFunc) (void) = 0; // объявляем функцию reset
// этот цикл отрабатывается вновь и вновь:
void loop() {
digitalWrite(led, HIGH); // включаем светодиод
Serial.println("on");
delay(1000); // ждем секунду
digitalWrite(led, LOW); // отключаем светодиод, подавая команду LOW
Serial.println("off");
delay(1000); // ждем одну секунду
Serial.println("resetting");
resetFunc(); //вызываем reset
delay(100);
Serial.println("never happens");
}
Для чего можно использовать программную перезагрузку Arduino?
Перезагрузку Arduino на программном уровне можно использовать при работе с nRF24L01+ 2.4 Гц трансивером (с использованием библиотеки RF24 library). Этот скетч отлично подходит в тех случаях, когда трансивер теряет связь и перестает работать. Обеспечить перезагрузку модулей радиопередатчиков 2.4G Гц достаточно сложно, а вот перезагрузить ваш Arduino Uno или Arduino Pro Mini не составит проблем. Ваша программа должна отработать примерно следующее: "Если на протяжении 100 мс не было получено пакета данных, Arduino должен перезагрузиться". В результате модули радиопередатчиков автоматически переподключаются и связь налаживается!
Оставляйте Ваши комментарии, вопросы и делитесь личным опытом ниже. В дискуссии часто рождаются новые идеи и проекты!