/**************************************** Exquisite Corpse: Pessimist Jonathan Llewellyn ****************************************/ // Define pins #define mag1 2 #define mag2 3 #define photo 2 // Global variables byte datum1 = 0; byte datum2 = 0; byte datum3 = 0; boolean bits[24]; int sensor = 0; void setup() { // setup serial port Serial.begin(9600); // set pin modes pinMode(mag1,OUTPUT); pinMode(mag2,OUTPUT); pinMode(13,OUTPUT); // seed random data to begin loop Serial.print((byte)random(255), BYTE); Serial.print((byte)random(255), BYTE); Serial.print((byte)random(255), BYTE); } void loop() { ////////////////////////////////////////////////////////// // WAIT FOR A NEW PACKET ////////////////////////////////////////////////////////// while (Serial.available() < 3) blinkLED(); datum1 = Serial.read(); datum2 = Serial.read(); datum3 = Serial.read(); ////////////////////////////////////////////////////////// // MAKE SOMETHING HAPPEN IN THE PHYSICAL WORLD // ACCORDING TO THE RECEIVED PACKET ////////////////////////////////////////////////////////// convert(datum1, datum2, datum3); mags(); ////////////////////////////////////////////////////////// // MODIFY THE PACKET ////////////////////////////////////////////////////////// sensor = analogRead(photo); modify(); // Echo modified packet mags(); ////////////////////////////////////////////////////////// // SEND THE NEW PACKET ////////////////////////////////////////////////////////// Serial.print(datum1, BYTE); Serial.print(datum2, BYTE); Serial.print(datum3, BYTE); ////////////////////////////////////////////////////////// // PAUSE FOR 1 SECOND ////////////////////////////////////////////////////////// delay(1000); } ////////////////////////////////////////////////////////////// // FUNCTIONS ////////////////////////////////////////////////////////////// // blink LED function void blinkLED(){ digitalWrite(13,HIGH); delay(55); digitalWrite(13,LOW); delay(55); } // Data modification function: the darker it // is, the more the values are reduced. void modify(){ if(sensor < 250){ datum1 /= 4; datum2 /= 4; datum3 /= 4; return; } if(sensor >= 250 && sensor < 500){ datum1 = datum1/4 * 2; datum2 = datum2/4 * 2; datum3 = datum2/4 * 2; return; } if(sensor >= 500 && sensor < 900){ datum1 = datum1/4 * 3; datum2 = datum2/4 * 3; datum3 = datum2/4 * 3; return; } if(sensor >= 900){ return; } } // Activation function: activates magnets according to // the position of the bits in each byte. void mags(){ for(int i = 0; i < 24; i++){ if(i % 2){ if(bits[i]){ digitalWrite(mag1,HIGH); delay(300); }else{ digitalWrite(mag1,LOW); delay(300); } }else{ if(bits[i]){ digitalWrite(mag2,HIGH); delay(300); }else{ digitalWrite(mag2,LOW); delay(300); } } } digitalWrite(mag1,LOW); digitalWrite(mag2,LOW); } // Byte to bit conversion function: converts each data byte to // an array of bits. void convert(byte datum1, byte datum2, byte datum3){ for(int i = 7; i >= 0; i--){ bits[i+16] = datum3 % 2; datum3 /= 2; } for(int i = 7; i >= 0; i--){ bits[i+8] = datum2 % 2; datum2 /= 2; } for(int i = 7; i >= 0; i--){ bits[i] = datum1 % 2; datum1 /= 2; } }