26.化學反應速率測量

按鈕 A0

光感測器 A2

/*

mode0 等待按按鈕

mode1 按下按鈕

mode2 放開按鈕等遮蔽

mode3 第一次遮蔽

mode4 持續遮蔽

mode5 復光

*/

#include <Wire.h> //載入I2C介面函式庫

#include <LiquidCrystal_I2C.h> //載入I2C液晶控制函式庫

LiquidCrystal_I2C lcd(0x27, 16, 2); // 若LCD 無法啟用,請將0X3F 改為0X27

int raw,bn_state,mode,state1,state2;

float t,t1,t2 ;

void setup() {

Serial.begin(9600); //啟用序列埠介面,可以從序列埠視窗抓到數據

lcd.init(); //LCD初始化

lcd.backlight(); //LCD 開啟背光

lcd.clear(); // LCD清除畫面

pinMode(14,INPUT);

}

void loop() {

if(state1==0){mode=0;

lcd.setCursor(0,1); //設定LCD游標至第0行,第0列的位置

lcd.print("press bn:start"); //LCD在現在的游標開始顯示 A0= ,每個字元游標會自動前進

lcd.print(" ");

}

raw = analogRead(A2); //讀取類比腳位A0,可以將0~5V 轉化成 0~1023

t = millis()/1000.00;

int bn = digitalRead(14);

//按下按鈕 mode1

if(bn==1){

bn_state += 1;

state1 +=1;

if(bn_state==1){t1 = millis()/1000.00; mode = 1;}

}else if(bn == 0){bn_state = 0;}

if(state1>0 && state2==0){mode=2;}

if(raw<200 && state1>0){

state2 += 1;

if(state2==1){t2 = millis()/1000.00; mode=3;}

}

if(state2>1){mode=4;}

if(raw>200 && state2>1){

mode=5;

lcd.setCursor(12,1); //設定LCD游標至第0行,第0列的位置

lcd.print("next"); //LCD在現在的游標開始顯示 A0= ,每個字元游標會自動前進

}

if(mode==5 && bn==1){

mode=0;

bn_state=0;

state1=0;

state2=0;

}

lcd.setCursor(0, 0); //設定LCD游標至第0行,第0列的位置

lcd.print("Read="); //LCD在現在的游標開始顯示 A0= ,每個字元游標會自動前進

lcd.print(raw); //LCD在現在的游標顯示變數a的值

lcd.print(" "); //LCD在現在的游標顯示空白,這樣可以在位數縮減時,清除多的位數

/*

lcd.setCursor(0, 1); //設定LCD游標至第0行,第0列的位置

lcd.print(bn); //LCD在現在的游標顯示變數a的值

lcd.print(" "); //LCD在現在的游標顯示空白,這樣可以在位數縮減時,清除多的位數

*/

if (mode==1 || mode==2){

lcd.setCursor(0,1); //設定LCD游標至第0行,第0列的位置

lcd.print("t="); //LCD在現在的游標開始顯示 A0= ,每個字元游標會自動前進

lcd.print(t-t1); //LCD在現在的游標顯示變數a的值

lcd.print(" "); //LCD在現在的游標顯示空白,這樣可以在位數縮減時,清除多的位數

}

if (mode==3){

lcd.setCursor(0,1); //設定LCD游標至第0行,第0列的位置

lcd.print("t="); //LCD在現在的游標開始顯示 A0= ,每個字元游標會自動前進

lcd.print(t2-t1); //LCD在現在的游標顯示變數a的值

lcd.print(" "); //LCD在現在的游標顯示空白,這樣可以在位數縮減時,清除多的位數

}

delay(100); //每個迴圈延遲0.1秒

}