花了好久的時間,做出來的作品,額溫槍!唯二在疫情期間有用的作品!
前情提要自從2020年二月起,新冠肺炎的疫情便一發不可收拾,讓大家都很害怕。2020年4月,我在學校研究程式時,老師跟我說我找到一個網頁,在教大家如何製作一個便宜的額溫槍,於是我就點進去看看。隔天,老師拿出了三個零件,分別是1.Arduino Pro Micro2.mlx906143.SSD1306 oled接著跟我說我買到了製作額溫槍的零件,可以給你研究看看。我先試著用網頁上的範例程式,但是那個範例程式只會不斷的更新感測到的數值,因此,我就決定要改良它。窩先在上面加了一個按鈕並加入讀取按鈕訊號的程式,但是不成功,後來我發現我用的按鈕是平常輸出1,被按下時輸出0,改了一下就成功了。Ya! 後來,我又加了LED來提示溫度,但經過時測後還是不準確,便加了連續讀取1秒,每0.1秒讀去一次,最後再算平均值,就變準確了!如果要自己做,步驟如下:準備材料
- 400孔麵包版mlx90614測溫模組按鈕RGB LEDSSD1306 OLED模組Arduino Pro Micro3號電池盒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度,如果有,就亮紅燈。製作完成!
