Keypad bağlı değil. Modülü bozsam scan ettiğimde 0x27 adresi göndermez diye düşünüyorum ama eminde değilim. Resimlerde gördüğüm gibi 4 pin dışarı bakacak şekilde lehimledim.Hiç bir şey çalışmasa bile bu ayarın yapılması ve ekranı tamamen pikselle doldurması ya da boşaltması lazım. Modülü bozmuş ya da hatalı bağlamış olabilir misin? Hiç görüntü aldın mı?
Keypad bağlı değil diye düşünüyorum.
SCL = D1 pinine SDA =D2 pinine bağlıyorum.Bir de nodemcu da D1 ve D2 numaralı pinleri kullanıyorsun değil mi?
Nodemcu dan 3.3v alıyorum. İ2c takılı değilken çalışıyordu. Belki onunla beraber yetersiz gelmiştir. Yarın 5v vererek deneyeyim birde.Peki besleme için 5V girişi yaptığından emin misin? Kontrast bir gerilim bölücü ile ayarlanıyor. Eğer giriş gerilimin 5 V değilse bu soruna sebep olur.
Peki besleme için 5V girişi yaptığından emin misin? Kontrast bir gerilim bölücü ile ayarlanıyor. Eğer giriş gerilimin 5 V değilse bu soruna sebep olur.
LCD beslemesi her zaman ayrı olmalı....
O hiç gelmedi aklıma.Ya da NodeMCU'nın Vin diye de geçen pininden 5V alabilirdin... Burası doğrudan USB girişindeki 5V'a bağlı.
Denedim şimdi. Vin de 5v yok. 0.5mv var. Sanırım bendeki versiyonda direk bağlı değil usb yeAmaç zaten tek kaynaktan beslemek. Regülatör ile niye uğraşasın.
Şimdi keyfim yerine geldi. Devam edeyim projeye. Yine uzadıkça sıkmaya başladı çünküO pinin açılımı VUSB (USB power output)
/*
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_I2C.h>
#include <Keypad.h>
#include <LiquidCrystal_I2C.h>
#include "Wire.h"
#define keypad_addr 0x20
/* ******************** Dikkat! bu tanımları özelleştir! ******************** */
// WiFi ayarları
const char* WiFi_Adi="xxxxxxx";
const char* WiFi_Sifre = "xxxxxxx";
// 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
LiquidCrystal_I2C lcd(0x27,16,2);
/*uint8_t lcd_adres = 0x3F;
uint8_t lcd_sutun = 20;
uint8_t lcd_satir = 4;*/
// Keypad ayarları
//const uint8_t KEYPAD_ADDRESS = 0x20;
//I2CKeyPad TusTakimi;
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] = {0, 1, 2, 3};
byte colPins[n_cols] = {4, 5, 6, 7};
/* ******************** 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_I2C TusTakimi = Keypad_I2C(makeKeymap(keys), rowPins, colPins, n_rows, n_cols, keypad_addr, PCF8574);
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("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) {
lcd.setCursor(0,0);
Serial.print("WiFi'ya baglandi");
lcd.setCursor(0,1);
Serial.print("IP:");
lcd.setCursor(4,1);
Serial.print(WiFi.localIP());
}
SatirTemizle(0);
lcd.setCursor(0,0);
lcd.print("IP:");
lcd.setCursor(4,0);
lcd.print(WiFi.localIP());
SatirTemizle(1);
lcd.setCursor(0,1);
lcd.print("Urun No Giriniz");
}
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( "Tuslanan Sayi:" );
Serial.println(ToplamSayi);
}
SatirTemizle(1);
lcd.print(ToplamSayi);
} else if ( tus_degeri == '#' ) {
// # tuşu enter gibi davranır
SatirTemizle(1);
lcd.print("Siparis isteniyor.");
if (konsol) {
Serial.print(ToplamSayi);
Serial.println( " 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(1);
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(1);
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(1);
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(1);
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(1);
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(1);
lcd.print(SayfaDonus);
} else {
SatirTemizle(1);
lcd.print("Sayfa cevap vermiyor");
}
} else {
if (konsol) {
Serial.printf("[HTTPS] GET... uyarı, hata: %s\n\r", https.errorToString(httpKod).c_str());
}
SatirTemizle(1);
lcd.print("Hata:");
lcd.setCursor(6,3);
lcd.print(httpKod);
}
https.end();
} else {
if (konsol) {
Serial.printf("[HTTPS] Bağlantı Hatası!\n\r");
}
SatirTemizle(1);
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);
}
//
// FILE: I2Ckeypad_demo02.ino
// AUTHOR: Rob Tillaart
// VERSION: 0.1.0
// PURPOSE: demo
// URL: https://github.com/RobTillaart/I2CKeyPad
//
// HISTORY:
// 2019-10-01 0.0.1 initial version
// 2020-06-26 0.1.0 updated with lib
// PCF8574
// pin p0-p3 rows
// pin p4-p7 colums
// 4x4 or smaller keypad.
#include "Wire.h"
#include "I2CKeyPad.h"
const uint8_t KEYPAD_ADDRESS = 0x20;
I2CKeyPad keyPad;
uint32_t start, stop;
uint32_t lastKeyPressed;
void setup()
{
Serial.begin(115200);
//Serial.println(__FILE__);
Wire.begin();
//Wire.setClock(400000);
if (keyPad.begin(KEYPAD_ADDRESS) == false)
{
Serial.println("\nERROR: cannot communicate to keypad.\nPlease reboot.\n");
while(1);
}
}
void loop()
{
//uint32_t now = millis();
// lastKeyPressed = now;
//bool c = keyPad.isConnected();
//bool b = keyPad.isPressed();
//uint8_t lk = keyPad.getLastKey();
//start = micros();
uint8_t idx = keyPad.getKey();
//stop = micros();
//Serial.print(millis());
//Serial.print("\t");
//Serial.print(idx);
//Serial.print("\t");
Serial.print((String)"D#0*C987B654A321"[idx]);
//Serial.print("\t");
//Serial.print(lk);
//Serial.print("\t");
//Serial.print(b?"True":"False");
//Serial.print("\t");
//Serial.print(c?"True":"False");
//Serial.print("\t");
Serial.println(start);
}
// -- END OF FILE --
Kodu şu şekilde düzenleyip senin kodlara ekledim.@Gokrtl zaten döngünde (loop) aşağıdaki 3 satır var.
uint8_t idx = keyPad.getKey();
Serial.print((String)"D#0*C987B654A321"[idx]);
Serial.println(start);
Bunlardan ilki tuşa basılmış mı diye sorguluyor. İkincisi basılı tuşu iletiyor. Son satır ise her defasında integer olarak tanımladığın start'ı gönderiyor.
Burada sadece "start" değişmiyor...
Ayrıca kodu taramaya çok da gerek yok. Seri monitörde metin bir alt satıra geçiyorsa print komutunun sonunda PHP'den de aşına olacağın '\n' <print yerine println kullanırsan new line karakteri eklemeden bu işi yapar> new line karakterini takip edebilirsin.
Senin durumda bastığın tuştan sonra 0 geliyor (A0) sonra yeni bir satıra geçip devam ediyor ya da belirttiğin gibi hiç bir şey yapmazsan 0 gönderip başa dönüyor.
Özetle Serial.println(start); satırını kaldır.
Ayrıca döngün çok kısa olduğu için hızlı tekrar yapıyor. O yüzden ekranda çok tekrar görüyorsun. Loop'un sonuna delay(1000); komutu eklersen, döngü tamamlandığında başa dönmek için 1 saniye bekler...
uint8_t idxx = keyPad.getKey();
char idx = "D#0*C987B654A321"[idxx];
Tam anlayamadım. Ben 2 ye basınca ekrana 222 yazıyor. Bu rakamın uzunluğu benim butona baskı süreme bağlı. Mesela 5sn bassam 222222222222222 oluyor. Bunu nasıl teke düşüreceğimi anlayamadım. Anneme desem ki "buna sadece 0,5sn bas" huyu değildir ama küfür edebilir.Ayarlanır ama tüm kod bittiğinde kodu işlemesi zaten zaman alacak. O nedenle şimdi bunu düşünmeye gerek yok.
Zaten bu gecikmeleri komut aldıktan sonra yapılan işlemlerin sonuna eklemek lazım. Hem tepki süren iyileşir hem de işlemi bir defa yapmayı garantiler.