Posted on

花了好久的時間,做出來的作品,額溫槍!唯二在疫情期間有用的作品!

前情提要自從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<(aSizei);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度,如果有,就亮紅燈。製作完成!

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *