Liczba postów: 7
Liczba wątków: 1
Dołączył: Nov 2020
Reputacja:
0
Witam Forumowiczów,
Prosiłbym o podpowiedź jak kontynuować pisanie programu dla możliwości wysterowania drugiego (2 diody) kanału
Poniżej zamieszczam skech:
volatile int i=0;
void setup()
{
pinMode(3, OUTPUT); // sterowanie 1 diody
pinMode(0, INPUT); //wejście na switch 1 up
pinMode(1, INPUT); //wejście na switch 1 down
pinMode(9, OUTPUT); // sterowanie 2 diody
pinMode(7, INPUT); // wejście na switch 2 up
pinMode(8, INPUT); // wejście na switch 2 down
}
void loop()
{
analogWrite(3, i); //analogWrite wartość od 0 do 255
if (digitalRead(0)==LOW)
{
if (i<255)
{
i++;//jeśli pin 0 jest wciśniety wartość rośnie do 255
delay(30);
}
}
if (digitalRead(1)==LOW)
{
if (i>0)
{
i--;//jeśli pin 0 jest wciśnięty wartość spada do 0
delay(30);
}
}
}
Będę wdzięczny za wszelkie podpowiedzi
Liczba postów: 2,366
Liczba wątków: 0
Dołączył: Oct 2017
Reputacja:
240
Naucz się korzystać z funkcji millis(), nie używaj delay(). Delay zatrzymuje cały program na określoną liczbę ms, millis() zlicza ms od uruchomienia programu, w wybranych miejscach odczytujesz i zapisujesz sobie do zmiennej jej wartość, potem odczytujesz ponownie i sprawdzasz ile tego czasu upłynęło od zapisania, jeśli chcesz by po 30ms od zapisania coś się wydarzyło to sprawdzasz czy stan zapisany od aktualnego >=30, jeśli tak to wykonujesz co masz do wykonania, ewentualnie zapisujesz nową wartość millis i dalej tak samo.
Liczba postów: 2,366
Liczba wątków: 0
Dołączył: Oct 2017
Reputacja:
240
Jak przestaniesz używać delay, to znika pojęcia kanału. W jednej sekcji programu piszesz kod dla 1 led, potem kopiujesz to do drugiej sekcji (oczywiście musi być inna nazwa zmiennej przechowująca ten drugi znacznik czasu) i obie działają niezależnie, żadna nie wpływa (w istotny sposób) na działanie drugiej. Można to powielać dalej aż braknie miejsca na kod czy zmienne. Przełączenie stanu led wykonuje się dzięki temu, że program w kółko sprawdza czy już (i przelatuje dalej), czy już (i przelatuje dalej), teraz!(i przelatuje dalej). A używając delay głównie stoi na delay i nie wykonuje nic więcej.
Liczba postów: 2,366
Liczba wątków: 0
Dołączył: Oct 2017
Reputacja:
240
Kod ma wyglądać tak jak wkleiłem, nie napiszę gotowego programu za Ciebie. Na forum podpowiadamy i doradzamy, robienie pracy za kogoś jest słabe.
Jeśli jednak chcesz by to ktoś zrobił za Ciebie jest dział zleceń.
Liczba postów: 2,366
Liczba wątków: 0
Dołączył: Oct 2017
Reputacja:
240
Zamiast zmieniać stan led co 1000ms (czy drugiej co 333) możesz sprawdzać co 30ms czy przycisk jest wciśnięty i który, potem zmieniać wysterowanie led analogowo. Jeżeli będziesz miał osobne przyciski, 4 w sumie, to można wtedy nawet "jednocześnie" ściemniać jeden i rozjaśniać drugi (oczywiście nic nie jest jednoczśnie, ale ms i tym bardziej ns nie są zauważalne dla człowieka).
Nie załączasz schematu, nie wiem czy masz podłączony rezystor podciągający, nic o nim nie piszesz, a jego brak przy przycisku jest błędem. Może go nie być, ale w kodzie powinno być podciągnięcie do VCC.
Zamiast wpisywać analogWrite(0), powinieneś dla 0 zmienić funkcję na digitalWrite(0); by uniknąć glitch'a dla PWM.
Nie eliminujesz drgań styków ani nie korzystasz z gotowej biblioteki do tego.
Takie rzeczy są podstawowe, może masz książki i je czytałeś, ale ich nie zrozumiałeś. Porób przykłady, przejdź kurs z linka, ostatni projekt drugiego etapu to projekt wielozadaniowy z millis(). Z załączonego kodu widać, że jesteś daleko od tego punktu. Każdy przykład który zrobiłeś z delay zrób na millis.
Bez zrozumienia podstaw nie zrobisz żadnej sensownej aplikacji, a wszelkie wskazówki uzyskane na forach i tak będą dla Ciebie niezrozumiałe.
Pierwsze kilkaset programów odtwarzałem bez głębszego zrozumienia całości, modyfikując kawałki i obserwując efekty, starając się zrozumieć.