einstellbarer Zufallsgenerator mittels 2 Potis

Hallo liebes Forum,

ich bin seit Weihnachten stolzer Besitzer des Fritzing Creator Kit's. (sprich Arduino Uno)

Mein erstes eigenes Projekt wirft jedoch schon Fragen auf. Kurz gesagt suche ich einen programmierbaren Zufallsgenerator. Der Zufallsgenerator soll in einer 1 min. Schleife laufen und in 30 Schritten ein bzw. ausschalten. Mit dem üblichen random bzw randomseed bin ich jedoch noch nicht weitergekommen.

Desweiteren möchte ich diesen Zufallsgenerator mit zwei Potis einstellen können. Der eine Poti ändert (in Prozent ?) die Phasen des "Aus-Zustands" und der andere Poti ändert den Zustand des "Ein-Zustands"

Bin für jegliche Hilfe oder Tips dankbar!

schönen Sonntag ....

Ich verstehe Deine Beschreibung nicht. Bitte werd etwas konkreter. Grüße Uwe

bernd83: Der Zufallsgenerator soll in einer 1 min. Schleife laufen und in 30 Schritten ein bzw. ausschalten.

Besonders zufällig ist die Schaltung allerdings nicht, wenn schon im voraus feststeht, dass stets exakt 30 Schaltschritte in einer Minute ablaufen sollen.

Ich verstehe jetzt aber trotzdem das Problem nicht ganz.

Wenn vorgegeben ist: 30 Schaltzyklen mit je 2 Zuständen HIGH/LOW dauern 60 Sekunden, dann entspricht das insgesamt 60 Umschaltungen des Zustands in einer Minute. Die 60 Umschaltungen sollen zufällig erfolgen.

Von der Programmlogik her legst Du Dir also einmal pro Minute ein Array mit 60 Umschaltzeitpunkten fest, das Du beispielsweise für millisekundengenaue Schaltung mit 60 Zufallswerten zwischen 0 und 59999 füllst und in der Reihenfolge sortierst. Dann arbeitest Du das Array in der sortierten Reihenfolge ab und schaltest bei jedem der 60 Zeitpunkte den Status um.

Und das wird dann jede Minute wiederholt.

Und wenn das Tastverhältnis zwischen Ein- und Ausschaltzeiten durch ein Poti einstellbar sein soll, muß die Logik etwas anders laufen. Dann ermittelst Du nur 30 Einschaltzeitpunkte per Zufallsgenerator, und der Ausschaltzeitpunkt ergibt sich aus der Zeitdifferenz zum nächsten Einschaltzeitpunkt in Verbindung mit der Potistellung. Und falls die "Einschaltzeitpunkte pro Minute" nicht konstant bei 30 liegen soll, kannst Du natürlich auch dafür ein Poti zum Einstellen vorsehen.

So ganz trivial ist das alles nicht. Aber mit der Wahl geeigneter Datenstrukturen und Algorithmen sooo aufwändig auch wieder nicht.

Insbesondere durch die Vorgabe "konstant 30x Einschalten pro Minute" in Verbindung mit "zufällige Einschaltzeiten" und "zufälliges Tastverhältnis" kommst Du wohl kaum umhin, den Zufall mit seinen Schaltzeiten immer für eine Minute im voraus zu berechnen und die Schaltzeiten zu sortieren, was natürlich bedeutet, dass Du nicht nur Zufallszahlen generieren, sondern auch ein Array sortieren können musst.

okay, zugegeben, ich habs ein wenig verwirrend formuliert.

Ich hätte gerne einen Zufallsgenerator der mir eine LED ein und ausschaltet.

Poti 1 ist für die "An-Phasen" zuständig. Mit seiner Hilfe kann ich die "An-Phasen" tendenziell länger machen. Poti 2 ist für die "Aus-Phasen" zuständig. Mit seiner Hilfe kann ich die "Aus-Phasen" tendenziell länger machen.

Vergiss am Besten die 30 Schritte bzw der 1 min Loop Wunsch. ;-)

@jurs:

da hast du vollkommen Recht! Ein Denkfehler meinerseits. Nehmen wir die Zeit und die Schaltmenge mal raus aus der Gleichung ...

bernd83: @jurs:

da hast du vollkommen Recht! Ein Denkfehler meinerseits. Nehmen wir die Zeit und die Schaltmenge mal raus aus der Gleichung ...

Programmbeispiel:

#define LED 13
#define POTI1 A0
#define POTI2 A1

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

int wertPoti, zufallZeit;
void loop() {
  // Zufällige Einschaltdauer von POTI1 festgelegt
  wertPoti=analogRead(POTI1);
  zufallZeit=random(wertPoti);
  digitalWrite(LED,HIGH);
  delay(zufallZeit);
  
  // Zufällige Ausschaltdauer von POTI2 festgelegt
  wertPoti=analogRead(POTI2);
  zufallZeit=random(wertPoti);
  digitalWrite(LED,LOW);
  delay(zufallZeit);
}

Perfekt!

Hut ab und vielen vielen Dank!

Problem gelöst

Leider muss ich diesen alten Threat nochmal ins Leben erwecken.

Der sketch funktioniert einwandfrei. Allerdings sind die "Hellphasen" noch zu kurz. Ich habe nun versucht die map Funktion anzuwenden um das ganze etwas zu strecken. Hat aber leider nicht funktioniert.

Klartext: Ich möchte, dass die obere Grenze des Poti eine längere Zeitphase (beispiel 30sek.) zur Folge hat.

vielen Dank im vorraus!

 delay(zufallZeit*30);

Oder C lernen.......

bernd83: Ich möchte, dass die obere Grenze des Poti eine längere Zeitphase (beispiel 30sek.) zur Folge hat.

Wenn Du im Schnitt längere Phase haben möchtest, berechnest Du einfach größere Zufallszahlen:

zufallZeit=random(2*wertPoti);
oder
zufallZeit=random(10*wertPoti);
oder auch
zufallZeit=random(3*wertPoti/2);

Und wenn Du eine "zufällige Mindestzeit" haben möchtest, müßtest Du eben Zufallszahlen erzeugen, die oberhalb des Mindestwertes liegen und nicht bei 0 starten.

Mit int gibts ab ca 16000 Probleme. und 30000 werden für 30sec doch schon gebraucht. :sunglasses:

combie: Mit int gibts ab ca 16000 Probleme. und 30000 werden für 30sec doch schon gebraucht. :sunglasses:

nicht 32 tausend und ein paar zerquetschte?

On the Arduino Uno (and other ATMega based boards) an int stores a 16-bit (2-byte) value. This yields a range of -32,768 to 32,767 (minimum value of -2^15 and a maximum value of (2^15) - 1).

Grüße Uwe

Wo du recht hast, hast du recht! Und ab jetzt werde ich konsequent das Gegenteil behaupten.

Was aber nicht heißt, dass so viel mehr als 30 sec drin sitzen.

combie: Wo du recht hast, hast du recht!

Sonst hätte ich es ja nicht gesagt 8) 8) 8)

combie: Und ab jetzt werde ich konsequent das Gegenteil behaupten.

Bin's gewohnt ;) ;) ;) ;)

combie: Was aber nicht heißt, dass so viel mehr als 30 sec drin sitzen.

Da hast Du recht (was ich aber auch in Zukunft auf's häftigste bestreiten werde) ;) ;) ;) :grinning: :grinning:

Grüße Uwe