avatar_gevv

Otomatik kümes kapısı açma sistemi

Başlatan gevv, 30 Haziran 2016, 16:00:47

ete

İki kümesin motorlarını transistörle  (devamında röle) sürmüş olman gerekiyor. İşin doğrusu port dan bir çıkış alıp 1K ile bir transistörü sürmen, diğer kümes için yine portdan 1K ile çıkıp başka bir transistörü sürmen dir bence. Bağlantın nasıl onuda belirt istersen ona göre arkadaşlar daha iyi bir yorum yapabilirler sanırım.

Ete

gevv

#16
merhaba, @ETE hocam sizin devrenin aynısını uygulamıştım  bağlantı aşağıda ki gibi oldu sadece motor ekledim







bahsettiğiniz bağlantı aşağıda ki gibi olmalı sanırım  öyle ise modifiye yapmaya başlayayım :)

 

ete

modifiye şeması doğru . Sıkıntı olacak ise boş bir pinden ikinci motor tetikleme emrini ayrıcada çıkartabiliriz.
Ete

gevv

teşekkürler hocam denemeyi yapayım sorun olursa bildiririm
 

Maxim

bence yeni şemadaki değişikliğe hiç gerek yok.
2 motorda gayet güzel tek röle üzerinden çalışması lazım
başka bir sorun vardır yada dediğin gibi açık kalma süresi düşüktür, onu 2 saniye falan yap bence

ersangundogdu

Bu projeyi akvaryum aydınlatmasında kullanmak istiyorum. Günün 2 yada 3 diliminde 2 şer saat aydınlatmanın açık kalması için nasıl bir değişiklik yapmalıyım? Yardımlarınız için şimdiden teşekkür ederim.

blueboard

#21
Ete Hocam , bu proje ile ilgili bir sorum olacak. Bu devreyi daha önceden yaptım ve başarılı bir şekilde çalışıyor.Fakat şimdi farklı bir senaryoya göre nasıl değişiklik yapılacağını bilmiyorum. Kodların orijinal hali ile günün belli saatinde kümes kapısı açılıyordu. Bu durum her gün aynı şekilde rutin olarak devam ediyordu. Şu andaki durumda ise kümes kapısı(Ben bu devreyi lamba açıp kapatmada kullanıyorum) haftanın belirli günlerinde açılabilir mi? Örneğin Pazartesi ve Salı günü kapı açılmayacak. Çarşamba günü kapı açılacak. Perşembe günü kapı açılmayacak. Cuma günü açılacak. Cumartesi açılmayacak. Pazar günü ise açılacak şekilde kodlarda ne gibi değişiklik yapmak gerekir?
Kodda gün kısmını aşağıdaki gibi yazabilir miyiz?
ACSURE=60000 'ms CİNSİNDEN VERİLECEK  (5000ms=5 SN DİR )
TEMP=IF GUN= CARSAMBA THEN  ' BURADA İKİ ADET EŞİTTİR İFADESİ VAR.BENCE BURADA HATA YAPIYORUM
 ACSAAT ACSAAT*60+ACDAK
ACSAAT1=20
ACDAK1=51

blueboard

#22
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2016 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 11.06.2016                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
;
@ Device PIC12F675
@ Device PIC12F675 , WDT_OFF     
@ Device PIC12F675 , PWRT_ON
@ Device PIC12F675 , PROTECT_OFF
@ Device PIC12F675 , CPD_OFF
@ Device PIC12F675 , MCLR_OFF
@ Device PIC12F675 , BOD_OFF
@ Device PIC12F675 , INTRC_OSC_NOCLKOUT
DEFINE OSC 4

CMCON = 7

ANSEL = 0
GPIO=0
TRISIO=0

SN      VAR BYTE 
SECOND  VAR BYTE
ESKISN  VAR BYTE
DAK     VAR BYTE
MINUTE  VAR BYTE
SAAT    VAR BYTE
HOUR    VAR BYTE
HAFGUN  VAR BYTE
WEEK    VAR BYTE
AYGUN   VAR BYTE
DAY     VAR BYTE   
AY      VAR BYTE
MONTH   VAR BYTE
YIL     VAR BYTE
YEAR    VAR BYTE
ACSAAT  VAR BYTE  'KAPIYI AÇMA SAATİ  0-23
ACSAAT1  VAR BYTE
ACDAK   VAR BYTE  'KAPIYI AÇMA DAKİKA 0-59
ACDAK1   VAR BYTE
ACSURE  VAR WORD  'KAPIYI AÇIK TUTMA SÜRESİ YANİMOTORUN ÇALIŞMA SÜRESİ
ACSURE1  VAR WORD
TEMP    VAR WORD 70
TEMP1    VAR WORD 74
SIMDI   VAR WORD 72
AKTIF   VAR BYTE 
ACIK    VAR BIT
SYMBOL ROLE=GPIO.0
SYMBOL SCL =GPIO.4
SYMBOL SDA =GPIO.5

