Hirdetés

Keresés

Hirdetés

Új hozzászólás Aktív témák

  • hukhl

    csendes tag

    Sziasztok!

    Lenne egy kezdő kérdésem. Nyomógomb lenyomásainak számát számolom és erre léptetek állapotokat, mint egy állapotgép szerűen. Az egyes állapotokban 4 db LED-et villogtatok. (minden állapotban más-más sorrendben) Először delay-t használtam. Ezzel az volt a gond, hogy, amíg az egyik állapotom nem járt le addig nem tudtam tovább léptetni.
    Aztán rátaláltam a millis()-re amivel szépen meglehetne ezt oldani. Mivel sok LED-em van és sok állapotom, így arra gondoltam, hogy ezt behívható funkcióként kellene megcsinálni. És amikor az egyik állapotban meghívom, akkor megadom a funkció bemeneti értékként a kívánt LED számát és a késleltetés idejét. Ezt a funkciót egy állapotban többször meghívva különböző LED-eket különböző ideig lehetne villogtatni. És közben elvileg a nyomógombom állapotát is tudom figyelni. :DD
    Idáig jutottam:
    //---------------
    //Function
    //--------------

    bool LedMillis(long interval, int LEDPin, unsigned long currentMillis, bool ledState){

    bool LEDStateResultInternal;
    unsigned long previousMillis = 0;

    if (currentMillis - previousMillis >= interval)
    {

    if(ledState == LOW)
    {
    ledState = HIGH;

    ledState = LEDStateResultInternal;
    }
    else{
    ledState = LOW;
    ledState = LEDStateResultInternal;
    }
    previousMillis = currentMillis;
    digitalWrite(LEDPin, ledState);
    }
    return LEDStateResultInternal;
    }

    Az adott kimenet számát, amelyhez a LED tartozik - LEDPin értéken adom be
    CurrentMillis-nél az aktuális Millis értéket adom be
    ledState-értéknél pedig a returnként visszaadott led állapot csatolom vissza.

    A previousMillis értékem sajnos mindig 0 marad mivel újra meghívódik a funkció és kinullázódik.
    A previousMillis érétket valahogy funkció meghívásonként el lehet tárolni valahogy külön-külön?
    Visszatérési értékként lehet több különböző adatot visszaadni?
    Bocsánat, ha kicsit katyvasznak tűnik így elsőre.
    Még szoknom kell ezt a környezetet. :))

    Köszönöm a segítséget! :)

    [ Szerkesztve ]

  • hukhl

    csendes tag

    válasz Aryes #14067 üzenetére

    Köszönöm aryes és neked is Janos250!
    Ez a globális változó ez bejött. :R

    Viszont a funkcióból sajnos nem sikerült kinyernem a return értéket. :W Biztos valami alap nyelvtani hibát vétek ami miatt nem sikerül. Monitorozva a programot, sajnos nem kapom meg kívülre az értéket...
    Lent látató az eddigi kód bejelölve ahova át akarnám másolni a visszatérési értéket majd újra betenni a funkcióba. Így megoldani a LED ki és bekapcsolását...

    Végig gondolva az eddig megírt funkciót, ha többször fogom behívni akkor a "previousMillis" értékeket külön-külön kell nyilvántartani, mivel más időintervallumot fogok megadni az egyes ledekhez és így máskor kapja meg majd az aktális Millis értéket.

    //---------
    //Constans
    //---------
    const int LED1 = 12;
    const int LED2 = 10;
    const int LED3 = 8;
    const int LED4 = 6;
    const int BUTTON1 = 4;
    const int BUTTON2 = 2;
    //---------
    //Variables
    //---------
    unsigned long previousMillis = 0;
    int Button1State = 0;
    int Button2State = 0;
    int Button1LastState = 0;
    int Button2LastState = 0;
    int Button1CountState = 0;
    int Button2CountState = 0;
    bool LedStateResult = LOW;
    //-------------------
    // Start Initializing
    //-------------------
    void setup() {
    pinMode(LED1, OUTPUT);
    pinMode(LED2, OUTPUT);
    pinMode(LED3, OUTPUT);
    pinMode(LED4, OUTPUT);
    pinMode(BUTTON1, INPUT);
    pinMode(BUTTON2, INPUT);
    Serial.begin(9600);
    }
    //--------------------
    //Main CODE start here
    //--------------------
    void loop() {
    Button1State = digitalRead(BUTTON1);
    unsigned long currentMillis = millis();
    //---------------------------------
    //Button State Reading and Counting
    //---------------------------------
    if (Button1State != Button1LastState) {
    if(Button1State == HIGH){

    Button1CountState = Button1CountState+1;
    Serial.println("BUTTON STATE CHANGED");
    }
    }
    Button1LastState = Button1State;

    Serial.print("LED Result Main Loop : ");
    Serial.println(LedStateResult);
    //-----------------------------------------
    //State machine according to Button 1 State
    //-----------------------------------------
    switch (Button1CountState)
    {
    case 0:
    digitalWrite(LED1, LOW);
    digitalWrite(LED2, LOW);
    digitalWrite(LED3, LOW);
    digitalWrite(LED4, LOW);
    Serial.println("CASE0");
    break;
    case 1:
    LedMillis(2000, LED1, currentMillis, LedStateResult);
    LedStateResult = LedMillis;
    // Serial.print("Millis Function Reuslt: ");
    // Serial.println(LedMillis);

    Serial.print("LED Result CASE1 : ");
    Serial.println(LedStateResult);
    //LedMillis(500, LED2, currentMillis, LedStateResult);
    // LedMillis(500, LED3, currentMillis, LedStateResult);
    Serial.println("CASE1");
    break;
    case 2:
    Serial.println("CASE2");
    break;

    case 3:
    Serial.println("CASE3");
    break;
    case 4:
    Serial.println("CASE4");
    break;
    case 5:
    Serial.println("CASE5");
    break;
    case 6:
    Serial.println("CASE6");
    Button1CountState = 0;
    break;
    }
    }

    //----------
    //Function
    //-----------
    bool LedMillis(long interval, int LEDPin, unsigned long currentMillis, bool ledState){
    bool LEDStateResultInternal;
    Serial.print("Previous Millis :");
    Serial.println(previousMillis);
    Serial.print("Current Millis :");
    Serial.println(currentMillis);
    if (currentMillis - previousMillis >= interval)
    {

    if(ledState == LOW)
    {
    ledState = HIGH;

    LEDStateResultInternal = ledState;

    Serial.print("LED Result LedState High :");
    Serial.println(LEDStateResultInternal);

    }
    else{
    ledState = LOW;
    LEDStateResultInternal = ledState;
    Serial.print("LED Result LedState Low :");
    Serial.println(LEDStateResultInternal);
    }
    previousMillis = currentMillis;
    digitalWrite(LEDPin, ledState);


    Serial.print("LED Result Final LedState :");
    Serial.println(ledState);
    }
    return LEDStateResultInternal;
    }

  • hukhl

    csendes tag

    válasz weiss #14071 üzenetére

    Szia!
    Igen ennél a sornál akarnám beírni a "LedMillis" funkció visszatérési értékét a "LedStateResult "-ba, hogy a következő funkció lefuttásnál már ezzel a beolvasott értékkel dolgozzon a funkció. Ekkor elvileg 2000 msec-onként a visszatérési érték negálódik és ezzel a LED kivezérlési értéke is. :))

  • hukhl

    csendes tag

    válasz Aryes #14070 üzenetére

    Bocsánat a szerkesztésért.
    Ahogy fentebb írtam. Egy olyan funkciót szeretnék megírni. Ahol paraméterként egy idő intervallumot és egy pin számot kellene megadni. Amivel a pin-hez tartozó LED-et megadot ideig villogtatom. És van egy állapotgép, amit nyomógombbal léptetek. Az egyes állapotokhoz ezt a funkciót hívnám be. Ahol mindig más és más idő intervallmot adnék majd meg. :D Tudom elég nyakatekert. :DD

  • hukhl

    csendes tag

    válasz Janos250 #14089 üzenetére

    Szia!
    Igen előrébb jutottam a témával kapcsolatban :)
    #1404 - aryes - válaszában ahogy írta. Elkezdtem utána nézni hogy lehetne egy ilyen LED classot csinálni. És belefutottam egy leírásba ahol a szerző az OOP előnyeit pont egy ilyen LED-es class készítése közben magyarázta el. :Y
    A LED számát, a bekapcsolás és kikapcsolás idejét is meg lehet adni benne.
    Magamtól sajnos még nem tudok ilyet írni, de ezt jól be tudtam illeszteni az eddigi programomba. :DD
    Tegnapi nap nagy része pedig egy 2004A típusú kijelző élesztésével ment el. A nap végére azt is sikerült összehoznom. Ma, ha lesz időm akkor akarok írni rá fancy szövegeket. Illetve van néhány szenzorom amit fel akarok még éleszteni és beintegrálni az eddigi projektbe.
    Szóval köszönöm az eddigi segítséget! :R

Új hozzászólás Aktív témák

Hirdetés