Random simulation

Hallo ich habe hier eine einfache Rechnung als Sketch gemacht

float hoehe = 24;

float abstandzurhoehe = 11;
float Groesse = 4;

float Geschwindigkeit = 10;
float Faktor = 100;

float zeit = (Geschwindigkeit*((Groesse/Faktor)+1)* (abstandzurhoehe/100));



void setup() {
 Serial.begin(9600);
}

void loop() {
Serial.println(zeit);
Serial.print("   cm");
delay(1000);
}

Mein Ziel ist es jetzt vorerst zwei Variablen aus der Rechnung als Random Werte zu machen.

float abstandzurhoehe = 11; und float Groesse = 4;

Hier Soll es jeweils z.B. 10 mal Groesse random(2,7) geben und jeweils 10 mal abstandzurhoehe random (7,11).

und diese sollen dann 10 mal float zeit berechnen.

Als letztes soll der jeweilige Wert als Delay eine LED beleuchten.

Ich denke man könnte arrays verwenden.

Ja, könnte man.

Gruß Tommy

Dass random keine float - Werte liefert, weißt du sicher.
random (2,7) liefert also maximal 5 verschiedene Werte.

Wenn du verrätst, wofür du Arrays verwenden willst, kann man dir das vermutlich ausreden.

Könnte man auch, je nachdem, was er will. Das hält er aber geheim, also könnte man es bestimmt auch mit Arrays machen :wink:

Da fehlen halt wie immer die entscheidenden Infos, ob er die enzelnen Ergebnisse hinterher noch braucht (Array) oder nicht (kein Array nötig).

Gruß Tommy

fehlen halt wie immer die entscheidenden Infos

Da stimme ich dir zu.
Meine Glaskugel sagt nur: Wer so unklar nach Arrays fragt, hat eigentlich ganz andere Probleme.

Meine Glaskugel sagt nur: Wer so unklar nach Arrays fragt, hat eigentlich ganz andere Probleme.

Ich glaube, du meinst auch mich....
:smiling_imp: :smiling_imp: :smiling_imp: :smiling_imp:
Zumindest, kann ich aus vielen Problemen das Optimum raus holen!

hi, darf ich mich an der Raterei beteiligen,

ich vermute Du willst die beiden Parameter für die Du Random verwenden willst eigendlich in zwei ineinander verschachtelten Schleifen benutzen lassen.

wenn Du die Ergebnisse am Ende brauchst kannst Du Arrys nehmen.

fang aber erst mal damit an die Ergebnisse und Parameter auf dem Bildschirm mir Serial.print auszugeben.

immer hübsch langsam step by step

Heinz

Also der Array soll sowohl für die 10 Groessen als auch für die jeweils 10 abständenzurhohe sein. Diese sollen dann in der Rechnung

float zeit = (Geschwindigkeit*((Groesse/Faktor)+1)* (abstandzurhoehe/100));

10 mal zugeordnet werden. Ich denke das ist der schwerste Teil in diesem Programm.
Die Array können ganzen Zahlen sein das ist nicht schlimm.

ich poste hier erst mal ein versuch nur drei groesse als array random in der Rechnung

int array Groesse= {1,2,3};

float hoehe = 24;
float abstandzurhoehe = 11;

float Geschwindigkeit = 10;
float Faktor = 100;