PAUSE 250

READ 0,AKTIF
data @0,255
IF AKTIF=255 THEN  'İLK ÇALIŞTIRMADA ZAMAN DEĞERLERİNİ GİRERSEN SAAATI AYRLAYACAK SONRADAN UNUTMAYACAK ds1307 DE PİL OLURSA
 saat=20
 DAK=33
 SN=0
 AY=6
 AYGun=11    'AYIN KAÇI İSE BURAYA YAZILACAK
 YIL=16      'YIL 2016 NIN YALNIZCA 16 SI YAZILACAK
 GOSUB ZAMANYAZ
 AKTIF=1
 WRITE 0,AKTIF:pause 10   'AKTIF=1 İSE SAAT AYARLI DEMEKTİR BİR KERE AYARLANACAK
ENDIF
 
'Yeniden saat ayarı yapmak istersen Aşağıdaki satırları aktif et 
' SAAT=8
' DAK=0
' SN=0 
' AY=6
' AYGUN=11
' YIL=16
' GOSUB ZAMANYAZ
' AKTIF=1
' WRITE 0,AKTIF:pause 10 
ACIK=0
ACSAAT=20
ACDAK=34
ACSURE=60000 'ms CİNSİNDEN VERİLECEK  (5000ms=5 SN DİR )
TEMP=GUN ACSAAT ACSAAT*60+ACDAK
ACSAAT1=20
ACDAK1=51
ACSURE1=60000 'ms CİNSİNDEN VERİLECEK  (5000ms=5 SN DİR )
TEMP1=ACSAAT1*60+ACDAK1

BASLA:

      GOSUB ZAMANOKU
      SIMDI=GUN=SAAT*60+DAK
      IF SIMDI=TEMP THEN GOSUB ACTIR
      IF SIMDI=TEMP1 THEN GOSUB ACTIR1
      'IF SIMDI=TEMP2 THEN GOSUB ACTIR2
      IF DAK>ACDAK THEN ACIK=0
      PAUSE 200
      GOTO BASLA
      
ACTIR:

      IF ACIK=1 THEN RETURN
      ROLE=1
      PAUSE ACSURE
      pause ACSURE
      ROLE=0
      ACIK=1   
      RETURN         

 ACTIR1:

      IF ACIK=1 THEN RETURN
      ROLE=1
      PAUSE ACSURE1
      ROLE=0
      ACIK=1   
      RETURN   
      
      ACTIR2:

      IF ACIK=1 THEN RETURN
      ROLE=1
      PAUSE ACSURE
      ROLE=0
      ACIK=1   
      RETURN  



ZAMANOKU:
        I2CRead SDA,SCL,$D0,$00,[SECOND,MINUTE,HOUR,WEEK,DAY,MONTH,YEAR]',TEMP]                  
        sn =((SECOND>>4) & $0F)*10+(SECOND & $0F)
        IF SN=ESKISN THEN RETURN
        dak=((MINUTE>>4) & $0F)*10+(MINUTE & $0F)
        SAAT=((HOUR>>4) & $03)*10+(HOUR & $0F) 
        HAFGUN=((WEEK>>4) & $03)*10+(WEEK & $0F) 
        AYGUN=((DAY>>4) & $03)*10+(DAY & $0F)
        AY= ((MONTH>>4) & $01)*10+(MONTH & $0F)
        YIL= ((YEAR>>4) & $0F)*10+(YEAR & $0F)          
        ESKISN=SN    
        RETURN 
                      
ZAMANYAZ: 
        SECOND =(SN DIG 1)<<4+SN DIG 0
        MINUTE=(DAK DIG 1)<<4+DAK DIG 0
        HOUR=(SAAT DIG 1)<<4+SAAT DIG 0
        WEEK=(HAFGUN DIG 1)<<4+HAFGUN DIG 0        
        DAY=(AYGUN DIG 1)<<4+AYgun DIG 0
        MONTH = (AY DIG 1)<<4 + AY DIG 0
        YEAR =(YIL DIG 1)<<4+YIL DIG 0       
        I2CWrite SDA,SCL,$D0,$00,[SECOND,MINUTE,HOUR,WEEK,DAY,MONTH,YEAR,0]
        PAUSE 10
        RETURN 

