Başa dön
Arduino ile Otomatik Sabunluk (Dezenfektan) Dispenser Yapımı

Arduino ile Su Pompası Kullanımı (Otomatik Sabunluk Yapımı)

Merhaba arkadaşlar, bu yazımızda corona virüs salgınına(pandemi) karşı kendimiz ve insanlar için basit ve konfor arttırıcı arduino ile su pompası kullanarak otomatik sıvı sabunluk ve dezenfektan dispenseri yapımı projesini inceleyeceğiz.

Corona Virus (Covid19) pandemisi dünyada çok ciddi ve büyük hasara yol açıyor. Hemen hemen her ülke Corona Virüsünden muzdarip. DSÖ zaten bir Pandemi hastalığı olduğunu açıkladı ve birçok şehir karantina durumda, insanlar evlerinden çıkamıyor ve binlerce insan hayatını kaybetti. Birçok web sitesi koronavirüs vakalarının canlı güncellemelerini sunmaktadır. Bkn. Corona Virus Canlı Harita

 

Bu projede, Coronavirus vakalarının sayısını da gösteren bir Arduino LCD ile Otomatik El Dezenfektanı yapacağız. Bu projede ESP32, Ultrasonik Sensör, 16×2 LCD Modül , Su pompası ve El Dezenfektanı kullanılacaktır . Covid19 virüslü kişilerin canlı verilerini almak için Esri’nin API Gezgini’ni kullanıyoruz. Dezenfektan makinesine yaklaşan ellerin tespiti için bir hc-sr04 ultrasonik sensör kullanılır. Dezenfektan çıkışı ile kendisi arasındaki mesafeyi sürekli hesaplar ve dezenfektanı dışarı itmek için mesafe 15 cm’den az olduğunda ESP’ye pompayı çalıştırmasını söyler.

ESP32 ana kontrolör olarak kullanılır, internete kolayca bağlanabilen bir Wi-Fi modülüdür.

 

Gerekli Malzemeler

Corona Canlı Verilerini almak için API bağlantısı

Burada verileri internetten almamız ve daha sonra 16×2 LCD’de görüntülemek için ESP32’ye göndermemiz gerekiyor. Bunun için internetten JSON dosyasını okumak için bir HTTP alma isteği çağrılır. Burada Coronavirus Disease GIS Hub tarafından sağlanan API’yı kullanıyoruz. Türkiye için onaylanan ve kurtarılan toplam vakayı almak için doğru sorgu URL’sini kolayca derleyebilir ve farklı bir ülke için kullanmak isterseniz ülkeyi / bölgeyi de değiştirebilirsiniz.

Şimdi “Şimdi Dene” yi tıklayın veya sorgu URL’sini yeni bir tarayıcıya yapıştırın, bu sorgunun çıktısı şu şekilde görünecektir:

 