float zeit = (Geschwindigkeit*((Groesse_/Faktor)+1)* (abstandzurhoehe/100));_
long randomNumber;
void setup() {

  • Serial.begin(9600);*
  • randomSeed(3);//? is egal*

_ //array = randomNumber;_
}
void loop()
{
* for (int i=0; i<4; i++){*

* randomNumber = random(2,4);*
_ Groesse = randomNumber;
float zeit = (Geschwindigkeit*((Groesse[1]/Faktor)+1)* (abstandzurhoehe/100)); //zeit*?
Serial.println(zeit);
float zeit = (Geschwindigkeit((Groesse[2]/Faktor)+1)* (abstandzurhoehe/100));

float zeit = (Geschwindigkeit*((Groesse[3]/Faktor)+1)* (abstandzurhoehe/100));
* delay(1000);
}*_

int array Groesse[]= {1,2,3};


float hoehe = 24;
float abstandzurhoehe = 11;

float Geschwindigkeit = 10;
float Faktor = 100;

float zeit = (Geschwindigkeit*((Groesse[i]/Faktor)+1)* (abstandzurhoehe/100));

long randomNumber;

void setup() {
  Serial.begin(9600);
  randomSeed(3);//? is egal
  
  //array[i] = randomNumber;
}
void loop()
{
  for (int i=0; i<4; i++){
    
  randomNumber = random(2,4);
  Groesse[i] = randomNumber;
  float zeit = (Geschwindigkeit*((Groesse[1]/Faktor)+1)* (abstandzurhoehe/100)); //zeit[i]?
  Serial.println(zeit);
    float zeit = (Geschwindigkeit*((Groesse[2]/Faktor)+1)* (abstandzurhoehe/100));
      float zeit = (Geschwindigkeit*((Groesse[3]/Faktor)+1)* (abstandzurhoehe/100));
  delay(1000);
}
    float zeit = (Geschwindigkeit*((Groesse[2]/Faktor)+1)* (abstandzurhoehe/100));

float zeit = (Geschwindigkeit*((Groesse[3]/Faktor)+1)* (abstandzurhoehe/100));

Warum sind diese Zeilen da, und warum liefern sie dir keinen Fehler ?

Hallo

ich hab jetzt mal versucht aus der verbalen Beschreibung des ersten Post´s ein Skatch zu machen. Dabei hab ich mich dann mal stur an das “Pflichtenheft” gehalten. Die meisen werden schon ahnen was jetzt kommt :wink: Ich hab das mal gemacht um darzustellen was für ein sorry " Quatsch" in einem Pflichtenheft stehen kann, ja natürlich gibts bei vagen Beschreibungen auch genüged Spielraum. Ich kann da auf fast 40 Jahre Erfahrung zurück greifen.

Also es gab:
eine feste Gleichung
mehrere Konstanten für die Gleichung
zwei Variable Grössen die jeweils mit einem Zufallswert in festgelegten Grenzen ebenfalls in die Gleichung einfliessen sollen. Für die Zufallswerte sollten je 10 Werte ausgeben werden.
Das Ergebniss der Gleichung sollte dann mittels eines delay zur Ansteuerung einer LED dienen.

ich denke mal das war nicht das was andi sich so vorgestellt hatte. Egal hat Spass gemacht, wollte eigentlich im Garten arbeiten , aber es regnet . 8)

@andi kann ja sein das Du mit dem Schnipsel doch noch was anfangen kannst, er läuft jedenfalls.

Gruß Heinz.

// ein sinnloses Programm 
 
float Abstand; // Variable Grösse
float Groesse;// Variable Grösse
const float hoehe = 24;// feste Grösse
const float Geschwindigkeit = 10;// feste Grösse
const float Faktor = 100;// feste Grösse 

float Zeit;
int led = 13; // Pin 13 für die interne LED

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(led, OUTPUT);// led als Ausgang festlegen
}

void loop() {
  for (int i = 1; i < 10; i++) {
    Groesse = random(2, 7); // Ganzzahlige Zufallswerte im bereich von 2 bis 7

    for (int n = 1; n < 10; n++) {
      Abstand = random(7, 11);// Ganzzahlige Zufallswert im Bereich von 7-11

      // Berechnung nach Vorgabe
      Zeit = Geschwindigkeit * ((Groesse / Faktor) + 1.0) * Abstand / 100.0;
      // Kontroll Ausgabe
      Serial.print(Groesse); Serial.print("\t");
      Serial.print(Abstand); Serial.print("\t");
      Serial.println(Zeit);
    }
  }

  digitalWrite(led, HIGH);
  delay(Zeit);
  digitalWrite(led, LOW);
  delay(Zeit);

}

Rentner:
ich denke mal das war nicht das was andi sich so vorgestellt hatte

Andi wollte unbedingt ein Array verwenden, ohne zu erklären, warum :wink:

