xxxxxxxxxx
112
var serial;
var latestData;
function setup() {
createCanvas(windowWidth, windowHeight);
serial = new p5.SerialPort();
serial.open('COM2');
serial.on('data', getData);
}
var counter = 0;
function draw() {
background(0);
stroke(255);
strokeWeight(1);
noFill();
if (latestData != undefined) {
text(latestData, 15, 25);
}
let pos, sensor = latestData * 500;
if (sensor) {
drawBackground();
}
for (let i = 0; i < 15; i++) {
pos = random(0, sensor);
drawLine(sensor, (height / 2) + pos, random(0, 255), random(0, 255), random(0, 255), random(0, 255));
drawLine(sensor, (height / 2) - (pos * 2), random(0, 255), random(0, 255), random(0, 255), random(0, 255));
}
}
function drawLine(sensor, n, r, g, b, a) {
let data = [];
let newData = [];
let cr = 255, cg = 255, cb = 255, ca = 0;
for (let i = 0; i <= (width + 300); i++) {
data[i] = height / 2;
}
if (sensor) {
for (let i = 150, j = 0; i <= (width + 300) / 2; i++, j += n / width / 2) {
data[i] = height / 2 - (j);
}
for (let i = (width + 300) / 2, j = 0; i >= 150; i--, j += n / width / 2) {
data[width / 2 + i] = height / 2 - (j);
}
cr = r;
cg = g;
cb = b
ca = a;
}
newData = movingAverage(data, 150);
let ref = random(0, 150);
for (let i = 0; i < ref; i++) {
newData.shift();
}
beginShape();
stroke(cr, cg, cb, ca);
strokeWeight(15);
for (let i = 0; i <= width; i++) {
vertex(i, newData[i]);
}
endShape();
}
function drawBackground() {
let aCol = color(random(0, 255), random(0, 255), random(0, 255), 100);
let bCol = color(random(0, 255), random(0, 255), random(0, 255), 100);
aspeed = bounce(0, 0, 100, 3)
bspeed = bounce(128, 0, 100, -3);
for (let i = 0; i <= width; i++) {
let inter = map(i, 0, width, 0, 1);
let col = lerpColor(aCol, bCol, inter);
stroke(col);
line(i, 0, i, height);
}
}
function bounce(num, low, high, speed) {
if (num < low || num > high) {
speed *= -1;
}
return speed;
}
function movingAverage(prices, interval) {
let index = interval - 1;
const length = prices.length + 1;
let results = [];
while (index <= length) {
index = index + 1;
const intervalSlice = prices.slice(index - interval, index);
const sum = intervalSlice.reduce((prev, curr) => prev + curr, 0);
results.push(sum / interval);
}
return results;
}
function getData() {
let currentData = serial.readLine();
trim(currentData);
if (!currentData) return;
latestData = currentData;
}