<span style="color: #000000;">{</span><span style="color: #005c5f;">"objectIdFieldName"</span><span style="color: #434f54;">:</span><span style="color: #005c5f;">"OBJECTID"</span><span style="color: #434f54;">,</span><span style="color: #005c5f;">"uniqueIdField"</span><span style="color: #434f54;">:</span><span style="color: #000000;">{</span><span style="color: #005c5f;">"name"</span><span style="color: #434f54;">:</span><span style="color: #005c5f;">"OBJECTID"</span><span style="color: #434f54;">,</span><span style="color: #005c5f;">"isSystemMaintained"</span><span style="color: #434f54;">:</span><span style="color: #00979c;">true</span><span style="color: #000000;">}</span><span style="color: #434f54;">,</span><span style="color: #005c5f;">"globalIdFieldName"</span><span style="color: #434f54;">:</span><span style="color: #005c5f;">""</span><span style="color: #434f54;">,</span><span style="color: #005c5f;">"geometryType"</span><span style="color: #434f54;">:</span><span style="color: #005c5f;">"esriGeometryPoint"</span><span style="color: #434f54;">,</span><span style="color: #005c5f;">"spatialReference"</span><span style="color: #434f54;">:</span><span style="color: #000000;">{</span><span style="color: #005c5f;">"wkid"</span><span style="color: #434f54;">:</span><span style="color: #000000;">4326</span><span style="color: #434f54;">,</span><span style="color: #005c5f;">"latestWkid"</span><span style="color: #434f54;">:</span><span style="color: #000000;">4326</span><span style="color: #000000;">}</span><span style="color: #434f54;">,</span><span style="color: #005c5f;">"fields"</span><span style="color: #434f54;">:</span><span style="color: #000000;">[</span><span style="color: #000000;">{</span><span style="color: #005c5f;">"name"</span><span style="color: #434f54;">:</span><span style="color: #005c5f;">"Country_Region"</span><span style="color: #434f54;">,</span><span style="color: #005c5f;">"type"</span><span style="color: #434f54;">:</span><span style="color: #005c5f;">"esriFieldTypeString"</span><span style="color: #434f54;">,</span><span style="color: #005c5f;">"alias"</span><span style="color: #434f54;">:</span><span style="color: #005c5f;">"Country/Region"</span><span style="color: #434f54;">,</span><span style="color: #005c5f;">"sqlType"</span><span style="color: #434f54;">:</span><span style="color: #005c5f;">"sqlTypeOther"</span><span style="color: #434f54;">,</span><span style="color: #005c5f;">"length"</span><span style="color: #434f54;">:</span><span style="color: #000000;">8000</span><span style="color: #434f54;">,</span><span style="color: #005c5f;">"domain"</span><span style="color: #434f54;">:</span><span style="color: #00979c;">null</span><span style="color: #434f54;">,</span><span style="color: #005c5f;">"defaultValue"</span><span style="color: #434f54;">:</span><span style="color: #00979c;">null</span><span style="color: #000000;">}</span><span style="color: #434f54;">,</span><span style="color: #000000;">{</span><span style="color: #005c5f;">"name"</span><span style="color: #434f54;">:</span><span style="color: #005c5f;">"Province_State"</span><span style="color: #434f54;">,</span><span style="color: #005c5f;">"type"</span><span style="color: #434f54;">:</span><span style="color: #005c5f;">"esriFieldTypeString"</span><span style="color: #434f54;">,</span><span style="color: #005c5f;">"alias"</span><span style="color: #434f54;">:</span><span style="color: #005c5f;">"Province/State"</span><span style="color: #434f54;">,</span><span style="color: #005c5f;">"sqlType"</span><span style="color: #434f54;">:</span><span style="color: #005c5f;">"sqlTypeOther"</span><span style="color: #434f54;">,</span><span style="color: #005c5f;">"length"</span><span style="color: #434f54;">:</span><span style="color: #000000;">8000</span><span style="color: #434f54;">,</span><span style="color: #005c5f;">"domain"</span><span style="color: #434f54;">:</span><span style="color: #00979c;">null</span><span style="color: #434f54;">,</span><span style="color: #005c5f;">"defaultValue"</span><span style="color: #434f54;">:</span><span style="color: #00979c;">null</span><span style="color: #000000;">}</span><span style="color: #434f54;">,</span><span style="color: #000000;">{</span><span style="color: #005c5f;">"name"</span><span style="color: #434f54;">:</span><span style="color: #005c5f;">"Confirmed"</span><span style="color: #434f54;">,</span><span style="color: #005c5f;">"type"</span><span style="color: #434f54;">:</span><span style="color: #005c5f;">"esriFieldTypeInteger"</span><span style="color: #434f54;">,</span><span style="color: #005c5f;">"alias"</span><span style="color: #434f54;">:</span><span style="color: #005c5f;">"Confirmed"</span><span style="color: #434f54;">,</span><span style="color: #005c5f;">"sqlType"</span><span style="color: #434f54;">:</span><span style="color: #005c5f;">"sqlTypeOther"</span><span style="color: #434f54;">,</span><span style="color: #005c5f;">"domain"</span><span style="color: #434f54;">:</span><span style="color: #00979c;">null</span><span style="color: #434f54;">,</span><span style="color: #005c5f;">"defaultValue"</span><span style="color: #434f54;">:</span><span style="color: #00979c;">null</span><span style="color: #000000;">}</span><span style="color: #434f54;">,</span><span style="color: #000000;">{</span><span style="color: #005c5f;">"name"</span><span style="color: #434f54;">:</span><span style="color: #005c5f;">"Recovered"</span><span style="color: #434f54;">,</span><span style="color: #005c5f;">"type"</span><span style="color: #434f54;">:</span><span style="color: #005c5f;">"esriFieldTypeInteger"</span><span style="color: #434f54;">,</span><span style="color: #005c5f;">"alias"</span><span style="color: #434f54;">:</span><span style="color: #005c5f;">"Recovered"</span><span style="color: #434f54;">,</span><span style="color: #005c5f;">"sqlType"</span><span style="color: #434f54;">:</span><span style="color: #005c5f;">"sqlTypeOther"</span><span style="color: #434f54;">,</span><span style="color: #005c5f;">"domain"</span><span style="color: #434f54;">:</span><span style="color: #00979c;">null</span><span style="color: #434f54;">,</span><span style="color: #005c5f;">"defaultValue"</span><span style="color: #434f54;">:</span><span style="color: #00979c;">null</span><span style="color: #000000;">}</span><span style="color: #434f54;">,</span><span style="color: #000000;">{</span><span style="color: #005c5f;">"name"</span><span style="color: #434f54;">:</span><span style="color: #005c5f;">"Deaths"</span><span style="color: #434f54;">,</span><span style="color: #005c5f;">"type"</span><span style="color: #434f54;">:</span><span style="color: #005c5f;">"esriFieldTypeInteger"</span><span style="color: #434f54;">,</span><span style="color: #005c5f;">"alias"</span><span style="color: #434f54;">:</span><span style="color: #005c5f;">"Deaths"</span><span style="color: #434f54;">,</span><span style="color: #005c5f;">"sqlType"</span><span style="color: #434f54;">:</span><span style="color: #005c5f;">"sqlTypeOther"</span><span style="color: #434f54;">,</span><span style="color: #005c5f;">"domain"</span><span style="color: #434f54;">:</span><span style="color: #00979c;">null</span><span style="color: #434f54;">,</span><span style="color: #005c5f;">"defaultValue"</span><span style="color: #434f54;">:</span><span style="color: #00979c;">null</span><span style="color: #000000;">}</span><span style="color: #434f54;">,</span><span style="color: #000000;">{</span><span style="color: #005c5f;">"name"</span><span style="color: #434f54;">:</span><span style="color: #005c5f;">"Active"</span><span style="color: #434f54;">,</span><span style="color: #005c5f;">"type"</span><span style="color: #434f54;">:</span><span style="color: #005c5f;">"esriFieldTypeInteger"</span><span style="color: #434f54;">,</span><span style="color: #005c5f;">"alias"</span><span style="color: #434f54;">:</span><span style="color: #005c5f;">"Active"</span><span style="color: #434f54;">,</span><span style="color: #005c5f;">"sqlType"</span><span style="color: #434f54;">:</span><span style="color: #005c5f;">"sqlTypeOther"</span><span style="color: #434f54;">,</span><span style="color: #005c5f;">"domain"</span><span style="color: #434f54;">:</span><span style="color: #00979c;">null</span><span style="color: #434f54;">,</span><span style="color: #005c5f;">"defaultValue"</span><span style="color: #434f54;">:</span><span style="color: #00979c;">null</span><span style="color: #000000;">}</span><span style="color: #000000;">]</span><span style="color: #434f54;">,</span><span style="color: #005c5f;">"features"</span><span style="color: #434f54;">:</span><span style="color: #000000;">[</span><span style="color: #000000;">{</span><span style="color: #005c5f;">"attributes"</span><span style="color: #434f54;">:</span><span style="color: #000000;">{</span><span style="color: #005c5f;">"Country_Region"</span><span style="color: #434f54;">:</span><span style="color: #005c5f;">"India"</span><span style="color: #434f54;">,</span><span style="color: #005c5f;">"Province_State"</span><span style="color: #434f54;">:</span><span style="color: #00979c;">null</span><span style="color: #434f54;">,</span><span style="color: #005c5f;">"Confirmed"</span><span style="color: #434f54;">:</span><span style="color: #000000;">194</span><span style="color: #434f54;">,</span><span style="color: #005c5f;">"Recovered"</span><span style="color: #434f54;">:</span><span style="color: #000000;">20</span><span style="color: #434f54;">,</span><span style="color: #005c5f;">"Deaths"</span><span style="color: #434f54;">:</span><span style="color: #000000;">4</span><span style="color: #434f54;">,</span><span style="color: #005c5f;">"Active"</span><span style="color: #434f54;">:</span><span style="color: #000000;">170</span><span style="color: #000000;">}</span><span style="color: #000000;">}</span><span style="color: #000000;">]</span><span style="color: #000000;">}</span>

