NodeMcu İle Tuşla Gelsin Projesi

Gokrtl

Gökhan Kartal
Katılım
27 Şubat 2019
Mesajlar
5,297
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.

EDİT: Siteyi güncelledim. Dosyayı evlist v2 olarak ekledim.
Admin için Kullanıcı adı: admin Şifre: admin
Normal Kullanıcı için Kullanıcı adı: Mekatronik Şifre: 1234

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: 47
  • web Sitesi.zip
    14.8 MB · Görüntüleme: 51
  • evlist v2.zip
    52.8 MB · Görüntüleme: 27
Son düzenleme:

cevdetfaikosman

Kayıtlı Üye
Katılım
19 Şubat 2019
Mesajlar
1,501
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
Katılım
27 Şubat 2019
Mesajlar
5,297
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.
 

Gokrtl

Gökhan Kartal
Katılım
27 Şubat 2019
Mesajlar
5,297
Projemi Güncelliyorum. Bittiğinde 1.Mesaja site dosyalarını ekleyeceğim.

evlist_1.jpg


evlist_2.jpg
 

Gokrtl

Gökhan Kartal
Katılım
27 Şubat 2019
Mesajlar
5,297
Çalışmalara Devam. Mütevazi Admin Sayfası :katil2:

admin_page.PNG
 

Gokrtl

Gökhan Kartal
Katılım
27 Şubat 2019
Mesajlar
5,297
Projemin güncellemesini bu gün nihayet bitirdim.
Daha fazla yapabileceğim şeyler vardı ama malumunuz bir işle çok uğraştım mı sıkıntı basıyor.
Güncel dosyaları müsait bir zamanda 1. mesaja ekleyeceğim.

Anasayfa: Header logoyu biraz değiştirdim. Tasarım konusunda kabiliyetsiz olduğum dan görsel olarak pek göze hitap etmiyor olabilir.
Hoşgeldin kısmının puntosunu büyüterek cep telefonundan daha rahat okunmasını ve tıklanmasını sağladım. Bu arada hoş geldin kısmı PC de biraz içeride durmasına karşın cep telefonunda tam görünüyor. PC de hizalarsam telefonda taşıyor. Bunun için bir kaç yöntem var ama uğraşmaya üşendim.
anasayfa.PNG



Ürün sayfası: Header'daki kategorileri sol tarafa taşıdım.
Renk konusunda seçim yapamadığım için netten bulduğum gibi ekledim css dosyasını.
Ürünlerin altına fiyatlarını yazdım.
Adet yada kg bazında seçilebilmeleri için select - option tagları kullandım.
Listeye eklenebilmesi için eskiden resime tıklarken artık butona tuklıyorum.
ürün.PNG


Giriş Yap Sayfası: Giriş yap sayfasına headeri ekledim. Böylece bomboş bir sayfada görünmekten kurtardım.
giriş.PNG


Şifremi Unuttum Sayfası: Bu sayfa önceki tasarımda yoktu. Şifre değiştirmek için veritabanına bağlanmak gerekiyordu.
şifre yenile.PNG


Hesabım Sayfası: Burasını çok gerekli olmasa da yeni bir ek özellik olsun diye ekledim. Zamanla geliştirilebilir.
hesap.PNG


Admin Sayfası: Bu sayfayıda eklediğim iyi oldu. Yeni bir ürün girmem gerektiğinde kodlara müdahale et, veritabanına müdahale et çok sıkıyordu.
güncellemeye gitmemdeki en büyük neden buydu. Artık birkaç tık ile ürünü direk ekleyebiliyorum.
admin.PNG


Liste Sayfası: En köklü güncelleme burada oldu.
Ürünlerin istenilen adetlerini yazdırdım.
Ürünlerin fiyatlarını veritabanından alarak input tagının "placeholder" özelliğine yazdırarak ekrana bastırdım. Ayrıca en altta bir div içine bu fiyatları toplayarak tahmini ödenecek fiyatı çıkardım.
Yuvarlak yeşil buton sayesinde markette alış veriş esnasında değişen fiyat varsa yandaki inputa girip bu buton ile veritabanında ki fiyatın güncellenmesini sağladım.
Sepete Ekle butonu ile alışveriş arabasına koyduğum ürünleri sepete gönderip listeden siliyorum. Ayrı olarak sepetim sayfası olmasına karşın küçük bir bilgi olarak da sağ tarafta ürün adı, fiyatı ve toplamını yazdırdım.
Son olarak almaktan vazgeçtiğim ürünü silmek için çöp kutusu simgesi ekledim.
liste.PNG


Sepetim Sayfası: Burada da aldığım ürünleri detaylı bir biçimde ekrana bastırdım. Yine son anda vazgeçmiş olduğum ürünü silebilmek için buraya da bir buton koydum.
sepet.PNG
 
Son düzenleme:

cevdetfaikosman

Kayıtlı Üye
Katılım
19 Şubat 2019
Mesajlar
1,501
En büyük sorun fiyatın sürekli değişmesi..

Aslında şöyle bir app olsa çok iyi olur.. Ürünleri marka ve türüne göre seçiyorum. sepete ekliyorum.
Sonra sistem o anki bütün market ve kampanya fiyatlarını hesaplıyor.
Ardından şu marketten şunlar, bu marketten bunları satın al diye en uygun listeyi çıkarmalı..

Çünkü bu aynı ürünün 100 metre ötede farklı fiyat olması hadisesi devam edecek enfasyon ile. ABD'de bile bu sorun var. Kapitalist sistem geçirebildiğine satıyor farklı fiyattan..
 

Gokrtl

Gökhan Kartal
Katılım
27 Şubat 2019
Mesajlar
5,297
En büyük sorun fiyatın sürekli değişmesi..

Aslında şöyle bir app olsa çok iyi olur.. Ürünleri marka ve türüne göre seçiyorum. sepete ekliyorum.
Sonra sistem o anki bütün market ve kampanya fiyatlarını hesaplıyor.
Ardından şu marketten şunlar, bu marketten bunları satın al diye en uygun listeyi çıkarmalı..

Çünkü bu aynı ürünün 100 metre ötede farklı fiyat olması hadisesi devam edecek enfasyon ile. ABD'de bile bu sorun var. Kapitalist sistem geçirebildiğine satıyor farklı fiyattan..
Onu düşndüm abi ama web siteleri tasarım değiştirdiği zaman sistem patlıyor. Her defasında kendi sistemimi de güncellemem gerekiyor.
Onun dışında ben çoğunlukla tek bir marketten alışveriş yapmak zorundayım. Çünkü sodexo ile ödeme yapıyorum. En güzeli alışveriş esnasında reyon başında fiyatı güncellemek oluyor benim için.
 

Gokrtl

Gökhan Kartal
Katılım
27 Şubat 2019
Mesajlar
5,297
Fiyat politikaları da bölgesel olarak değişiyor abi. Nette gördüğüm bir ürünü aynı fiyata markette bulamama olasılığı da yüksek.
 
Top