NodeMcu İle Tuşla Gelsin Projesi

Gokrtl

Gökhan Kartal
Staff member
Mesajlar
3,717
Yaş
36
Konum
Antalya
Merhabalar,
Çoğumuz evimizin eksiklerini almak üzere elimize liste tutuşturularak markete gönderiliriz. Bir elde liste diğer elde alış-veriş sepeti dolanır dururuz markette.
Tabi çoğu zaman yanımız da kalem de taşımadığımızdan listede ne aldık? ne almadık? Hangi ürün nerede? gibi problemler ile boğuşabilmekteyiz.
Bu projemizde buzdolabımızın üzerine bir cihaz yaptık. Bu cihaz ile NodeMcu kullanarak evdeki wi-fi'a bağlanıyoruz ve önceden oluşturduğumuz veritabanımıza ürünleri yazdırıyoruz. Sonra da markette iken cep telefonumuzdan veritabanına bağlanarak bu ürünleri listeliyoruz.
Veritabanının yanısıra birde web sitesi yaparak aynı ürünlerin tablet, telefon, bilgisayar gibi cihazlardan da veritabanına eklenebilmesini sağladık.
Başlarda "Evlist" olarak düşündüğüm projenin ismini, projeye yoğun katkısından dolayı @uyesercan 'ın önerdiği "Tuşla Gelsin" ismini verdim. NodeMcu tarafındaki kodların çok büyük çoğunluğunu kendisi yazmıştır. Benim sadece kendi ayarlarıma göre ufak tefek değişiklikler yapmam gerekti.
Sistemi halihazırda kullanmaya başladığım için sizlerin ulaşımına kapatmak durumundayım. Çünkü kişisel kullanıma göre tasarlandı.
Ancak ileri de hem web sitesini çoklu kullanıcıya açacağım hem de raspberry kullanarak ürünleri ses komutu ile girmek üzere çalışmalar yapacağım.

Tanıtım Videosu;


Kullanılan Malzemeler;
3D Printerdan Kasa Basıldı,
NodeMcu
4x4 Keypad
16x2 Lcd Ekran
i2c Seri Haberleşme Modülü
PCF8574 Seri Haberleşme Modülü
Jumper Kablo
Vida, Somun

NodeMcu Kodları;
C:
// Sercan & Gökhan
// https://mekatronik.org/forum

#include <ESP8266WiFi.h>
#include <LiquidCrystal_I2C.h>
#include <ESP8266HTTPClient.h>
#include "Wire.h"
#include "I2CKeyPad.h"

// WiFi ayarları
    const char* WiFi_Adi="TPLINK_WIFI";
    const char* WiFi_Sifre = "password";
// Verinin gönderileceği SSL URL adresi
    String url_ekle = "http://webadresi.com/int/keypad.php?siparis=";
    String url_sil = "http://webadresi.com/int/keypad.php?id=";
// true seri port ile heberleşir, false kapatır.
    bool konsol = false;
// LCD ekran bilgileri
    LiquidCrystal_I2C lcd(0x27,16,2);
    const uint8_t KEYPAD_ADDRESS = 0x20;
    I2CKeyPad keyPad;
    int ToplamSayi = 0;
    int NoktaSay = 0;
    
void setup()
{
  pinMode(D0, OUTPUT);
  pinMode(D8, OUTPUT);
  digitalWrite(D8, LOW);
  digitalWrite(D0, HIGH);
  delay(300);
  Serial.begin(115200);
  Wire.begin();
  if (keyPad.begin(KEYPAD_ADDRESS) == false)
  {
    Serial.println("\nERROR: cannot communicate to keypad.\nPlease reboot.\n");
    while(1);
  }
  if (konsol) {
        Serial.begin(115200);
        delay(500);
        Serial.println(F("Tusla Gelsin v1"));
    }
    lcd.init();
    lcd.backlight();
    lcd.setCursor(0,0);
    lcd.print("Tusla Gelsin v1");
    WiFi.mode(WIFI_STA);
    WiFi.begin(WiFi_Adi,WiFi_Sifre);
    lcd.setCursor(0,1);
    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        if (konsol) {
            Serial.print(".");
        }
        if (NoktaSay++ < 20) {
            lcd.print(".");
        } else {
            SatirTemizle(1);
            NoktaSay = 0;
        }
    }
    //if (konsol) {
        SatirTemizle(0);
        lcd.setCursor(0,0);
        lcd.print("WiFi'ya baglandi");
        SatirTemizle(1);
        lcd.setCursor(0,1);
        lcd.print("IP:");
        lcd.setCursor(4,1);
        lcd.print(WiFi.localIP());
        digitalWrite(D8, HIGH);
        delay(5000);
    //}
    SatirTemizle(0);
    lcd.setCursor(0,0);
    lcd.print("Tusla Gelsin v1");
    SatirTemizle(1);
    lcd.setCursor(0,1);
    lcd.print("Urun No Giriniz");
}

void loop()
{
    uint8_t idxx = keyPad.getKey();
    char idx = "D#0*C987B654A321"[idxx];

    if ( isdigit(idx) ) {
        uint8_t sayi = idx - '0';
        ToplamSayi = ((ToplamSayi * 10) + sayi);
        if (konsol) {
            Serial.print( "Tuslanan Sayi:" );
            Serial.println(ToplamSayi);
        }
        SatirTemizle(1);
        lcd.print(ToplamSayi);
    } else if ( idx == '#' ) {
// # tuşu enter gibi davranır
        SatirTemizle(1);
        lcd.print("Urun Ekleniyor.");
        if (konsol) {
            Serial.print(ToplamSayi);
            Serial.println( " Urun Eklendi.\n" );
        }
        int urlEk = ToplamSayi;
        String TamUrl = url_ekle + urlEk;
        SiparisVer(TamUrl, urlEk);
        ToplamSayi = 0;
    } else if ( idx == '*' ) {
// * tuşu yanlış girişi sıfırlar....
        ToplamSayi = 0;
        if (konsol) {
            Serial.print("ToplamSayi ");
            Serial.print(ToplamSayi);
            Serial.println(" sıfırlandı.\n");
        }
        SatirTemizle(1);
        lcd.print("Sayi Silindi...");
        delay(4000);       
        SatirTemizle(1);
        lcd.print("Urun No Giriniz");
    } else if ( idx == 'A' ) {
// Bu tuş hızlıca favori ürün siparişi verebilir!
        if (konsol) {
            Serial.println("A tuşuna basıldı");
            }
        SatirTemizle(1);
        lcd.print("A");
    } else if ( idx == 'B' ) {
// Bu tuş hızlıca favori ürün siparişi verebilir!
        if (konsol) {
            Serial.println("B tuşuna basıldı");
            }
        SatirTemizle(1);
        lcd.print("B");
    } else if ( idx == 'C' ) {
// C Tuşu NodeMCU ya Reset Atar!
        digitalWrite(D0, LOW);
    } else if ( idx == 'D' ) {
// D Tuşu numarası girilen ürünü siler!
        SatirTemizle(1);
        lcd.print("Urun Ekleniyor.");
        if (konsol) {
            Serial.print(ToplamSayi);
            Serial.println( " Urun Eklendi.\n" );
        }
        int urlEk = ToplamSayi;
        String TamUrl = url_sil + urlEk;
        SiparisSil(TamUrl, urlEk);
        ToplamSayi = 0;
    }
    delay(300);
}

void SiparisVer(String TamUrl, int urlEk) {
// Sipariş Verme Fonksiyonu
    SatirTemizle(0);
    lcd.setCursor(0,0);
    lcd.print("Tusla Gelsin v1");
    SatirTemizle(1);
    lcd.setCursor(0,1);
    lcd.print("Baglaniyor...");
    delay(4000);
//TCP bağlantıları oluşturmak için HTTPClient sınıfını kullanın
    HTTPClient http;
    http.begin(TamUrl);
      SatirTemizle(0);
      SatirTemizle(1);
      lcd.setCursor(0,0);
      lcd.print("Baglandi...");
      lcd.setCursor(0,1);
      lcd.print("Urun Ekleniyor..");
      delay(4000);
    int httpCode = http.GET();
    if (httpCode > 0) {
      String payload = http.getString();
      Serial.print("Gönderilen Url: ");
      Serial.println(TamUrl);
      Serial.print("Sayfa yanıtı:");
      Serial.println(payload);
    if(payload == "0"){
        SatirTemizle(0);
        lcd.setCursor(0,0);
        lcd.print("Urun Eklendi");
        SatirTemizle(1);
        lcd.setCursor(0,1);
        lcd.print("Yeni Urun Girinz");
     }else if(payload == "1"){
        SatirTemizle(0);
        lcd.setCursor(0,0);
        lcd.print("Urun Zaten Var");
        SatirTemizle(1);
        lcd.setCursor(0,1);
        lcd.print("Yeni Urun Girinz");
     }else if(payload == "2"){
        lcd.setCursor(0,0);
        lcd.print("Hatali Numara");
        SatirTemizle(1);
        lcd.setCursor(0,1);
        lcd.print("Yeniden Deneyin.");
     }else{
        SatirTemizle(1);
        lcd.setCursor(0,1);
        lcd.print("Baglanti Hatasi.");
        digitalWrite(D0, LOW);
     } 
  }
    http.end();
    delay(2000); // 2 saniyede bir işlemi tekrarlayacak
}
 

void SiparisSil(String TamUrl, int urlEk) {
// Sipariş Silme Fonksiyonu
    SatirTemizle(0);
    lcd.setCursor(0,0);
    lcd.print("Tusla Gelsin v1");
    SatirTemizle(1);
    lcd.setCursor(0,1);
    lcd.print("Baglaniyor...");
    delay(5000);
//TCP bağlantıları oluşturmak için HTTPClient sınıfını kullanın
    HTTPClient http;
    http.begin(TamUrl);
      SatirTemizle(0);
      SatirTemizle(1);
      lcd.setCursor(0,0);
      lcd.print("Baglandi...");
      lcd.setCursor(0,1);
      lcd.print("Urun Siliniyor..");
      delay(4000);
    int httpCode = http.GET();
    if (httpCode > 0) {
      String payload = http.getString();
      Serial.print("Gönderilen Url: ");
      Serial.println(TamUrl);
      Serial.print("Sayfa yanıtı:");
      Serial.println(payload);
    if(payload == "0"){
        SatirTemizle(0);
        lcd.setCursor(0,0);
        lcd.print("Urun Silindi");
        SatirTemizle(1);
        lcd.setCursor(0,1);
        lcd.print("Yeni Urun Girinz");
     }else if(payload == "1"){
        SatirTemizle(0);
        lcd.setCursor(0,0);
        lcd.print("Urun Bulunamadi");
        SatirTemizle(1);
        lcd.setCursor(0,1);
        lcd.print("Yeni Urun Girinz");
       }else if(payload == "2"){
        lcd.setCursor(0,0);
        lcd.print("Hatali Numara");
        SatirTemizle(1);
        lcd.setCursor(0,1);
        lcd.print("Yeniden Deneyin.");
     }else{
        SatirTemizle(1);
        lcd.setCursor(0,1);
        lcd.print("Baglanti Hatasi.");
        digitalWrite(D0, LOW);
     } 
  }
    http.end();
    delay(2000); // 2 saniyede bir işlemi tekrarlayacak
}

void SatirTemizle(int satir) {
    lcd.setCursor(0,satir);
    lcd.print("                ");
    lcd.setCursor(0,satir);
}
 

Ekler

  • 3D Kasa Dosyaları.zip
    127.8 KB · Görüntüleme: 16
  • web Sitesi.zip
    14.8 MB · Görüntüleme: 15

cevdetfaikosman

Kayıtlı Üye
Mesajlar
732
Yaş
46
Ses tanıma daha iyi olur. Hiç ekran, tuş filan gerekmez. Sadece esp32 +button + mikrofon + haporlör ile yapılabilir. Ses tanıma işi esp ile zor değil. Free google'ın kotası bile bu iş için yeter sanırım.
 

Gokrtl

Gökhan Kartal
Staff member
Mesajlar
3,717
Yaş
36
Konum
Antalya
Bu gün bu projede ilk denemeyi yapmaya kalkıştık. Listeyi oluşturup markete gittik. Telefondan açtık listeyi. Ben henüz sepete ilk ürünü koymuştum ki hatun sayfayı yenileyeceğim diye gitti listeyi sil butonuna bastı. :katil2: Alış-Veriş o dakika yalan oldu. Ezberden alacaklarımızı alıp eve döndük.
Bide diyor ki senin yapacağın sistemin ......... :katil2:
Şimdi bu sorunu çözmek için "Listeyi Sil" butonuna windows gibi "Emin misin? Son Kararın mı?" gibi seçenekler koymam gerekecek.
 
Top