JSON verilerini aldıktan sonra, şimdi JSON verilerini okumak ve ihtiyaçlarımıza göre ifade etmek için kod oluşturun. Bunun için ArduinoJson Yardımcısı’na gidin ve JSON verilerini Giriş bölümüne yapıştırın.

Şimdi ayrıştırma programına gidin ve sizin için yararlı olan kod bölümünü kopyalayın. Aşağıdaki değişkenler sadece Türkiye’da onaylanmış ve kurtarılmış vakaları içermektedir. Kendinize göre düzenleyebilirsiniz.

Devre Şeması

Covid19 canlı takip ve otomatik el dezenfektanı için komple devre şeması aşağıda verilmiştir

 

Su pompası bir röle modülü aracılığıyla ESP32’ye bağlanır. Rölenin VCC ve GND pinleri ESP32’nin Vin ve GND pinlerine bağlanırken, rölenin giriş pimi ESP32’nin D19 pinine bağlanır. Ultrasonik sensörün Trig ve Echo pinleri Arduino’nun D5 ve D18 Pinlerine bağlanır.

 

Komple bağlantılar aşağıdaki tabloda verilmiştir.

LCDESP32
VSSGND
VDD5V
VOPotansiyometre
RSD22
RWGND
ED4
D4D15
D5D13
D6D26
D7D21
bir5V
KGND
Ultrasonik sensörESP32
VccVin
GNDGND
trigonometriD5
EKOD18

