pwm és késleltetés egyszerre

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

pwm és késleltetés egyszerre

Hozzászólás Szerző: learner »

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: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: pwm és késleltetés egyszerre

Hozzászólás Szerző: Robert »

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: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: pwm és késleltetés egyszerre

Hozzászólás Szerző: kapu48 »

Itt pont hasonló sorsporti parancsvezérléssel foglalkoztam:
Soros parancs értelmező program készítés!
viewtopic.php?f=30&t=2039
Szerintem hasznát veszed.
learner
DrótVégénSzéndarab
Hozzászólások: 25
Csatlakozott: 2017. november 4. szombat, 16:41

Re: pwm és késleltetés egyszerre

Hozzászólás Szerző: learner »

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: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: pwm és késleltetés egyszerre

Hozzászólás Szerző: kapu48 »

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

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

...
if (a == 128 || a == 129 || a == 130) { ...
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: pwm és késleltetés egyszerre

Hozzászólás Szerző: kapu48 »

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

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.
Válasz küldése