как остановить цикл arduino

У меня есть этот цикл, как бы закончить цикл?

void loop() { // read the pushbutton input pin: a ++; Serial.println(a); analogWrite(speakerOut, NULL); if(a > 50 && a < 300){ analogWrite(speakerOut, 200); } if(a = 300 && a <= 2499){ analogWrite(speakerOut, NULL); } 

Arduino специально не дает абсолютно никакого выхода для выхода из своей функции loop , как показывает код, который фактически запускает его:

 setup(); for (;;) { loop(); if (serialEventRun) serialEventRun(); } 

Кроме того, на микроcontrollerе в первую очередь нет выхода.

Самое близкое, что вы можете сделать, это просто остановить процессор. Это прекратит обработку, пока не будет сброшено.

Это не опубликовано на Arduino.cc, но вы можете фактически выйти из цикла с простым выходом (0);

Это будет составлять практически любую доску, которую вы имеете в своем списке. Я использую IDE 1.0.6. Я тестировал его с помощью Uno, Mega, Micro Pro и даже брелка Adafruit

 void loop() { // All of your code here /* Note you should clean up any of your I/O here as on exit, all 'ON'outputs remain HIGH */ // Exit the loop exit(0); //The 0 is required to prevent compile error. } 

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

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

Если это так, есть несколько решений:

  1. Если вы хотите сгенерировать сигнал с помощью кнопки, вы можете сделать следующее

     int speakerOut = A0; int buttonPin = 13; void setup() { pinMode(speakerOut, OUTPUT); pinMode(buttonPin, INPUT_PULLUP); } int a = 0; void loop() { if(digitalRead(buttonPin) == LOW) { a ++; Serial.println(a); analogWrite(speakerOut, NULL); if(a > 50 && a < 300) { analogWrite(speakerOut, 200); } if(a <= 49) { analogWrite(speakerOut, NULL); } if(a >= 300 && a <= 2499) { analogWrite(speakerOut, NULL); } } } 

    В этом случае мы используем кнопочный контакт как INPUT_PULLUP . Вы можете прочитать ссылку Arduino для получения дополнительной информации об этой теме, но в двух словах эта конфигурация устанавливает внутренний резистор для подтягивания, таким образом вы можете просто подключить вашу кнопку к земле, без необходимости использования внешних резисторов. Примечание . Это приведет к инвертированию уровней кнопки, LOW будет нажата, а HIGH будет отпущена.

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

Три варианта, которые приходят на ум:

1-й) Конец void loop() с while(1) … или равно как хороший … while(true)

 void loop(){ //the code you want to run once here, //eg, If (blah == blah)...etc. while(1) //last line of main loop } 

Эта опция запускает ваш код один раз, а затем ударяет Ard в бесконечный «невидимый» цикл. Возможно, это не самый приятный способ, но, по внешнему виду, он выполняет свою работу.
Ard продолжит рисовать ток, пока он вращается в бесконечном круге … возможно, можно было бы создать своего рода функцию таймера, которая заставит Ard спать после стольких секунд, минут и т. Д. Цикла … просто мысль … там, конечно, есть различные библиотеки сна … см., например, Monk, Programming Arduino: Next Steps, pgs., 85-100 для дальнейшего обсуждения таких вопросов.

2nd) Создайте функцию «stop main loop» с условной структурой управления, которая делает ее первоначальный тест неудачным на втором проходе.
Это часто требует объявления глобальной переменной и функции «stop main loop» для переключения значения переменной после завершения. Например,

 boolean stop_it = false; //global variable void setup(){ Serial.begin(9600); //blah... } boolean stop_main_loop(){ //fancy stop main loop function if(stop_it == false){ //which it will be the first time through Serial.println("This should print once."); //then do some more blah....you can locate all the // code you want to run once here....eventually end by //toggling the "stop_it" variable ... } stop_it = true; //...like this return stop_it; //then send this newly updated "stop_it" value // outside the function } void loop{ stop_it = stop_main_loop(); //and finally catch that updated //value and store it in the global stop_it //variable, effectively //halting the loop ... } 

Конечно, это может быть не особенно красиво, но оно также работает.
Он выталкивает Ard в другой бесконечный «невидимый» цикл, но на этот раз это случай многократной проверки условия if(stop_it == false) в stop_main_loop() который, конечно же, не проходит каждый раз после первого раза.

3-й). Можно снова использовать глобальную переменную, но использовать простую структуру if (test == blah){} вместо функции «stop main loop».

 boolean start = true; //global variable void setup(){ Serial.begin(9600); } void loop(){ if(start == true){ //which it will be the first time through Serial.println("This should print once."); //the code you want to run once here, //eg, more If (blah == blah)...etc. } start = false; //toggle value of global "start" variable //Next time around, the if test is sure to fail. } 

Есть, конечно, другие способы «остановить» эту досадную бесконечную основную петлю, но эти три, а также те, которые уже упомянуты, должны начать вас.

Это отключит прерывания и включит CPU (постоянный, пока перезагрузка / питание не переключится):

 cli(); sleep_enable(); sleep_cpu(); 

См. Также http://arduino.land/FAQ/content/7/47/en/how-to-stop-an-arduino-sketch.html , для получения более подробной информации.

 > #include  > #include  > #include  > > #define RST_PIN 4 > #define SS_PIN 2 > > String content=""; > > byte mac[]={0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; IPAddress > ip(192,168,3,15); > > MFRC522 mfrc522(SS_PIN, RST_PIN); EthernetClient client; > > void setup() { Serial.begin(9600); > SPI.begin(); while(!Serial){;} Ethernet.begin(mac, ip); > mfrc522.PCD_Init(); > //Serial.println(F("Silahkan Scan Kartu RFID Anda:")); } > > void loop() { rfid(); database(); } > > void rfid(){ //membaca kartu RFID if ( ! > mfrc522.PICC_IsNewCardPresent()) { > return; } // memilih salah satu card yang terdeteksi if ( ! mfrc522.PICC_ReadCardSerial()) { > return; } > //Serial.print("Kartu Anda Adalah :"); //String content= ""; //byte letter; //for (byte i = 0; i < mfrc522.uid.size; i++) { > //Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "); > //Serial.print(mfrc522.uid.uidByte[i], HEX); > //content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ")); > //content.concat(String(mfrc522.uid.uidByte[i], HEX)); //} //Serial.println(); //delay(1000); //change value if you want to > read cards faster > > //mfrc522.PICC_HaltA(); //mfrc522.PCD_StopCrypto1(); } > > void database(){ EthernetClient client; rfid(); if > (client.connect("192.168.3.12", 80)){ > Serial.print("Kartu Anda Adalah :"); > String content=""; > byte letter; > for (byte i = 0; i < mfrc522.uid.size; i++) { > Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "); > Serial.print(mfrc522.uid.uidByte[i], HEX); > content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ")); > content.concat(String(mfrc522.uid.uidByte[i], HEX)); } Serial.println(); delay(1000); //change value if you want to read > cards faster mfrc522.PICC_HaltA(); mfrc522.PCD_StopCrypto1(); > > //Serial.println("connected"); > Serial.print(content); > client.println("POST /gerbang2/insert.php HTTP/1.1"); > client.println("Host: 192,168,3,12"); > client.println("Connection: close"); > client.print("Content-Type: application/x-www-form-urlencoded\n"); > client.print("Content-Length: "); > client.print(content.length()); > client.print("\n\n"); > client.print(content); > Serial.println(content); > delay (1000); > client.stop(); } else{ > Serial.println("Connection Failed."); > Serial.println(); > delay (1000); } } 

как остановить цикл в последовательном мониторе?