Stroboscope effect

algemene C code
Berichten: 133
Geregistreerd: 10 Jan 2016, 16:39

Stroboscope effect

Berichtdoor Nightmystic » 04 Nov 2018, 19:10

Ik probeer een stroboscope effect te maken met millis in plaats van delay, maar het werkt niet helemaal zoals verwacht.
Ik maak waarschijnlijk een denkfout . Ik ben ook benieuwd hoe jullie dit zouden programmeren.

De tijd die hij uit blijft na de serie snellere flitsen zou 10 sec. moeten zijn, maar is in werkelijkheid korter, misschien 5 sec ongeveer.

cpp code
const int stro1Pin =  11;   

int strobe = 1;
int count = 0;
long prvsMS1 = 0;
long prvsMS2 = 0;
long prvsMS3 = 0;
long Timer1 = 100;
long Timer2 = 100;
long Timer3 = 10000;

int StrobeCount = 5;

void setup()
{
Serial.begin(115200);
pinMode(stro1Pin, OUTPUT);
strobe = 2;
}

void Strobe()
{
for(int j = 0; j <= StrobeCount; j++)
{
digitalWrite(stro1Pin, HIGH);
delay(100);
digitalWrite(stro1Pin, LOW);
delay(100);
}
digitalWrite(stro1Pin, LOW);
delay(10000);
}

void loop()
{

for(int j = 0; j < StrobeCount; j++)
{
// Serial.println(count);
if (count == StrobeCount) { strobe = 1; }
unsigned long crntMS1 = millis(); // set time to now
if (strobe == 2 && crntMS1 - prvsMS1 > Timer2)
{
prvsMS1 = crntMS1;
Serial.print("1. ON : ");
Serial.println(crntMS1);
digitalWrite(stro1Pin, HIGH);
strobe = 3;
}
if (strobe == 3 && crntMS1 - prvsMS1 > Timer1)
{
prvsMS1 = crntMS1;
Serial.print("2. OFF: ");
Serial.println(crntMS1);
digitalWrite(stro1Pin, LOW);
strobe = 2;
count++;
}
}
for(int j = 0; j < 1; j++)
{
unsigned long crntMS3 = millis(); // set time to now
if (strobe == 1 && crntMS3 - prvsMS3 > Timer3)
{
prvsMS3 = crntMS3;
Serial.print("3. OFF: ");
Serial.println(crntMS3);
digitalWrite(stro1Pin, LOW);
strobe = 2;
count = 0;
}
}
}

Advertisement

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Stroboscope effect

Berichtdoor Koepel » 04 Nov 2018, 19:49

Je vraag zag ik drie dagen geleden al aankomen :lol: :lol: Toen maakte ik dit voorbeeld: https://gist.github.com/Koepel/f6bc3f747b277f522f4127eebba7a978

Dus je wilt meteen er voor gaan om beide met millis() te doen ? Dus zowel de tijd er tussen als ook de snelle pulsen ?
Dan zou ik een tweede timer met millis() maken die met een "bool" variabele "aan" en "uit" gezet kan worden.

Code: Alles selecteren
bool strobo = false;

unsigned long previousMillis;
unsigned long intervalOff = 10000UL;   // UL = unsigned long
unsigned long intervalOn = 1000UL;

unsigned long previousMillisStrobo;
unsigned long intervalStrobo = 50;

void loop()
{
  // Gebruik mijn voorbeeld voor verschillende tijden van "aan" en "uit"
  // Bij het starten van de korte "aan" tijd de strobo op "true" zetten.
  // Bij en starten van de lange "uit" tijd de strobo op "false" zetten.

  if( strobo)
  {
    // Tweede millis timer voor de korte pulsen
  }
}

Gebruikers-avatar
Berichten: 631
Geregistreerd: 15 Nov 2015, 11:54

Re: Stroboscope effect

Berichtdoor Gij Kieken » 04 Nov 2018, 20:45

Aha Koepel,
Je hebt dus echt een glazen bol en dan nog wel een die werkt.
Goeie demo,

Berichten: 133
Geregistreerd: 10 Jan 2016, 16:39

Re: Stroboscope effect

Berichtdoor Nightmystic » 04 Nov 2018, 22:15

Thanks! Ik ga ermee aan de slag.

En je glazen bol is idd kristal helder ;)

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Stroboscope effect

Berichtdoor shooter » 05 Nov 2018, 02:26

maak een verschil tussen de variabele strobe en de functie.
haal die serial prints uit de loop die vertragen de loop.
en ik zie nergens een aanroep van jouw strobe functie.
paul deelen
shooter@home.nl

Berichten: 133
Geregistreerd: 10 Jan 2016, 16:39

Re: Stroboscope effect

Berichtdoor Nightmystic » 05 Nov 2018, 11:05

Bedankt voor de tip betreft Serial Paul ;)

Er is geen aanroep van de strobe functie omdat die enkel als voorbeeld dient en geen functie heeft.

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Stroboscope effect

