Stroboscope effect
11 berichten
• Pagina 1 van 2 • 1, 2
- Nightmystic
- Berichten: 133
- Geregistreerd: 10 Jan 2016, 16:39
Stroboscope effect
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
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
Re: Stroboscope effect
Je vraag zag ik drie dagen geleden al aankomen 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.
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
}
}
- Gij Kieken
- Berichten: 636
- Geregistreerd: 15 Nov 2015, 11:54
Re: Stroboscope effect
Aha Koepel,
Je hebt dus echt een glazen bol en dan nog wel een die werkt.
Goeie demo,
Je hebt dus echt een glazen bol en dan nog wel een die werkt.
Goeie demo,
- Nightmystic
- Berichten: 133
- Geregistreerd: 10 Jan 2016, 16:39
Re: Stroboscope effect
Thanks! Ik ga ermee aan de slag.
En je glazen bol is idd kristal helder
En je glazen bol is idd kristal helder
Re: Stroboscope effect
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.
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
shooter@home.nl
- Nightmystic
- Berichten: 133
- Geregistreerd: 10 Jan 2016, 16:39
Re: Stroboscope effect
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.
Er is geen aanroep van de strobe functie omdat die enkel als voorbeeld dient en geen functie heeft.
Re: Stroboscope effect
Nu beginnen jullie over een kristallen bol
Daarom geef ik hier de meest lelijke sketch die ik ooit heb gemaakt
cpp code
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.
Daarom geef ik hier de meest lelijke sketch die ik ooit heb gemaakt
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.
- Nightmystic
- Berichten: 133
- Geregistreerd: 10 Jan 2016, 16:39
Re: Stroboscope effect
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
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;
}
}
}
Re: Stroboscope effect
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
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
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
- 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;}}
11 berichten
• Pagina 1 van 2 • 1, 2
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 0 gasten