pwm és késleltetés egyszerre

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
learner
DrótVégénSzéndarab
Hozzászólások: 24
Csatlakozott: 2017. november 4. szombat, 16:41

pwm és késleltetés egyszerre

HozzászólásSzerző: learner » 2018. április 30. hétfő, 19:30

Sziasztok! Miként lehetne megoldani, egy led be és kikapcsolásának az időzítését, miközben a fényerejét is szabályozom?

Kód: Egész kijelölése

void setup()
{
  DDRD = DDRD | B11101000;
  PORTD = B11101000;
  Serial.begin(9600);
}

void loop() {
  byte a;
  byte b;
  while (Serial.available() < 2 ); {
    a = Serial.read();
    delay(10);
    b = Serial.read();
    if (b == 128|129|130) {
      b = map (b, 255, 140, 0, 255);
    }
    if (a == 128) {
      analogWrite(5, b);
    }
    if (a == 129) {
      analogWrite(6, b);
    }
    if (a == 130) {
      analogWrite(3, b);
    }
  }
}

Ezt a programot az applikációmhoz készítettem, mellyel egy rgb led szalag színét tudom kikeverni. Szeretném továbbfejleszteni, lenne egy olyan funkciója mely, ha be van kapcsolva a beállított szín villogását (ki, bekapcsolási idejét) képes szabályozni, miközben a színkikeverő funkciója is működik késés nélkül.

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9908
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: pwm és késleltetés egyszerre

HozzászólásSzerző: Robert » 2018. április 30. hétfő, 22:26

A,
A kód elején ki vag bekapcsolod. Ha ki van kapcsolva, a PWM beállításra nem futsz rá.
B,
A 0-s fényerő, az pont a kikapcsolás.
http://www.tavir.hu - a gazda :)

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3231
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

Re: pwm és késleltetés egyszerre

HozzászólásSzerző: kapu48 » 2018. április 30. hétfő, 23:30

Itt pont hasonló sorsporti parancsvezérléssel foglalkoztam:
Soros parancs értelmező program készítés!
http://forum.tavir.hu/viewtopic.php?f=30&t=2039
Szerintem hasznát veszed.

learner
DrótVégénSzéndarab
Hozzászólások: 24
Csatlakozott: 2017. november 4. szombat, 16:41

Re: pwm és késleltetés egyszerre

HozzászólásSzerző: learner » 2018. május 2. szerda, 18:31

Köszönöm a válaszokat, sikerült közben magamtól megoldani a problémát. :)
Ez a kód az applikációmmal jelenleg megfelelően működik, úgy hogy most már csak az a kérdés, hogy lehet kisebb?

Vázlat használ 2920 bájt (9%) -ot a program tárhelyből. A maximum 30720 bájt.
A globális változók 200 bájt (9%)-ot használnak a dinamikus memóriából, 1848 bájtot hagyva a helyi változóknak. A maximum 2048 bájt.

Kicsit átláthatatlan, úgy hogy megpróbálok pár információt leírni ami fontos lehet:
Bluetooth-on keresztül az app. 2x1 byte-os "számsorokat" küld el. Az első byte az azonositó azt határozza meg, hogy mi történjen a következő 1 byte értékével. Az azonosítok 128-139-ig a feldogozható adatok pedig 140-255-ig terjednek. A 128,129,130 azonosítok a 3 kimeneten megjelenő pwm jelért felelősek. A 131-132 azonosítok a ki és bekapcsolás hosszáért, míg a 133 és a 134 azonosítok a be-és kikapcsolás engedélyezésért felelősek.
Lehet, hogy egy meglehetne oldani egyszerűbben nekem ez jutott eszembe, de szívesen meghallgatok más ötleteket is. :) :) :)

Kód: Egész kijelölése

unsigned long lastMillis1;
unsigned long lastMillis2;
int c = 50;
int d = 134;

void setup()
{
  DDRD = DDRD | B11101000;
  PORTD = B11101000;
  Serial.begin(9600);
  lastMillis1 = millis();
  lastMillis2 = millis();
}

void loop() {
  int a;
  int b;
  if (Serial.available() > 1) {
    a = Serial.read();
    b = Serial.read();
    Serial.println(a);
    Serial.println(b);
  }
  if (a == 128 | a == 129 | a == 130) {
    b = map (b, 255, 140, 0, 255);
  }
  if (a == 131 | a == 132) {
    c = map (b, 140, 255, 50, 1000);
  }
  if (a == 133 | a == 134) {
    d = b;
    Serial.println(d);
  }
  if (a == 128) {
    analogWrite(5, b);
  }
  if (a == 129) {
    analogWrite(6, b);
  }
  if (a == 130) {
    analogWrite(3, b);
  }
  if (d == 133) {
  if ((millis() - lastMillis1) >= c) {
    digitalWrite(7, !digitalRead(7));
    lastMillis1 = millis();
  }
  }
  else
    digitalWrite(7, HIGH);
}

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3231
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

Re: pwm és késleltetés egyszerre

HozzászólásSzerző: kapu48 » 2018. május 3. csütörtök, 2:06

Szerintem így lenne jó a logikai-OR:
https://www.arduino.cc/reference/en/language/structure/boolean-operators/logicalor/

Kód: Egész kijelölése

...
if (a == 128 || a == 129 || a == 130) { ...

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3231
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

Re: pwm és késleltetés egyszerre

HozzászólásSzerző: kapu48 » 2018. május 3. csütörtök, 2:56

Gyorsabb lenne a programod ha switch...case-t használnál, If-ek helyet.:
https://www.arduino.cc/reference/en/language/structure/control-structure/switchcase/

Kód: Egész kijelölése

unsigned long lastMillis1;
unsigned long lastMillis2;
int c = 50;
int d = 134;

void setup()
{
  DDRD = DDRD | B11101000;
  PORTD = B11101000;
  Serial.begin(9600);
  lastMillis1 = millis();
  lastMillis2 = millis();
}

void loop() {
  int a;
  int b;
  if (Serial.available() > 1) {
    a = Serial.read();
    b = Serial.read();
    Serial.println(a);
    Serial.println(b);
 
   //  if (a == 128 | a == 129 | a == 130) {
  //  b = map (b, 255, 140, 0, 255);
  //}
   switch (a) {
  case 128:
     analogWrite(5, b);
       b = map (b, 255, 140, 0, 255);
    break;
  case 129:
    analogWrite(6, b);
      b = map (b, 255, 140, 0, 255);
    break;
   case 130:
    analogWrite(3, b);
       b = map (b, 255, 140, 0, 255);
    break;      

  //if (a == 131 | a == 132) {
   case 131:
    // statements
    //break; // hagyjuk tovább csorogni
   case 132:
    // statements
       c = map (b, 140, 255, 50, 1000);
    break;   
   
  //if (a == 133 | a == 134) {
   case 133:
   case 134:
    d = b;
    Serial.println(d);
   break;
 
    default:
    // statements
  } // end switch (a)

  if (d == 133) {
  if ((millis() - lastMillis1) >= c) {
    digitalWrite(7, !digitalRead(7));
    lastMillis1 = millis();
  }
  }
  else
    digitalWrite(7, HIGH);
   }
}



Így nem lépked feleslegesen végig az if vizsgálatokon, hanem csak az 1 igaz elágazáshoz ugrik a végrehajtás.


Vissza: “Arduino / C-nyelvű programozás (AVR-Duino, EthDuino, Arduino, Diecimila)”

Ki van itt

Jelenlévő fórumozók: Bing [Bot] valamint 1 vendég