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

Kapıyı açınca = 2b,
Kapıyı kapatınca = 2a,
Askıya asınca = 1b,
Askıdan alınca = 1a yazmakta.

Açılıp-kapanmayı ters ayarlamışısız. Şimdi kodu tekrar test edelim ve ekran aşağıdaki sonuçları doğru şekilde veriyor mu bir bakalım.

Kapıyı açınca = KAPI AÇILDI,
Kapıyı kapatınca = KAPI KAPANDI,
Askıya asınca = ASKIYA ASILDI,
Askıdan alınca = ASKIDAN ALINDI

#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("ASKIYA", "ASILDI")
}
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
    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 == HIGH;
}
bool askidaEsyaVarMi() {
  return eskiAskiDurumu == LOW;
}
1 Beğeni

Evet doğru sonuçları vermekte.

Kapıyı açınca = KAPI AÇILDI,
Kapıyı kapatınca = KAPI KAPANDI,
Askıya asınca = ASKIYA ASILDI,
Askıdan alınca = ASKIDAN ALINDI

Aynen bu şekil.

Tamam o zaman. Şimdi düzgün çalışması 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 ( 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 == HIGH;
}
bool askidaEsyaVarMi() {
  return eskiAskiDurumu == LOW;
}
1 Beğeni

Bu kod ile şu sorun tekrar başladı:

“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.”

Şu kod ile bu sorun çözülmüştü ancak kapı switchi tersti:

#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;
}

İlginç bir durum. Halbuki kodda buzzer öttürme kısmı sadece kapı açıldığı esnada var. Kapı kapandığı andaki kısım tamamen boş durumda. Kapı açıldığında askıda eşya var mı kontrolü yapıyor. Eğer eşya varsa ekrana yazdırıp , buzzer öttürülüyor.

void kapiAcildi() {
  if ( askidaEsyaVarMi() ) {
    ekranaYazdir("Esyanizi", "Unuttunuz!");
    buzzerOttur();
  }
}
void KapiKapandi() {

}
1 Beğeni

Sanki kapının kapanıp kapanmamasıyla ilgilenmiyor da sadece kapıda bir değişiklik olup olmamasına bakıyor gibi hissettirdi. Belki ufak bir yer gözden kaçıyordur. Bir de forumdaki kod eklemek için olan butonu kullanamıyorum. Siz nasıl kodları ekliyorsunuz?

[code]

kodu buraya yazıyorum…

[+code]

(+) işareti olan yere (/) işaretini koyarak gönderdiğinizde kod bloğu olarak iletilecektir.

1 Beğeni

Evet hem kapı için hemde askı için kapandığı ve açıldığı anı algılatıyoruz. Her hangi bir değişlik sonucunda eğer açılmışsa açıldı fonksiyonuna , kapanmış ise kapandı fonksiyonuna yönlendiriyoruz.

1 Beğeni

Şimdi kodun mantığını daha iyi kavradım. Biraz kurcalayacağım, olmaz ise artık aşağıdaki kodu kullanacağım ve switchi mekanik olarak tam ters çalışacak şekilde ayarlamaya uğraşacağım.

Şu an doğruya en yakın çalışan kod bu;


#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;
}

Bu attığın kodu kurcalayarak ilerleme. Burada ters çekiyor. En son gönderdiğimi kullanmanı öneriyorum.

1 Beğeni

Fakat o kodda da kapının her iki durumunda da öttüğü için mekanik olarak değişiklik yapıp eski kodu kullanmak daha iyi gibi.

Tamamdır. Eğer kodda anlamadığın veya takıldığın yer olursa yazabilirsin. Kodu olabildiğince anlaşılır biçimde yazmaya çalıştım.

Tamamdır. Size çok teşekkür ediyorum. Emeklerinizi boşa çıkarmamak için kodu iyice inceleyip öğrenmeye çalışacağım.

1 Beğeni

Estağfurullah rica ederim :blush:
Kodlamak hoşuma gidiyor ve yardımcı olmayı seviyorum sadece. Bende evimden uzaktayım. Eve gidip bir an önce ledime yeni efekt yazılımları yazmak için sabırsızlanıyorum :smile:

1 Beğeni

Mükemmel olmuş gerçekten, çok hoş duruyor. Sizlere diğer projelerinizde de başarılar diliyorum.

1 Beğeni