Welcome to Hackster!
Hackster is a community dedicated to learning hardware, from beginner to pro. Join us, it's free!
Rushabh Jain
Published © GPL3+

Handsfree Thermometer

A non-contact temperature measurement device

IntermediateFull instructions providedOver 1 day198
Handsfree Thermometer

Things used in this project

Hardware components

Arduino Pro Mini 328 - 5V/16MHz
SparkFun Arduino Pro Mini 328 - 5V/16MHz
×1
0.96" OLED 64x128 Display Module
ElectroPeak 0.96" OLED 64x128 Display Module
×1
Ultrasonic Sensor - HC-SR04 (Generic)
Ultrasonic Sensor - HC-SR04 (Generic)
×1

Software apps and online services

Arduino IDE
Arduino IDE

Story

Read more

Custom parts and enclosures

Chassis_Lid

This is a custom made Lid for the project so we can attach various components to it

Chassis_Box

This file is the box for the thermometer device.

Schematics

Circuit Diagram

Code

Thermometer_V1.0.ino

Arduino
Main code for handsfree thermometer
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_MLX90614.h>
#include <Fonts/FreeSans9pt7b.h>
#include <Fonts/FreeMono9pt7b.h>
#include <Fonts/FreeSerif9pt7b.h>

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels


#define trigPin   9     //Trig Pin of Ultrasound sensor
#define echoPin   8     //Echo Pin of Ultrasound Sensor
#define greenLed  5    //Green Led Pin
#define redLed    6     //Red Led Pin
#define buttonPin 11     //Button Pin
#define buzzer    2     // Buzzer pin

//Creating an object of the class
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
Adafruit_MLX90614 mlx = Adafruit_MLX90614();

//Define Functions
int getDistance();      // Returns the distance 
float getTemp();        // Returns the temperature
float getTempf();
String getUnit();       // Returns the unit for temperature


void Press();           // Function for buttom

void StartScreen();     //Function for start screen
void Menu();            //Function for menu screen
void WaitScreen();      // Function for wait screen
void End();             // Function for end screen
void LED(int num);      // Function for Led

// defines variables
char temp[10];
long duration;
int distance;
int glow = 0;
int unit = 0;

void setup() {
  Serial.begin(115200); //Start the Serial Monitor for debugging. Can be commented out after debugging is done

  pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
  pinMode(echoPin, INPUT); // Sets the echoPin as an Input
  pinMode(buttonPin, INPUT_PULLUP); //Activate internal pullup resister for normally HIGH
  pinMode(redLed, OUTPUT);  //Sets the Red led Pin as an Output
  pinMode(greenLed, OUTPUT);  //Sets the green led pin as an Output
  pinMode(buzzer,OUTPUT);     // Set the Buzzer as OUTPUT
  
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Begins the display if correct is provided
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }
  
  delay(1000);
  display.clearDisplay();
  display.setTextColor(WHITE);
  //StartScreen();
  mlx.begin();
 
}

void loop() {
  Menu();
  if(getDistance() < 7){
    End();
    
    digitalWrite(buzzer,HIGH);
    delay(500);
    digitalWrite(buzzer,LOW);
    
    delay(2000);
  }
  delay(250);
}

//////////////////////////////////////////////////////////////////////
//                      FUCNTIONS
//////////////////////////////////////////////////////////////////////

int getDistance(){
    
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  // Sets the trigPin on HIGH state for 10 micro seconds
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  // Reads the echoPin, returns the sound wave travel time in microseconds
  duration = pulseIn(echoPin, HIGH);
  // Calculating the distance
  distance= duration*0.034/2;
  
  return distance;
}

float getTemp(){
  
  float dataF = 0;
  for(int i=0; i<10;i++){
    dataF += mlx.readObjectTempF();
    delay(100);
  }
  dataF /= 10;

  if(unit == 0){
    return dataF;
  }
  else if(unit == 1){
    return ( (5.0/9.0)*(dataF-32) );
  }
  
}

float getTempf(){
  
  float dataF = 0;
  for(int i=0; i<10;i++){
    dataF += mlx.readObjectTempF();
    delay(100);
  }
  dataF /= 10;

  
  return dataF;
  
}
String getUnit(){
  switch(unit){
    case 0:
      return "F";
      break;

    case 1:
      return "C";
      break;
  }
}

void Press(){
  int rd = digitalRead(buttonPin);
  if( !rd && unit == 0){
    unit=1;
  }
  else if( !rd && unit == 1){
    unit=0;
  }
  Serial.println(rd);
}
//////////////////////////////////////////////////////////////////////
//                   SCREEN FUCNTIONS
//////////////////////////////////////////////////////////////////////

void StartScreen(){
  display.clearDisplay();
  display.setFont(&FreeSans9pt7b);
  display.setTextSize(1);
  display.setCursor(10,20);
  display.println("Contactless   Thermometer");
  display.display();
}

void Menu(){
  Press();
  display.clearDisplay();
  LED(0);
  display.setFont(&FreeSerif9pt7b);
  display.setTextSize(2);
  
  display.setCursor(0,25);
  display.println("LOOK");

  display.setCursor(0,60);
  display.println("HERE");

  display.setTextSize(1);
  display.setCursor(110,20);
  display.println(getUnit());

  display.drawRect(108,6,19,19,WHITE);
  display.display();
}

void End(){
  display.clearDisplay();
  display.clearDisplay();
  display.setFont(&FreeSans9pt7b);
  display.setTextSize(2);
  
  display.setCursor(0,25);
  dtostrf(getTemp(),0,1,temp);
  display.println(temp);

  display.drawCircle(98,3,3,WHITE);
  display.setCursor(103,25);
  display.println(getUnit());

  if(getTempf() < 99.0){
    display.setCursor(0,60);
    display.setTextColor(WHITE);
    display.println("OK");
    glow = 1;
  }
  else if(getTempf() > 99.0 && getTempf() < 102.0){
    display.setCursor(0,60);
    display.println("FEVER");
    glow = 3;
  }
  else if(getTempf () > 102.0){
    display.setCursor(0,60);
    display.println("HIGH");
    glow = 2; 
  }

  display.display();
  LED(glow);
}

void LED(int num){
  switch(num){
    case 0:
       digitalWrite(greenLed,LOW);
       digitalWrite(redLed,LOW);
       break;
    
    case 1:                           //Green LED
      digitalWrite(greenLed,HIGH);
      digitalWrite(redLed,LOW);
      break;

    case 2:                           // Red LED
      digitalWrite(greenLed,LOW);
      digitalWrite(redLed,HIGH);
      break;

    case 3:                           // Orange LED
      digitalWrite(greenLed,HIGH);
      digitalWrite(redLed,HIGH);
      break;
  }
}

Credits

Rushabh Jain
10 projects • 44 followers
An engineer who loves to solve problems with technology. Expertise in Embedded firmware and software.
Contact

Comments

Please log in or sign up to comment.