Skocz do zawartości

Dlaczego pętla loop() w Arduino wykonuje się co 5 sekund? Analiza kodu


Igus

Pomocna odpowiedź

Nie wiem co w poniższym kodzie wprowadza opóźnienie. Może ja sprecyzuje... Pętla loop wykonuje się co aż 5 sekund! Nie ma żadnych opóźnień przed delay(), więc naprawdę nie wiem. Podsyłam ponieżej ten kod
 

#include <Wire.h>
#include <PN532_I2C.h>
#include <PN532.h>
#include <NfcAdapter.h>
#include <Servo.h>
#include <IRremote.h>

#define IR_RECEIVE_PIN 2

Servo serwomechanizm;
int otwarte = 0;
unsigned long czasOtwarcia = 0;

PN532_I2C pn532_i2c(Wire);
NfcAdapter nfc = NfcAdapter(pn532_i2c);
String tagId = "None";
int currentPosition = 90;

void setup(void)
{
Serial.begin(115200);
Serial.println("System initialized");
serwomechanizm.attach(10);
nfc.begin();
IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);
serwomechanizm.write(currentPosition);
}

void loop()
{

if (IrReceiver.decode()) {
uint16_t command = IrReceiver.decodedIRData.command;
Serial.println(command);
switch (command) {
case 64:
otwarte = 1;
powolneOtwarcie();
break;
case 25:
powolneZamkniecie();
break;

}
delay(100); // wait a bit
IrReceiver.resume();
}



readNFC();

// Jeśli szlaban jest otwarty, sprawdź czy minęło 210 sekund
if (otwarte == 1 && millis() - czasOtwarcia > 10000) {
powolneZamkniecie();
}

delay(100); // Możesz zmniejszyć to opóźnienie, aby częściej sprawdzać warunki
}

void readNFC()
{
if (nfc.tagPresent())
{
NfcTag tag = nfc.read();
tag.print();
tagId = tag.getUidString();
Serial.println("Tag ID: " + tagId);

otwarte = 1;
czasOtwarcia = millis();
powolneOtwarcie();
}
}

void powolneOtwarcie() {
serwomechanizm.attach(10);
for (int pos = currentPosition; pos <= 180; pos += 1) {
serwomechanizm.write(pos);
delay(7);
}
currentPosition = 180;
serwomechanizm.detach();
}

void powolneZamkniecie() {
serwomechanizm.attach(10);
for (int pos = currentPosition; pos >= 90; pos -= 1) {
serwomechanizm.write(pos);
delay(7);
}
currentPosition = 90;
serwomechanizm.detach();
}

 

Link do komentarza
Share on other sites

Biblioteka może i jest problemem, ale Twoje funkcje nie pomagają, np. powolne otwarcie. Jeśli chcesz coś wolniutko otwierać, to zamiast to robić for 100x na 7ms delay wywołujesz funkcję z millis co 7 ms i sprawdzasz, czy jest otwierane, czy zamykane, czy ma być otwarte, czy zamknięte i włączasz taką opcję jak trzeba, wychodzisz do loop i niech się dalej kręci, stan zapamiętujesz w zmiennej static, tak samo krok otwierania czy zamykania. Oczywiście cały loop musi tak biegać, żeby nie było czkawki, że jakaś funkcja zabiera czas loop na milisekundy, bo będzie słabo.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Co z tego jak nadal niczego się nie nauczyłeś. To tak jakby cię bolał palec, po usunięciu palec boleć przestał xD

Kij z tym że przyczyną bólu palca był przygnieciony paznokieć 

Edytowano przez _LM_
  • Lubię! 2
Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.