案例說明: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,所以執行的結果很可能是隻有一個圖形,下面就不再執行了。
附效果圖一張: