Close

Problém ve smyčce

Úvodní stránka Fórum Vaše projekty Arduino Problém ve smyčce

  • Toto téma obsahuje celkem 5 odpovědí. Do diskuze (2 diskutující) se naposledy zapojil uživatel Cuore a poslední změna proběhla před 8 roky.
Aktuálně je na stránce zobrazeno 6 příspěvků - 1. až 6. (celkem z 6)
  • Autor
    Příspěvky
  • #8430
    Cuore
    Účastník

    Ahoj,
    použil jsem arduino pro spuštění HTPC postaveného na Raspi. S kódem jsem se nějak popral, ale má jedno nestandardní chování, kde nemůžu najít příčinu. Vše až po spuštění Raspberry proběhne, ale pokud vypnu raspičko, tak se arduino chová, jako by raspi stále běželo (dioda svítí modře) a ignoruje odchyt IRtlačítka. Tady je kód pro kontrolu:
    #include <IRremote.h>
    #define PRODLEVA 50
    bool MinulyStav = 0; // priznak predchoziho stavu tlacitka (1 .. stisknuto)
    unsigned long CasZmeny; // promenna pro ulozeni casu zmeny stavu tlacitka
    int RECV_PIN = 3; // vstup od IRLED
    IRrecv irrecv(RECV_PIN);
    decode_results results;
    void setup()
    {
    Serial.begin(9600);
    irrecv.enableIRIn(); // Zacatek cteni pinu v seriovem monitoru
    pinMode(3, INPUT_PULLUP); // vstup od IRLED
    pinMode(4, OUTPUT); // R
    pinMode(5, OUTPUT); // G
    pinMode(6, OUTPUT); // B
    pinMode(7, INPUT); // zpetna vazba od RasPi
    pinMode(12, OUTPUT); // napajeni pro RasPi
    int zelena; // Zelene tlacitko na ovladaci TV Sony Bravia
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    digitalWrite(12, LOW);
    }
    void loop() {
    // **OVLADANI RGB LED**
    if (digitalRead(7) == 1 && digitalRead(12) == 1) // RasPi si seplo samodrzny kontakt vypnu napajeni
    {
    analogWrite(5, 150); // zelena LED = 1
    analogWrite(4, 255); // cervena LED = 0
    analogWrite(6, 255); // modra LED = 0
    delay (5000); // cekej 5s
    digitalWrite(12, LOW); // vypnu napajeni pro RasPi
    }
    else if (digitalRead(7) == 0 && digitalRead(12) == 1) // pokud RasPi jeste nenabehlo
    {
    analogWrite(4, 254); // cervena LED = 1
    analogWrite(5, 254); // zelena LED = 1
    analogWrite(6, 255); // modra LED = 0
    }
    else if (digitalRead(7) == 1 && digitalRead(12) == 0) // RasPi bezi a drzi si napajeni
    {
    analogWrite(6, 254); // modra LED = 1
    analogWrite(5, 255); // zelena LED = 0
    analogWrite(4, 255); // cervena LED = 0
    }
    else if (digitalRead(7) == 0 && digitalRead(12) == 0) // arduino v pohotovosti
    {
    analogWrite(4, 254); // cervena LED = 1
    analogWrite(5, 255); // zelena LED = 0
    analogWrite(6, 255); // modra LED = 0
    }
    // **ODCHYT TLACITKA Z DALKOVEHO OVLADACE**
    if (irrecv.decode(&results)) {
    int zelena = results.value;
    if ((zelena == 13033) && ((digitalRead(7) == 0) && (digitalRead(12) == 0))) // pokud je stisknuto pozadovane tlacitko a zatim neprobehla akce spusteni RasPi
    {
    digitalWrite(12, HIGH); // sepni napajeni pro RasPi
    analogWrite(5, 255); // zelena LED = 0
    analogWrite(6, 255); // modra LED = 0
    analogWrite(4, 254); // zacatek bliknuti cervena LED = 1
    delay(100);
    analogWrite(4, 250);
    delay(100);
    analogWrite(4, 240);
    delay(100);
    analogWrite(4, 230);
    delay(100);
    analogWrite(4, 220);
    delay(100);
    analogWrite(4, 210);
    delay(100);
    analogWrite(4, 200);
    delay(100);
    analogWrite(4, 190);
    delay(100);
    analogWrite(4, 180);
    delay(100);
    analogWrite(4, 170);
    delay(100);
    analogWrite(4, 160);
    delay(100);
    analogWrite(4, 150);
    delay(100);
    analogWrite(4, 140);
    delay(100);
    analogWrite(4, 130);
    delay(100);
    analogWrite(4, 120);
    delay(100);
    analogWrite(4, 110);
    delay(100);
    analogWrite(4, 100);
    delay(100);
    analogWrite(4, 90);
    delay(100);
    analogWrite(4, 80);
    delay(100);
    analogWrite(4, 70);
    delay(100);
    analogWrite(4, 60);
    delay(100);
    analogWrite(4, 50);
    delay(100);
    analogWrite(4, 40);
    delay(100);
    analogWrite(4, 30);
    delay(100);
    analogWrite(4, 20);
    delay(100);
    analogWrite(4, 10);
    delay(100);
    analogWrite(4, 0);
    delay(100);
    analogWrite(4, 10);
    delay(100);
    analogWrite(4, 20);
    delay(100);
    analogWrite(4, 30);
    delay(100);
    analogWrite(4, 40);
    delay(100);
    analogWrite(4, 50);
    delay(100);
    analogWrite(4, 60);
    delay(100);
    analogWrite(4, 70);
    delay(100);
    analogWrite(4, 80);
    delay(100);
    analogWrite(4, 90);
    delay(100);
    analogWrite(4, 100);
    delay(100);
    analogWrite(4, 110);
    delay(100);
    analogWrite(4, 120);
    delay(100);
    analogWrite(4, 130);
    delay(100);
    analogWrite(4, 140);
    delay(100);
    analogWrite(4, 150);
    delay(100);
    analogWrite(4, 160);
    delay(100);
    analogWrite(4, 170);
    delay(100);
    analogWrite(4, 180);
    delay(100);
    analogWrite(4, 190);
    delay(100);
    analogWrite(4, 200);
    delay(100);
    analogWrite(4, 210);
    delay(100);
    analogWrite(4, 220);
    delay(100);
    analogWrite(4, 230);
    delay(100);
    analogWrite(4, 240);
    delay(100);
    analogWrite(4, 250);
    delay(100);
    analogWrite(4, 255); // konec bliknuti cervena LED = 0
    }
    Serial.println(zelena, HEX); // prepis HEX na seriovy monitor
    irrecv.resume(); // Cti dalsi hodnotu
    }
    if (digitalRead(3) == 0) // je-li tlacitko stisknuto
    {
    if (MinulyStav == 0 && millis() – CasZmeny > PRODLEVA) // neni-li nastaven priznak
    { // tlacitko stisknuto a uplynul-li vetsi cas od zmeny stavu tlacitka nez je mez (50ms)
    MinulyStav = 1; // nastav priznak tlacitko stisknuto
    }
    }
    else // neni-li stisknuto tlacitko
    {
    CasZmeny = millis(); // zapamatuj si posledni cas, kdy bylo nestisknuto
    MinulyStav = 0; // nuluj priznak, tlacitko stisknuto
    }
    }

    díky za rady

    #8457
    Cuore
    Účastník

    Tak nakonec byl problém v SSR pomocí kterého se posila binární info od Raspi. Ikdyž tam byl pulldown odpor, tak arduino vyhodnocovalo Log1. Takže jsem to zapojil jako pullup a optimalizoval kód.
    #include <IRremote.h>
    #define PRODLEVA 50
    bool MinulyStav = 0; // priznak predchoziho stavu tlacitka (1 .. stisknuto)
    unsigned long CasZmeny; // promenna pro ulozeni casu zmeny stavu tlacitka
    int zelena; // Zelene tlacitko na ovladaci TV Sony Bravia
    int RECV_PIN = 3; // vstup od IRLED
    int poc; // promenna na pocitani cycklu
    int jas; // jas diody
    IRrecv irrecv(RECV_PIN);
    decode_results results;
    void setup()
    {
    Serial.begin(9600);
    irrecv.enableIRIn(); // Zacatek cteni pinu v seriovem monitoru
    pinMode(3, INPUT_PULLUP); // vstup od IRLED
    pinMode(4, OUTPUT); // R
    pinMode(5, OUTPUT); // G
    pinMode(6, OUTPUT); // B
    pinMode(7, INPUT_PULLUP); // zpetna vazba od RasPi
    pinMode(12, OUTPUT); // napajeni pro RasPi
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    digitalWrite(12, LOW);
    }
    void loop() {
    // **OVLADANI RGB LED**
    if (digitalRead(7) == 0 && digitalRead(12) == 1) // RasPi si seplo samodrzny kontakt vypnu napajeni
    {
    analogWrite(5, 150); // zelena LED = 1
    analogWrite(4, 255); // cervena LED = 0
    analogWrite(6, 255); // modra LED = 0
    delay (5000); // cekej 5s
    digitalWrite(12, LOW); // vypnu napajeni pro RasPi
    }
    else if (digitalRead(7) == 1 && digitalRead(12) == 1) // pokud RasPi jeste nenabehlo
    {
    analogWrite(4, 254); // cervena LED = 1
    analogWrite(5, 254); // zelena LED = 1
    analogWrite(6, 255); // modra LED = 0
    }
    else if (digitalRead(7) == 0 && digitalRead(12) == 0) // RasPi bezi a drzi si napajeni
    {
    analogWrite(6, 254); // modra LED = 1
    analogWrite(5, 255); // zelena LED = 0
    analogWrite(4, 255); // cervena LED = 0
    }
    else if (digitalRead(7) == 1 && digitalRead(12) == 0) // arduino v pohotovosti
    {
    analogWrite(4, 254); // cervena LED = 1
    analogWrite(5, 255); // zelena LED = 0
    analogWrite(6, 255); // modra LED = 0
    }
    // **ODCHYT TLACITKA Z DALKOVEHO OVLADACE**
    if (irrecv.decode(&results)) {
    int zelena = results.value;
    if ((zelena == 13033) && ((digitalRead(7) == 1) && (digitalRead(12) == 0))) // pokud je stisknuto pozadovane tlacitko a zatim neprobehla akce spusteni RasPi
    {
    digitalWrite(12, HIGH); // sepni napajeni pro RasPi
    analogWrite(5, 255); // zelena LED = 0
    analogWrite(6, 255); // modra LED = 0
    jas = 256; // zacatek bliknuti s cervenou LED
    for(poc=0;poc<256;poc++){
    jas = jas – 1;
    analogWrite(4, jas);
    delay(10);
    }
    for(poc=0;poc<256;poc++){
    analogWrite(4, poc);
    delay(10);
    } // konec bliknuti s cervenou LED
    }
    Serial.println(zelena, HEX); // prepis HEX na seriovy monitor
    irrecv.resume(); // Cti dalsi hodnotu
    }
    if (digitalRead(3) == 0) // je-li tlacitko stisknuto
    {
    if (MinulyStav == 0 && millis() – CasZmeny > PRODLEVA) // neni-li nastaven priznak
    { // tlacitko stisknuto a uplynul-li vetsi cas od zmeny stavu tlacitka nez je mez (50ms)
    MinulyStav = 1; // nastav priznak tlacitko stisknuto
    }
    }
    else // neni-li stisknuto tlacitko
    {
    CasZmeny = millis(); // zapamatuj si posledni cas, kdy bylo nestisknuto
    MinulyStav = 0; // nuluj priznak, tlacitko stisknuto
    }
    }

    #8468
    Cuore
    Účastník

    Ještě přidám nějakou ukázku hotového multimediálního PC HTPi a NAS serveru RASNas, na kterém jsou uloženy data. Hlavní požadavek byl bezhlučnost, proto síťové uložiště. Pak plně automatický chod a jednoduché ovládání. Raspi podporuje HDMI CEC + odchyt tlačítek arduinem, takže stačí jen ovladač od TV. A poslední požadavek minimální spotřeba. Arduino je napájeno pomocí USB z TV, takže běží jen když je zapnuta TV. Raspi je sepnuto následně Arduinem přes vnitřní napájecí zdroj HTPi. U RasNas pokud neni potřeba, tak běží pouze Raspi < 3W a potřebné disky se připnou.

    #8488
    posjirka
    Účastník

    bastleni 21 stoleti. Moc hezky udělané, díky za projekt. torchu se mi nelíbí to blikání LED diody se použitím delay , ale hlavní je že to funguje jak potřebuješ. Gratulace ..

    #8508
    Cuore
    Účastník

    Bliknutí jsem předělal
    jas = 256; // zacatek bliknuti s cervenou LED
    for(poc=0;poc<256;poc++){
    jas = jas – 1;
    analogWrite(4, jas);
    delay(10);
    }
    for(poc=0;poc<256;poc++){
    analogWrite(4, poc);
    delay(10);
    } // konec bliknuti s cervenou LED
    nic lepšího mě nenapadlo. Jinak projekt je to spíš pro Raspi než arduino, proto jsem to tady nějak moc nezaplevelil. Na raspberry je napsaný celý program pro backend NASu a řízení disků a na HTPi je zase frontend pro komunikaci s NAS pak obsluha displaye, zápis dat na display, komunikace s Arduinem. Další frontendy jsou s klikacím GUI pro běžné PC, kde je možnost si yažádat o připojení do sítě, pro konkrétní disk. Arduino se stará jen o prvotní spuštění HTPi.

    #8510
    posjirka
    Účastník

    ahoj, tak jsem to nemyslel. spíš mi v tom programu trochu vadí, že se ti na 2,5s zastaví smyčka a jen bliká. Pokud ti to ovšem nevadí je vše v pořádku a v klidu mě ignoruj.

Aktuálně je na stránce zobrazeno 6 příspěvků - 1. až 6. (celkem z 6)
  • Pro reakci na toto téma se musíte přihlásit.