Kapı projesi için hazırlanan kod çalışmıyor

Merhabalar. Bir proje yapıyorum, askıya eşya takıldığı zaman led yanıyor ve I2C LCD ekranda uyarı çıkıyor. Eşya askıdan alındığında led sönüyor ve ekrandaki yazı siliniyor. Kod buraya kadar tamam. 2. aşama olarak, askıda eşya varken kapı açılırsa (yani kapı pini on olursa) buzzer ötecek ve ekrandaki yazı silinip yerine farklı bir yazı yazılacak. Bu kısım çalışmıyor. Yardımınıza ihtiyacım var. Kod şu şekilde:

#include <LiquidCrystal_I2C.h>

#include <AvrI2c_Greiman.h>
#include <LiquidCrystal_I2C_AvrI2C.h>

LiquidCrystal_I2C lcd(0x27,20,4);

const int buzzerPin = 5;

const int KapiPin = 3;
const int AskiPin = 8;
const int ledPin = 2;
int x = 0;

int KapiDurumu = 0;
int eskiKapiDurumu = HIGH;

int AskiDurumu = 0;
int eskiAskiDurumu = HIGH;

void setup() {
lcd.init();
pinMode(buzzerPin, OUTPUT);
pinMode(KapiPin, INPUT_PULLUP);
pinMode(AskiPin, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
lcd.backlight();
}

void loop()
{

int yeniKapiDurumu = digitalRead(KapiPin);
int yeniAskiDurumu = digitalRead(AskiPin);

if (yeniAskiDurumu == HIGH && eskiAskiDurumu == LOW) {

lcd.setCursor(0,0);
lcd.print("Esyanizi"); 
lcd.setCursor(0,1);
lcd.print("Unutmayiniz."); 

if (x == 0) {
 
  digitalWrite(ledPin, HIGH);
  x = 1;
  delay(10);

} else {

  lcd.clear();  
  digitalWrite(ledPin, LOW);
  x = 0;
  delay(10);
}

if (yeniKapiDurumu == HIGH && eskiKapiDurumu == LOW) {

tone(buzzerPin, 1000); // Send 1KHz sound signal…
delay(1000); // …for 1 sec
noTone(buzzerPin); // Stop sound…
delay(1000); // …for 1sec

lcd.clear();
lcd.setCursor(0,0);
lcd.print("Esyanizi"); 
lcd.setCursor(0,1);
lcd.print("Unuttunuz!"); 

}

}

eskiAskiDurumu = yeniAskiDurumu;
}

eskiAskiDurumu = yeniAskiDurumu; yapmışsın ama
eskiKapiDurumu = yeniKapiDurumu; yapmamışsın.

Şu kodu dener misin.

#include <LiquidCrystal_I2C.h>
#include <AvrI2c_Greiman.h>
#include <LiquidCrystal_I2C_AvrI2C.h>

LiquidCrystal_I2C lcd(0x27, 20, 4);

const int buzzerPin = 5;
const int kapiPin = 3;
const int askiPin = 8;
const int ledPin = 2;
bool ledDurum = false;
bool askidaEsyaVar = false;

int KapiDurumu = 0;
int eskiKapiDurumu = HIGH;

int AskiDurumu = 0;
int eskiAskiDurumu = HIGH;

void setup() {
  lcd.init();
  pinMode(buzzerPin, OUTPUT);
  pinMode(kapiPin, INPUT_PULLUP);
  pinMode(askiPin, INPUT_PULLUP);
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
  lcd.backlight();
}

void loop()
{
  lediAcKapa();
  askiKontrol();
  kapiKontrol();
}
void askiyaEsyaTakildi() {
  askidaEsyaVar = true;
  ekranaYazdir("Esyanizi", "Unutmayiniz")
}
void askidanEsyaAlindi() {
  askidaEsyaVar = false;
}
void kapiAcildi() {
  if ( askidaEsyaVar ) {
    ekranaYazdir("Esyanizi", "Unuttunuz!");
    buzzerOttur();
  }
}
void KapiKapandi() {

}











void askiKontrol() {
  int yeniAskiDurumu = digitalRead(askiPin);
  if (yeniAskiDurumu != eskiAskiDurumu) { // Askida Bir Değişiklik Olduysa
    if ( yeniAskiDurumu == HIGH ) {
      askiyaEsyaTakildi();
    }
    else
    {
      askidanEsyaAlindi();
    }
    eskiAskiDurumu = yeniAskiDurumu;
  }
}
void kapiKontrol() {
  int yeniKapiDurumu = digitalRead(kapiPin);
  if (yeniKapiDurumu != eskiKapiDurumu) { // Kapı açıldıysa veya kapandıysa
    if ( yeniKapiDurumu == HIGH ) {
      kapiAcildi();
    }
    else
    {
      KapiKapandi();
    }
    eskiKapiDurumu = yeniKapiDurumu;
  }
}
void ekranaYazdir(String ilkPanel, String ikinciPanel) {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(ilkPanel);
  lcd.setCursor(0, 1);
  lcd.print(ikinciPanel);
}
void buzzerOttur() {
  tone(buzzerPin, 1000); // Send 1KHz sound signal…
  delay(1000); // …for 1 sec
  noTone(buzzerPin); // Stop sound…
  delay(1000); // …for 1sec
}
void lediAcKapa() {
  digitalWrite(ledPin, ledDurum ? LOW : HIGH);
  ledDurum = !ledDurum;
  delay(10);
}
1 Beğeni

Yabancı forumlarda vs. çok uğraştım ancak yabancı dil olduğu için iletişim çok zor oluyor. Bana yardım edebileceğini umuyorum, şimdiden çok teşekkürler.

Kodu denedim ve şöyle oldu:

Led hep yanıyordu.

İlk switche basılı tuttum. Normalde bunu yaptığımda eşyanızı unuttunuz deyip ışığı yakması gerekirken bıraktıktan sonra eşyanızı unuttunuz yazdı ve led ufak bir yalpalayıp geri yandı.

İlk switche basılı tutarken ikinci switche bastım, bir şey olmadı. İkinci switche tek başına basılı tuttum, bir şey olmadı (zaten normalde de birinci switche basılı tutarken buna basılı tutmadığım sürece bir şey olmaması gerekiyordu) fakat bıraktığım gibi buzzer öttü ve ekrandaki yazı eşyanızı unuttunuz şeklinde değişti.

Şunu belirtmek isterim ki switchler şu şekilde:

Bu tür switchden 2 tane aynı anda kullanılamıyor olabilir mi acaba?

1 Beğeni

O halde test ede ede gidelim. Şuanda olayları doğru bir şekilde çekebiliyor muyuz ona bakalım. Lütfen gönderdiğim kodu çalıştırın ve paneldeki yazıları takip edin.
Kapıyı kapatıp aç , askıya eşya koy al ve paneldeki yazılar doğru mu çalışıyor bir gözlemle. Kapıyı kapatınca kapıyı açtı yazması veya askıya eşya asınca askıdan eşya alındı gibi hatalı çıktılar mı verecek yoksa doğru yazıları yazabilecek mi önce bi görelim. Daha sonra kaldığımız yerden devam ederiz.

#include <LiquidCrystal_I2C.h>
#include <AvrI2c_Greiman.h>
#include <LiquidCrystal_I2C_AvrI2C.h>

LiquidCrystal_I2C lcd(0x27, 20, 4);

const int buzzerPin = 5;
const int kapiPin = 3;
const int askiPin = 8;
const int ledPin = 2;
bool ledDurum = false;
bool askidaEsyaVar = false;

int KapiDurumu = 0;
int eskiKapiDurumu = HIGH;

int AskiDurumu = 0;
int eskiAskiDurumu = HIGH;

void setup() {
  lcd.init();
  pinMode(buzzerPin, OUTPUT);
  pinMode(kapiPin, INPUT_PULLUP);
  pinMode(askiPin, INPUT_PULLUP);
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
  lcd.backlight();
}

void loop()
{
  lediAcKapa();
  askiKontrol();
  kapiKontrol();
}
void askiyaEsyaTakildi() {
  ekranaYazdir("Askiya", "Takildi");
}
void askidanEsyaAlindi() {
  ekranaYazdir("Askidan", "Alindi");
}
void kapiAcildi() {
  ekranaYazdir("Kapi", "Acildi");
}
void KapiKapandi() {
  ekranaYazdir("Kapi", "Kapandi");
}

void askiKontrol() {
  int yeniAskiDurumu = digitalRead(askiPin);
  if (yeniAskiDurumu != eskiAskiDurumu) { // Askida Bir Değişiklik Olduysa
    if ( yeniAskiDurumu == HIGH ) {
      askiyaEsyaTakildi();
    }
    else
    {
      askidanEsyaAlindi();
    }
    eskiAskiDurumu = yeniAskiDurumu;
  }
}
void kapiKontrol() {
  int yeniKapiDurumu = digitalRead(kapiPin);
  if (yeniKapiDurumu != eskiKapiDurumu) { // Kapı açıldıysa veya kapandıysa
    if ( yeniKapiDurumu == HIGH ) {
      kapiAcildi();
    }
    else
    {
      KapiKapandi();
    }
    eskiKapiDurumu = yeniKapiDurumu;
  }
}
void ekranaYazdir(String ilkPanel, String ikinciPanel) {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(ilkPanel);
  lcd.setCursor(0, 1);
  lcd.print(ikinciPanel);
}
void buzzerOttur() {
  tone(buzzerPin, 1000); // Send 1KHz sound signal…
  delay(1000); // …for 1 sec
  noTone(buzzerPin); // Stop sound…
  delay(1000); // …for 1sec
}
void lediAcKapa() {
  digitalWrite(ledPin, ledDurum ? LOW : HIGH);
  ledDurum = !ledDurum;
  delay(10);
}
1 Beğeni

Düzgün gibi, askıya eşya takılıyken askıdan eşya alındı diyor, buradaki sorun tam tersi olması, kolayca değiştirilebilir sanırım. Led hep yanık, tuşlara basıldığı zaman milisaniyelik bir şekilde yalpalayıp tekrar yanıyor. Kapı kısmında sıkıntı yok. Kapı kapalıyken switche basılı olacak şekilde düşünmüştüm zaten. Buzzer’ın öttüğü bir durum yok, zaten kodda boşta sanırım şu anlık.

İkisine aynı anda basılmaya çalışıldığı zaman hangisi daha sonra basılmışsa o uygulanıyor.

Bu arada yardımlarınız için çok teşekkürler.

if ( yeniAskiDurumu == LOW )

Burayı değişerek askı kısmını mekanizmaya göre değiştirdim.

Tahmin ettiğim şekilde olmuş. Peki Ledin ne zaman yanmasını istiyorsun ? Sadece eşya unutulduğunda mı ?

1 Beğeni

Eşya askıda olduğu müddetçe led yanacak. Askıdan alınırsa sönecek. Askıda eşya varken kapı açılırsa farklı tepkiler verebilir, yanıp sönmek gibi fakat o kısım çok mühim değil şimdilik.

Tekrar dener misin. Her hangi bir sorun olursa yaz. Tekrar düzenleyelim.

#include <LiquidCrystal_I2C.h>
#include <AvrI2c_Greiman.h>
#include <LiquidCrystal_I2C_AvrI2C.h>

LiquidCrystal_I2C lcd(0x27, 20, 4);

const int buzzerPin = 5;
const int kapiPin = 3;
const int askiPin = 8;
const int ledPin = 2;
bool ledDurum = false;
bool askidaEsyaVar = false;

int KapiDurumu = 0;
int eskiKapiDurumu = HIGH;

int AskiDurumu = 0;
int eskiAskiDurumu = HIGH;

void setup() {
  lcd.init();
  pinMode(buzzerPin, OUTPUT);
  pinMode(kapiPin, INPUT_PULLUP);
  pinMode(askiPin, INPUT_PULLUP);
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
  lcd.backlight();
}

void loop()
{
  askiKontrol();
  kapiKontrol();
}
void askiyaEsyaTakildi() {
  digitalWrite(ledPin, HIGH );
  askidaEsyaVar = true;
  ekranaYazdir("Esyanizi", "Unutmayiniz")
}
void askidanEsyaAlindi() {
  digitalWrite(ledPin, LOW );
  askidaEsyaVar = false;
}
void kapiAcildi() {
  if ( askidaEsyaVar ) {
    ekranaYazdir("Esyanizi", "Unuttunuz!");
    buzzerOttur();
  }
}
void KapiKapandi() {

}



void askiKontrol() {
  int yeniAskiDurumu = digitalRead(askiPin);
  if (yeniAskiDurumu != eskiAskiDurumu) { // Askida Bir Değişiklik Olduysa
    if ( yeniAskiDurumu == LOW ) {
      askiyaEsyaTakildi();
    }
    else
    {
      askidanEsyaAlindi();
    }
    eskiAskiDurumu = yeniAskiDurumu;
  }
}
void kapiKontrol() {
  int yeniKapiDurumu = digitalRead(kapiPin);
  if (yeniKapiDurumu != eskiKapiDurumu) { // Kapı açıldıysa veya kapandıysa
    if ( yeniKapiDurumu == HIGH ) {
      kapiAcildi();
    }
    else
    {
      KapiKapandi();
    }
    eskiKapiDurumu = yeniKapiDurumu;
  }
}
void ekranaYazdir(String ilkPanel, String ikinciPanel) {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(ilkPanel);
  lcd.setCursor(0, 1);
  lcd.print(ikinciPanel);
}
void buzzerOttur() {
  tone(buzzerPin, 1000); // Send 1KHz sound signal…
  delay(1000); // …for 1 sec
  noTone(buzzerPin); // Stop sound…
  delay(1000); // …for 1sec
}
1 Beğeni

Sadece, mekanizmaya göre kapının tam tersi çalışması gerekti (yani kapı switchine basılıyken kapı kapalı oluyor), onu değiştirmeye çalışıyorum şu an. Ufak bir sorun ise şu: Kapı kapalıyken askıya bir şey asılırsa ve kapı açılırsa ötüyor ama kapı açıkken askıya bir şey asılıp kapı kapatılırsa yine ötüyor. Normalde sadece askıda eşya varken kapı açılırsa ötmesi gerek sadece. Bunlar dışında kusursuz çalışıyor. Uğraşlarınızın karşılığı da sadece kodu bana vermek değil ayrıca beni eğitmek, yazdığınız kodları iyice inceleyeceğim. Size çok teşekkür ediyorum.

Rica ederim.
Tekrar test eder misin.

#include <LiquidCrystal_I2C.h>
#include <AvrI2c_Greiman.h>
#include <LiquidCrystal_I2C_AvrI2C.h>

LiquidCrystal_I2C lcd(0x27, 20, 4);

const int buzzerPin = 5;
const int kapiPin = 3;
const int askiPin = 8;
const int ledPin = 2;

int KapiDurumu = 0;
int eskiKapiDurumu = HIGH;

int AskiDurumu = 0;
int eskiAskiDurumu = HIGH;

void setup() {
  lcd.init();
  pinMode(buzzerPin, OUTPUT);
  pinMode(kapiPin, INPUT_PULLUP);
  pinMode(askiPin, INPUT_PULLUP);
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
  lcd.backlight();
}

void loop()
{
  askiKontrol();
  kapiKontrol();
}
void askiyaEsyaTakildi() {
  digitalWrite(ledPin, HIGH );
  ekranaYazdir("Esyanizi", "Unutmayiniz")
}
void askidanEsyaAlindi() {
  digitalWrite(ledPin, LOW );
}
void kapiAcildi() {
  if ( askidaEsyaVarMi() ) {
    ekranaYazdir("Esyanizi", "Unuttunuz!");
    buzzerOttur();
  }
}
void KapiKapandi() {

}



void askiKontrol() {
  int yeniAskiDurumu = digitalRead(askiPin);
  if (yeniAskiDurumu != eskiAskiDurumu) { // Askida Bir Değişiklik Olduysa
    if ( yeniAskiDurumu == LOW ) {
      askiyaEsyaTakildi();
    }
    else
    {
      askidanEsyaAlindi();
    }
    eskiAskiDurumu = yeniAskiDurumu;
  }
}
void kapiKontrol() {
  int yeniKapiDurumu = digitalRead(kapiPin);
  if (yeniKapiDurumu != eskiKapiDurumu) { // Kapı açıldıysa veya kapandıysa
    if ( yeniKapiDurumu == LOW ) {
      kapiAcildi();
    }
    else
    {
      KapiKapandi();
    }
    eskiKapiDurumu = yeniKapiDurumu;
  }
}
void ekranaYazdir(String ilkPanel, String ikinciPanel) {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(ilkPanel);
  lcd.setCursor(0, 1);
  lcd.print(ikinciPanel);
}
void buzzerOttur() {
  tone(buzzerPin, 1000); // Send 1KHz sound signal…
  delay(1000); // …for 1 sec
  noTone(buzzerPin); // Stop sound…
  delay(1000); // …for 1sec
}
bool kapiAcikMi(){
  return eskiKapiDurumu==LOW;
}
bool askidaEsyaVarMi(){
  return eskiAskiDurumu==LOW;
}
1 Beğeni

Askıda eşya varken kapıya ne olursa olsun ötme sorunu çözüldü. Artık sadece tek durumda ötüyor. Yani askıda eşya varken kapı açılırsa durumunda. Geriye kalan tek sıkıntı kapı switchinin ters çalışıyor olması. Normalde kapı tuşuna basmıyorken kapının kapalı olması gerek. Kodda ise tam tersi. Yani askı tuşuna basılı tutuyorum, o sırada kapı tuşuna basınca ötüyor. Normalde olması gereken kapı tuşunu bırakınca ötmesi.

Sanırsam problemin şimdi çözülmüş olması gerek.

#include <LiquidCrystal_I2C.h>
#include <AvrI2c_Greiman.h>
#include <LiquidCrystal_I2C_AvrI2C.h>

LiquidCrystal_I2C lcd(0x27, 20, 4);

const int buzzerPin = 5;
const int kapiPin = 3;
const int askiPin = 8;
const int ledPin = 2;

int KapiDurumu = 0;
int eskiKapiDurumu = HIGH;

int AskiDurumu = 0;
int eskiAskiDurumu = HIGH;

void setup() {
  lcd.init();
  pinMode(buzzerPin, OUTPUT);
  pinMode(kapiPin, INPUT_PULLUP);
  pinMode(askiPin, INPUT_PULLUP);
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
  lcd.backlight();
}

void loop()
{
  askiKontrol();
  kapiKontrol();
}
void askiyaEsyaTakildi() {
  digitalWrite(ledPin, HIGH );
  ekranaYazdir("Esyanizi", "Unutmayiniz")
}
void askidanEsyaAlindi() {
  digitalWrite(ledPin, LOW );
}
void kapiAcildi() {
  if ( askidaEsyaVarMi() ) {
    ekranaYazdir("Esyanizi", "Unuttunuz!");
    buzzerOttur();
  }
}
void KapiKapandi() {

}



void askiKontrol() {
  int yeniAskiDurumu = digitalRead(askiPin);
  if (yeniAskiDurumu != eskiAskiDurumu) { // Askida Bir Değişiklik Olduysa
    eskiAskiDurumu = yeniAskiDurumu;
    if ( yeniAskiDurumu == LOW ) {
      askiyaEsyaTakildi();
    }
    else
    {
      askidanEsyaAlindi();
    }
  }
}
void kapiKontrol() {
  int yeniKapiDurumu = digitalRead(kapiPin);
  if (yeniKapiDurumu != eskiKapiDurumu) { // Kapı açıldıysa veya kapandıysa
    eskiKapiDurumu = yeniKapiDurumu;
    if ( yeniKapiDurumu == LOW ) {
      kapiAcildi();
    }
    else
    {
      KapiKapandi();
    }
  }
}
void ekranaYazdir(String ilkPanel, String ikinciPanel) {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(ilkPanel);
  lcd.setCursor(0, 1);
  lcd.print(ikinciPanel);
}
void buzzerOttur() {
  tone(buzzerPin, 1000); // Send 1KHz sound signal…
  delay(1000); // …for 1 sec
  noTone(buzzerPin); // Stop sound…
  delay(1000); // …for 1sec
}
bool kapiAcikMi(){
  return eskiKapiDurumu==LOW;
}
bool askidaEsyaVarMi(){
  return eskiAskiDurumu==LOW;
}
1 Beğeni

Daha önceden yazdığım şu mesajdaki sorun tekrar başladı bu kod ile:

“Ufak bir sorun ise şu: Kapı kapalıyken askıya bir şey asılırsa ve kapı açılırsa ötüyor ama kapı açıkken askıya bir şey asılıp kapı kapatılırsa yine ötüyor. Normalde sadece askıda eşya varken kapı açılırsa ötmesi gerek sadece.”

Kapı için ; ( LOW : AÇIK ) - ( HIGH : KAPALI )
Askı için ; ( LOW : KAPALI ) - ( HIGH : AÇIK )

Bu şekilde oluyor. Doğru muyum ?

1 Beğeni

Evet, kapı tuşu basılıyken gerçek hayatta kapalı oluyor. Mantık şu: Kapı kapandığı vakit üzerindeki metal kısım kapının çerçevesindeki plakaya değerek switch görevi görüyor ve switch basılı oldukça kapı kapalı demek oluyor.

Şuanda bir sıkıntı göremiyorum. Aletin direk yanında olsam aslında 3-5 dakikalık iş.

#include <LiquidCrystal_I2C.h>
#include <AvrI2c_Greiman.h>
#include <LiquidCrystal_I2C_AvrI2C.h>

LiquidCrystal_I2C lcd(0x27, 20, 4);

const int buzzerPin = 5;
const int kapiPin = 3;
const int askiPin = 8;
const int ledPin = 2;

int KapiDurumu = 0;
int eskiKapiDurumu = HIGH;

int AskiDurumu = 0;
int eskiAskiDurumu = HIGH;

void setup() {
  lcd.init();
  pinMode(buzzerPin, OUTPUT);
  pinMode(kapiPin, INPUT_PULLUP);
  pinMode(askiPin, INPUT_PULLUP);
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
  lcd.backlight();
}

void loop()
{
  askiKontrol();
  kapiKontrol();
}
void askiyaEsyaTakildi() {
  digitalWrite(ledPin, HIGH );
  ekranaYazdir("Esyanizi", "Unutmayiniz")
}
void askidanEsyaAlindi() {
  digitalWrite(ledPin, LOW );
}
void kapiAcildi() {
  if ( askidaEsyaVarMi() ) {
    ekranaYazdir("Esyanizi", "Unuttunuz!");
    buzzerOttur();
  }
}
void KapiKapandi() {

}



void askiKontrol() {
  int yeniAskiDurumu = digitalRead(askiPin);
  if (yeniAskiDurumu != eskiAskiDurumu) { // Askida Bir Değişiklik Olduysa
    eskiAskiDurumu = yeniAskiDurumu;
    if ( askidaEsyaVarMi() ) {
      askiyaEsyaTakildi();
    }
    else
    {
      askidanEsyaAlindi();
    }
  }
}
void kapiKontrol() {
  int yeniKapiDurumu = digitalRead(kapiPin);
  if (yeniKapiDurumu != eskiKapiDurumu) { // Kapı açıldıysa veya kapandıysa
    eskiKapiDurumu = yeniKapiDurumu;
    if ( kapiAcikMi() ) {
      kapiAcildi();
    }
    else
    {
      KapiKapandi();
    }
  }
}
void ekranaYazdir(String ilkPanel, String ikinciPanel) {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(ilkPanel);
  lcd.setCursor(0, 1);
  lcd.print(ikinciPanel);
}
void buzzerOttur() {
  tone(buzzerPin, 1000); // Send 1KHz sound signal…
  delay(1000); // …for 1 sec
  noTone(buzzerPin); // Stop sound…
  delay(1000); // …for 1sec
}
bool kapiAcikMi() {
  return eskiKapiDurumu == LOW;
}
bool askidaEsyaVarMi() {
  return eskiAskiDurumu == HIGH;
}
1 Beğeni

Bu sefer de askıya basarken kapıya basarsak veya çekersek bir şey olmuyor, kapıya tek başına basınca ötüyor.

if (yeniKapiDurumu != eskiKapiDurumu) { // Kapı açıldıysa veya kapandıysa

Sorunun kaynağı bu satır olabilir mi?

Hayır orada bir problem bulunmuyor. Orası kısaca "yeniKapiDurumu ile eskiKapiDurumu eşit değilse demek oluyor.

pinleri birbirine karıştırmadığınızdan emin misiniz ? Yanlışlıkla kapı yerine askı pinini , askı yerine ise kapı pinini kullanmadınız değil mi ?

1 Beğeni

Evet eminim.

Aslında aşağıdaki mesajımda dediğim gibi tek sorun (aşağıdaki mesajı üzerine attığım koddaki tek sorun yani) switchin tam ters çalışmasıydı. Artısı eksisi ile yer değiştirsem de mantıkken bir şey değişmiyor. Eğer sorun kod ile çözülmezse mekanik olarak halletmek gerekecek.

“Askıda eşya varken kapıya ne olursa olsun ötme sorunu çözüldü. Artık sadece tek durumda ötüyor. Yani askıda eşya varken kapı açılırsa durumunda. Geriye kalan tek sıkıntı kapı switchinin ters çalışıyor olması. Normalde kapı tuşuna basmıyorken kapının kapalı olması gerek. Kodda ise tam tersi. Yani askı tuşuna basılı tutuyorum, o sırada kapı tuşuna basınca ötüyor. Normalde olması gereken kapı tuşunu bırakınca ötmesi.”

Kapıyı açınca ekranda ne yazıyor ?
Kapıyı kapatınca ekranda ne yazıyor ?
Askıya bir şey asınca ekranda ne yazıyor ?
Askıdan eşya alınca ekranda ne yazıyor ?

Kodu yükleyip bu soruların cevaplarını yazabilir misiniz.

#include <LiquidCrystal_I2C.h>
#include <AvrI2c_Greiman.h>
#include <LiquidCrystal_I2C_AvrI2C.h>

LiquidCrystal_I2C lcd(0x27, 20, 4);

const int buzzerPin = 5;
const int kapiPin = 3;
const int askiPin = 8;
const int ledPin = 2;

int KapiDurumu = 0;
int eskiKapiDurumu = HIGH;

int AskiDurumu = 0;
int eskiAskiDurumu = HIGH;

void setup() {
  lcd.init();
  pinMode(buzzerPin, OUTPUT);
  pinMode(kapiPin, INPUT_PULLUP);
  pinMode(askiPin, INPUT_PULLUP);
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
  lcd.backlight();
}

void loop()
{
  askiKontrol();
  kapiKontrol();
}
void askiyaEsyaTakildi() {
  ekranaYazdir("1", "a")
}
void askidanEsyaAlindi() {
  ekranaYazdir("1", "b")
}
void kapiAcildi() {
  ekranaYazdir("2", "a")
}
void KapiKapandi() {
  ekranaYazdir("2", "b")
}

void askiKontrol() {
  int yeniAskiDurumu = digitalRead(askiPin);
  if (yeniAskiDurumu != eskiAskiDurumu) { // Askida Bir Değişiklik Olduysa
    eskiAskiDurumu = yeniAskiDurumu;
    if ( askidaEsyaVarMi() ) {
      askiyaEsyaTakildi();
    }
    else
    {
      askidanEsyaAlindi();
    }
  }
}
void kapiKontrol() {
  int yeniKapiDurumu = digitalRead(kapiPin);
  if (yeniKapiDurumu != eskiKapiDurumu) { // Kapı açıldıysa veya kapandıysa
    eskiKapiDurumu = yeniKapiDurumu;
    if ( kapiAcikMi() ) {
      kapiAcildi();
    }
    else
    {
      KapiKapandi();
    }
  }
}
void ekranaYazdir(String ilkPanel, String ikinciPanel) {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(ilkPanel);
  lcd.setCursor(0, 1);
  lcd.print(ikinciPanel);
}
void buzzerOttur() {
  tone(buzzerPin, 1000); // Send 1KHz sound signal…
  delay(1000); // …for 1 sec
  noTone(buzzerPin); // Stop sound…
  delay(1000); // …for 1sec
}
bool kapiAcikMi() {
  return eskiKapiDurumu == LOW;
}
bool askidaEsyaVarMi() {
  return eskiAskiDurumu == HIGH;
}
1 Beğeni