我刚接触并尝试制作一个非常简单的程序,其中我有一个产生seriel输入的arduino(根据模拟读取值)。这个想法是一个处理窗口打开,块颜色显示30秒。在这段时间里,arduino的所有读数将被求和并取平均值 - 创建该颜色的平均值。
30秒后,颜色会发生变化,并开始计算新的平均值(下一种颜色)。这是我已经开始编写的代码(现在仅关注一个30秒的绿色时段)。
我意识到阅读/求和和平均可能存在问题(我还没有研究过这些问题,所以我会把它放到一边) - 但我的主要问题是为什么背景不是绿色?当我运行这个程序时,我希望背景为绿色30秒 - 其中发生的是它是白色30秒然后变为绿色。无法弄清楚原因!谢谢你的帮助!
import processing.serial.*;
Serial myPort;
float gsrAverage;
float greenAverage;
int gsrValue;
int greenTotal = 0;
int greenCount = 1;
int timeSinceStart = 0;
int timeAtStart;
int count=0;
color green = color(118,236,0);
void setup () {
size(900, 450);
// List all the available serial ports
//println(Serial.list());
myPort = new Serial(this, Serial.list()[0], 9600);
}
void draw () {
while (timeSinceStart < 30000) {
background(green);
greenTotal = greenTotal + gsrValue;
greenCount = greenCount + 1;
delay(500);
timeSinceStart = millis()-timeAtStart;
//println(timeSinceStart); for de bugging
}
greenAverage = greenTotal/greenCount;
//println(greenAverage); for de bugging
}
void serialEvent (Serial myPort) {
int inByte=myPort.read();
//0-255
gsrValue=inByte;
}
答案 0 :(得分:0)
可能已经找到了一种使用IF语句的方法。我也许看了一下draw函数本身就是一个循环的事实,所以我能够使用
的变体if (timeSinceStart < 5000) {
background(green);
}
在平局中
答案 1 :(得分:0)
我想为计时器做些什么,是使用IF语句并使用millis()或不断更新的变量&#39; m&#39;在条件内:
int timeSinceStart;
int m;
void setup(){
timeSinceStart = millis(); // initialize here so it only happens once
}
void draw(){
m = millis(); // constantly update the variable
if(timeSinceStart + 30000 < m){
greenAverage = greenTotal/greenCount; // or whatever is outside while loop
timeSinceStart = millis();
}
//Anything that went inside the while loop can go here, or above the IF
}
这使得每30秒左右,背景将改变一次,你只需重新更新timeSinceStart变量。这样,它只会在您希望更新时更新,而不是不断更新和破坏代码。
我倾向于不在处理过程中使用while循环,因为它们通常会导致头痛。希望我的例子有所帮助。
答案 2 :(得分:0)
在处理Processing中的定时事件时,不应在draw()函数中使用while循环。 draw()函数本身是一个while循环,它更新每帧的“屏幕”。
所以,你应该做的是创建一个计时器,让它在draw()函数内为你做一个开关。在您的情况下,如果您想以绿色屏幕开始,则在setup()函数中执行此操作,然后根据draw()函数中的计时器创建一个更改方法。
这是关于如何解决您的特定问题的建议。只需根据需要更改循环变量即可。在你的情况下,它将是30000。
boolean isGreen = true;
int startTime = 0;
int lastTime = 0;
int cycle = 1000; //the cycle you need
void setup() {
size(200, 200);
background(0, 255, 0); //green
}
void draw() {
startTime = millis();
if (startTime > lastTime + cycle) {
if (isGreen) {
background(255); //white
isGreen = !isGreen;
} else {
background(0, 255, 0); //green
isGreen = !isGreen;
}
lastTime = millis();
}
}