#define LED 11 //LED/STATUS pin dieser Zelle. Gesteuert durch interne Logik #define sensorPIN A4 //pin zur Senor-Auswerung #define sensorVALUE analogRead(A4) //sensor wert #define stepPIN A5 //pin zur koordinierung. Gesteuert durch externe Logik #define readPIN (stepSTATE+3)%8+2 //formel zur berechnung der Pins, an denen die Nachbarzellen gelesen werden #define writePIN stepSTATE+1 //formel zur berechnung der Pins, an denen Nachbarzelen angeschrieben werden #define stepINPUT digitalRead(A5) int stepSTATE = 0; //extern angegebener Counter für den Lese/Schreibe Zyklus boolean stepTOGGLE = false; //toggle für den stepSTATE int jobSTATE = 0; //interner counter für den Lese/Schreibe Zyklus boolean liveSTATE = false; //"Lebens"status dieser Zelle int liveNEIGHBOUR = 0; //Anzahl der "Lebenden" Nachbar Zellen const int threshold = 450; //Grenzwert ab dem der Sensor anschlagen soll boolean sensorTOGGLE = false; //"sensor zustand" void setup() { //Serial.begin(9600); pinMode(LED, OUTPUT); //LED Pin pinMode(sensorPIN, INPUT); //Pin wo die hall-sonde ausgelesen wird pinMode(stepPIN, INPUT); //Pin wo durch der Lese/schreibe Zyklus reinkommt pinMode(12, OUTPUT); pinMode(12, LOW); } void loop() { digitalWrite(LED, liveSTATE); //Die LED spiegelt den Lebensstatus der Zelle wieder if(stepTOGGLE == false && stepINPUT == true){ //wurde bis jetzt noch kein genarationsimpuls regestriert, geht aber grad einer ein stepTOGGLE = true; //wird vermerkt das ein impuls eingeht stepSTATE += 1; //und eine Generation hochgegangen } if(stepTOGGLE == true && stepINPUT == false){ //ist vermerkt das ein Impuls registriert wurde, liegt aber keiner an stepTOGGLE = false; //wird dies vermerkt } if (stepSTATE == 0){ //geht die Zelle nicht die genarationen durch, kann mit dem magneten der status geändert werden: if (sensorVALUE <= threshold && sensorTOGGLE == false){ //Ist der Magnet nah genug dran und wars bis jetzt aber noch nicht sensorTOGGLE = true; //wird vermerkt das der Magnet nah genug dran ist liveSTATE = !liveSTATE; //der Lebenstatus geändert Serial.println(sensorVALUE); } if (sensorVALUE > threshold){ //ist der Magnet wieder weiter weg sensorTOGGLE = false; //wird vermerkt das grad kein Magnet da ist } } if (stepSTATE > 0 && stepSTATE < 9 && jobSTATE == stepSTATE - 1){ //werden die schritte durchgegangen: if (stepSTATE == 1){ //wird erst gecheckt ob dies der erste schritt ist liveNEIGHBOUR = 0; //ist dies der fall wird der Nachbar counter auf null gesetzt } pinMode(writePIN,OUTPUT); //es wird der Erste pin in der folge als out-put definiert digitalWrite(writePIN,liveSTATE); //und darüber der lebensstatus an den entsprechenden Nachbarn vermittelt pinMode(readPIN, OUTPUT); digitalWrite(readPIN,LOW); //der entsprechend gegenüberliegende pin wird resetet, pinMode(readPIN,INPUT); //als input definiert liveNEIGHBOUR += digitalRead(readPIN); //und sofern dort eine lebende nachbarzelle entdeckt wird, wird dies vermerkt jobSTATE++; //es wird vermerkt das der erste schritt fertig ist Serial.print(liveNEIGHBOUR); Serial.print(" Nachbarnzahl, die nach dem pin "); Serial.print(readPIN); Serial.println(" gelesen wurde"); } else if (stepSTATE ==9 && jobSTATE == stepSTATE - 1){ //wenn angefordert und fertig mit Job 2 werden die Regeln angewendet: if (liveSTATE == false && liveNEIGHBOUR == 3){ //tote Zelle mit genau drei Lebenden Nachbarn liveSTATE = true; //wird lebendig } else if (liveSTATE == true && liveNEIGHBOUR < 2){ //Lebende Zelle mit weniger als zwei Lebenden Nachbarn liveSTATE = false; //Stirbt } else if (liveSTATE == true && liveNEIGHBOUR > 3){ //Lebende Zelle mit mehr als 3 Lebenden Nachbarn liveSTATE = false; //Stirbt } Serial.println(); Serial.print("Gesammt zahl lebender Nachbarn:"); Serial.println(liveNEIGHBOUR); Serial.println(); jobSTATE = 0; //Fertig mit allen Jobs, stepSTATE = 0; //wartet auf erste Aufgabe } }