• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Pomoc w pisaniu programu
#1
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
 
Odpowiedź
#2
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.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#3
(20-11-2020, 17:25)kaczakat napisał(a): 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.
Dziękuję za poradę!! Mam jeszcze pytanie odnoście drugiego kanału, o ile na początek wysterowanie jednej diody nie jest problemem, to problem zaczyna się dla sterowania drugą diodą - a dokładniej w którym miejscu należy dopisać sterowanie dla drugiej diody (to ten sam kod tylko inne piny)
 
Odpowiedź
#4
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.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#5
(20-11-2020, 19:32)kaczakat napisał(a): 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.
Kaczakat, czy mogę Cię prosić o napisanie takiego kodu dla dwóch sekcji ?
 
Odpowiedź
#6
Masz przykład wbudowany w Arduino blinkWithoutDelay, dla dwóch led wygląda tak:
Kod:
// constants won't change. Used here to set a pin number:
const int ledPin1 =  5;// the number of the LED pin
const int ledPin2 =  6;
// Variables will change:
int ledState1 = LOW;             // ledState used to set the LED
int ledState2 = LOW;             // ledState used to set the LED
// Generally, you should use "unsigned long" for variables that hold time
// The value will quickly become too large for an int to store
unsigned long previousMillis1 = 0;        // will store last time LED was updated
unsigned long previousMillis2 = 0;        // will store last time LED was updated

// constants won't change:
const long interval1 = 1000;           // interval at which to blink (milliseconds)
const long interval2 = 333;           // interval at which to blink (milliseconds)
void setup() {
  // set the digital pin as output:
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
}

void loop() {
  // here is where you'd put code that needs to be running all the time.

  // check to see if it's time to blink the LED; that is, if the difference
  // between the current time and last time you blinked the LED is bigger than
  // the interval at which you want to blink the LED.
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis1 >= interval1) {
    // save the last time you blinked the LED
    previousMillis1 = currentMillis;

    // if the LED is off turn it on and vice-versa:
    if (ledState1 == LOW) {
      ledState1 = HIGH;
    } else {
      ledState1 = LOW;
    }

    // set the LED with the ledState of the variable:
    digitalWrite(ledPin1, ledState1);
  }

  if (currentMillis - previousMillis2 >= interval2) {
    // save the last time you blinked the LED
    previousMillis2 = currentMillis;

    // if the LED is off turn it on and vice-versa:
    if (ledState2 == LOW) {
      ledState2 = HIGH;
    } else {
      ledState2 = LOW;
    }

    // set the LED with the ledState of the variable:
    digitalWrite(ledPin2, ledState2);
  }
 
}
currentMillis jest jedno, bo tylko raz na początku trwania pętli wystarczy sprawdzić jaki mamy czas, ciągłe wywoływanie tej funkcji do każdego zadania z osobna zrobi funkcje/procedury bardziej niezależne od siebie, będzie je można przenosić między programami, ale też każde to wywołanie kosztuje czas.
A wśród zamieszczonych tu przykładów na forum funkcja czas(), która nieco ułatwia korzystanie z millis(). Warunkiem zmiany stanu led nie musi być ilość ms od ostatniej zmiany, może być zliczana ilość dziesiątek czy setek, zmiana stanu led gdy te zmienne są podzielne przez 3 czy 5, lub tylko wtedy gdy sekunda działania układu jest parzysta i właśnie wybiła. To są wszystko podstawy każdego języka programowania, dlatego jak tego nie wiesz lepiej zacząć od  kursu lub książki C/C++.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#7
(20-11-2020, 20:47)kaczakat napisał(a): Masz przykład wbudowany w Arduino blinkWithoutDelay, dla dwóch led wygląda tak:
Kod:
// constants won't change. Used here to set a pin number:
const int ledPin1 =  5;// the number of the LED pin
const int ledPin2 =  6;
// Variables will change:
int ledState1 = LOW;             // ledState used to set the LED
int ledState2 = LOW;             // ledState used to set the LED
// Generally, you should use "unsigned long" for variables that hold time
// The value will quickly become too large for an int to store
unsigned long previousMillis1 = 0;        // will store last time LED was updated
unsigned long previousMillis2 = 0;        // will store last time LED was updated