Das Rentner - Beispiel kann man durch minimales Versetzen von Klammern viel schöner machen:
Dann blinkt es nach jeder Zeile einmal, statt jedesmal 100 Zeilen auszugeben.
Und wenn es nach jeder Zeile einmal blinkt, wird auch klar, dass die äussere Schleife ( i ) eher sinnlos ist, weil ein Controller Programm von Natur aus ewig läuft.

Man kann natürlich am Ende von loop() auch sowas einbauen:

void loop() {
   for (int i = 1 ; i < 10; i++) {
   ... Deine Funktion, die zehnmal drankommen soll
   }
  Serial.println(F("Stop! \n Weiter nur mit Reset"));
  while (true) {}
}

Aber das kann man auch in setup() einbauen und loop() leer lassen. Das wäre klarer.

Hallo,

@Michael

ist schon kar , ich hatte das auch alles zuest im Setup drin, dann kam mir der Gedanke das es sich um eine optische Spielerei handeln könnte , und dann macht es Sinn die in den Loop zu nehmen. Die Anzeige auf dem Monitor macht allerdings bei der Lichtorgel keinen Sinn , mann kann aber schön das Ergebniss kontrollieren. Fall es sich um eine mathematische Aufgabestellung handeln sollte, mach die LED irgendwie keinen Sinn. :wink: (glaube ich, oder doch ?? :roll_eyes: )

Mit der außen Schleife hast Du natürlich Recht, aber theoretisch könnte ja noch was anderes im loop stehen, und es veranschaulicht auch besser was passiert. Und ich muss , gestehen die Konstruktion der beiden Schleife stammt noch aus derm Setup.

So ist das nun mal mit einem Pflichtenheften jeder versteht was anderes darunter, vor 20 Jahren etwa meinte man das sei das gelbe vom Ei und jeder Hansel könnte nach einem Pflichtenheft die komplexesten Programme schreiben, inzwischen ist man da wieder mehr von weg. Klar es liegt am Pflichtenheft, nicht an dem Softi der eigendlich nicht weis was er da macht. :wink:

Gruß Heinz

Ich wollte dadurch vor allem etwas programmieren lernen. Das ganze soll so aussehen, dass insgesamt 10 led's zu aller erstmal nacheinander leuchten. Und das mit verschiedenen längen. Wie sich aus der jeweiligen Berechnung ergibt. Heinz sketch kann ich nachvollziehen.

Warum Array weiß ich nicht genau. offensichtlich nicht notwendig.

Nur besser wäre es wenn sie teilweise auch zugleich anfangen zu leuchten. Das ganze ist dann eine Art Schwarm der leicht random ist, aber nur leicht. Sowas kann man eventuell auch für etwas anderes verwenden.

Also nochmal mit dem Sketch den ich gepostet habe verwende ich ein Array (Datensatz) um die Berechnung mehrmals unter verschiedenen Datensätzen auszurechnen und das kann ich bei Heinz skatch nicht finden

