全自動測量IOT額溫槍

日前看到新聞報導台大研發成本3000元非接觸式額溫槍, 但在Marker的世界, 其實有更簡單更便宜的方法, 利用超音波測距再加上一個Buzzer, 30元就可以把日前設計的IOT紅外線額溫槍改為全自動測量. 總成本約600元. 仿間許多額溫槍前面只用一個透鏡, 然後用黑體來校正醫療級的紅外線Sensor, 尤其是中國製低價的產品都是這樣設計, 但常常因為距離與其他因素測不準, 最近我常常因為這樣的原因被攔下來一直量體溫, 我個人只要大量運動後前額有汗水干擾紅外線反射, 中國製的額溫槍就會失靈, 怎麼量都是low, 而量測人員一直很認真的要測出來, 我就一直被擋在門口. 很想告訴他們應該換成台灣代工的百靈牌, 人家有專利可以解決這問題, 不然用我這篇的方法也可以, 不要再擋我下來了, 量不到是額溫槍設計的問題, 我真得沒有體溫異常!! 而MCU90615測量溫度會也因為距離的影響而測不準, 但是這問題在兩公分內就可以改善, HC-SR04最短距離是2公分, 所以我在layout上設定與MCU90615距離0.5公分時候就會啟動測量. 額頭接近HC-SR04 10公分的時候就用斷音提示使用者用, 2公分就會一個長音進行測量.

BOM

1. 萬孔板
2. HC-SR04 超音波模塊
3. 蜂鳴器
4. 排針母座 1*16P 2個
5. 90度排針母座 1*4P 2個
5. 排針母座 1*4P 1個
6. JST 2.0 1*2P 公 1個
7. JST 2.0 1*2P 母 1個
8. 4號4個電池盒附蓋附開關 1個
9. MCU90615
10. 0.96吋 I2C OLED
11. NodeMCU 開發板 ESP8266 WiFi ESP-12E cp2102

電路

schematic_esptsmv2_esp8266-v2_20200402155718

Arduino程式碼 https://github.com/ChenKaiJung/esptsm


#include
#include
#include
#include
#include
#include
#include
#include "images.h"

/* Set these to your desired credentials. */
const char *ssid = "ESPTSMOLED";
const char *password = "12345678";

Ultrasonic ultrasonic(12, 14);
ESP8266WebServer server(80);
SoftwareSerial sSerial(2, 0);
SSD1306Wire display(0x3c, SDA, SCL);

float temperture[10] = {NAN,NAN,NAN,NAN,NAN,NAN,NAN,NAN,NAN,NAN};
unsigned int tp = 0;
float envTemperture[10] = {NAN,NAN,NAN,NAN,NAN,NAN,NAN,NAN,NAN,NAN};
unsigned int ep = 0;
unsigned char output[37];
unsigned char to[2];
unsigned char ta[2];
char buff[1024];
char dispbuf[128];

void handleRoot() {

  char temp[256];
  unsigned int pf=0;
   int ttp=tp;

  //Serial.println();
  //Serial.print("ttp:");
  //Serial.print(ttp);
  if(ttp!=0) {
    for( int i=ttp-1;i>=0;i--){
     sprintf(temp, "</pre>
<h1><span style="font-size:300%;">Temperture is: %.2f</span></h1>
<pre>
", temperture[i]);
     strncpy(&amp;buff[pf],temp,strlen(temp));
     pf=pf+strlen(temp);
     Serial.println();
     Serial.print("temperture:");
     Serial.print(temperture[i]);

              Serial.println();
       Serial.print("i:");
       Serial.print(i);
    }
  }

  //Serial.println();
  //Serial.print("ttp:");
  //Serial.print(ttp);

  if(ttp!=9) {
    for( int i=9;i&gt;=ttp;i--){
     sprintf(temp, "</pre>
<h1><span style="font-size:300%;">Temperture is: %.2f</span></h1>
<pre>
", temperture[i]);
     strncpy(&amp;buff[pf],temp,strlen(temp));
     pf=pf+strlen(temp);
       //Serial.println();
       //Serial.print("temperture:");
       //Serial.print(temperture[i]);

       //       Serial.println();
       //Serial.print("i:");
       //Serial.print(i);
    }
  }
  server.send(200, "text/html", buff);
}

unsigned char checksum(unsigned char* buffer) {
  unsigned char *buf = (unsigned char *)buffer;
  unsigned int seed;
  seed = buffer[0] + buffer[1] + buffer[2] + buffer[3] + buffer[4] + buffer[5] + buffer[6] + buffer[7];
  unsigned char result = (unsigned char)seed &amp; 0xff;
  return result;
}

void setup() {
  delay(1000);
  Serial.begin(115200);
  Serial.println();
  Serial.print("Configuring access point...");
  /* You can remove the password parameter if you want the AP to be open. */
  WiFi.mode(WIFI_AP);
  WiFi.softAP(ssid, password);

  IPAddress myIP = WiFi.softAPIP();
  Serial.print("AP IP address: ");
  Serial.println(myIP);

  server.on("/", handleRoot);
  server.begin();
  Serial.println("HTTP server started");

  sSerial.begin(115200);
  //sSerial.write(0xA5);
  //sSerial.write(0x45);
  //sSerial.write(0xEA);

  display.init();
  //display.flipScreenVertically();
  display.setFont(ArialMT_Plain_10);

  //pinMode(16, INPUT);
  pinMode(13,OUTPUT);
}
void loop() {
  server.handleClient();

  //int keyin=digitalRead(16);
  //Serial.println();
  //Serial.print(keyin);
  //if(keyin==1) {
  //  sSerial.write(0xA5);
  //  sSerial.write(0x15);
  //  sSerial.write(0xBA);
  //}
  int dist=ultrasonic.distanceRead();
        Serial.println("");
        Serial.print("Distance: ");
      Serial.print(dist);  //讀取距離
      Serial.println(" CM");

  if(dist  2 ) {
          noTone(13);
      }
      else {
        sSerial.write(0xA5);
        sSerial.write(0x15);
        sSerial.write(0xBA);
      }
   }
   else {
      noTone(13);
  }

  if (sSerial.available() == false) {
    delay(100);
    return;
  }
  noTone(13);

  Serial.println();
  Serial.print("Taking Readings:");
  for (int counter = 0; counter &lt;= 36; counter++) {
    output[counter] = (unsigned char)sSerial.read();
    Serial.print(output[counter], HEX);;
  }

  for (int obj = 0; obj &lt;= 36; obj++) {

    if (output[obj] != 0x5A
        || output[obj + 2] != 0x45
        || output[obj + 3] != 0x04
        || output[obj + 8] != checksum(&amp;output[obj])) {
      delay(100);
      continue;
    }

    to[0] = output[obj + 4];
    to[1] = output[obj + 5];
    unsigned int total = to[0] &lt;9) {
      tp=0;
    } 

    ta[0] = output[obj + 6];
    ta[1] = output[obj + 7];

    total = ta[0] <span id="mce_SELREST_start" style="overflow:hidden;line-height:0;"></span><span id="mce_SELREST_start" style="overflow:hidden;line-height:0;"></span>&lt;9) {
      ep=0;
    }
  }

  delay(100);
}

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google photo

您的留言將使用 Google 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s