Orijinal kodlar bu şekilde idi.

ete

#23
Yapılması gereken mantık olarak basit. Önceden yanlızca saat-dakika karşılaştırması yaparken şimdi işin içine gün karşılaştırması da eklemen gerekecek. Bu amaçla programında zaten var ola HAFGUN 'ü tespit edeceksin. Ayrıca karşılaştırmak amacı ile hangi günler açılacak onlarıda kayıtta tutman gerekiyor elbette.
SOnuç olarak önceden belirlenmiş ve Haftanın günü, saati, dakikası olarak kayıt altında tutulan açma saati ile mevcut RTC den okunan Hafgün, Saat, Dak değerleri kaşılaştırılıp eşitlik var ise kapı açılacak. Benzer şekilde kapatmada yapılacak ise aynı işlemler kapatma saati içinde tekrarlanmalı.

Elbette program bu hali ile bu işe pek uygun değil. Bu işleri yapacak bir programın menüsü olmalı va açma saati, dakikası ile haftanın günü (rakamsal değeri yeterli) kayda alınmalıdır.

SOnrasında gerisi karşılaştırmadan başka bşir şey değil.
IF HAFGUN=ACMA_GUN THEN
    IF SAAT=ACSAAT AND DAK=ACDAK AND SN=0 THEN KAPIYIAC
ENDIF
Şeklinde bir karşılaştırma yeterli olur.

Kapının açılacağı günler bit bazında da tutulabilir. RTC den okunan HAFGUN değeri 0 olduğunda pazar ise ve HAngi gün olursa olsun hep aynı saatte açılıp kapanıyor ise Açık olan GÜNLER için ACGUN=%0xxxxxxx şeklinde bir değişken tutulabilir. Örnek olarak bu değişkene %01001001 değeri verilirse anlamı şu olacaktır. Pazar açılacak, Pazartesi -Salı kapalı, Çarşamba açılacak,Perşembe-Cuma kapalı ve Cumartesi açılacak demektir.
Karşılaştırma ise ;
IF HAFGUN AND ACGUN=1 then
  Saat ve dak karşılaştır şeklinde yapılabilir.
Örnekle sağlama yapalım.  HAFGUN=%00000100 (Salı) olsun.
HAFGUN AND ACGUN = %00000100 AND %01001001=0 çıkacaktır. O halde kapalı olacak demektir.
HAFGUN=%00001000 AND %01001001=1 çıkacaktır Yani Çarşamba günü kapı açılacak demektir.

Benim düşündüğüm mantık bu şekilde.

Ete


blueboard

Ete hocam, anlattıklarınızı uygulamaya çalıştım. Bunda kısmi olarak başarılı oldum. Şöyle ki: Kodlara IF AYGUN=14  THEN GOSUB SART1 ifadesini eklediğimde RTC'den alınan ayın kaçıncı gününe göre istediğim gün ve saatte röleyi aktif edebiliyorum. Eklediğim örnekte ayın 14. gününde istenen saatte röle çekiyor. Ancak bu isteğimi tam karşılamıyor. Sizin de bir önceki mesajınızda belirttiğiniz üzere örneğin haftanın günü Salı olduğunda istediğim saatte röleyi çektirmek istiyorum. Sizin verdiğiniz ipucuna göre  IF HAFGUN & ACGUN=%00000100 THEN  ROLE2=1 yazdığımda ( burada istenen saatini gelmesini beklememek için direkt olarak şart sağlanıyorsa ROLE2=1 olsun yazdım) ROLE2 aktif olmuyor. Sanırım programda ZAMANOKU döngüsünde  "HAFGUN=((WEEK>>4) & $03)*10+(WEEK & $0F)" kısmından haftanın gününü doğru olarak almıyorum. Bu kısımda yardımcı olabilir misiniz. Devre şemasını ve kodlarımı ek olarak yükledim.

ete

#25
Çalışan program ilişikte,
Öncelikle ACGUN isimli değişkenimiz Byte cinsinden olmalı. Bu değişken açılacak günleri bit bazında temsil edecek. Bit1-Bit7 arası toplam 7 bit günlere tekabül ediyor ve byte1=pazar'ı işaret ediyor ve Bit7 ise Cumartesini gösteriyor. Bu günlerin hangisinde açık olacak ise karşılık gelen bit 1 yapılacak.
Haftanın gününden yararlanarak bir TEMP değişkeninin bitlerini haftanın gününe göre set etmek gerekti. Bunuda TEMP=DCD (HAFGUN+1) komutu yerine getiriyor.