Berichtdoor Koepel » 05 Nov 2018, 12:04

Nu beginnen jullie over een kristallen bol :o
Daarom geef ik hier de meest lelijke sketch die ik ooit heb gemaakt :lol:
cpp code
unsigned long s,M,S,T,l;
#define LB LED_BUILTIN
void setup(){pinMode(LB,OUTPUT);}
void loop(){unsigned long C=millis();
if(C-M>=T)M=C,T=(s=!s)?1000:10000,digitalWrite(LB,0);
if(s&&(C-S>=50))S=C,digitalWrite(LB,l=!l);}

De "LED_BUILTIN" wordt gebruikt, dat is pin 13 bij een Arduino Uno. Het ledje knippert 1 seconde, met een pauze van 10 seconden. Er is dus maar weinig nodig voor twee software timers met millis() waarbij de ene software timer de andere aanstuurt.

Berichten: 133
Geregistreerd: 10 Jan 2016, 16:39

Re: Stroboscope effect

Berichtdoor Nightmystic » 05 Nov 2018, 14:50

:shock: Code art :lol:

Berichten: 133
Geregistreerd: 10 Jan 2016, 16:39

Re: Stroboscope effect

Berichtdoor Nightmystic » 05 Nov 2018, 20:02

Met een led op een arduino uno doet deze code wat het moet doen.

Maar ik weet niet of dit ook de beste manier is om het te programmeren:

cpp code
unsigned long previousMillis;
unsigned long previousMillisStrobo;
unsigned long intervalOff = 5000UL; // UL = unsigned long
unsigned long intervalOn = 100UL;

const int LED = 11;

bool ledState = LOW;

int strobecount = 0;

void setup()
{
pinMode(LED, OUTPUT);
}

void loop()
{
unsigned long currentMillis = millis();
if (strobecount < 6)
{
if( currentMillis - previousMillisStrobo >= intervalOn)
{
previousMillisStrobo = currentMillis;

if(ledState == HIGH)
{
digitalWrite(LED, HIGH);
ledState = LOW;
}
else
{
digitalWrite(LED, LOW);
strobecount = strobecount + 1;
ledState = HIGH;
}
}
}
if(strobecount > 5)
{
if(currentMillis - previousMillis >= intervalOff)
{
digitalWrite(LED, LOW);
ledState == HIGH;
strobecount = 0;
previousMillis = currentMillis;
}
}
}

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Stroboscope effect

Berichtdoor Koepel » 06 Nov 2018, 10:39

Het werkt, dus het kan. Het is echter niet de beste manier.

Zie je de getallen in mijn lelijke sketch ?
1000: de tijd dat het stroboscope effect aan is.
10000: de tijd dat het stroboscope effect uit is.
50: de interval tijdens de flitsen (zowel de tijd dat de led aan is en ook de tijd dat de led uit is).
Je kunt die tijden wijzigen, en dan blijft het werken. De tijden zijn onafhankelijk van elkaar.

Jij legt je vast aan de teller van strobecount. Dan ben je dus minder vrij.
De waarde van strobecount gebruik je om een van de twee software timers met millis() te kiezen. Dat is een beetje onduidelijk omdat de previousMillis en previousMillisStrobo alleen gezet worden als die bepaalde software timer actief is.
De tijd dat het stroboscope effect actief is, is een combinatie van intervalOn en strobecount.

Het zit een beetje in elkaar gedraaid. Als je de onderdelen wat meer onafhankelijk van elkaar kunt maken, dan kun je later gemakkelijker iets wijzigen.

In mijn lelijke sketch gebruikte ik geen teller. Als je een teller gemakkelijk vindt, dan kun je alles op een teller van 10 Hz baseren.
0: led aan
1: led uit
2: led aan
3: led uit
...
11: led uit
50: begin opnieuw

cpp code
unsigned long previousMillis;
const unsigned long interval = 100UL; // 10 Hz

const int ledPin = 11;

int count = 0;

void setup()
{
pinMode( ledPin, OUTPUT);
}

void loop()
{
unsigned long currentMillis = millis();

if( currentMillis - previousMillis >= interval)
{
previousMillis = currentMillis;

if( count < 12)
{
if( count % 2 == 0)
digitalWrite( ledPin, HIGH);
else
digitalWrite( ledPin, LOW);
}

count++;

if( count > 50)
{
count = 0;
}
}
}

Dat is dus één millis() software timer van 10 Hz, en de teller "count" doet het werk.
Dan heb ik zelfs geen ledState meer. De count % 2 is count delen door twee en kijken wat het restgetal is. Daarmee zet ik de led aan en uit (zolang de count nog een lage waarde heeft).

Deze sketch kan ik ook lelijk maken :lol:
Code: Alles selecteren
unsigned P,c;
void setup(){pinMode(11,OUTPUT);}
void loop(){unsigned C=millis();
if(C-P>100){P=C;if(c++<12)digitalWrite(11,c%2);if(c>50)c=0;}}

Volgende

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 6 gasten