Zahlwert |
Farbe |
1 |
Rot |
2 |
Gelb |
4 |
Grün |
8 |
Blau |
/**************************************************\
* Name: Sensoduino *
* Version 1.0
*
* Datum: 27.12.2018 *
* Autor: Wolfgang Triebig
*
\**************************************************/
#include "pitches.h"
#define TasteRt 3
#define TasteGe 4
#define TasteGn 5
#define TasteBl 6
#define LedRt 8
#define LedGe 9
#define LedGn 10
#define LedBl 11
#define Piezo 12
#define ZeitHand 300 //Anzeigezeit für Tastendruck
int Werteliste[10]; //Array für die Farbenfolge
int Ton[9] //Array für Töne
{0, //ungenutzt
NOTE_C5, //Ton für rot
NOTE_D5, //Ton für gelb
NOTE_C3, //Ton für Fehler
NOTE_E5, //Ton für grün
NOTE_A5, //1. Ton für Fanfare
NOTE_B5, //2. Ton für Fanfare
NOTE_C6, //3. Ton für Fanfare
NOTE_F5}; //Ton für blau
int i; //Schleifenvariable
int Runde; //Spielrunde
int Position; //Aktuelle Stelle, aus der Werteliste,
die angezeigt wird
int ZeitZeigen; //Anzeigezeit für Farbe/Ton
int ZeitPause=100; //Pausenzeit zwischen zwei Farben/Tönen
boolean Richtig; //HIGH wenn richtige Taste, LOW wenn
falsche Taste gedrückt wurde
void setup()
{
Serial.begin(9600); //Für Testzwecke
noTone(Piezo);
for(i=TasteRt;i<=TasteBl;i++)
//Inizialisierung der Tasteingänge
{
pinMode(i,INPUT);
digitalWrite(i,HIGH);
}
for(i=LedRt;i<=Piezo;i++)
//Inizializierung der Ausgänge (LED und Piezo)
{
pinMode(i,OUTPUT);
}
}
void loop()
{
PORTB=15; //Alle LEDs an
while(0 ==(15 & ~(PIND/8))); //Warten auf Eingabe zum Starten des
Programmes
PORTB=0;
ZeitZeigen=1000;
delay(ZeitZeigen);
NeueZahlen(4);
for(Runde=0;Runde<10;Runde++) //Durchlauf von 10 Runden
{
for(Position=0;Position<=Runde;Position++) //je Runde eine Farbe mehr anzeigen
{
Anzeige(ZeitZeigen,Werteliste[Position]);
}
for(Position=0;Position<=Runde;Position++) //Jetzt kommt die Eingabe der Farbfolge
{
while(0
== (15 & ~(PIND/8))); //Warte auf Eingabe
if((15
& ~(PIND/8)) == Werteliste[Position])
//Auswerten der Handeingabe
{
Anzeige(ZeitHand,Werteliste[Position]);
Richtig=HIGH;
}
else
{
Anzeige(1000,3);
Richtig=LOW;
}
while(0
!= 15 & ~(PIND/8)); //Warten auf Ende der Handeingabe
if(Richtig
== LOW)
//Abbruch der Runde bei falscher Eingabe
{
break;
}
}
if(Richtig
== LOW)
//Abbruch des Spieles bei Falscheingabe
break;
delay(ZeitZeigen);
}
if(Richtig==HIGH)
{
Tusch();
if(ZeitZeigen>100)
//Wenn Runde richtig beendet, Tusch und kürzere Zeit für nächste Runde
{
ZeitZeigen=ZeitZeigen-100;
}
else //Wenn alle Runden richtig beendet,
Abschluss und neues Spiel
{
for(Runde=0;Runde<10;Runde++)
{
for(Position=1;Position<=8;Position=Position*2)
{
PORTB=Position;
delay(200);
}
for(Position=8;Position>=1;Position=Position/2)
{
PORTB=Position;
delay(200);
}
}
}
}
}
void Tusch()
{
Serial.println("Tusch");
PORTB=15;
tone(Piezo, Ton[5], 200);
delay(300);
tone(Piezo, Ton[6], 200);
delay(300);
tone(Piezo, Ton[7], 750);
delay(2000);
PORTB=0;
}
void Anzeige(int
Anzeigezeit,int Tonart)
{
PORTB=Werteliste[Position];
tone(Piezo, Ton[Tonart], Anzeigezeit);
delay(Anzeigezeit);
PORTB=0;
delay(ZeitPause);
}
void NeueZahlen(int Wertebereich)
{
Serial.println("Neue
Zahlen");
randomSeed(millis());
for(int i=0;i<10;i++)
{
Werteliste[i] = 1;
int Wert
= random(Wertebereich);
for(int j=0;j<Wert;j++)
{
Werteliste[i]=Werteliste[i]*2;
}
Serial.println(Werteliste[i]);
}
}