for (int i = 1; n < 10; i++) {
Abstand = random(7, 11);// Ganzzahlige Zufallswert im Bereich von 7-11
abstandzurhoehe
for (int i=0; i<10; i++){

  • randomNumber = random(2,4);*
    _ Groesse = randomNumber;_
    _ float zeit = (Geschwindigkeit*((Groesse[1]/Faktor)+1)* (abstandzurhoehe*/100));*
    jetzt nochmal speziell zu meinem zuvor geposteten skatch_

Hallo Andi,

finde ich super das Du was lernen willst. Es war auch nicht gegen Dich gerichtert, schliesslich aller Anfang ist schwer.

ich versuche noch mal Dir auf die Sprünge zu helfen.

in deinem Skatch unter #8 schreibts Du deine Gleichung ( die selbe ) in 3 Zeilen untereinander. einzigster unterschied ist das Du ein Array Groesse 1-3 verwendest. Die Werte dieser drei Variablen hast Du oben mit

int array Groesse[]= {1,2,3};

festgelegt. Du willst sie in einer for Schleife aber später vermutlich überschrieben. Tust Du aber nicht , da dein Schleifenzähler i nirgends vorkommt damit werden die drei Zeilen mit den Variablen Groesse[1]… Groesse[3] mit den Werten aus der Zeile oben berechnet.

Zudem überschreibst Du ja jedesmal das Ergebniss der Berechnung mit folgenden Zeile.

Die for Schleife geht vermutlich auch nicht , das fehlt die abschliessende geschweifte Klammer. es gibt da eine , aber die gehört zu der Anweisung loop. Eigendlich hättest Du einen Fehler bekommen müssen bei dem Versuch das auf das Board zu laden.

for (int i=0; i<4; i++){

  • randomNumber = random(2,4);*
    _ Groesse = randomNumber;_
    _ float zeit = (Geschwindigkeit*((Groesse[1]/Faktor)+1)* (abstandzurhoehe/100)); //zeit*?
    Serial.println(zeit);
    float zeit = (Geschwindigkeit((Groesse[2]/Faktor)+1)* (abstandzurhoehe/100));

    float zeit = (Geschwindigkeit*((Groesse[3]/Faktor)+1)* (abstandzurhoehe/100));
    * delay(1000)
    Du hast uns ja jetzt noch ein Geheimniss verraten, letztlich willst Du 10 LED´s ansteuern, nicht eine. Damit kann man natürlich für Zeit ein Array einrichten, das später den LED zugeordnet wird , und lässt in einer Schleife die 10 Ergebnisse berechnen.
    das kann dann so aussehen.
    oben im allgemeinen Teil
    float Zeit[10] // ergibt 10 Elemente mit dem Index 0-9
    dann im loop
    for (int n = 0; n <= 9; n++) {
    Abstand = random(7, 11);// Ganzzahlige Zufallswert im Bereich von 7-11

    Zeit[n] = Geschwindigkeit * ((Groesse / Faktor) + 1.0) * Abstand / 100.0;
    }*_

    Damit Du das verstehst bau mal einen neuen Skatch in diesem Sinne und lass Dir die Ergebnisse anzeigen.
    damit Du was sehen kannst baust Du ähnliche Serial.print ein und einen mit Serial.print(zeit[n]) und hinter der Schleife mal ein delay(10000) dann macht das Programm 10s pause bevor es im loop neu anfängt.
    Ergebniss sollen dann 10 Zeilen mit den Werten auf dem Monitor sein darauf erfolgt eine Pause von 10 s und dann geht es wieder los.
    An die Gemeinde ich hab die code Schnipsel bewust nicht in code tags gesetzt da sie als verbale Erklärung dienen und nicht als code.

Hallo Rentner,

ich habs jetzt mal ganz simple gemacht

float Groesse;
float abstandzurhoehe;

float hoehe = 24;
float Geschwindigkeit = 10;
float Faktor = 100;

float zeit[] = {0,0,0,0,0,0,0,0,0,0};


void setup() {
  Serial.begin(9600);
}
void loop()
{


  for (int i=0; i<9; i++){
  delay(10000);  
  
  abstandzurhoehe = random(8,11);
  Groesse = random(2,4);
  
  float zeit[i] = (Geschwindigkeit*((Groesse/Faktor)+1)*(abstandzurhoehe/100));
  }
  Serial.print(zeit[i]);
}

array must be initialized with a brace-enclosed initializer

Fehler

folgendes gefunden:

Naming something array does not make it an array, the square brackets do.

daraufhin habe ich es so abgeändert

float zeit = {0,0,0,0,0,0,0,0,0,0};

aber immer noch

array must be initialized with a brace-enclosed initializer

geht doch float nicht? als array

eine weitere Frage wenn ich zum Beispiel 1.13 rausbekomme also eine komma zahl wie könnte ich das zu einem delay machen?

Hallo,

das war ja schon mal fast richtig :wink:

erst mal zu dem Fehler :

Du hast oben im allgemeinen Teil die Variable Zeit als Array deklariert , damit ist sie als globale Variable festgelegt.

loop und setup sind normale C Funktionen das erkennst Du unter anderem an der runden Klammer hinter dem Namen. Innerhalb einer Funktion sind variable grundsätzlich erst mal privat. Wenn Du hier eine variable mit der Anweisung float Zeit*= deffinierst ist das eine neue Variable die mit der ersten nicht´s zu tun hat ausser dem selben Namen. Also der Herr Schmitz aus Köln un ein Herr Schmitz aus Bonn. Dazu schaust Du dir mal das Thema “Gültigkeitssbereich von Variablen” z.B hier an.*
http://www.c-howto.de/tutorial/variablen-konstanten/gueltigkeitsbereich/
Dann hab ich die Serialprint Ausgabe in die Schleife genommen weil das Ergebiss ja für jedes i angezeigt werden soll. Hier kommt jetzt das gleiche Problem wieder. Wenn Du die Printanweisung ausserhalb der Schleife machst gibt eine es Fehlermeldung das die Variable i nicht bekannt ist. i hast du innerhalb der Schleifenfunktion deklariert, damit ist sie private für den Geltungsbereich der for (…) Schleife. dann habe ich noch geändert <=9 in der for Anweisung damit auch alle 10 Werte ausgegen werden.
eine andere Variante wäre
int i
for(i=0;i<=9;i++){

}
dann ist es eine Variable für den Bereich loop ;
zuletzt hab ich dann noch das delay verschoben damit es nicht 10 s dauert bist die schleife ein mal weiter geht.
Zu der Frage mit dem delay:
eigendlich ist delay nicht besonders gut . Der uP macht hier eine Pause , macht eigendlich nichts mehr und damit ist das Programm blokiert. Das muss man zum delay wissen. Wie man das anders macht wäre jetzt aber hier zu viel. Beispiel blink wihout delay !! mal wieder. :wink:
zu der eigendlichen Frage : das ist eine Frage der Skalierung , entweder änderst Du deine Formel so das als Ergebniss Zahlen heraus kommen die Du verwenden kannst, oder du multiplizierst das Ergebniss mit 100, 1000 was immer du willst.
Beispiel du willst eine analoge Spannung einlesen 0-5V das enspricht nach dem einlesen Zahlen von 0-1023. Das soll pausenzeiten von 0-5 s entsprechen , dann must Du halt ein wenig rechnen um von 1023 auf 5000 zu kommen :wink: .
Gruß Heinz
```
*float Groesse;
float abstandzurhoehe;

float hoehe = 24;
float Geschwindigkeit = 10;
float Faktor = 100;

//float zeit = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
float zeit[10];

void setup() {
 Serial.begin(9600);
 
}
void loop()
{

for (int i = 0; i <= 9; i++) {
   //delay(10000);

abstandzurhoehe = random(8, 11);
   Groesse = random(2, 4);
   zeit[i] = (Geschwindigkeit * ((Groesse / Faktor) + 1) * (abstandzurhoehe / 100));

Serial.println(zeit[i]);
 }

delay (10000);
}*
```

Vielen Dank Heinz das ganze funktioniert sehr gut und mit delayMicroseconds(1*zeit[0]); geht es ganz gut.

eine Frage :

//float zeit = {0,0,0,0,0,0,0,0,0,0};

worin liegt der unterschied. Einfach andere Schreibweise?

float zeit[10];

Ich werde noch versuchen eventuell noch ein delay oder ein interval zwischen den 10 LEDs zu machen, welcher auch etwas random ist. Und ich muß erstmal 10 leds auf ein steckbrett bekommen.

worin liegt der unterschied. Einfach andere Schreibweise?

Ja!
Im globalen Kontext sind beide Ausdrücke in ihrer Wirkung identisch!
In einem lokalen Kontext allerdings nicht.

Tipp:
Wenn du solche Meldunge siehst:

array must be initialized with a brace-enclosed initializer

Dann solltest du zwingend auf die Zeile achten, in der sie auftreten.

In diesem Fall wird nicht:

float zeit = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
angemeckert.
Denn die Zeile ist zu 100% korrekt.

Der Fehler findet sich viel später:

float zeit = (Geschwindigkeit*((Groesse/Faktor)+1)*(abstandzurhoehe/100));