#3.2 belebtes haus 2.0

 

Nachdem wir im Teil 3 der Arduino Reihe das belebte Haus ja recht ausführlich programmiert haben, versuchen wir es jetzt mal komplexer aber kurz.

Wir überlassen viel mehr dem "Zufall". Zufall in " " da der Arduino eigentlich kein wirklichen Zufall beherrscht... Aber dazu später mehr.

 

Was ihr zum nachmachen braucht:

  • Die Arduino Software
  • Ein Arduino Controller
  • USB Verbindungskabel
  • Ein Breadbord
  • Breadboardkabel
  • LEDs
  • Vorwiderstände (ca. 220 Ohm)

Zunächst bauen wir wider unseren Versuchsaufbau auf. Dieser ist genau der gleiche wie im ersten Belebtes_Haus_Projekt.

 

Wie viele LEDs ihr tatsächlich verwendet kann natürlich variieren. Wichtig ist nur, dass ihr direkt aufeinander folgende Ausgänge verwendet.

z.B. 5-13 oder 7-12

Hier im Beispiel nutzen wir die Ausgänge 3-7.


Nun zur Programmierung des Sketch:

 

Zunächst definieren wir unsere Variablen:

 

int led3 = 3;

int led4 = 4;

int led5 = 5;

int led6 = 6;

int led7 = 7;

int randOnOff;

int randNr;

int randdelay;

 

die ersten 5 Variablen sind klar. Die Namen der LEDs und ihre Pins. Dann habe ich noch drei Variablen angelegt, welche die Zufallswerte später speichern.

randOnOff legt fest ob gleich eine LED an oder aus geschaltet wird.

randNr legt die LED fest die ihren Status verändern soll.

randdelay legt die Zeit fest die bis zur nächsten Veränderung vergehen soll.

 

Dann kommen wir zum Setup:

 

void setup() {

  pinMode(led3, OUTPUT);

  pinMode(led4, OUTPUT);

  pinMode(led5, OUTPUT);

  pinMode(led6, OUTPUT);

  pinMode(led7, OUTPUT);

 

Das war schon der ganze Setup. Die Pins der LEDs werden als Ausgänge deklariert.

 

 

Dann geht es also mit dem Loop weiter:

 

void loop() {

  randomSeed(millis());

  randOnOff = random(1, 3);

  if (randOnOff == 1)

  {

    randNr = random(3, 8);

    digitalWrite(randNr, HIGH);

  }

  if (randOnOff == 2)

  {

    randNr = random(3, 8);

    digitalWrite(randNr, LOW);

  }

  randdelay = random(1000, 10000);

 

  delay(randdelay);

 

 


Zunächst definieren wir eine Quelle, welche der Arduino als Zufallsgeber nehmen soll, da der Mikrokontroller an sich kein wirklichen Zufallswert erstellen kann. Wir nehmen hier sozusagen die innere Uhr. 

Dann lassen wir den ersten Zufallswert zwischen 1 und 3 erstellen. Wenn der Wert 1 ergibt startet die erste if-Schleife wenn der Wert 2 ist, die zweite. In jeder Schleife wird ein zufallswert erzeugt der den PIN bestimmt. Der Wert kann nur in einem Bereich (von..bis) definiert werden, deshalb sollten die Ausgänge aufeinanderfolgend sein. Anschließend wird dieser PIN auf HIGH oder eben auf LOW geschrieben.

Zum Schluss das ganze noch mit der Pause. Zufallswert zwischen 1000 und 10000 ermitteln und mit dem Befehl delay in Millisekunden abwarten.

 

Und fertig ist das ganze Wunder...

Beim definieren eines Zufallswerts müssen wir einen Bereich angeben innerhalb dessen der Wert liegen darf. Dabei kann der Zufallswert den kleineren Wert treffen, den höheren nie.

z.B. 

random(1, 3) - 1 oder 2

random(5, 12) - 5,6,7,8,9,10 oder 11

random(3, 7) - 3,4,5,6



Nun kann man das ganz noch ein wenig Anlagentauglich bearbeiten...

Z.B. frage ich noch den Status des Pin 2 ab. Sobald es in meinem MoBa Zimmer dunkel wird, sendet ein Arduino ein 5V Signal an alle Arduino auf der Anlage die daraufhin ihren Nachtmodus starten. Man könnte das aber auch über einen Schalter erledigen. Außerdem würde ich auf der Anlage einen Arduino Pro Mini verwenden.

 

Zur Umsetzung:

 

Oben müssen wir noch zusätzlich eine Variable definieren:

 

int in = 2;

 

Dann Packen wir den void loop in eine if_schleife:

 

if (digitalRead(in) == HIGH)

{

  hier der bisherige loop teil

}

 

aber was passiert wenn kein Signal am Pin2 anliegt? Aktuell würde sich der aktuelle Status nicht mehr verändern. Wir möchten aber die Lichter wieder ausschalten. Also packen wir den 2. Teil unseres vorherigen Loop (der die LED auf LOW schreibt) in einen else_Teil.

 

Fertig sieht das dann so aus:

 

int led3 = 3;

int led4 = 4;

int led5 = 5;

int led6 = 6;

int led7 = 7;

int randOnOff;

int randNr;

int randdelay;

int in = 2;

 

void setup() {

  pinMode(led3, OUTPUT);

  pinMode(led4, OUTPUT);

  pinMode(led5, OUTPUT);

  pinMode(led6, OUTPUT);

  pinMode(led7, OUTPUT);

 

void loop() {

  if(digitalRead(in) == HIGH)

  {

    randomSeed(millis());

    randOnOff = random(1, 3);

    if (randOnOff == 1)

    {

      randNr = random(3, 8);

      digitalWrite(randNr, HIGH);

    }

    if (randOnOff == 2)

    {

      randNr = random(3, 8);

      digitalWrite(randNr, LOW);

    }

    randdelay = random(1000, 10000);

 

    delay(randdelay);

  }

  else

  {

    randNr = random(3, 8);

    digitalWrite(randNr, LOW);

    randdelay = random(1000, 10000);

 

 

    delay(randdelay);

  }

}

Download
Schaltplan
belebtes Haus.pdf
Adobe Acrobat Dokument 55.7 KB

Download
Nochmals alles in einer PDF zusammengefasst
Beschreibung komplett.pdf
Adobe Acrobat Dokument 334.1 KB
Download
Arduino sketch
Das ist der von mir verwendete Sketch.
ein paar Details sind anders als in der Erklärung, aber grundsätzlich funktioniert er identisch.
H_user_zufall.ino
Text Dokument 649 Bytes