Otomatik El Dezenfektanı tamamlanınca aşağıdaki gibi görünecektir

Covid19 Takip için ESP32 Programlama

Auto Hand Sanitizer ve CORONA19 Tracker için tam kodu sayfanın sonunda bulabilirsiniz. Burada programın önemli kısımları açıklanmaktadır.

Gerekli tüm kütüphane dosyalarını ekleyerek kodu başlatın. HTTPClient kütüphanesi, HTTP sunucusundan veri almak için kullanılır. Veri dizilerini ifade etmek için ArduinoJson kütüphanesi kullanılır. Burada ArduinoJson kütüphanesi, onaylanmış vakaları filtrelemek ve sunucudan aldığımız veri dizisinden aktarmak için kullanılır. LCD ekran Modülü için LiquidCrystal kütüphanesi kullanılır.

#include <HTTPClient.h>
#include <WiFi.h>
#include <ArduinoJson.h>
#include <LiquidCrystal.h>

Verileri sunucudan almak için NodeMCU ESP32’nin internete bağlanması gerekir. Bunun için, aşağıdaki satırlara Kablosuz SSID’nizi ve Şifrenizi girin.

const char* ssid = "Galaxy-M20";
const char* pass = "ac312124";

Bundan sonra, LCD modülünü, Ultrasonik sensörü ve Röle modülünü bağladığınız pimleri tanımlayın.

const int rs = 22, en = 4, d4 = 15, d5 = 13, d6 = 26, d7 = 21;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
const int trigPin = 5;
const int echoPin = 18;
const int pump = 19;

Şimdi daha önce oluşturulan API bağlantısını giriyoruz. Bu bağlantıyı kullanarak, Türkiye’de onaylanmış toplam vakaları ve Kurtarılan vakaları alacağız. URL’deki ülke adını size göre değiştirebilirsiniz.

constchar*url="https://services1.arcgis.com/0MSEUqKaxRlEPj5g/arcgis/rest/services/ncov_cases/FeatureServer/1/query?f=json&where=(Country_Region=%27Turkey%27)&returnGeometry=false&outFields=Country_Region,Confirmed,Recovered";


Şimdi void kurulumunun () içinde Ultrasonik sensörün Trig ve Echo pinini giriş pinleri ve Röle pinini çıkış olarak tanımlayın.

pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(pump, OUTPUT);

Ultrasonik sensörün nasıl çalıştığı hakkında daha fazla bilgi edinmek için Arduino ile Ultrasonik Mesafe Sensörü (HC-SR04) Kullanımı yazımızı inceleyebilirsiniz.

Bundan sonra, ESP’nin Wi-Fi’ye bağlı olup olmadığını kontrol edin, eğer değilse, seri monitörde “… ..” yazdırarak ESP’nin bağlanmasını bekleyecektir.

WiFi.begin(ssid, pass);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");              // print ... till not connected
  }
  Serial.println("WiFi connected");

İç boşluk, ultra () işlev ile sürekli bir ultrasonik sensör kullanarak mesafe hesaplanır ve mesafe 15 cm e eşit veya daha az ise 2 saniye sıvı iletimi için pompa açılır. Birisi ellerini çıkış borusunun altına koyduğunda, mesafe azalacak ve pompanın açılmasını tetikleyecektir.

void ultra(){
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = duration * 0.0340 / 2;
  Serial.println("Distance");
  Serial.println(distance);
  if (distance <= 15){
    Serial.print("Opening Pump");
    digitalWrite(pump, HIGH);
    delay(2000);
    digitalWrite(pump, LOW);
    ESP.restart();
    }
}

Şimdi void loop () işlevinin içinde, ESP32 tarafından alınan JSON dosyasının aşağıdaki satırları kullanarak ve ekranda JSON verilerini kontrol edin.

