/*
TuşlaGelsin v1.0
Bu yazılım, NODEMCU v0.9 üzerinde ESP8266 ile 4x4 tuş takımı ve 4x20 I2C LCD ekran kullanılarak geliştirilmiştir.
# tuşu enter gibi davranır. * tuşu ise hatalı girişlere karşı girilen değeri sıfırlar.
Dijital pinleri korumak ve terminale gelen ters soru işaretini kaybetmek için PCF8574 gibi bir entegre ile tuş takımı için de I2C kullanılabilir.
Not: Tuş takımı için D8'pini kullanılamıyor. Fiziksel olarak "10k PULL_DOWN" direncine sahip.
*/
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <Keypad.h>
#include <LiquidCrystal_I2C.h>
/* ******************** Dikkat! bu tanımları özelleştir! ******************** */
// WiFi ayarları
const char* WiFi_Adi="SSID";
const char* WiFi_Sifre = "Şifre";
// Verinin gönderileceği SSL URL adresi
String url = "https://www.google.com/esp_post.php?siparis=";
// true seri port ile heberleşir, false kapatır.
bool konsol = false;
// LCD ekran bilgileri
uint8_t lcd_adres = 0x3F;
uint8_t lcd_sutun = 20;
uint8_t lcd_satir = 4;
// Keypad ayarları
const byte n_rows = 4;
const byte n_cols = 4;
char keys[n_rows][n_cols] = { {'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}};
byte rowPins[n_rows] = {D0, D3, D4, D5};
byte colPins[n_cols] = {D6, D7, D9, D10};
/* ******************** Dikkat! Bu değişkenler kodun iç yapısı için kullanılır. Değiştirmeyin! ******************** */
int ToplamSayi = 0;
int NoktaSay = 0;
LiquidCrystal_I2C lcd(lcd_adres, lcd_sutun, lcd_satir);
Keypad TusTakimi = Keypad(makeKeymap(keys), rowPins, colPins, n_rows, n_cols);
void setup() {
pinMode(D0, INPUT_PULLUP);
pinMode(D3, INPUT_PULLUP);
pinMode(D4, INPUT_PULLUP);
pinMode(D5, INPUT_PULLUP);
pinMode(D6, INPUT_PULLUP);
pinMode(D7, INPUT_PULLUP);
pinMode(D9, INPUT_PULLUP);
pinMode(D10, INPUT_PULLUP);
delay(500);
if (konsol) {
Serial.begin(115200);
delay(500);
Serial.println(F("* * * Tuşla Gelsin v1.0 * * *"));
}
lcd.init();
lcd.backlight();
lcd.setCursor(1,0);
lcd.print("Tusla Gelsin v 1.0");
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) {
Serial.println(F("WiFi'ya bağlandı, ESP hazır!"));
Serial.print("IP Adresi: ");
Serial.println(WiFi.localIP());
}
SatirTemizle(1);
lcd.print(" IP : ");
lcd.setCursor(6,1);
lcd.print(WiFi.localIP());
lcd.setCursor(0,2);
lcd.print("Hazir komut bekliyor");
lcd.setCursor(0,3);
lcd.print("Gravite, 2020-09-09");
}
void loop() {
char tus_degeri = TusTakimi.getKey();
if ( isdigit(tus_degeri) ) {
uint8_t sayi = tus_degeri - '0';
ToplamSayi = ((ToplamSayi * 10) + sayi);
if (konsol) {
//Serial.println(tus_degeri);
Serial.print( "Tuşlanan sayı " );
Serial.println(ToplamSayi);
}
SatirTemizle(3);
lcd.print(ToplamSayi);
} else if ( tus_degeri == '#' ) {
// # tuşu enter gibi davranır
SatirTemizle(3);
lcd.print("Siparis isteniyor.");
if (konsol) {
Serial.print(ToplamSayi);
Serial.println( " numaralı sipariş istendi.\n" );
}
int urlEk = ToplamSayi;
String TamUrl = url + urlEk;
SiparisVer(TamUrl);
ToplamSayi = 0;
} else if ( tus_degeri == '*' ) {
// * 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(3);
lcd.print("sayi iptal edildi");
} else if ( tus_degeri == 'A' ) {
// Bu tuş hızlıca favori ürün siparişi verebilir!
if (konsol) {
Serial.println("A tuşuna basıldı");
}
SatirTemizle(3);
lcd.print("A");
} else if ( tus_degeri == 'B' ) {
// Bu tuş hızlıca favori ürün siparişi verebilir!
if (konsol) {
Serial.println("B tuşuna basıldı");
}
SatirTemizle(3);
lcd.print("B");
} else if ( tus_degeri == 'C' ) {
// Bu tuş hızlıca favori ürün siparişi verebilir!
if (konsol) {
Serial.println("C tuşuna basıldı");
}
SatirTemizle(3);
lcd.print("C");
} else if ( tus_degeri == 'D' ) {
// Bu tuş hızlıca favori ürün siparişi verebilir!
if (konsol) {
Serial.println("D tuşuna basıldı");
}
SatirTemizle(3);
lcd.print("D");
}
}
/*
* @brief Bu fonksiyon belirtilen url adresine GET değeri taşır ve apache koduna göre sonuçları ekran yazdırır.
*/
void SiparisVer(String TamUrl) {
std::unique_ptr<BearSSL::WiFiClientSecure>client(new BearSSL::WiFiClientSecure);
client->setInsecure();
HTTPClient https;
/*
if (konsol) {
Serial.println(TamUrl);
}
*/
if (https.begin(*client, TamUrl )) {
// HTTPS
int httpKod = https.GET();
if (httpKod > 0) {
if (konsol) {
Serial.printf("[HTTPS] Header Kod: %d\n", httpKod);
}
if (httpKod == HTTP_CODE_OK) {
String SayfaDonus = https.getString();
if (konsol) {
Serial.print(String("[HTTPS] Sayfanın yaptığı dönüş: ") + SayfaDonus);
}
SatirTemizle(3);
lcd.print(SayfaDonus);
} else {
SatirTemizle(3);
lcd.print("Sayfa cevap vermiyor");
}
} else {
if (konsol) {
Serial.printf("[HTTPS] GET... uyarı, hata: %s\n\r", https.errorToString(httpKod).c_str());
}
SatirTemizle(3);
lcd.print("Hata:");
lcd.setCursor(6,3);
lcd.print(httpKod);
}
https.end();
} else {
if (konsol) {
Serial.printf("[HTTPS] Bağlantı Hatası!\n\r");
}
SatirTemizle(3);
lcd.print("Baglanti Hatasi!");
}
}
/*
* @brief Bu fonksiyon LCD ekranda belirtilen satırı temizler ve satır başına döner.
*/
void SatirTemizle(int satir) {
lcd.setCursor(0,satir);
lcd.print(" ");
lcd.setCursor(0,satir);
}