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.
-
AutorPříspěvky
-
18.9.2016 v 14:45 #8430CuoreÚč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
19.9.2016 v 18:02 #8457CuoreÚčastníkTak 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
}
}19.9.2016 v 22:27 #8468CuoreÚčastníkJeš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.
20.9.2016 v 21:28 #8488posjirkaÚčastníkbastleni 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 ..
21.9.2016 v 20:58 #8508CuoreÚčastníkBliknutí 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.21.9.2016 v 21:49 #8510posjirkaÚčastníkahoj, 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.
-
AutorPříspěvky
- Pro reakci na toto téma se musíte přihlásit.