Stress gör konst: galvanisk hud svar och visuella Generation (2 / 3 steg)
Steg 2: kod
1) GSR källkoden
Först var http://cwwang.com/2008/04/13/gsr-reader/ som inkluderar Arduino koden (för Arduino och bearbetning att kommunicera) och bearbetning kod att använda galvanisk hud svarsdata från konstruerade sensorerna. Wangs kod diagram i princip en persons galvanisk hud svar värdet i en glidande linje graf, som ser ut lite som en EKG läsa visuellt. Jag ville ha en mer abstrakt visualisering av data så används koden från en annan källa att generera visuella.
2) visual Source Code
Koden för att skapa visuella är från: http://www.generative-gestaltung.de/P_2_2_1_01
3) min kod
A) ARDUINO KODEN NEDAN
void setup() {
Serial.BEGIN(9600);
}
void loop() {
int a=analogRead(0);
om (Serial.available() > 0)
{
byte inbyte=Serial.read();
IF(inbyte=='a')
{
Serial.write(a);
}
}
}
---------------------------------------------
B) BEARBETNING KODEN NEDAN
Du kan kopiera/klistra in denna kod till en ny behandling skiss
Visuella källkoden från: http://www.generative-gestaltung.de/P_2_2_1_01
GSR källkoden från: http://cwwang.com/2008/04/13/gsr-reader/
import processing.pdf.*;
import java.util.Calendar;
booleska recordPDF = false;
import processing.serial.*;
Seriella myPort;
int hPosition = 1;
float currentReading;
float lastReading;
int count = 0;
int zeroLinePos = 0;
float gsrAverage, prevGsrAverage;
float originalplan = 0;
lång lastFlatLine = 0;
int baselineTimer = 10000, //10 SEK
int gsrValue;
int gsrZeroCount = 0;
flyta gsrRange = 0;
int downhillCount = 0;
int uphillCount = 0;
booleska nedförsbacke.
Boolean nådde = false;
float peak, dalen;
int hastighet;
int Nord = 0;
int NORDOST = 1;
int öster = 2;
int SYDOST = 3;
int söder = 4;
int SYDVÄST = 5;
int väst = 6;
int nordväst = 7.
flyta stepSize = 1;
float diameter = 1;
int riktning;
flyta posX, posY;
int minCurrentReading = 1000;
int maxCurrentReading = 0;
void setup() {
storlek (800, 800); //size i fönstret för bild
Background(255);
Smooth();
noStroke();
posX = bredd/2;
posY = höjd/2;
println(Serial.list());
currentReading = 0;
lastReading = 0;
gsrAverage = 0;
hitta rätt serieport för din dator och ange i nummer inuti]
myPort = ny följetong (denna, Serial.list() [8], 9600);
}
void serialEvent (Serial myPort) {
int inByte=myPort.read();
0-255
gsrValue = inByte; //taking värdet som skickas från Arduino
}
void draw() {
calculateGSR();
println ("currentReading =" + currentReading);
Mappa currentReading snabbare
om (currentReading < = 50)
{
currentReading = minCurrentReading;
} else om (currentReading > 1000)
{
currentReading = maxCurrentReading;
}
annat / / giltig zon
{
om (currentReading < minCurrentReading)
{
minCurrentReading = int (currentReading);
}
om (currentReading > maxCurrentReading)
{
maxCurrentReading = int(currentReading);
}}
println ("currentReading =" + currentReading + "minCurrentReading =" + minCurrentReading + "maxCurrentReading =" + maxCurrentReading);
currentReading = karta (currentReading, minCurrentReading, maxCurrentReading, 10, 15000);
hastighet = int (currentReading);
println ("mappade värdet =" + hastighet);
fördröjning (50), //delay för stabilitet
tillämpa den GSR behandlingen att köra hastighet som organiska ritningen "växer"
för (int jag = 0; jag < = hastighet; i ++) {
riktning = (int) random (0, 8);
om (riktning == norr) {
posY-= stepSize;
}
annars om (riktning == NORDOST) {
posX += stepSize;
posY-= stepSize;
}
annars om (riktning == öst) {
posX += stepSize;
}
annars om (riktning == SYDOST) {
posX += stepSize;
posY += stepSize;
}
annars om (riktning == söder) {
posY += stepSize;
}
annars om (riktning == SYDVÄST) {
posX-= stepSize;
posY += stepSize;
}
annars om (riktning == väst) {
posX-= stepSize;
}
annars om (riktning == nordväst) {
posX-= stepSize;
posY-= stepSize;
}
om (posX > bredd) posX = 0;
om (posX < 0) posX = bredd;
om (posY < 0) posY = höjd;
om (posY > höjd) posY = 0;
fyllning (0, 40);
ellips (posX + stepSize/2, posY + stepSize/2, diameter, diameter);
Skicka "a" för fler byte
}
}
void calculateGSR () {
bästa dröjsmål inställningen för gsr avläsningar
println(gsrValue);
Delay(50);
bild (myMovie, 0, 0);
om (gsrValue < 15 & & gsrValue > -15) {/ / något mellan -15 och + 15 anses noll
om någon fingrar går av stapeln i 10 sekunder vilket resulterar i 10 0s, bara reset
om (gsrZeroCount > 10) {
currentReading = 0; //flatline
gsrAverage = 0;
Originalplan = 0;
lastFlatLine=millis();
gsrZeroCount = 0;
println("reset");
}
gsrZeroCount ++;
} / / end av test för nära noll
annat {/ / ggood läsning
currentReading = gsrValue-baseLine;
gsrZeroCount = 0;
}
om (millis ()-lastFlatLine > baselineTimer) {
Originalplan = gsrAverage; //if fick vi minst 10 sekunder av behandlingen sedan den senaste flatline
}
gsrRange = peak-dalen;
gsrAverage=smooth(currentReading,.99,gsrAverage);
int hövs = 7.
om (currentReading-hövs > lastReading & & toppnotering == true) {
neråt = false;
println(downhillCount);
uphillCount ++;
downhillCount = 0;
punkt (hPosition-1, höjd/2.0-lastReading).
dalen = lastReading;
toppnotering = false;
}
om (currentReading + hövs < lastReading & & toppnotering == false) {
println(uphillCount);
neråt = sant;
uphillCount = 0;
downhillCount ++;
punkt (hPosition-1, höjd/2.0-lastReading).
toppen = lastReading;
toppnotering = sant;
}
prevGsrAverage = gsrAverage;
lastReading = currentReading;
Skicka "a" för fler byte
myPort.write('a');
}
int slät (flyta data, flyta filterVal, flyta smoothedVal) {
om (filterVal > 1) {/ / check till göra säker param är inom spänna
filterVal =. 99;
}
annars om (filterVal < = 0) {
filterVal = 0;
}
smoothedVal = (data * (1 - filterVal)) + (smoothedVal * filterVal);
tillbaka (int) smoothedVal;
}