Skocz do zawartości

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


Pomocna odpowiedź

Napisano

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();
}

 

No przecież tak masz w kodzie... ile to twoim zdaniem 180 x 7 (i następne takie? tam).

Poza tym funkcje irrcośtam nie wykonują się w zerowym czasie.

Jakieś jeszcze pytania?

 

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.

(edytowany)

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

Patrzyłeś w linki? Czy tak tylko jęczysz? Twój kod da się w 100% napisać tak że nie będzie blokował maina 

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...