Merfinius Marzec 15, 2020 Udostępnij Marzec 15, 2020 @Treker Dzięki za odpowiedź ! Dioda była podłączona na tak jak na rysunku niżej. Dziwi mnie to, że jej wpięcie sypało przerwanie. Dołączyłem ją w celu sprawdzenia jak długo czujnik wystawia stan wysoki. Cytuj Link do komentarza Share on other sites More sharing options...
Gieneq Marzec 16, 2020 Udostępnij Marzec 16, 2020 10 godzin temu, Merfinius napisał: Dziwi mnie to, że jej wpięcie sypało przerwanie. Dołączyłem ją w celu sprawdzenia jak długo czujnik wystawia stan wysoki. Czujnik ten (wg. dokumentacji) w stanie wysokim ma 3,3 V niezależnie od zasilania które może wynosić od 4-12 V. Jest to dobre całkiem dobre gdyż czujnik da się podłączyć do urządzeń na niższe napięcia, ale możliwe że dla Arduino UNO które posługuje się logiką 5 V jest to na granicy i podłączenie dodatkowego obciążania w postaci LED powoduje że spada poniżej granicy 1 logicznej, Cytuj Link do komentarza Share on other sites More sharing options...
Merfinius Marzec 16, 2020 Udostępnij Marzec 16, 2020 46 minut temu, Gieneq napisał: podłączenie dodatkowego obciążania w postaci LED powoduje że spada poniżej granicy 1 logicznej, Dlaczego napięcie do PINu Arduino miało by spaść? Wydaje mi się, że przy takim podłączeniu LED'a potencjał przed rezystorem i wejściem na PIN Arduino jest takie samo. Cytuj Link do komentarza Share on other sites More sharing options...
Gieneq Marzec 16, 2020 Udostępnij Marzec 16, 2020 Nie mogę znaleźć konkretnie jaki jest maksymalny prąd, ale jeżeli jest on rzędu kilku mA to nawet taki mały LED może spowodować że nastąpi spadek napięcia. Źródło prądu/napięcia w tym przypadku PIR ma swoje parametry: napięcie w stanie jałowym (bez obciążenia) i maksymalny prąd. Jeżeli podłączysz coś niewielkiego względem maksymalnego prądu (coś co pobierze np. 10% maksymalnego prądu) to napięcie niewiele się zmieni i urządzenie pracuje wtedy jako źródło napięcia, ale jeżeli przesadzisz i dasz coś większego co pobierze maksymalny prąd, to dopóki coś się nie uszkodzi to urządzenie będzie pracować jako źródło prądowe - prąd będzie stały ale napięcie spadnie z racji problemów z wydajnością. Podłączając 2 urządzenia: LED i Arduino możliwe, że tworzy się niewielki spadek napięcia ale jednak wystarczający aby przestać wyraźnie interpretować 3,3 V jako 1 logiczną. Dla pewności weź miernik i sprawdź co tam się dzieje. A jak nie masz miernika to może podłącz do ADC 🙂 1 Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
Merfinius Marzec 16, 2020 Udostępnij Marzec 16, 2020 @Gieneq Jest to całkiem możliwe dioda bardzo słabo świeciła w porównaniu z połączeniem ze źródłem zasilania 5VDC. Dzięki za zaangażowanie! Swoją drogą możliwe, że czujnik wystawia stan wysoki przez podciągniecie przez rezystor przez to ten prąd jest mocno ograniczony 🧐 1 Cytuj Link do komentarza Share on other sites More sharing options...
Gieneq Marzec 16, 2020 Udostępnij Marzec 16, 2020 (edytowany) 7 minut temu, Merfinius napisał: Swoją drogą możliwe, że czujnik wystawia stan wysoki przez podciągniecie przez rezystor To się nazywa wyjście open-collector i wątpię że jest to w tym czujniku, bo aktywowałby sygnał poprzez sink (nie źródło tylko to drugie... zlew?) oznacza to że prąd spływa do czujnika, a dokładnie do kolektora tranzystora na wyjściu. Jeżeli chcesz mieć koniecznie LED to możesz PIRem sterować tranzystor z LEDem w kolektorze i np. od kolektora podać sygnał na Arduino - zrobi się wtedy negacja i tranzystor będzie wystawiał sygnał poprzez ściągnięcie sygnału do masy. Edytowano Marzec 16, 2020 przez Gieneq Cytuj Link do komentarza Share on other sites More sharing options...
catalyst Marzec 23, 2020 Udostępnij Marzec 23, 2020 Witam serdecznie Od dwóch dni męczę się z tymi przerwaniami i nadal nie chcą działać :( Nie mam pojęcia już co mogę robić źle. Poniżej zamieszczam bardzo prosty kod z przerwaniem który i tak nie działa poprawnie (zaraz po uruchomieniu urządzenia, dioda zielona mignie na kilka milisekund i odpala się od razu dioda czerwona, mimo że przycisk nie został wciśnięty). Przycisk (zwykły microswitch) jest podłączony do pinu 2 i GND. #define green 6 #define red 7 #define syg 13 void setup(){ pinMode(syg, OUTPUT); pinMode(green, OUTPUT); pinMode(red, OUTPUT); pinMode(PIR, INPUT); digitalWrite(syg, LOW); digitalWrite(red, LOW); digitalWrite(green, HIGH); attachInterrupt(0,alarm, FALLING); } void loop(){ digitalWrite(syg, HIGH); delay(1000); digitalWrite(syg, LOW); delay(1000); } void alarm(){ digitalWrite(red, HIGH); digitalWrite(green, LOW); } Cytuj Link do komentarza Share on other sites More sharing options...
BHBmacieg Marzec 24, 2020 Udostępnij Marzec 24, 2020 @catalyst jeśli przycisk podłączony jest na Pinie 2 to czemu w kodzie usiłujesz wskazac PIN 0 jako ten odpowiedzialny za przerwanie? Zmień linijkę: attachInterrupt(0,alarm, FALLING); Na attachInterrupt(digitalPinToInterrupt(2), alarm, FALLING) Czemu nie korzystasz z funkcji digitalPinToInterrupt? Odpowiada ona za dobranie odpowiedniego pinu przerwań zależnie od płytki. Wtedy taki kod zadziała na każdym rodzaju płytki. 1 Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Marzec 24, 2020 Udostępnij Marzec 24, 2020 53 minuty temu, BHBmacieg napisał: jeśli przycisk podłączony jest na Pinie 2 to czemu w kodzie usiłujesz wskazac PIN 0 W kwestii formalnej: nie PIN 0 a przerwanie numer 0. Jest to poprawne, chociaż niewskazane. Cytuj Link do komentarza Share on other sites More sharing options...
BHBmacieg Marzec 24, 2020 Udostępnij Marzec 24, 2020 27 minut temu, ethanak napisał: W kwestii formalnej: nie PIN 0 a przerwanie numer 0. Jest to poprawne, chociaż niewskazane. W takim razie mea culpa. Źle zrozumiałem wpis na blogu. Dziękuję za uwagę. przeczytałem wpis na blogu raz jeszcze i teraz rozumiem. Na podstawie tego co napisałeś wynika, że kod @catalyst powinien działać, a mimo to nie działa. Bo przecież wskazuje przerwanie numer 0, a ono w przypadku UNO przypisane jest do pinu 2. Popraw mnie jeśli nie mam racji? Ja korzystam z funkcji digitalPinToInterrupt i za każdym razem przerwania działają u mnie jak należy. Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Marzec 24, 2020 Udostępnij Marzec 24, 2020 Nie wiem czy ten kod powinien działać czy nie - w kodzie jest odniesienie do jakiegoś niezdefiniowanego PIR, brak pinMode dla pinu 2. Kod jest niekompletny i w ogóle nie powinien się skompilować. Jeśli przypadkiem PIR to pin 2 i gdzieś to znikło - to w przypadku przycisku powinno być pinMode(PIR, INPUT_PULLUP) a nie INPUT. Po poprawieniu powinien działać. 2 Cytuj Link do komentarza Share on other sites More sharing options...
RomekAtomek Kwiecień 14, 2020 Udostępnij Kwiecień 14, 2020 Chcę użyć kilku przerwań PCINT z jednego portu. Jak zachowa się uC jeśli w trakcie obsługi przerwania nastąpi zmiana stanu na kolejnym pinie. Czy po zakończeniu przerwania zostanie wygenerowane ponownie? Jeśli tak to po jakim czasie? Nie mogę nigdzie znaleźć informacji na ten temat. Cytuj Link do komentarza Share on other sites More sharing options...
Kurczak92 Czerwiec 2, 2020 Udostępnij Czerwiec 2, 2020 Witam Mam problem z kontaktronem. Kiedy jest przy nim magnes, wszystko jest ok, ale gdy go nie ma, dioda zaczyna mrygać zamiast zmienić kolor. Żeby lepiej zrozumieć w czym problem, dodałem komunikaty do portu szeregowego i tak to wygląda: Gdy kontaktron jest "zamknięty". Oraz gdy jest "otwarty". Ciągle przeskakuje ze stany wysokiego na niski i odwrotnie. Oto program: #define LED_R 10 #define LED_G 11 #define LED_B 13 #define KONTAKTRON 7 void setup() { pinMode(LED_R, OUTPUT); //Piny sterujące diodą RGB jako wyjścia pinMode(LED_G, OUTPUT); pinMode(LED_B, OUTPUT); pinMode(KONTAKTRON, INPUT_PULLUP); //Kontaktron jako wejście (jak przycisk) digitalWrite(LED_R, LOW); //Dioda wyłączona digitalWrite(LED_G, LOW); digitalWrite(LED_B, LOW); Serial.begin(9600); } void loop() { if (digitalRead(KONTAKTRON) == LOW) { //Jeśli czujnik zwarty digitalWrite(LED_R, LOW); //Stan OK - dioda zielona digitalWrite(LED_G, HIGH); Serial.println("Stan OK"); } else { digitalWrite(LED_R, HIGH); //Stan ALARM - dioda czerwona digitalWrite(LED_G, LOW); Serial.println("ALARM"); } } Co może być przyczyną? Cytuj Link do komentarza Share on other sites More sharing options...
Gieneq Czerwiec 2, 2020 Udostępnij Czerwiec 2, 2020 @Kurczak92 ciężko powiedzieć, bo widzę że masz PULLUP. Może spróbuj dać opóźnienie, ze 100ms pod koniec loop(). Zamienić na chwilę kontaktron na przycisk. Jeżeli to drugie pomoże to możliwe że kontaktron jest jakiś nie taki albo masz skąś pole magnetyczne które powoduje problemy. Może przepuściłeś przez niego spory prąd i się uszkodził. Cytuj Link do komentarza Share on other sites More sharing options...
Kurczak92 Sierpień 4, 2020 Udostępnij Sierpień 4, 2020 @Gieneq Niestety ani opóźnienie ani zamiana na przycisk nie działa. Co prawda przy opóźnieniu 1s jest większe prawdopodobieństwo na trafienie w prawidłowy odczyt, ale problem pozostaje. Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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!