Skocz do zawartości

Przeszukaj forum

Pokazywanie wyników dla tagów 'rc5'.

  • Szukaj wg tagów

    Wpisz tagi, oddzielając przecinkami.
  • Szukaj wg autora

Typ zawartości


Kategorie forum

  • Elektronika i programowanie
    • Elektronika
    • Arduino, ESP
    • Mikrokontrolery
    • Raspberry Pi
    • Inne komputery jednopłytkowe
    • Układy programowalne
    • Programowanie
    • Zasilanie
  • Artykuły, projekty, DIY
    • Artykuły redakcji (blog)
    • Artykuły użytkowników
    • Projekty - roboty
    • Projekty - DIY
    • Projekty - DIY (początkujący)
    • Projekty - w budowie (worklogi)
    • Wiadomości
  • Pozostałe
    • Oprogramowanie CAD
    • Druk 3D
    • Napędy
    • Mechanika
    • Zawody/Konkursy/Wydarzenia
    • Sprzedam/Kupię/Zamienię/Praca
    • Inne
  • Ogólne
    • Ogłoszenia organizacyjne
    • Dyskusje o FORBOT.pl
    • Na luzie
    • Kosz

Szukaj wyników w...

Znajdź wyniki, które zawierają...


Data utworzenia

  • Rozpocznij

    Koniec


Ostatnia aktualizacja

  • Rozpocznij

    Koniec


Filtruj po ilości...

Data dołączenia

  • Rozpocznij

    Koniec


Grupa