Sİmulasyonda röle 12V olduğundan röle bacağına 12V verdim. Böylece röleninde çalıştığını görebiliyorum.
Ben yaptığım ilave ile rölenin çekmesini sağladım. Röleyi kapatacak komutları senin eklemen lazım ne zaman kapanacak bilemiyorum.

Ete

blueboard


ete

Haftanın günü karşılaştırmasında ufak bir hata varmış.
TEMP=DCD (HAFGUN+1)
şeklinde olan satırı
TEMP=DCD (HAFGUN)
şeklinde düzelttim. Doğrusu bu. Önceki mesajımda programı verdiğim yere yenisini yükleyip eskisini kaldırdım. Oradan tekrar yükleyebilirsin.
DCD komutu (DCD X) formatında X in alacağı 0-7 değerine karşılık gelen biti set eder. Bu komutu
TEMP=DCD HAFGUN şeklinde kullandığımız zaman ilk bit olan Bit-0 ı biz kullanmadığımız için işimize yarıyor. Zira RTC de haftanın günü 1-7 arası rakamla belirleniyor. Böylece Haftanın günü 1 yani Pazar olduğunda TEMP=(DCD HAFGUN)=%00000010 değerini alıyor. Hafgun=2 olduğunda ise TEMP=%00000100 değerini alıyor. Hafgun=7 olduğunda ise TEMP=10000000 oluyorki bu tamda bizim aradığımız şey olmuş oluyor. Böylece ikisini ACGUN ile AND lediğimiz zaman sonuç TEMP e eşit ise o gün açılacak anlamına geliyor ve röle çektiriliyor.

Ete

blueboard

#28
Ete Hocam, maalesef yine yardımınıza ihtiyacım var. Bir önceki mesajınızda yapmış olduğunuz açıklamalar doğrultusunda kodları tekrar yazdım. Başlangıçta rölelerin açılma ve kapanma zamanlarını proteus'ta tek tek denedim.Sorunsuz çalıştılar. Daha sonra farklı günlerde ve farklı zamanlarda açma kapama yapılacağı için

ACGUNSALI=%00001000   'SALI

ACGUNCARS=%00010000   'ÇARŞAMBA

ACGUNCTESI=%10000000  'CUMARTESİ

ACGUNPAZAR=%00000010  'PAZAR
şeklinde değişkenler belirledim. Bu aşamadan sonra nerede hata yaptığımı bilmiyorum, program çalışmaz oldu. Kodları ekliyorum. Yapmaya çalıştığım senaryoyu buradan da yazmak istiyorum;
Her Salı ve Cumartesi günü Saat 21.00'da ROLE1 aktif olacak
'Her Çarşamba ve Pazar gecesi Saat 02.00 'da ROLE1 kapanacak
'Her Çarşamba ve Pazar gecesi Saat 04.00'da ROLE 2 aktif olacak
'Her Çarşamba ve Pazar sabahı SAAT 08.00'da ROLE 2 kapanacak.
Yardımlarınızı rica ediyorum.

ete

Bu kadar basit bir senaryo için bir araba kod yazmanın hiç anlamı yok.

Saat ayarı verdiğin satır ile BASLA arasındaki bütün herşeyi sil. Hepsi gereksiz.

BASLA ve GOTO BASLA arasında da aşağıdaki satırlar olsun yeterli.
Dene bak çalıştığını göreceksin.

Ete

BASLA:
      GOSUB ZAMANOKU
      
      IF HAFGUN=3 OR HAFGUN=7 THEN   'SALI VE CUMARTESİ GÜNÜ   
        IF SAAT=>21 DAK=0 AND SN=0 AND ROLE1=0 THEN ROLE1=1  
      ENDIF
      
      IF HAFGUN=4 OR HAFGUN=1 THEN     'ÇARŞAMBA VE PAZAR GÜNÜ
          IF SAAT=>2 AND DAK=0 AND SN=0 AND ROLE1=1 THEN ROLE1=0
          IF SAAT=>4 AND SAAT<8 AND DAK=0 AND SN=0 THEN ROLE2=1
          IF SAAT=>8 AND DAK=0 AND SN=0 AND ROLE2=1 THEN ROLE2=0          
      ENDIF
      
      PAUSE 200
      GOTO BASLA

Powered by EzPortal