Skocz do zawartości

Kurs Arduino II - #4 - przerwania, kontaktron, czujnik PIR


Komentator

Pomocna odpowiedź

12 minut temu, farmaceuta napisał:

kod powyzej u mnie dziala bez zarzutu

Jednemu działa, drugiemu nie.

Zasadnicza sprawa - w procedurach obsługi przerwania (ISR) nie powinno używać się funkcji, które same polegają na przerwaniach,  w szczególności dotyczy to Serial.print()  (a także np. delay()).

Procedura ISR powinna być krótka, szybko się wykonywać, a wszystko inne powinno być w loop().

W przypadku ESP32 jest to jeszcze bardziej istotne ze względu na obsługę wifi.

Link do komentarza
Share on other sites

5 minut temu, PierotB napisał:

@farmaceuta a w jakim celu dałeś zwłokę 200ms? W tym wypadku jeśli impulsy będą podawane poniżej tego czasu nie będą liczone. Prawda?

Dokladnie tak...to taki popularny filtr programowy dla drgania styków od guzików np....ten czas oczywiście trzeba dobrać według własnego projektu (częstotliwości "wciśnięć")

Link do komentarza
Share on other sites

Witam, mam problem z czujnikiem PIR. Wszystko jest podłączone prawidłowo, a kod został skopiowany z artykułu. Problem polega na tym, że czujnik nie wykrywa ruchu. Żadne machanie ręką ani nic. Dopiero jak poruszam tą pokrywą (okrągłą plastikową kopułą) to losowo czasem zapali się czerwony kolor na diodzie RGB. Nie wiem czemu tak się dzieje. Dodam, że potencjometry również są skręcone tak jak pisało w artykule.

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


#define LED_R 9
#define LED_G 10
#define LED_B 11
String zamkniete = "Okno zamknięte ";
String otwarte = "Okno otwarte";
#define KONTAKTRON 0
int buzzer = A0;
int dt=100;

void setup() {
  pinMode(LED_R, OUTPUT);  //Poszczególne piny sterujące diodą jako wyjścia
  pinMode(LED_G, OUTPUT);
  pinMode(LED_B, OUTPUT);
  pinMode(buzzer, OUTPUT);

  pinMode(KONTAKTRON, INPUT_PULLUP);  //Kontaktron jako wejście
  Serial.begin(9600);
  digitalWrite(LED_R, LOW);  //Dioda wyłączona
  digitalWrite(LED_G, LOW);
  digitalWrite(LED_B, LOW);
}

void loop() {
  if (digitalRead(KONTAKTRON) == LOW) {  //Jeśli czujnik zwarty
    digitalWrite(LED_R, LOW);            //Stan OK - dioda zielona
    digitalWrite(LED_G, HIGH);
    Serial.println(zamkniete);
    digitalWrite(buzzer,LOW);
  } else {
    digitalWrite(LED_R, HIGH);  //Stan ALARM - dioda czerwona
    digitalWrite(LED_G, LOW);
    Serial.println(otwarte);
    tone(buzzer,1000);
    delay(dt);
    noTone(buzzer);
    delay(dt);

  }
}

Mój sposób na zadanie domowe 4.1 

Miałem problem ponieważ mój program nie chciał mi się załadować ale wystarczyło odpiąć kabel od pinu 0 na arduino i po załadowaniu programu podłączyć go ponownie. Jest ktoś w stanie wyjaśnić dlaczego tak się stało ??

 

Link do komentarza
Share on other sites

Mam pytanie co do przerwań . Korzystam z RISING i nie wiem czy dobrze zrozumiałem artykuł . Chodzi mi o to że po zmianie stanu z 0 na 1 taki stan juz pozostanie , czyli cały czas powinna świecić się dioda czerwona ? Nie będzie to tak jak w poprzedniej części z PIR gdzie chwile po odnotowaniu ruchu dioda wracała do koloru zielonego ? Będę wdzięczny za naprostowanie tematu . Dzięki 


#define LED_R 10
#define LED_G 11
#define LED_B 12
String zamkniete = "Okno zamknięte ";
String otwarte = "Okno otwarte";
#define KONTAKTRON 0
int buzzer = A0;
int dt = 2000;
int yellow = 13;
int PIR = 2;

void setup() {
  pinMode(LED_R, OUTPUT);  //Poszczególne piny sterujące diodą jako wyjścia
  pinMode(LED_G, OUTPUT);
  pinMode(LED_B, OUTPUT);
  pinMode(buzzer, OUTPUT);
  pinMode(yellow, OUTPUT);
  digitalWrite(yellow, LOW);
  pinMode(PIR, INPUT);
  pinMode(KONTAKTRON, INPUT_PULLUP);  //Kontaktron jako wejście
  Serial.begin(9600);
  digitalWrite(LED_R, LOW);  //Dioda wyłączona
  digitalWrite(LED_G, HIGH);
  digitalWrite(LED_B, LOW);

  attachInterrupt(digitalPinToInterrupt(PIR), alarm, RISING);  //Przerwanie reagujące na zbocze rosnące
}

void loop() {
  digitalWrite(yellow, HIGH);
  delay(dt);
  digitalWrite(yellow, LOW);
  delay(dt);
}
void alarm() {
  digitalWrite(LED_R, HIGH);
  digitalWrite(LED_G, LOW);
}

 

  • Lubię! 1
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

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