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秒
}