Skocz do zawartości

bujo2001

Użytkownicy
  • Zawartość

    18
  • Rejestracja

  • Ostatnio

Reputacja

10 Dobra

O bujo2001

  • Ranga
    2/10
  1. Co masz na myśli? Tzn czy znaczy to, że muszę standardowo dobrać rezystor, podobnie jak zrobiłbym to przy zasilaniu z baterii 9V, czy jestem zmuszony wybrać jakiś "większy" rezystor, który będzie wymagany przy pracy z relatywnie aż tak silnym źródłem prądu? (Tj. że rezystory z zestawu nie dadzą rady i potrzebuję jakiegoś wielkiego bad boya, żeby dał sobie w ogóle radę?)
  2. Tak, tak też zrobię następnymi razami. Teraz byłem w pośpiechu, a bardzo chciałem załatwić przynajmniej to jeszcze dzisiaj. Na pewne rozwiązanie wpadłem już po tym, jak wspomniałeś, że .toInt() w przypadku wystąpienia znaku, który nie jest cyfrą, domyślnie zwraca 0. Przetestuję je i dam znać w tym wpisie. Niezależnie od skuteczności poczytam w forach z linków. Jeszcze raz dzięki za pomoc Edit: Mi udało się to obejść, dodając warunek sprawdzający zero osobno, pamiętając o tym, że w odczycie poza zerem pojawia się znak \n Poczytam jeszcze dokładniej podesłane tematy, jednak to rozwiązanie jest już skuteczne.
  3. Przecież napisałem, że usiądę do tego jak wrócę, a jeżeli ktoś może odpowiedzieć od ręki to proszę o wypowiedzenie się. Doszedłbym do tego po sprawdzeniu, co zwraca .toInt() po podaniu mu znaków innych niż liczby, a w miarę potrzeby szukał odpowiedzi w necie lub dokumentacji. Wolałem zapytać, gdyby ktoś mógł podać odpowiedź od ręki. Po co zaraz się denerwować
  4. Cześć, postanowiłem zmodyfikować trochę kod, w którym zastosowaliśmy multipleksowanie wyświetlacza tak, że: używając potencjometru podłączonego w roli konwertera ADC regulujemy częstotliwość odświeżania wyświetlacza (co pozwala łatwiej zaobserwować bezwładność naszego wzroku) wyświetla on liczby z zakresu 1-99, a w przypadku podania nieodpowiedniej liczby / ciągu znaków program prosi nas o podanie prawidłowej wartości Podłączenia takie same, jak w kursie. Dołączam również kod programu: #define potentiometer A5 // Defines pin used to control the frequency #define firstDisp 10 // Defines pins used for multiplexing method #define secondDisp 9 #define rightDown 2 // Defines all pins (according to pinout and segments) #define leftDown 3 #define Down 4 #define rightUp 5 #define Middle 8 #define Up 7 #define leftUp 6 int delayTime = 0; // Variable used for ADC converter measurement byte firstNumber = 0; // Variables used to store currently displayed numbers byte secondNumber = 0; String receivedString = ""; // Variables used to "decode" and show number sent by user int receivedInt = 0; byte nextNumber = 0; void setup() { Serial.begin(9600); // Initializes UART communication pinMode(firstDisp, OUTPUT); // Initializes both displays pinMode(secondDisp, OUTPUT); pinMode(Up, OUTPUT); // Initializes particular segments of the displays pinMode(leftUp, OUTPUT); pinMode(rightUp, OUTPUT); pinMode(Middle, OUTPUT); pinMode(Down, OUTPUT); pinMode(leftDown, OUTPUT); pinMode(rightDown, OUTPUT); // Initial animation digitalWrite(firstDisp, HIGH); // Turns both displays on digitalWrite(secondDisp, HIGH); digitalWrite(Up, HIGH); // Checks if every diode works correctly delay(200); digitalWrite(leftUp, HIGH); delay(200); digitalWrite(rightUp, HIGH); delay(200); digitalWrite(Middle, HIGH); delay(200); digitalWrite(Down, HIGH); delay(200); digitalWrite(leftDown, HIGH); delay(200); digitalWrite(rightDown, HIGH); delay(200); clearAll(); digitalWrite(firstDisp, LOW); digitalWrite(secondDisp, LOW); Serial.println("Give any number in range 0-99 and I'll show it on the display. For 0, type zero."); } void loop() { delayTime = analogRead(potentiometer); // Reads the value from potentiometer delayTime = map(delayTime, 0, 1023, 5, 1000); // Converts the measurement into time in miliseconds if (Serial.available() > 0) { // If data has been received receivedString = Serial.readStringUntil("\n"); // Reads incoming data as String receivedInt = receivedString.toInt(); // Converts incoming data into integer if ((receivedInt > 0) and (receivedInt < 100)) { // If converted data is in given 10-99 range: Serial.println(receivedInt); // Shows given number on Serial Monitor secondNumber = (receivedInt % 10); // Reads the second number receivedInt = (receivedInt / 10); // Moves the whole number one decimal place right firstNumber = (receivedInt % 10); // Reads the first number } else { Serial.println("Invalid number, please, try again."); } } digitalWrite(firstDisp, HIGH); // First display is on digitalWrite(secondDisp, LOW); // Second is off showNumber(firstNumber); // This number is shown on first display delay(delayTime); // Waits for some time digitalWrite(firstDisp, LOW); // First display is off digitalWrite(secondDisp, HIGH); // Second is on showNumber(secondNumber); // This number is shown on second display delay(delayTime); // Waits for some time } void clearAll() { // Function that clears the display digitalWrite(Up, LOW); digitalWrite(leftUp, LOW); digitalWrite(rightUp, LOW); digitalWrite(Middle, LOW); digitalWrite(Down, LOW); digitalWrite(leftDown, LOW); digitalWrite(rightDown, LOW); } void showNumber(byte number) { // Function that displays given single number on the display switch (number) { case 0: digitalWrite(Up, HIGH); digitalWrite(leftUp, HIGH); digitalWrite(rightUp, HIGH); digitalWrite(Middle, LOW); digitalWrite(Down, HIGH); digitalWrite(leftDown, HIGH); digitalWrite(rightDown, HIGH); break; case 1: digitalWrite(Up, LOW); digitalWrite(leftUp, LOW); digitalWrite(rightUp, HIGH); digitalWrite(Middle, LOW); digitalWrite(Down, LOW); digitalWrite(leftDown, LOW); digitalWrite(rightDown, HIGH); break; case 2: digitalWrite(Up, HIGH); digitalWrite(leftUp, LOW); digitalWrite(rightUp, HIGH); digitalWrite(Middle, HIGH); digitalWrite(Down, HIGH); digitalWrite(leftDown, HIGH); digitalWrite(rightDown, LOW); break; case 3: digitalWrite(Up, HIGH); digitalWrite(leftUp, LOW); digitalWrite(rightUp, HIGH); digitalWrite(Middle, HIGH); digitalWrite(Down, HIGH); digitalWrite(leftDown, LOW); digitalWrite(rightDown, HIGH); break; case 4: digitalWrite(Up, LOW); digitalWrite(leftUp, HIGH); digitalWrite(rightUp, HIGH); digitalWrite(Middle, HIGH); digitalWrite(Down, LOW); digitalWrite(leftDown, LOW); digitalWrite(rightDown, HIGH); break; case 5: digitalWrite(Up, HIGH); digitalWrite(leftUp, HIGH); digitalWrite(rightUp, LOW); digitalWrite(Middle, HIGH); digitalWrite(Down, HIGH); digitalWrite(leftDown, LOW); digitalWrite(rightDown, HIGH); break; case 6: digitalWrite(Up, HIGH); digitalWrite(leftUp, HIGH); digitalWrite(rightUp, LOW); digitalWrite(Middle, HIGH); digitalWrite(Down, HIGH); digitalWrite(leftDown, HIGH); digitalWrite(rightDown, HIGH); break; case 7: digitalWrite(Up, HIGH); digitalWrite(leftUp, LOW); digitalWrite(rightUp, HIGH); digitalWrite(Middle, LOW); digitalWrite(Down, LOW); digitalWrite(leftDown, LOW); digitalWrite(rightDown, HIGH); break; case 8: digitalWrite(Up, HIGH); digitalWrite(leftUp, HIGH); digitalWrite(rightUp, HIGH); digitalWrite(Middle, HIGH); digitalWrite(Down, HIGH); digitalWrite(leftDown, HIGH); digitalWrite(rightDown, HIGH); break; case 9: digitalWrite(Up, HIGH); digitalWrite(leftUp, HIGH); digitalWrite(rightUp, HIGH); digitalWrite(Middle, HIGH); digitalWrite(Down, HIGH); digitalWrite(leftDown, LOW); digitalWrite(rightDown, HIGH); break; default: digitalWrite(Up, HIGH); digitalWrite(leftUp, LOW); digitalWrite(rightUp, LOW); digitalWrite(Middle, HIGH); digitalWrite(Down, HIGH); digitalWrite(leftDown, LOW); digitalWrite(rightDown, LOW); break; } }
  5. @ethanak Dzięki raz jeszcze i przepraszam za małe zamieszanie, miło że chciało Ci się to wytłumaczyć. Idę dalej z materiałem
  6. @ethanak Tak, na ten pomysł już wpadłem, tak jak wspomniałem w drugim poście, jednak myślałem, że może jest tutaj jakiś problem w samym Arduino i da się to wyeliminować bez zastosowania takiego warunku. A jak wyłączyć przekazywanie tego znaku? Raczej nie widziałem nigdzie podobnego wpisu, może zbyt słabo szukałem. Poszukam jeszcze, jednak wolałem spytać, bo widać, że znasz się na rzeczy i może szybciej się dowiem pytając.
  7. @Gieneq Najwidoczniej tak, według prośby ograniczyłem program do prostego odczytania: int sign = 0; // Typ integer ze wzgledu na kod ASCII void setup() { Serial.begin(9600); } void loop() { if(Serial.available() > 0) { sign = Serial.read(); Serial.println("Pierwsza opcja"); Serial.println(sign); sign = (sign - '0'); Serial.println("Druga opcja"); Serial.println(sign); } } Efekt pozostaje ten sam, Najpierw wyświetlane są prawidłowo odczytane wiadomości, a później program wykonuje tą samą operację dla pewnego innego klawisza (patrz Blad_v2.png). Sprawdziłem w wikipedii i znak 10 w kodzie ASCII należy do Line Feed (koniec linii). Z początku myślałem, że może pomóc wywalenie końcówki -ln, jednak nadal ten sam problem. int sign = 0; // Typ integer ze wzgledu na kod ASCII void setup() { Serial.begin(9600); } void loop() { if(Serial.available() > 0) { sign = Serial.read(); Serial.print(sign); } } Efekt w Blad_v3.png Wygląda to tak, jakby po odebraniu danych i wykonaniu poprawnych operacji na odpowiednim klawiszu Arduino otrzymywało kolejny znak (którym jest przejście do nowej linii), który interpretuje jako odebrane dane (Serial.available() > 0), co wywołuje wykonanie operacji na właśnie tym znaku. Jest to jednak moja nieekspercka diagnoza i zarówno nie wiem, czy ma ona sens, jak i nie mam pomysłu na to, jak ją rozwiązać. Niby mógłbym zrobić licznik, który przepuszczałby co drugą wartość (przykładowo dla liczby nieparzystej, która odpowiadałaby odpowiedniemu znakowi, kod zostałby wykonany, a dla parzystej, która odpowiadałaby nowej linii, program pomijałby operację), jednak mija to się z celem, jeżeli istnieje lepsze rozwiązanie. Z góry dzięki za pomoc.
  8. Witam użytkowników Forbota Podczas próby dodania znaku ERROR na wypadek wybrania nieodpowiedniego klawisza natknąłem się na pewien problem. Jest to mianowicie fakt, że ERROR pokazuje się za każdym razem, niezależnie od podanej liczby. Aby sprawdzić co się dzieje, wykorzystałem wiadomość ze zmienną wysyłaną do komputera przez UART. Ku mojemu zaskoczeniu, zmienna na początku przyjmuje odpowiednią wartość (1, 2, itd.), po czym niezależnie od tego, jaka była liczba, zmienia wartość na -38. Po dodaniu krótkiego delayu na końcu programu zauważyłem również, że program najpierw działa prawidłowo i pokazuje odpowiednią cyfrę, jednak po czasie ustalonym w delayu zmienna przyjmuje wartość -38 i wyskakuje ERROR. Próbowałem dwóch sposobów (zarówno instrukcja warunkowa if, jak i funkcja default w switch-case, jednak w każdej z nich rezultat jest identyczny. Dzieje się tak również przy wciśnięciu samego przycisku Enter bez podania żadnego znaku. Przez chwilę zastanawiałem się, czy jest to właśnie interpretacja przycisku Enter jako ten nieprawidłowy, jednak zastosowanie dodatkowych, krótkich opóźnień w celu wykluczenia mojego ciężkiego palca z grona podejrzanych raczej wskazuje inaczej. Co robić? (PS. Połączenie wyświetlacza jest identyczne jak w kursie, pomimo zastosowania innych nazw w funkcji define) Kod z instrukcją if #define rightDown 2 // Defines all pins (according to pinout and segments) #define leftDown 3 #define Down 4 #define rightUp 5 #define Middle 8 #define Up 7 #define leftUp 6 int givenNumber = 0; void setup() { Serial.begin(9600); pinMode(Up, OUTPUT); // Initializes the display pinMode(leftUp, OUTPUT); pinMode(rightUp, OUTPUT); pinMode(Middle, OUTPUT); pinMode(Down, OUTPUT); pinMode(leftDown, OUTPUT); pinMode(rightDown, OUTPUT); digitalWrite(Up, HIGH); // Checks if every diode works correctly delay(300); digitalWrite(leftUp, HIGH); delay(300); digitalWrite(rightUp, HIGH); delay(300); digitalWrite(Middle, HIGH); delay(300); digitalWrite(Down, HIGH); delay(300); digitalWrite(leftDown, HIGH); delay(300); digitalWrite(rightDown, HIGH); delay(200); clearAll(); delay(200); Serial.println("Please, give any number from 0 to 9 and I'll show it on the display."); } void loop() { if (Serial.available() > 0) { // If data has been received givenNumber = (Serial.read()- '0'); // Received number is in ASCII code, so in order to make it into the right one, we can subtract 0 (0 = 48 in ASCII) Serial.println(givenNumber); showNumber(givenNumber); /* if ((-1 < givenNumber) and (givenNumber < 10)) { showNumber(givenNumber); } else { digitalWrite(Up, HIGH); digitalWrite(leftUp, LOW); digitalWrite(rightUp, LOW); digitalWrite(Middle, HIGH); digitalWrite(Down, HIGH); digitalWrite(leftDown, LOW); digitalWrite(rightDown, LOW); } */ } } void clearAll() { // Function that clears the display digitalWrite(Up, LOW); digitalWrite(leftUp, LOW); digitalWrite(rightUp, LOW); digitalWrite(Middle, LOW); digitalWrite(Down, LOW); digitalWrite(leftDown, LOW); digitalWrite(rightDown, LOW); } void showNumber(byte number) { // Function that displays given single number on the display switch (number) { case 0: digitalWrite(Up, HIGH); digitalWrite(leftUp, HIGH); digitalWrite(rightUp, HIGH); digitalWrite(Middle, LOW); digitalWrite(Down, HIGH); digitalWrite(leftDown, HIGH); digitalWrite(rightDown, HIGH); break; case 1: digitalWrite(Up, LOW); digitalWrite(leftUp, LOW); digitalWrite(rightUp, HIGH); digitalWrite(Middle, LOW); digitalWrite(Down, LOW); digitalWrite(leftDown, LOW); digitalWrite(rightDown, HIGH); break; case 2: digitalWrite(Up, HIGH); digitalWrite(leftUp, LOW); digitalWrite(rightUp, HIGH); digitalWrite(Middle, HIGH); digitalWrite(Down, HIGH); digitalWrite(leftDown, HIGH); digitalWrite(rightDown, LOW); break; case 3: digitalWrite(Up, HIGH); digitalWrite(leftUp, LOW); digitalWrite(rightUp, HIGH); digitalWrite(Middle, HIGH); digitalWrite(Down, HIGH); digitalWrite(leftDown, LOW); digitalWrite(rightDown, HIGH); break; case 4: digitalWrite(Up, LOW); digitalWrite(leftUp, HIGH); digitalWrite(rightUp, HIGH); digitalWrite(Middle, HIGH); digitalWrite(Down, LOW); digitalWrite(leftDown, LOW); digitalWrite(rightDown, HIGH); break; case 5: digitalWrite(Up, HIGH); digitalWrite(leftUp, HIGH); digitalWrite(rightUp, LOW); digitalWrite(Middle, HIGH); digitalWrite(Down, HIGH); digitalWrite(leftDown, LOW); digitalWrite(rightDown, HIGH); break; case 6: digitalWrite(Up, HIGH); digitalWrite(leftUp, HIGH); digitalWrite(rightUp, LOW); digitalWrite(Middle, HIGH); digitalWrite(Down, HIGH); digitalWrite(leftDown, HIGH); digitalWrite(rightDown, HIGH); break; case 7: digitalWrite(Up, HIGH); digitalWrite(leftUp, LOW); digitalWrite(rightUp, HIGH); digitalWrite(Middle, LOW); digitalWrite(Down, LOW); digitalWrite(leftDown, LOW); digitalWrite(rightDown, HIGH); break; case 8: digitalWrite(Up, HIGH); digitalWrite(leftUp, HIGH); digitalWrite(rightUp, HIGH); digitalWrite(Middle, HIGH); digitalWrite(Down, HIGH); digitalWrite(leftDown, HIGH); digitalWrite(rightDown, HIGH); break; case 9: digitalWrite(Up, HIGH); digitalWrite(leftUp, HIGH); digitalWrite(rightUp, HIGH); digitalWrite(Middle, HIGH); digitalWrite(Down, HIGH); digitalWrite(leftDown, LOW); digitalWrite(rightDown, HIGH); break; } } Kod z instrukcją default w switch-case #define rightDown 2 // Defines all pins (according to pinout and segments) #define leftDown 3 #define Down 4 #define rightUp 5 #define Middle 8 #define Up 7 #define leftUp 6 int givenNumber = 0; void setup() { Serial.begin(9600); pinMode(Up, OUTPUT); // Initializes the display pinMode(leftUp, OUTPUT); pinMode(rightUp, OUTPUT); pinMode(Middle, OUTPUT); pinMode(Down, OUTPUT); pinMode(leftDown, OUTPUT); pinMode(rightDown, OUTPUT); digitalWrite(Up, HIGH); // Checks if every diode works correctly delay(300); digitalWrite(leftUp, HIGH); delay(300); digitalWrite(rightUp, HIGH); delay(300); digitalWrite(Middle, HIGH); delay(300); digitalWrite(Down, HIGH); delay(300); digitalWrite(leftDown, HIGH); delay(300); digitalWrite(rightDown, HIGH); delay(200); clearAll(); delay(200); Serial.println("Please, give any number from 0 to 9 and I'll show it on the display."); } void loop() { if (Serial.available() > 0) { // If data has been received givenNumber = (Serial.read()- '0'); // Received number is in ASCII code, so in order to make it into the right one, we can subtract 0 (0 = 48 in ASCII) Serial.println(givenNumber); showNumber(givenNumber); } } void clearAll() { // Function that clears the display digitalWrite(Up, LOW); digitalWrite(leftUp, LOW); digitalWrite(rightUp, LOW); digitalWrite(Middle, LOW); digitalWrite(Down, LOW); digitalWrite(leftDown, LOW); digitalWrite(rightDown, LOW); } void showNumber(byte number) { // Function that displays given single number on the display switch (number) { case 0: digitalWrite(Up, HIGH); digitalWrite(leftUp, HIGH); digitalWrite(rightUp, HIGH); digitalWrite(Middle, LOW); digitalWrite(Down, HIGH); digitalWrite(leftDown, HIGH); digitalWrite(rightDown, HIGH); break; case 1: digitalWrite(Up, LOW); digitalWrite(leftUp, LOW); digitalWrite(rightUp, HIGH); digitalWrite(Middle, LOW); digitalWrite(Down, LOW); digitalWrite(leftDown, LOW); digitalWrite(rightDown, HIGH); break; case 2: digitalWrite(Up, HIGH); digitalWrite(leftUp, LOW); digitalWrite(rightUp, HIGH); digitalWrite(Middle, HIGH); digitalWrite(Down, HIGH); digitalWrite(leftDown, HIGH); digitalWrite(rightDown, LOW); break; case 3: digitalWrite(Up, HIGH); digitalWrite(leftUp, LOW); digitalWrite(rightUp, HIGH); digitalWrite(Middle, HIGH); digitalWrite(Down, HIGH); digitalWrite(leftDown, LOW); digitalWrite(rightDown, HIGH); break; case 4: digitalWrite(Up, LOW); digitalWrite(leftUp, HIGH); digitalWrite(rightUp, HIGH); digitalWrite(Middle, HIGH); digitalWrite(Down, LOW); digitalWrite(leftDown, LOW); digitalWrite(rightDown, HIGH); break; case 5: digitalWrite(Up, HIGH); digitalWrite(leftUp, HIGH); digitalWrite(rightUp, LOW); digitalWrite(Middle, HIGH); digitalWrite(Down, HIGH); digitalWrite(leftDown, LOW); digitalWrite(rightDown, HIGH); break; case 6: digitalWrite(Up, HIGH); digitalWrite(leftUp, HIGH); digitalWrite(rightUp, LOW); digitalWrite(Middle, HIGH); digitalWrite(Down, HIGH); digitalWrite(leftDown, HIGH); digitalWrite(rightDown, HIGH); break; case 7: digitalWrite(Up, HIGH); digitalWrite(leftUp, LOW); digitalWrite(rightUp, HIGH); digitalWrite(Middle, LOW); digitalWrite(Down, LOW); digitalWrite(leftDown, LOW); digitalWrite(rightDown, HIGH); break; case 8: digitalWrite(Up, HIGH); digitalWrite(leftUp, HIGH); digitalWrite(rightUp, HIGH); digitalWrite(Middle, HIGH); digitalWrite(Down, HIGH); digitalWrite(leftDown, HIGH); digitalWrite(rightDown, HIGH); break; case 9: digitalWrite(Up, HIGH); digitalWrite(leftUp, HIGH); digitalWrite(rightUp, HIGH); digitalWrite(Middle, HIGH); digitalWrite(Down, HIGH); digitalWrite(leftDown, LOW); digitalWrite(rightDown, HIGH); break; default: digitalWrite(Up, HIGH); digitalWrite(leftUp, LOW); digitalWrite(rightUp, LOW); digitalWrite(Middle, HIGH); digitalWrite(Down, HIGH); digitalWrite(leftDown, LOW); digitalWrite(rightDown, LOW); break; } } Dodam jeszcze, że po wywaleniu zarówno instrukcji warunkowej, jak i opcji default program pokazuje cyfry jak należy (pomimo tego, że w wiadomości nadal pojawia się nieszczęsne -38). Widać to na dołączonym zdjęciu.
  9. Witam, Szybkie pytanie - skoro wydajność prądowa musi być WIĘKSZA niż to, ile pobierze nasz układ, a sam układ nie pobierze większej ilości prądu, tylko tyle, ile trzeba, to czy możliwe jest (hipotetycznie) zasilenie pojedynczej diody LED z zestawu przykładowo akumulatorem samochodowym? W teorii nie powinno nic się takiego stać Taka szybka, nocna myśl.
  10. Witam Co prawda nie dokończyłem jeszcze całego odcinka, jednak chciałbym przedstawić moją małą modyfikację co do zadania domowego dla systemu alarmowego przy otwieraniu okien. Jedynym, a jednak dość istotnym dodatkiem jest pojedynczy mikroswitch, który pozwala na wygodne zresetowanie systemu po upewnieniu się, że okna są zamknięte, a w środku nie przybyło nam żadnych gości. Stwierdziłem, że przy takim resetowaniu miłym dodatkiem są dwa szybkie bipnięcia buzzera, co daje nam znać że możemy odejść od układu spokojni, że dalej jesteśmy pod jego ochroną. Co prawda można by użyć do tego celu przycisku RESET na mikrokontrolerze, jednak własny przycisk ma pewną przewagę - możemy go umieścić gdzie tylko sobie życzymy, co pozwala nam zresetować układ wygodnie z naszego biurka/łóżka bez potrzeby żadnego ruchu. Leniuchowanie nigdy nie było tak proste! Załączam mój kod, jednak komentarze są po angielsku, ponieważ przyzwyczajam się na to, co czeka mnie na studiach. Wyprowadzenia na Arduino dokładnie tak, jak są opisane w #define // This programme uses reed switch, RGB LED and a buzzer in simple alarm system /* * System works as follows: * 1. When the window is closed (reed switch is connected), LED glows GREEN and the system is silent * 2. Once the window is opened, reed switch disconects: * - LED turns RED * - Buzzer starts making noise * Even when the window is immediately closed, once opened alarm goes off * 3. Microswitch is used to reset the system: * - When the door is closed, button is pushed * - LED turns GREEN again * - Buzzer makes two short beeps to let us know that the system is succesfully reset * - Additional short delay to prevent disruptions * * That way it's a simple alarm system that can be expanded with more reed switches. */ #define firstRed 10 // Defines these pins for our convenience #define firstGreen 11 #define firstBlue 12 #define firstReed 2 #define buzzerPin 9 #define button 3 void setup() { pinMode(firstRed, OUTPUT); // RGB pins as outputs pinMode(firstGreen, OUTPUT); pinMode(firstBlue, OUTPUT); digitalWrite(firstRed, LOW); // Makes sure the LED is initially turned off digitalWrite(firstGreen, LOW); digitalWrite(firstBlue, LOW); pinMode(firstReed, INPUT_PULLUP); // Reed switch as an input pinMode(buzzerPin, OUTPUT); // Buzzer as an output digitalWrite(buzzerPin, LOW); noTone(buzzerPin); pinMode(button, INPUT_PULLUP); } void loop() { tone(buzzerPin, 4000, 100); // Buzzer beeps two times (initially to let you know the system is on, then that the system is reset) delay(150); tone(buzzerPin, 4000, 100); delay(1000); // Additional delay to prevent disruptions digitalWrite(firstRed, LOW); // Settings to reset the system - LED glows GREEN, buzzer is silent digitalWrite(firstGreen, HIGH); noTone(buzzerPin); while(digitalRead(firstReed) == LOW) {} // Waits for the window to be opened digitalWrite(firstRed, HIGH); // LED glows RED digitalWrite(firstGreen, LOW); while(digitalRead(button) == HIGH) { // Loop that goes on till the button is pressed tone(buzzerPin, 4250); delay(150); tone(buzzerPin, 3750); delay(150); } // Button has been pressed, main loop starts over again } Postaram się dołączyć również filmik jak tylko zedytuję wpis na telefonie. PS - Podczas pracy nad tym układem naszły mnie dwa szybkie pytania: - Czy jest różnica w tym, który pin używamy jako wyprowadzenie dla buzzera bez generatora przy używaniu funkcji tone()? W kursie podłączyliśmy go do pinu Analog, jednak wygląda na to że działa równie dobrze zarówno na pinach Digital i PWM - Jaka jest różnica pomiędzy microswitchami 4.3mm a 5mm? Oczywiście, poza tymi oczywistymi. Jedyne logiczne wytłumaczenia jakie przychodzą mi do głowy to albo żeby móc puścić przez nie "większy" prąd, albo dla naszej wygody, gdy musimy umieścić je w otworach o odpowiedniej grubości. Skoro używamy ich do ustawienia logicznego 0/1, przy pracowaniu z większym prądem tak czy siak będziemy musieli użyć tranzystorów, dlatego obstawiam tą drugą opcję. Miłego dnia, może za chwilę wyląduje kolejny wpis, tym razem o czujniku ruchu lub przerywaniach Edit - nie mogę zamieścić tutaj pliku mp4, więc dołączam zdjęcie układu. Myślę że każdy poradzi sobie z jego odtworzeniem, swoją drogą polecam wykorzystać naklejki forbota na drewnianej podstawce, etektywny sposób na upewnienie się co do odpowiedniego rezystora
  11. Witam wszystkich czytelników Po dłuższym czasie mniejszej aktywności z elektroniką w końcu usiadłem na dłużej, żeby pokombinować coś z Arduino, akurat przyszła pora na programowalne RGB... Chciałem zostawić tu, jak na tą porę, swoją opinię o serii kursów FORBOTA, a także powiedzieć parę słów o mojej przygodzie tą dziedziną nauki. Ani Arduino, ani programowanie nie są dla mnie żadną nowością. Już w podstawówce uczęszczałem na koło informatyczne, gdzie wprowadzono mnie w pewne tajniki. Problem w tym, że przy pracy z Arduino bardziej skupialiśmy się na nim od strony programowania. Co prawda montowaliśmy różne elementy, od zwykłych LEDów, przez wyświetlacze LCD, aż po miernik odległości (co ciekawe, były to zestawy z nigdzie indziej jak te przygotowane przez FORBOTA i BOTLAND, więc już na pierwszy rzut oka rozpoznałem znajome komponenty), jednak nasz wkład w montaż polegał głównie na zmontowaniu układu na podstawie wydrukowanego rzutu z góry na płytkę stykową i mikrokontroler. Wszystko podane jak na tacy, o "elektrycznej" stronie elektroniki usłyszałem co najwyżej na lekcjach fizyki podczas omawiania prądu stałego. Wiedziałem, że pewne elementy należy podłączyć przez rezystor, a niektórym zapodać kondensator, jednak o celu tych działań nie miałem głębszego pojęcia (poza ogólnym konceptem, że rezystor chroni przed zbyt dużym prądem, a kondensator gromadzi energię). Kilka lat po skończeniu gimnazjum (w liceum brak styczności z elektroniką) zdecydowałem się wrócić do "korzeni" i zrozumieć to, co wcześniej było nieporuszone. Wtedy pojawił się FORBOT, oferując serię elektroniki, Arduino i wiele innych. Po przekonaniu rodziców od razu zdecydowałem się kupić oba poziomy podstaw elektroniki i Arduino, a także Technikę Cyfrową. W ten sposób chciałem poniekąd zmusić się do zestawów poczuciem, że "jeżeli nie wykorzystam nawet pierwszego, to na co mi było marnować pieniądze na drugi, trzeci i czwarty?". Po kilku odcinkach nie było już takiej potrzeby. otrzymałem to, czego potrzebowałem: Przemyślane kursy, które raz po raz tłumaczyły zastosowania konkretnych komponentów w elektronice, czasami włączając w to nawet ich budowę, czy zasady działania Konsekwentne wprowadzanie coraz bardziej skomplikowanych zagadnień w sposób zrozumiały dla nawet i kompletnego laika, który ma wystarczająco zapału i chęci, żeby rzeczywiście usiąść i nauczyć się czegoś nowego Porady, sztuczki techniczne i zasady przejrzystości oraz optymalizacji projektów (zarówno cable management, jak i wiedza przydatna przy programowaniu) Błyskawiczną pomoc, bazę danych i miłą atmosferę na forum, gdzie czuć się dobrze może zarówno ekspert w swojej dziedzinie, jak i nowicjusz, który zawita tu z pytaniem "dlaczego po podłączeniu LEDów jeden za drugim, od pewnego momentu świecą już dużo ciemniej niż ten pierwszy" Teraz zamiast zastanawiać się nad tym, czy na pewno użyłem wiersza 6 a nie 7 na płytce stykowej wiem, że nie ma to żadnego znaczenia, dopóki nie ma zwarcia między nóżkami, a w ogóle to równie dobrze mógłbym wszystko zlutować ze sobą na stałe, a płytka nie jest mi wcale potrzebna. Może jest to dość przerysowany przykład, ale na ten moment nie są mi już groźne schematy ideowe (może z wyjątkiem tych "groźniejszych" ), +/- wiem czego będę potrzebować i czego mogę użyć, gdy najdzie mnie ochota złożyć jakiś własny, funkcjonalny projekt, wiem jak zrealizować go od strony "deweloperskiej", a w razie potrzeby wiem gdzie szukać potrzebnych informacji - włączając w to oczywiście artykuły i wpisy na FORBOCIE. Wkrótce zaczynam studia na kierunku Elektronika i Telekomunikacja, myślę że znalazłem tu genialny suplement do tego, z czym przyjdzie mi się mierzyć, poza tym mam w głowie kilka projektów, które chciałbym zrealizować w najbliższej przyszłości (zarówno elektroniczne, jak i czysto programistyczne, czy inżynierskie), więc jestem otwarty na kontakt z każdym, kto może udzielić mi swojej ekspertyzy, posłużyć radą, czy nawet i czegoś nauczyć. Zdecydowanie polecam i życzę wszystkim miłego dnia! PS. Jedyna rzecz, do jakiej się mogę przyczepić to fakt, że w kursach czasami zdarzają się momenty, w których jakaś pomocna / kluczowa funkcja zostaje wprowadzona dopiero po pewnym czasie, albo po segmentach typu "Czy program działa? Nie. Dlaczego? ...", czego idea jest dla mnie zrozumiała, jednak dzisiaj doprowadziło mnie to do stworzenia własnej funkcji, która miałaby zresetować pamięć paska LED i wyłączyć go (LEDy dołączone w zestawie świecą całkiem mocno, a policyjny stroboskop nie pomagał w przyswajaniu artykułu) void clearLED() { // Simple command to clear all patterns from LED's and turn them off int i = 0; for (i = 0; i < 8; i++) { LEDstripe.setPixelColor(i, LEDstripe.Color(0, 0, 0)); } LEDstripe.show(); Tylko po to, żeby parę linijek po przescrollowaniu strony dowiedzieć się o istnieniu tego bad boya LEDstripe.clear();
  12. @Gieneq Wszystko jasne, dzięki bardzo :)) Nie zauważyłem, że jest taka opcja, teraz na pewno będę z tego korzystać, wszystko staje się o wiele czytelniejsze.
  13. Witam, Szybkie pytanie - czy mogę użyć funkcji map(), żeby z interwału konwertera (0-1023) przeskalować go na interwał z liczbami zmiennoprzecinkowymi? W ten sposób można by ominąć tworzenie dwóch zmiennych w celu stworzenia naszego woltomierza. Mój zmieniony program: float voltage = 0; // Zmienna, na której będziemy działać void setup() { Serial.begin(9600); } void loop() { voltage = analogRead(A5); // Zczytuje wartość z pinu - teraz jest w formie cyfrowej, interwał 0-1023 voltage = map(voltage, 0, 1023, 0.0, 5.0); // Przeskalowuje cyfrowy interwał na interwał, który pokazuje napięcie // Użyłem zapisu 0.0-5.0 zamiast 0-5, żeby uniknąć oczywistej omyłki Serial.println(voltage); // Pokazuje przeskalowane napięcie w Monitorze delay(200); } Program mimo zapisu z zerem po przecinku skaluje napięcie w taki sposób, że można zczytać je z dokładnością do cyfry jedności. Efekt podobny jak gdyby zastosować zapis 0-5, z tym że za każdą z tych cyfr pojawiają się dwa zera. Przykładowo: 0.00 1.00 4.00 itd. Czy używam nie poprawnie funkcji map() i nie powinno się jej używać do skalowania do interwałów z liczbami po przecinku (jak sugeruje google)? Czy może robię coś innego nie tak? Liczę na Waszą pomoc, z góry dziękuję
  14. Witam Was wszystkich, podczas przerabiania kursu naszła mnie myśl, żeby nieco zmodyfikować doświadczenie z diodą i potencjometrem tak, aby każdy, a w szczególności nowi adpeci elektroniki mogli lepiej zrozumieć działanie potencjometru. Oprócz materiałów z doświadczenia z kursu potrzebujemy wyłącznie dodatkowej diody czerwonej. Najlepiej ustawić potencjometr w rownowadze (tak, jan na zdjęciu). Po podłączeniu układu do zasilania, manipulowanie pokrętłem powoduje zmiany w jasności obu diod, co wskazuje na to, w jaki sposób potencjometr dzieli prąd elektryczny. W załącznikach schemat oraz zdjęcie do podglądu, nie wiem czy coś takiego juz tutaj było, ale wolę podzielić się pomysłem, tym bardziej ze może nadałby się do kursu
×
×
  • Utwórz nowe...