案例说明:Arduino按钮按下时,processing画出一圈同心圆。
Arduino连线图:
先看Arduino代码:
int in = 12;//定义按钮引脚
void setup()
{
pinMode(in,INPUT);
Serial.begin(9600);//设置波特率
}
void loop()
{
int v = digitalRead(in);//读取引脚电压以检测是否按下按钮
if(v == HIGH){
Serial.print(1); //如果按下,发送1
delay(300);//延迟0.3秒,防止操作过快
}
}
下面是Processing代码:
import processing.serial.*;//导入需要的包
Serial myPort = new Serial(this, "COM4", 9600);//实例化连接对象,这里的波特率与上述一致
int i=10;//画的圆的个数
int x,y;//圆的坐标
void setup(){//默认只执行一遍的方法
size(800,800);//设置窗体大小
}
void draw(){//默认循环执行
int j = myPort.available();
//available()方法返回当前剩余的字符个数,即发送一个数据就返回1,发两个就返回2
myPort.read();
//read()方法将 取出 并 读取 发送过来的数据,也就是说,如果不取出,available()返回的数值越来越大
println(j);//无实际意义,可以看到available()返回的数值
if(j>0){//如果获取数据,j就会大于0
x =int(random(800));//随机取x轴坐标
y =int(random(800));//随机取y轴坐标
while(i>=0)//画圆的动作
{
ellipse(x,y,20+i*8,20+i*8);
fill(random(255),random(255),random(255));//随机组合rgb以生成随机颜色
i--;
//之所以用--而不用++,是因为先画小圆会被大的圆盖住
}
}else{
println("nothing happend");
i = 10;//圆的个数初始化,不然就画不出圆了
}
}
容易出问题的就是available()这里,通常想,只要判断有数据过来就行,执行完了就会再次执行draw()方法,但是判断的方式是available()方法的返回值是否是大于0的,如果不执行read()方法,则数据会一直积累,即永远不会小于0,所以执行的结果很可能是只有一个图形,下面就不再执行了。
附效果图一张: