DIY

Non-contact thermometer with data transfer to the cloud

Бесконтактный термометр с передачей данных в облакоБесконтактный термометр с передачей данных в облакоБесконтактный термометр с передачей данных в облакоPandemic COVID-19 spread to a large part of the world. One of the symptoms of infection is a fever, dry cough and shortness of breath. Temperature control is an important tool in these conditions. This is especially important for people who suffer easy form in home conditions.
Infrared thermometer – this is the fastest way to learn, high temperature no. Infrared thermometer indicates temperature instantly. You can find non-contact infrared thermometers on sale, but not one of them supports the IoT for the collection, collation and wound temperature data. To solve this problem, the master made thermometer IoT, which automatically sends the data to the cloud server.
Tools and materials:
Module infrared temperature sensor MLX90614;
-Wemos D1 mini ESP8266;
-0.96 inch OLED display;
Li-ion battery 18650;
-Charging module lithium-ion battery TP4056 1A;
-3D printer;
-Soldering station;
-Clock button – 4 PCs;
-Wires;
Step one: General information
Functions thermometer:
1. Contactless
2. Battery
3. Support WiFi and cloud storage
4. Viewing data from the cloud
5. Automatic energy saving mode
6. The adjustment and calibration
Бесконтактный термометр с передачей данных в облакоБесконтактный термометр с передачей данных в облакоThe sensor MLX90614 integrates two devices: one infrared sensor and the other device signal processing DSP (computing module). It works on the basis of the Stefan-Boltzmann law, which States that all objects emit infrared energy, and the intensity of this energy will be directly proportional to the temperature of the object. The sensing element in the sensor measures how much infrared energy is emitted by the object, and the computing module converts it into a temperature value using the built-in 17-bit ADC and outputs the data according to the I2C communication Protocol. The sensor measures how the temperature of an object and the ambient temperature to calibrate the temperature value of the object.
Wemos D1 mini is a module with wifi to ESP8266. It has one analog port and digital port 11.
Led display (OLED) that will be used in this project is a model SSD1306: single color 0.96 inch display with a resolution of 128 × 64 pixels. OLED display needs no backlight and is very economical.
Бесконтактный термометр с передачей данных в облакоSecond step: 3D design and printing
Case for their device master printed on 3D-printer. For the template, it took the work of another artist. Downloaded the file and made some changes. For example, altered niche for battery with 9 V on an 18650.
Бесконтактный термометр с передачей данных в облакоБесконтактный термометр с передачей данных в облакоБесконтактный термометр с передачей данных в облакоБесконтактный термометр с передачей данных в облакоFiles for printing can be downloaded below.
IoT Thermometer back.stl
IoT Thermometer display panel.stl
IoT Thermometer front.stl
IoT Thermometer sensor panel.stl
Step three: Assembly
After printing all of the files, the wizard starts the Assembly of the device. First you need to prepare control Board with display. Cost cuts in accordance with the size of the front panel (28 mm x 48 mm). Mounts three tactile buttons. One terminal of all the switches must be connected together, and further soldered to the minus.
Бесконтактный термометр с передачей данных в облакоБесконтактный термометр с передачей данных в облакоБесконтактный термометр с передачей данных в облакоAfter mounting the buttons to the next task – setting of the display. For accommodation fees Wemos D1 were cut out another circuit Board. The display cable and jumpers from the boards of the buttons needs to be connected to female connectors. Then you need to connect another button to the Board, which will be used to measure and download data to the cloud and an infrared sensor.
Бесконтактный термометр с передачей данных в облакоБесконтактный термометр с передачей данных в облакоБесконтактный термометр с передачей данных в облакоБесконтактный термометр с передачей данных в облакоThe device will use lithium-ion rechargeable battery 18650. The battery is installed in the handle of the device. To protect and charge the battery module is used for charging.
Бесконтактный термометр с передачей данных в облакоБесконтактный термометр с передачей данных в облакоБесконтактный термометр с передачей данных в облакоБесконтактный термометр с передачей данных в облакоБесконтактный термометр с передачей данных в облакоБесконтактный термометр с передачей данных в облакоБесконтактный термометр с передачей данных в облакоThe charging module is also housed in the handle.
Бесконтактный термометр с передачей данных в облакоБесконтактный термометр с передачей данных в облакоБесконтактный термометр с передачей данных в облакоIn the upper part of the handle is installed the switch. With the help of it the device will turn on and off.
Бесконтактный термометр с передачей данных в облакоБесконтактный термометр с передачей данных в облакоБесконтактный термометр с передачей данных в облакоStep four: download code
Before downloading code, you must prepare an account Adafruit IO. More detail how to do this can be read here. Now we need to load the code.