Znaleziono 2 wyniki

  1. Witam zbudowałem sześcian z diod LED i chciałbym sterować świeceniem diod pilotem. Program napisałem wykorzystując bibliotekę Rc5 i jest kilka problemów. Nie potrafię napisać kodu, który po wciśnięciu przycisku np.1 na pilocie zapamięta wciśniecie przycisku jako logiczne 1 i wywoła funkcję, która będzie świeciła diodami(tryb 1) Po wciśnięciu innego przycisku np. 2 chciałbym aby diody przestały świecić w "trybie 1 i" zaczęły inaczej świecić (trybie 2). Mówiąc krótko wciskam przycisk 1 diody świecą w trybie 1 wciskam kolejny przycisk i diody zaczynają inaczej świecić(tryb 2). Dotychczas udało mi się zrobić tak, że wcisnę np. przycisk 1 i program zapamiętuje wciśniecie przycisku i diody ciągle świecą (wcześniej musiałem ciągle trzymać przycisk, żeby diody ciągle świeciły). Ale jest problem taki, że program zapamiętuje wciśniecie tego przycisku i dalej nic nie da się zrobić ani zmienić tryb świecenia ani wyłączyć diody(muszę zrobić reset aby diody się wyłączyły). Mógłby mi ktoś to na chłopski rozum wytłumaczyć jak to zrobić? Moje tryby napisałem jako funkcje, gdzie pierwsza funkcja to zwykłe miganie diodami, a druga to rozjaśnianie i gaszenie diod z pinu PWM. Tak wygląda mój kod: #define warstwa1 3 #define warstwa11 5 //podlaczenie diod do pinow PWM #define warstwa2 6 #define warstwa22 9 #define warstwa3 10 #define warstwa33 11 #define TSOP_PIN 7 //odbiornik podczerwieni #include <RC5.h> //biblioteka standard RC5 RC5 rc5(TSOP_PIN); //Informacja o podłączeniu odbiornika TSOP int wypelnienie=0; //zmienna dla PWM (dla funkcji dioda1) //Zmienne dla RC5 byte address; byte command; byte toggle; int button; void setup() { pinMode(TSOP_PIN ,INPUT); //odbiornik podczerwieni pinMode(warstwa1, OUTPUT); //diody jako wyjscie i wylacz wszystkie na starcie digitalWrite(warstwa1, 0); pinMode(warstwa11, OUTPUT); digitalWrite(warstwa11, 0); pinMode(warstwa2, OUTPUT); digitalWrite(warstwa2, 0); pinMode(warstwa22, OUTPUT); digitalWrite(warstwa22, 0); pinMode(warstwa3, OUTPUT); digitalWrite(warstwa3, 0); pinMode(warstwa33, OUTPUT); digitalWrite(warstwa33, 0); Serial.begin(9600); } void loop() { //Jeśli odebrano komendę if (rc5.read(&toggle, &address, &command)) { if(command == 2) { button=2; } // jesli odebrano zmienną command o wartosci 2 to zmienna button ma wartosc 2 else if (command == 1) { button=1;} } switch(button){ //wybierz zmienna button case 2: funkcja2(255,5,50); // Serial.println(button); break; case 1: funkcja1(250); //wlacz funkcje migania Serial.println(button); break; } } void funkcja1(int czas) { //funkcja1 digitalWrite(warstwa33, HIGH); delay(czas); digitalWrite(warstwa33, LOW); delay(czas); } void funkcja2( int ilewypelnienie, int zmiana, int czas){ //funkcja2 if(wypelnienie<ilewypelnienie){ analogWrite(warstwa1, wypelnienie); analogWrite(warstwa11, wypelnienie); analogWrite(warstwa2, wypelnienie); analogWrite(warstwa22, wypelnienie); analogWrite(warstwa3, wypelnienie); analogWrite(warstwa33, wypelnienie); wypelnienie+= zmiana; } if(wypelnienie==ilewypelnienie){ while(wypelnienie!=0){ analogWrite(warstwa1, wypelnienie); analogWrite(warstwa11, wypelnienie); analogWrite(warstwa2, wypelnienie); analogWrite(warstwa22, wypelnienie); analogWrite(warstwa3, wypelnienie); analogWrite(warstwa33, wypelnienie); wypelnienie=wypelnienie-zmiana; delay(czas); } } delay(czas); } I teraz po wciśnięciu przycisku 2 (tryb 2)do zmiennej button będzie ciągle przypisywał wartość 2 i nie mogę wtedy włączyć trybu 1. Tak to wygląda w monitorze portu szeregowego(screen w załączniku). I teraz jak zrobić, żeby dało się przełączać tryby lub wciśniecie tego samego przycisku powodowało by wyłączenie danego trybu? Napisałem prosty program, który po wciśnięciu switcha zapala diode i dioda gaśnie dopiero po ponownym wciśnięciu switcha. Tak wygląda ten kod: boolean buttonState1 = false; #define buttonPin1 7 //pin do odczytu stanu przycisku #define led1 11 void setup() { pinMode(led1, OUTPUT); //Dioda jako wyjście pinMode(buttonPin1, INPUT_PULLUP); //Przycisk jako wejście digitalWrite(led1, LOW); //Wyłączenie diody Serial.begin(9600); } void loop() { if (digitalRead(buttonPin1) == LOW) { delay(20); //20ms na obsługę drgań styków buttonState1 = !buttonState1; //zmiana na odwrotny stan if (buttonState1 == true){ digitalWrite(led1, HIGH); Serial.println(buttonState1); } else { digitalWrite(led1, LOW); Serial.println(buttonState1); } while (digitalRead(buttonPin1) == LOW); //czekamy tak długo, jak długo wciśnięty jest przycisk delay(20); //20ms na obsługę drgań styków } } Przerobiłem kod tak aby po wciśnieciu przycisku wywołał funkcje 2 lecz program nie działa tak jak chciałem tzn. rozjaśnienie i przygaszenie diody. boolean buttonState1 = false; // aktualny stan zaświecenia diody #define buttonPin1 7 //pin do odczytu stanu przycisku #define led1 11 //pin do obsługi diody int wypelnienie = 0; void setup() { pinMode(led1, OUTPUT); //Dioda jako wyjście pinMode(buttonPin1, INPUT_PULLUP); //Przycisk jako wejście digitalWrite(led1, LOW); //Wyłączenie diody Serial.begin(9600); } void loop() { if (digitalRead(buttonPin1) == LOW) { delay(20); //20ms na obsługę drgań styków buttonState1 = !buttonState1; //jest stan true i zamienia go na false if (buttonState1 == true){ funkcja2(255,5,50); Serial.println(buttonState1); Serial.println(wypelnienie); } else { digitalWrite(led1, LOW); // dioda sie Serial.println(buttonState1); Serial.println(wypelnienie); } while (digitalRead(buttonPin1) == LOW); //czekamy tak długo, jak długo wciśnięty jest przycisk delay(20); //20ms na obsługę drgań styków } } void funkcja2( int ilewypelnienie, int zmiana, int czas){ //ta sama funkcja co dioda tylko, ze na instrukcji warunkowej if if(wypelnienie<ilewypelnienie){ analogWrite(led1, wypelnienie); wypelnienie+= zmiana; } if(wypelnienie==ilewypelnienie){ while(wypelnienie!=0){ analogWrite(led1, wypelnienie); wypelnienie=wypelnienie-zmiana; delay(czas); } } delay(czas); } Wciśniecie przycisku powoduje ustawienie stanu logicznego 1 i zmianę wypełnienia o wartość 5. Wytłumaczy mi ktoś łopatologiczne jak napisać kod który: Po wciśnięciu przycisku na pilocie lub zwykłego switcha zapamięta wciśniecie przycisku jako logiczne 1 i będzie wykonywał wywołaną funkcje Ponowne wciśniecie tego samego przycisku spowoduje wyłączenie wywołanej funkcji lub wciśniecie innego przycisku zatrzyma aktualnie wywoływaną funkcję i wywoła inną Proszę o pomoc.
  2. Witam chciałbym zbudować sześcian z diod LED, którymi będę sterował za pomocą pilota. Problem tkwi w tym, że jestem początkującym programistą i nie wiem jak napisać kod aby wciśniecie przycisku na pilocie oznaczało logiczne 1 i żeby program zapamiętywał ten stan. Chodzi o to żeby nie trzymać ciągle wciśniętego przycisku tylko żeby raz go wcisnąć. Również chce zrobić tak, żeby za pomocą guzików(przycisków) w pilocie przełączać różne tryby świecenia diod. Napisałem wstępnie 3 testowe funkcje które mają być jednymi z trybów świecenia diodami. Funkcja na pętli for działa teoretycznie prawidłowo, ale nie wiem jak ją zatrzymać tak aby przełączyć guzikiem z pilota na inny tryb. Funkcja dioda1 działa poprawnie tylko, że trzeba ciągle trzymać przycisk na pilocie. Wygląd kodu: #define TSOP_PIN 7 #define diodyLED 11 #include <RC5.h> RC5 rc5(TSOP_PIN); //Informacja o podłączeniu odbiornika TSOP int wypelnienie=0; //Zmienne dla RC5 byte address; byte command; byte toggle; void setup() { pinMode(TSOP_PIN ,INPUT); //odbiornik podczerwieni pinMode(diodyLED, OUTPUT); //diody LED digitalWrite(diodyLED, LOW); } void loop() { //Jeśli odebrano komendę if (rc5.read(&toggle, &address, &command)) { switch(command){ case 2: dioda(255,50,0,999); //wlacz funkcje dioda i potworz ją 999 razy break; case 3: dioda1(0,255,5,50); break; case 1: zamigajLED(250); break; } } } void zamigajLED(int czas) { analogWrite(diodyLED, HIGH); delay(czas); analogWrite(diodyLED, LOW); delay(czas); } void dioda(int ile, int czas,int ile2,int ile3){ //funkcja z pętlą nieskonczoną if(digitalRead(2)==LOW){ for (int j=0; j<=ile3; j++){ for (int i=0; i<=ile; i++){ analogWrite(diodyLED, i); delay(czas); } for (int i =ile; i>=ile2; i--){ analogWrite(diodyLED, i); delay(czas); } } } } void dioda1(int wyplelnienie, int ilewypelnienie, int zmiana, int czas){ if(wypelnienie<ilewypelnienie){ analogWrite(diodyLED, wypelnienie); wypelnienie+= zmiana; } if(wypelnienie==ilewypelnienie){ while(wypelnienie!=0){ analogWrite(diodyLED, wypelnienie); wypelnienie=wypelnienie-zmiana; delay(czas); } } delay(czas); } Próbowałem napisać kod, który będzie zapamiętywał stan przycisku, ale nie wiem jak go połączyć z funkcją dioda1. boolean stan = false; // aktualny stan zaświecenia diody int TSOP_PIN = 10; //pin do odczytu stanu przycisku int diodyLED = 11; //pin do obsługi diody void setup() { pinMode(diodyLED OUTPUT); //Dioda jako wyjście pinMode(TSOP_PIN, INPUT_PULLUP); //Przycisk jako wejście digitalWrite(diodyLED, HIGH); //Wyłączenie diody } void loop() { if (digitalRead(TSOP_PIN) == LOW) { //jak odwołać się do guzika na pilocie? delay(20); //20ms na obsługę drgań styków stan = !stan; //ustawienie przeciwnego stanu diody if (stan == true){ digitalWrite(diodyLED, stan); } else { digitalWrite(diodyLED, stan); } while (digitalRead(TSOP_PIN) == LOW); //czekamy tak długo, jak długo wciśnięty jest przycisk delay(20); //20ms na obsługę drgań styków } } Nie mam pojęcia jak mam odnieść się w instrukcji warunkowej do dowolnego przycisku(guzika) na pilocie lub czy ewentualnie da się zatrzymać funkcje dioda na pętli for która powtarza się 999razy czy trzeba czekać aż się ona 'skończy'. Mógłby ktoś pomoc z napisaniem kodu? Dodam jeszcze, że w kursie budowy robotów napisana funkcja wywołana w instrukcji warunkowej switch-case za pomocą przycisku w pilocie działa po jednym wciśnięciu i nie trzeba trzymać przycisku aby silnik się kręcił. Wygląd kodu: void leftMotor(int V) { if (V > 0) { //Jesli predkosc jest wieksza od 0 (dodatnia) V = map(V, 0, 100, 0, PWM_MAX); digitalWrite(L_DIR, 0); //Kierunek: do przodu analogWrite(L_PWM, V); //Ustawienie predkosci } else { V = abs(V); //Funkcja abs() zwroci wartosc V bez znaku V = map(V, 0, 100, 0, PWM_MAX); digitalWrite(L_DIR, 1); //Kierunek: do tyłu analogWrite(L_PWM, V); //Ustawienie predkosci } } Proszę o pomoc.
×
×
  • Utwórz nowe...