花了好久的時間,做出來的作品,額溫槍!唯二在疫情期間有用的作品!
前情提要
自從2020年二月起,新冠肺炎的疫情便一發不可收拾,讓大家都很害怕。
2020年4月,我在學校研究程式時,老師跟我說我找到一個網頁,在教大家如何製作一個便宜的額溫槍,於是我就點進去看看。隔天,老師拿出了三個零件,分別是
1.Arduino Pro Micro
2.mlx90614
3.SSD1306 oled
接著跟我說我買到了製作額溫槍的零件,可以給你研究看看。我先試著用網頁上的範例程式,但是那個範例程式只會不斷的更新感測到的數值,因此,我就決定要改良它。窩先在上面加了一個按鈕並加入讀取按鈕訊號的程式,但是不成功,後來我發現我用的按鈕是平常輸出1,被按下時輸出0,改了一下就成功了。Ya! 後來,我又加了LED來提示溫度,但經過時測後還是不準確,便加了連續讀取1秒,每0.1秒讀去一次,最後再算平均值,就變準確了!
如果要自己做,步驟如下:
準備材料
- 400孔麵包版
- mlx90614測溫模組
- 按鈕
- RGB LED
- SSD1306 OLED模組
- Arduino Pro Micro
- 3號電池盒
- 3號電池
- 麵包版跳線
- 有源蜂鳴器
步驟
1.先準備好所有的材料。
2.開始組裝電路。
3.連到電腦,寫程式囉!
範例程式!
#include <Wire.h>
#include <Adafruit_MLX90614.h>
#include <U8glib.h>
float avg = 0.00;
float data = 0.00;
float temp[9];
Adafruit_MLX90614 mlx = Adafruit_MLX90614();
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE);
float tmax = 0.00;
void draw(void) {
u8g.setFont(u8g_font_fur25);
u8g.setPrintPos(10, 29);
u8g.print(avg, 1);
u8g.drawStr(80, 29, "\260C");
u8g.setPrintPos(10, 63);
u8g.print(tmax, 1);
u8g.drawStr(80, 63, "\260C");
}
void rankUp(float *arr, byte aSize){
uint16_t tempData;
aSize-=1; //2個之間比較,所以執行n-1次.
for(int i=0;i<aSize;i++){
for(int j=0;j<(aSize–i);j++){
if(arr[j]>arr[j+1]){
tempData=arr[j+1];
arr[j+1]=arr[j];
arr[j]=tempData;
}
}
}
}
void setup() {
Serial.begin(9600);
Serial.println("Adafruit MLX90614 Forehead thermometer");
mlx.begin();
pinMode(7, INPUT); //switch
pinMode(8, OUTPUT); //buzzer
pinMode(4, OUTPUT); //red
pinMode(5, OUTPUT); //green
pinMode(6, OUTPUT); //blue
digitalWrite(8, HIGH);
}
void loop() {
if(digitalRead(7)==LOW) {
while (!digitalRead(7)==HIGH);
}
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
int i;
for(i=0;i<9;i++) {
temp[i] = mlx.readObjectTempC();
delay(100);
}
digitalWrite(5, LOW);
digitalWrite(5, LOW);
digitalWrite(8, LOW);
delay(100);
digitalWrite(8, HIGH);
for(i=0;i<9;i++) {
data += temp[i];
}
avg = data/10;
Serial.print("Ambient = "); Serial.print(mlx.readAmbientTempC());
Serial.print("*C\tObject = "); Serial.print(mlx.readObjectTempC()); Serial.println("*C");
Serial.print("Ambient = "); Serial.print(mlx.readAmbientTempF());
Serial.print("*F\tObject = "); Serial.print(mlx.readObjectTempF()); Serial.println("*F");
Serial.print(avg); Serial.println("*C");
rankUp(temp, 10);
tmax = temp[9];
u8g.firstPage();
do {
draw();
} while( u8g.nextPage() );
if (avg > 37.5) {
digitalWrite(4, HIGH);
delay(1000);
digitalWrite(4, LOW);
} else if (avg < 37.0) {
digitalWrite(6, HIGH);
delay(1000);
digitalWrite(6, LOW);
}
delay(1000);
}
程式解說
1-3行:引用螢幕和測溫模組的程式庫。
7行:暫存測溫模組輸出的資料。
9-10行:初始化測溫模組。
13-21行:在螢幕上顯示溫度。
41-45行:初始化Arduino Pro Micro版和設定周邊元件的針腳。
50-100行:主程式。
51、52行:判斷開關有沒有被按下(筆者用的開關是平常輸出1,被按下時輸出0,各位讀者,如果你用的是按下時輸出1的開關,記得要改成: if (digitalRead(7) ==HIGH ) {……。
55-56行:亮燈(藍和綠)。
58-62行:記錄溫度。
64-65行:關燈。
66-68行:讓蜂鳴器較0.1秒。
70-72行:取十個數值的平均值。
86行:在螢幕上顯示溫度。
89-87行:判斷溫度是否超過攝氏37.5度,如果有,就亮紅燈。
製作完成!