/* This code works with MLX90614 (GY906) and OLED screen 
 * It measures both ambient and object temperature in Fahrenheit and display it on the screen 
 * 
 * 
 * 
 */ 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include "AdafruitIO_WiFi.h" 
#include 
#include "Arduino.h" 

#define IO_USERNAME "Your Adafruit IO Username" 
#define IO_KEY "Your Adafruit IO Key" 
#define WIFI_SSID "your wifi ssid" 
#define WIFI_PASS "your wifi password" 
#define SCREEN_WIDTH 128 // OLED display width, in pixels 
#define SCREEN_HEIGHT 64 // OLED display height, in pixels 
#define OLED_RESET -1 // Reset pin # (or -1 if sharing the Arduino reset pin) 

#define MENU D5 
#define UP D6 
#define DOWN D7 
#define MEASURE D4 

int menu = 0; 
int celcius = 0; 
int wifi = 1; 
body_temp int = 1; 
int patient_id = 1; 
int display_on = 1; 


Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); //Declaring the display name (display) 
Adafruit_MLX90614 mlx = Adafruit_MLX90614(); 
AdafruitIO_WiFi io(IO_USERNAME, IO_KEY, WIFI_SSID, WIFI_PASS); 
//AdafruitIO_Feed *temperature = io.feed("temperature"); 

void setup() { 

 pinMode(MENU, INPUT_PULLUP); 
 pinMode(UP, INPUT_PULLUP); 
 pinMode(DOWN, INPUT_PULLUP); 
 pinMode(MEASURE, INPUT_PULLUP); 

 /************************Configuration Read fromEEPROM***************************/ 
 EEPROM.begin(512); //Initialize EEPROM 
 celcius = EEPROM.read(0); 
 wifi = the EEPROM.read(1); 
 body_temp = EEPROM.read(2); 

 mlx.begin(); 
 display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //Start the OLED display 

 home_page(); 

 Serial.begin(9600); 
 delay(10000); 
 // connect to io.adafruit.com 
 if(wifi)connectAIO(); 
 if(io.status() < AIO_CONNECTED){ 
 display.clearDisplay(); 
 display.setTextColor(WHITE); 
 display.setTextSize(1); 
 display.setFont(); 
 display.setCursor(0,20); 
 display.println("No Internet Access!"); 
 display.display(); 
 delay(3000); 
 } 

 // we are connected 
 Serial.println(); 
 Serial.println(io.statusText()); 

} 

long time_count = millis(); 
void loop() { 

 if(!digitalRead(MENU)){ 
 time_count = millis(); 
 delay(200); 
 menu++; 
 if(menu>3) { 
 menu = 0; 
 EEPROM.write(0, celcius); 
 EEPROM.write(1, wifi); 
 EEPROM.write(2, body_temp); 
 EEPROM.commit(); 
 } 
 } 

 if(!digitalRead(UP)){ 
 time_count = millis(); 
 delay(200); 
 if(menu==0)++ patient_id; 
 if(menu==1) celcius = 1; 
 if(menu==2) wifi = 1; 
 if(menu==3) body_temp = 1; 
 } 

 if(!digitalRead(DOWN)){ 
 time_count = millis(); 
 delay(200); 
 if(menu==0) patient_id--; 
 if(menu==1) celcius = 0; 
 if(menu==2) wifi = 0; 
 if(menu==3) body_temp = 0; 
 } 

 if(wifi){ 
 if(WiFi.status() != WL_CONNECTED){ 
 Wi-Fi access.forceSleepWake(); 
 delay(1); 
 Wi-Fi access.mode(WIFI_STA); // 
 Wi-Fi access.begin(WIFI_SSID, WIFI_PASS); // 
 while (WiFi.status() != WL_CONNECTED) { 
 delay(500); 
 Serial1.print("."); 
 } 
 } 
 } 

 if(!wifi){ 
 Wi-Fi access.disconnect(); // 
 Wi-Fi access.mode(WIFI_OFF);// 
 Wi-Fi access.forceSleepBegin(); 
 delay(100); 
 } 

 if(menu == 0) home_page(); 
 else if(menu == 1) scale_setup_page(); 
 else if(menu == 2) wifi_setup_page(); 
 else if(menu == 3) temp_setup_page(); 

 if(!digitalRead(MEASURE)){ 
 time_count = millis(); 
 display.ssd1306_command(SSD1306_DISPLAYON); 
 display_on = 1; 
 Serial.println("Button Press"); 
 delay(5000); 
 if(wifi){ 
 if(io.status() >= AIO_CONNECTED){temp_write(); 
 display.clearDisplay(); 
 display.setTextColor(WHITE); 
 display.setTextSize(1); 
 display.setFont(); 
 display.setCursor(0,20); 
 display.println("Data Sent!"); 
 display.display(); 
 delay(1500); 
 } 
 else{ 
 display.clearDisplay(); 
 display.setTextColor(WHITE); 
 display.setTextSize(1); 
 display.setFont(); 
 display.setCursor(0,10); 
 display.println("No Internet access!"); 
 display.display(); 
 delay(1500); 
 } 
 } 
 //delay(3000); 
 } 

 if((millis()>= time_count + 50000) && display_on == 1){ 
 display.ssd1306_command(SSD1306_DISPLAYOFF); 
 display_on = 0; 
 } 

 //display.ssd1306_command(SSD1306_DISPLAYON); 
 //io.run(); 
 //temperature->save(tempF); 
 //delay(3000); 

} 