int httpCode = https.GET();
  if (httpCode > 0) { //Check for the returning code
 String payload = https.getString();

Bundan sonra, ArduinoJson Assistant’tan oluşturulan ifade programını kullanınBu ifade programı bize Türkiye’deki onaylanmış ve geri kazanılan toplam vakayı verecektir.

JsonArray fields = doc["fields"];
JsonObject features_0_attributes = doc["features"][0]["attributes"];
long features_0_attributes_Last_Update = features_0_attributes["Last_Update"];
int features_0_attributes_Confirmed = features_0_attributes["Confirmed"];
//int features_0_attributes_Deaths = features_0_attributes["Deaths"];
int features_0_attributes_Recovered = features_0_attributes["Recovered"];

Otomatik El Dezenfektanı ve Covid19 Canlı Takip – Test

Sonunda pille çalışan otomatik el dezenfektanı test edilmeye hazır. Sadece devre şemasına göre donanımı bağlayın ve programı ESP32’ye yükleyin, başlangıçta LCD’de “Covid19 Tracker” ve “Hand Sanitizer” mesajını görmelisiniz ve birkaç saniye sonra onaylanmış vakaları ve kurtarılmış vakaları gösterecektir. LCD ekran aşağıda gösterildiği gibidir.

Buna benzer olarak, API bağlantısında bazı değişiklikler yaparak bu verileri herhangi bir ülke için alabilirsiniz. 

 

Arduino ile Otomatik Sabun Dispenseri – Kod

<span class="com"><span style="color: #5e6d03;">#include</span> <span style="color: #434f54;">&lt;</span><span style="color: #000000;">HTTPClient</span><span style="color: #434f54;">.</span><span style="color: #000000;">h</span><span style="color: #434f54;">&gt;</span> <span style="color: #5e6d03;">#include</span> <span style="color: #434f54;">&lt;</span><b><span style="color: #d35400;">WiFi</span></b><span style="color: #434f54;">.</span><span style="color: #000000;">h</span><span style="color: #434f54;">&gt;</span> <span style="color: #5e6d03;">#include</span> <span style="color: #434f54;">&lt;</span><span style="color: #000000;">ArduinoJson</span><span style="color: #434f54;">.</span><span style="color: #000000;">h</span><span style="color: #434f54;">&gt;</span> <span style="color: #5e6d03;">#include</span> <span style="color: #434f54;">&lt;</span><b><span style="color: #d35400;">LiquidCrystal</span></b><span style="color: #434f54;">.</span><span style="color: #000000;">h</span><span style="color: #434f54;">&gt;</span> <span style="color: #00979c;">const</span> <span style="color: #00979c;">char</span><span style="color: #434f54;">*</span> <span style="color: #000000;">ssid</span> <span style="color: #434f54;">=</span> <span style="color: #005c5f;">"Galaxy-M20"</span><span style="color: #000000;">;</span> <span style="color: #00979c;">const</span> <span style="color: #00979c;">char</span><span style="color: #434f54;">*</span> <span style="color: #000000;">pass</span> <span style="color: #434f54;">=</span> <span style="color: #005c5f;">"ac312124"</span><span style="color: #000000;">;</span> <span style="color: #00979c;">int</span> <span style="color: #000000;">count</span><span style="color: #000000;">;</span> <span style="color: #00979c;">const</span> <span style="color: #00979c;">int</span> <span style="color: #000000;">rs</span> <span style="color: #434f54;">=</span> <span style="color: #000000;">22</span><span style="color: #434f54;">,</span> <span style="color: #000000;">en</span> <span style="color: #434f54;">=</span> <span style="color: #000000;">4</span><span style="color: #434f54;">,</span> <span style="color: #000000;">d4</span> <span style="color: #434f54;">=</span> <span style="color: #000000;">15</span><span style="color: #434f54;">,</span> <span style="color: #000000;">d5</span> <span style="color: #434f54;">=</span> <span style="color: #000000;">13</span><span style="color: #434f54;">,</span> <span style="color: #000000;">d6</span> <span style="color: #434f54;">=</span> <span style="color: #000000;">26</span><span style="color: #434f54;">,</span> <span style="color: #000000;">d7</span> <span style="color: #434f54;">=</span> <span style="color: #000000;">21</span><span style="color: #000000;">;</span> <b><span style="color: #d35400;">LiquidCrystal</span></b> <span style="color: #000000;">lcd</span><span style="color: #000000;">(</span><span style="color: #000000;">rs</span><span style="color: #434f54;">,</span> <span style="color: #000000;">en</span><span style="color: #434f54;">,</span> <span style="color: #000000;">d4</span><span style="color: #434f54;">,</span> <span style="color: #000000;">d5</span