Not: Bu proje Linter tarafından yapılmış olup, ilk olarak Hackster.io‘da yayınlanmıştır.
Bu, Seeed Studio Grove – MLX90615 Dijital Kızılötesi Sıcaklık Sensörü tabanlı bir “koronavirüs dedektörü”dür.
Maskenin üzerinde iki dedektör bulunmaktadır. Her dedektör aynı kızılötesi sıcaklık sensöründen yapılmıştır. Ve sıcaklık verilerini maskenin üzerinde göstermek için Grove – OLED Display 1.12” V2 kullanmayı tercih ettim.
Bu projede kullanılan malzemeler
Dedektör
1 x Arduino Uno
2 x Grove – Dijital Kızılötesi Sıcaklık Sensörü
1 x Grove – MP3 v2.0
1 x Pil
1 x Grove – Buton
1 x Mono Kapalı Hoparlör – 2W 6 Ohm Mono Kapalı Hoparlör – 2W 6 Ohm
1 x Grove – OLED Display 1.12” V2
1 x Grove – RGB LED Yüzük (20 – WS2813 Mini)
Birçok Grove kablosu
Yapısal
3mm kalınlığında akrilik levha
Biraz yapıştırıcı
Araçlar
Sıcak eriyik yapıştırıcı tabancası.
Elektrikli lehimleme demiri
Lazer kesici 3D Yazıcı makinesi
Bu dedektörün aşağıdaki işlevleri vardır:
- Maskenin üzerindeki dijital kızılötesi sıcaklık sensörü, gerçek zamanlı olarak vücut sıcaklığını algılayabilir ve maskeye bağlı OLED ekranda sıcaklığı gösterebilir.
- Diğer taraftaki dedektör, temas ettiğim kişinin sıcaklığını algılayabilir.
- Diğer kişinin sıcaklığı normalse, sol göz kısmındaki RGB LED yüzük yeşil renkte yanar.
- Diğer kişinin sıcaklığı 38℃’yi aşarsa, RGB LED yüzük kırmızı renge döner ve bir uyarı ile birlikte gelir, bu da onun koronavirüs açısından potansiyel bir risk taşıdığını gösterir, ardından ona test ve tedavi için hastaneye gitmesini öneririm.


Adım 1: Ne gerekiyor
Donanım Listesi
Dedektör
1 x Arduino Uno
2 x Grove – Dijital Kızılötesi Sıcaklık Sensörü
1 x Grove – MP3 v2.0
1 x Pil
1 x Grove – Buton
1 x Mono Kapalı Hoparlör – 2W 6 Ohm
1 x Grove – OLED Display 1.12” V2
1 x Grove – RGB LED Yüzük (20 – WS2813 Mini)
Birçok Grove kablosu
Yapısal
3mm kalınlığında akrilik levha
Biraz yapıştırıcı
Araç
Sıcak eriyik yapıştırıcı tabancası
Elektrikli lehimleme demiri
Lazer kesici
3D yazıcı
Adım 2: CAD çizimi ve tasarımı
İşte oluşturduğum CAD çizimi.

Adım 3: Lazer kesimi

Eğer yakınınızda bir üretim alanı varsa, kolayca bir lazer kesici bulabilirsiniz. Her üretim alanında bir lazer kesici olduğunu söyleyebilirim. Eğer lazer kesicinin levhasını bulamazsanız, Seeed tarafından sağlanan lazer kesim hizmetini deneyebilirsiniz.
Adım 4: Pili dönüştürme
Pilimiz iki portlu olduğu için, Seeedunio’ya daha kolay bağlanabilmek için pili Grove arayüzüne dönüştürmek için küçük bir değişiklik yapmamız gerekiyor.



Öncelikle, pilimizin portunu Grove kablosunun portundan kesiyoruz.
İkincisi, kırmızı hat kırmızı hat ile ve siyah hat siyah hat ile eşleşecek şekilde, elektrikli lehimleme demiri ile telleri lehimliyoruz.

Adım 5: Yazılım çalışması

Adım 6: Donanım bağlantısı ve montaj
Donanımı aşağıda gösterildiği gibi bağlayın:

Dedektör bu şekilde bağlanacaktır:

Not: Dijital kızılötesi sıcaklık sensörünün algılama mesafesi farklı sonuçlara yol açabilir. Ben algılama için yaklaşık 6mm mesafe kullandım, bu yüzden vücut sıcaklığı formülünü algılama durumunuza göre ayarlamanız gerekiyor.
Bu çalışma aslında birçok farklı çözümü denerken değiştirilmektedir. Akım da biraz kaba, gelecekte daha rafine bir versiyonu üretilecektir. Umarım herkes beğenir.
Aşağıda CAD dosyasını ve kodu ekledim.
detector.inoC/C++
#include <Wire.h>
#include <SeeedGrayOLED.h>
#include <avr/pgmspace.h>
#include "Adafruit_NeoPixel.h"
#include "MLX90615.h"
#include "WT2003S_Player.h"
#ifdef __AVR__
#include <SoftwareSerial.h>
SoftwareSerial SSerial(2, 3); // RX, TX
#define COMSerial SSerial
#define ShowSerial Serial
WT2003S<SoftwareSerial> Mp3Player;
#endif
#ifdef ARDUINO_SAMD_VARIANT_COMPLIANCE
#define COMSerial Serial1
#define ShowSerial SerialUSB
WT2003S<Uart> Mp3Player;
#endif
#ifdef ARDUINO_ARCH_STM32F4
#define COMSerial Serial
#define ShowSerial SerialUSB
WT2003S<HardwareSerial> Mp3Player;
#endif
#define BY_PINS // Bunu her MLX için pin kullanmak için yorumdan çıkarın
// #define BY_ADDR // Tek bir veri yolu kullanmak için bunu yorumdan çıkarın
#ifdef BY_PINS // EK PİNLER KULLANILIYOR
byte sda_1 = 5;
byte scl_1 = 4;
byte sda_2 = 7;
byte scl_2 = 6;
SoftI2cMaster i2c_1(sda_1, scl_1);
MLX90615 mlx90615_1(DEVICE_ADDR, &i2c_1);
SoftI2cMaster i2c_2(sda_2, scl_2);
MLX90615 mlx90615_2(DEVICE_ADDR, &i2c_2);
#endif // BY_PINS
#ifdef BY_ADDR
// TODO: Gerçek adreslerinizi ve MLX sayısını güncelleyin!
#define DEVICE1_ADDR DEVICE_ADDR
#define DEVICE2_ADDR DEVICE_ADDR+1
// #define INCLUDED_I2C
#ifdef INCLUDED_I2C // Dahil edilen I2C Kütüphanesini kullanma
#define SDA_PIN SDA // SDA pinini tanımla
#define SCL_PIN SCL // SCL pinini tanımla
SoftI2cMaster i2c_bus(SDA_PIN, SCL_PIN);
MLX90615 mlx90615_1(DEVICE1_ADDR, &i2c_bus);
MLX90615 mlx90615_2(DEVICE2_ADDR, &i2c_bus);
#else // Wire kullanma
MLX90615 mlx90615_1(DEVICE1_ADDR, &Wire);
MLX90615 mlx90615_2(DEVICE2_ADDR, &Wire);
#endif // WITH_WIRE tanımlandı
#endif // BY_ADDR tanımlandı
//LED
#define PIN 8
#define NUMPIXELS 24
#define BRIGHTNESS 255
Adafruit_NeoPixel strip = Adafruit_NeoPixel(24, PIN, NEO_GRB + NEO_KHZ800);
int delayval = 500; // yarım saniye bekleme
int button1 = 14; // tetik butonu A0
//MP3
uint8_t vol = 70;
uint32_t spi_flash_songs = 0;
uint32_t sd_songs = 0;
STROAGE workdisk = SD;
float temperatureObj1 = 0;
float temperatureObj2 = 0;
void setup() {
Wire.begin();
SeeedGrayOled.init(SH1107G); // SEEED OLED ekranı başlat
SeeedGrayOled.clearDisplay(); // Ekranı temizle.
SeeedGrayOled.setNormalDisplay(); // Normal Ekran Modunu Ayarla
SeeedGrayOled.setVerticalMode(); // Metin görüntülemek için dikey moda ayarla
COMSerial.begin(9600);
Mp3Player.init(COMSerial);
Mp3Player.volume(vol);
Serial.begin(115200);
while (!Serial); // Sadece yerel USB seri için
delay(2000); // terminali açmak için ek bekleme süresi, setup() mesajlarını görmek için
Serial.println("Kurulum...");
pinMode(button1, INPUT);
strip.setBrightness(BRIGHTNESS);
strip.begin();
strip.show(); // Tüm pikselleri 'kapalı' olarak başlat
#ifdef WITH_WIRE
Wire.begin();
#endif // WITH_WIRE tanımlandı
}
void loop() {
temperatureObj1 = mlx90615_1.getTemperature(MLX90615_OBJECT_TEMPERATURE);
temperatureObj1=temperatureObj1+3;
if(digitalRead(button1)){
temperatureObj2 = mlx90615_2.getTemperature(MLX90615_OBJECT_TEMPERATURE);
temperatureObj2=temperatureObj2+3;
if(temperatureObj2<38){
mode1();
}
else{
Mp3Player.playSDRootSong(0x0001);
mode2();
}
}
delay(1000);
// Serial.print("Temp_1: ");
// Serial.print(temperatureObj1);
// Serial.print("°C ");
SeeedGrayOled.setTextXY(2,0); // i. satıra, 0. sütuna imleci ayarla
SeeedGrayOled.setGrayLevel(5); // Gri tonlama seviyesini ayarla. 0 - 15 arasında herhangi bir sayı.
SeeedGrayOled.putFloat(temperatureObj1); // Hello World yazdır
}
void mode1(void){
for(int i=0;i<NUMPIXELS;i++){
// pixels.Color RGB değerlerini alır, 0,0,0'dan 255,255,255'e kadar
strip.setPixelColor(i, strip.Color(0,255,0)); // Orta derecede parlak yeşil renk.
strip.show(); // Bu, güncellenmiş piksel rengini donanıma gönderir.
// delay(250); // Bir süre (milisaniye cinsinden) bekleme.
}
}
void mode2(void){
for(int i=0;i<NUMPIXELS;i++){
// pixels.Color RGB değerlerini alır, 0,0,0'dan 255,255,255'e kadar
strip.setPixelColor(i, strip.Color(255,0,0)); // Orta derecede parlak kırmızı renk.
strip.show(); // Bu, güncellenmiş piksel rengini donanıma gönderir.
// delay(250); // Bir süre (milisaniye cinsinden) bekleme.
}
}