void home_page(){ 
 float body_tempF = mlx.readObjectTempF()+ 4.5; 
 float ambient_tempF = mlx.readAmbientTempF(); 
 float body_tempC = (body_tempF-32)/1.8; 
 float ambient_tempC = (ambient_tempF-32)/1.8; 
 display.clearDisplay(); 
 display.setTextColor(WHITE); 
 display.setTextSize(1); 
 display.setFont(); 
 display.setCursor(0,0); 
 if(body_temp) 
 display.println("Body Temperature"); 
 else 
 display.println("Ambient Temp"); 
 display.setFont(&FreeSerif12pt7b); 
 display.setCursor(20,40); 
 if(body_temp && celcius) display.println(body_tempC,2); 
 else if(body_temp && !celcius) display.println(body_tempF,2); 
 else if(!body_temp && !celcius) display.println(ambient_tempF,2); 
 else if(!body_temp && celcius) display.println(ambient_tempC,2); 
 //display.println(mlx.readObjectTempF()+4.5,2); 
 display.setCursor(80,40); 
 display.drawCircle(85, 28, 3, WHITE); 
 if(celcius) display.println(" C"); 
 else display.println(" F"); 
 display.setFont(); 
 display.setCursor(0,55); 
 display.print("ID: P0"); 
 display.println(String(patient_id)); 
 display.setCursor(70,55); 
 if(WiFi.status() == WL_CONNECTED) display.println("WiFi: ON"); 
 else display.println("WiFi: OFF"); 
 display.display(); 
 } 


void scale_setup_page(){ 
 display.clearDisplay(); 
 display.setTextColor(WHITE); 
 display.setFont(&FreeSerif9pt7b); 
 display.setCursor(0,13); 
 display.println("Temp Scale"); 
 display.setFont(&FreeSerif12pt7b); 
 display.drawCircle(65, 25, 3, WHITE); 
 display.drawRect(35, 25, 15, 15, WHITE); 
 display.setCursor(70,39); 
 display.println("C"); 
 display.drawCircle(65, 45, 3, WHITE); 
 display.drawRect(35, 45, 15, 15, WHITE); 
 display.setCursor(70,60); 
 display.println("F"); 
 if(celcius) 
 display.fillRect(37, 27, 11, 11, INVERSE); 
 else 
 display.fillRect(37, 47, 11, 11, INVERSE); 
 display.display(); 
 } 


void wifi_setup_page(){ 
 display.clearDisplay(); 
 display.setTextColor(WHITE); 
 display.setFont(&FreeSerif9pt7b); 
 display.setCursor(0,13); 
 display.println("WiFi Setup"); 
 display.setFont(&FreeSerif12pt7b); 
 display.drawRect(10, 25, 15, 15, WHITE); 
 display.setCursor(40,39); 
 display.println("Enable"); 
 display.drawRect(10, 45, 15, 15, WHITE); 
 display.setCursor(40,60); 
 display.println("Disable"); 
 if(Wi-Fi) 
 display.fillRect(12, 27, 11, 11, INVERSE); 
 else 
 display.fillRect(12, 47, 11, 11, INVERSE); 
 display.display(); 
 } 

void temp_setup_page(){ 
 display.clearDisplay(); 
 display.setTextColor(WHITE); 
 display.setFont(&FreeSerif9pt7b); 
 display.setCursor(0,13); 
 display.println("Temperature"); 
 display.setFont(&FreeSerif12pt7b); 
 display.drawRect(10, 25, 15, 15, WHITE); 
 display.setCursor(40,39); 
 display.println("Body"); 
 display.drawRect(10, 45, 15, 15, WHITE); 
 display.setCursor(40,60); 
 display.println("Ambient"); 
 if(body_temp) 
 display.fillRect(12, 47, 11, 11, INVERSE); 
 else 
 display.fillRect(12, 27, 11, 11, INVERSE); 
 display.display(); 
 } 

void power_saving_mode(){ 
 display.ssd1306_command(SSD1306_DISPLAYOFF); 
 //wifi_station_disconnect(); 
 wifi_set_opmode(NULL_MODE); 
 wifi_fpm_set_sleep_type(LIGHT_SLEEP_T); 
 wifi_fpm_open(); // Enables force sleep 
 //wifi_fpm_set_wakeup_cb(callback); 
 gpio_pin_wakeup_enable(GPIO_ID_PIN(MEASURE), GPIO_PIN_INTR_LOLEVEL); // GPIO_ID_PIN(2) corresponds to GPIO2 on ESP8266-01 , GPIO_PIN_INTR_LOLEVEL for a logic low, can also do other interrupts, see gpio.h above 
 wifi_fpm_do_sleep(0xFFFFFFF); // Sleep for the longest possible time 
 } 

void callback() { 
 display.ssd1306_command(SSD1306_DISPLAYON); 
 Serial1.println("Callback"); 
 Serial.flush(); 
} 

void temp_write(){ 
 // set up `deepsleep` feed 
 String str = "P0"; 
 str += patient_id; 
 int str_len = str.length() + 1; 
 char char_array[str_len]; 
 str.toCharArray(char_array, str_len); 
 AdafruitIO_Feed *temperature = io.feed(char_array); 
 Serial.println("sending temperature to feed"); 
 float body_tempF = mlx.readObjectTempF()+ 4.5; 
 float ambient_tempF = mlx.readAmbientTempF(); 
 float body_tempC = (body_tempF-32)/1.8; 
 float ambient_tempC = (ambient_tempF-32)/1.8; 

 if(body_temp && celcius) temperature->save(body_tempC,2); 
 else if(body_temp && !celcius) temperature->save(body_tempF,2); 
 else if(!body_temp && !celcius) temperature->save(ambient_tempF,2); 
 else if(!body_temp && celcius) temperature->save(ambient_tempC,2); 
 // send data to feed deepsleep 
 //temperature->save(temp); 
 // write data to AIO 
 io.run(); 
} 

void connectAIO() { 
 Serial.println("Connecting to Adafruit IO..."); 
 io.connect(); 
 long entering_time = millis(); 
 // wait for a connection 
 while ((io.status() < AIO_CONNECTED) || (millis()> entering_time + 15000)) { 
 Serial.print("."); 
 delay(500); 
 } 

 // we are connected 
 Serial.println(); 
 Serial.println(io.statusText()); 
}

Бесконтактный термометр с передачей данных в облакоБесконтактный термометр с передачей данных в облакоWell, the last step is final Assembly.
The wizard installs the display case.
Бесконтактный термометр с передачей данных в облакоБесконтактный термометр с передачей данных в облакоБесконтактный термометр с передачей данных в облакоБесконтактный термометр с передачей данных в облакоSecures the sensor, that all cards, switches, buttons. Collects body parts.
Бесконтактный термометр с передачей данных в облакоБесконтактный термометр с передачей данных в облакоБесконтактный термометр с передачей данных в облакоEverything is ready.
Бесконтактный термометр с передачей данных в облакоБесконтактный термометр с передачей данных в облако

Source:

usamodelkina.ru

Show More

Related Articles

Leave a Reply

Your email address will not be published. Required fields are marked *

Back to top button

Please disable your ad blocker

We know you are here for the stories. Not the ads. But we need the ads to keep the lights on. So please whitelist Buzzon.live.