// constants won't change:
const long interval1 = 1000;           // interval at which to blink (milliseconds)
const long interval2 = 333;           // interval at which to blink (milliseconds)
void setup() {
  // set the digital pin as output:
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
}

void loop() {
  // here is where you'd put code that needs to be running all the time.

  // check to see if it's time to blink the LED; that is, if the difference
  // between the current time and last time you blinked the LED is bigger than
  // the interval at which you want to blink the LED.
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis1 >= interval1) {
    // save the last time you blinked the LED
    previousMillis1 = currentMillis;

    // if the LED is off turn it on and vice-versa:
    if (ledState1 == LOW) {
      ledState1 = HIGH;
    } else {
      ledState1 = LOW;
    }

    // set the LED with the ledState of the variable:
    digitalWrite(ledPin1, ledState1);
  }

  if (currentMillis - previousMillis2 >= interval2) {
    // save the last time you blinked the LED
    previousMillis2 = currentMillis;

    // if the LED is off turn it on and vice-versa:
    if (ledState2 == LOW) {
      ledState2 = HIGH;
    } else {
      ledState2 = LOW;
    }

    // set the LED with the ledState of the variable:
    digitalWrite(ledPin2, ledState2);
  }
 
}
currentMillis jest jedno, bo tylko raz na początku trwania pętli wystarczy sprawdzić jaki mamy czas, ciągłe wywoływanie tej funkcji do każdego zadania z osobna zrobi funkcje/procedury bardziej niezależne od siebie, będzie je można przenosić między programami, ale też każde to wywołanie kosztuje czas.
A wśród zamieszczonych tu przykładów na forum funkcja czas(), która nieco ułatwia korzystanie z millis(). Warunkiem zmiany stanu led nie musi być ilość ms od ostatniej zmiany, może być zliczana ilość dziesiątek czy setek, zmiana stanu led gdy te zmienne są podzielne przez 3 czy 5, lub tylko wtedy gdy sekunda działania układu jest parzysta i właśnie wybiła. To są wszystko podstawy każdego języka programowania, dlatego jak tego nie wiesz lepiej zacząć od  kursu lub książki C/C++.
Na początek przebrnąłem przez kilka poradników na www oraz 2 tomach "Arduino dla początkujących Podstawy i szkice Simon Monk"(początki są oporne Wink). Wgrałem program który przesłałeś (na dobry początek staram się zrozumieć Twoje założenie przy jego pisaniu)
Jednak program który chciałbym napisać miałby działać a'la sterownik do taśm LED rozdzielony np. na 2 kanały gdzie przy pomocy dwóch switch-y (po parze na każdy kanał) można sterować jasnością diody.
Czy na podstawie sktch-u który zamieściłem oraz polecenia millis(), mógłbyś napisać mi jak taki kod by wyglądał ?
 
Odpowiedź
#8
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ń.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#9
(20-11-2020, 21:52)kaczakat napisał(a): 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ń.
Może to faktycznie tak wygląda....., ale nie chcę żebyś pisał to za mnie. Dla początkującego jest to skomplikowane, przy kodzie który mi napisałeś trochę zgłupiałem bo nie wiem na jakiej zasadzie bez użycia fizycznego użycia przycisku zostają wysterowane led-y (podejrzewam tylko, że jest to podobne jak np. w sterownikach zmierzch-świt do akwarium, o danej godz. załącza 100% wypełnienia po czym przy użyciu funkcji millis() zaczyna spadać do zera)

Czy w takim razie możesz podpowiedzieć mi, gdzie na przykładzie mojego pierwszego wpisu mam umieścić kod którym będę mógł wysterować 2 kanał, metodą prób i błędów postaram się użyć funkcji o której pisałeś.

Jeśli zostało o odebrane jako pisanie za mnie to zaszło nieporozumienie
 
Odpowiedź
#10
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ć.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości