EV GÜVENLİK SİSTEMİ

Başlatan eprom_20, 08 Şubat 2017, 22:05:46

eprom_20

Hocam mrb,
güvenlik sistemini devreye aldıktan sonra diyelimki ac besleme kesildi bir müddet sonra geldi,bu arada sistem aküden besleniyor olacak sistem onu da ölçüyor,Akü değeride 10,5-10 v aralığında ihbar veriyor "AKÜ VOLYAJI DÜŞÜK" diye,
sorunum ac besleme ve akü değeri normale dönünce onu gösteremiyorum

KONTROL_ET:
FOR I=1 TO 5000
if M=1 AND DIS_PIR=1 then DIS_PIR1
if M=1 AND KAPI=1 then KAPI_ON
if M=1 AND PENCERE=1 then PEN_ON
if M=1 AND SABOTAJ=1 then SABO_ON
if M=1 AND GAZ_ALARM=1 then GAZ_KACAK
if PANIK=1 then PANIK_ON
GOSUB VOLT_KONT ' bu kodu ekledim ama voltaj normale dönünce geri dönüş yapmıyor
NEXT
goto KONTROL_ET


Kontrol kodu :

VOLT_KONT:
ADCIN 1,AC_DEGER
IF AC_DEGER=0 THEN
LCDOUT $fe,$96," AC VOLTAJ YOK "
ENDIF
ADCIN 0,ADC_DEGER
IF ADC_DEGER<700 THEN
LCDOUT $fe,$D4," AKU DUSUK VOLTAJ:",dec2 VOLT," "
PAUSE 200
ENDIF
RETURN


Sistem hakkında arkadaşlar fikir ve önerilerini yazarlarsa memnun olurum,PC bağlantısı,alarmı durdurma (şifreli kilit veya Rfıd vb) eklentileri daha yapılmadı

F®T

Demekki ac değer adc tarafından sıfır olarak ölçülemiyor.Sıfıra eşitse göster demişsin değilse zaten göstermezki.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

F®T

VOLT_KONT:
ADCIN 1,AC_DEGER
IF AC_DEGER=0 THEN
LCDOUT $fe,$96," AC VOLTAJ YOK "
ELSE
LCDOUT $fe,$96," AC VOLTAJ VAR "
ENDIF
ADCIN 0,ADC_DEGER
IF ADC_DEGER<700 THEN
LCDOUT $fe,$D4," AKU DUSUK VOLTAJ:",dec2 VOLT," "
ELSE
LCDOUT $fe,$D4," AKU NORML VOLTAJ:",dec2 VOLT," "
PAUSE 200
ENDIF
RETURN


Bunu bir denermisin.Enerji gidince olanı lcd ye yazdırıyorsun aksi durumunda olanı yazdırmamışsın o değerler o satırda kalıyor.Bu şekil olursa ac gelirse ve akü normale dönerse onlarda yazacak.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

eprom_20

Tşk,Hocam evet bu şekilde normal geri dönüyor;ancak benim istediğim ac veya dc voltajları normal sınırlarında iken ekranda herhangi birşey yazmaması,belirlenen sınırlar içinde ekranda yazmalı bende ona göre şart belirtmek istiyorum,telf ara haber et, ac kesik veya akü düşük diye onu beceremedim açıkçası,,yardımınız için tşk ederim

aRci

#4
merhaba

ete hocadan daha önce görmüş olduğum bir yöntem ile yapabilirsiniz. Kontrol de 4 ayrı drum var bunlar;
ac yok, ac var, akü düşük ve akü normal. Bu durumlara bir değer verip bir değişkene atarsanız ve sonra bu değeri önceden okunan değerle karşılaştırırsanız yeterli olacaktır.


Yeni var byte
Eski var byte

Yeni = 0
Eski = 200  'ilk çalışmada bildirim yapa bilmesi için
'buraya kadarı program başına eklenecek ve bir kere çalışacak

VOLT_KONT:
Yeni = 0
ADCIN 1,AC_DEGER
IF AC_DEGER=0 THEN
LCDOUT $fe,$96," AC VOLTAJ YOK "
ELSE
LCDOUT $fe,$96," AC VOLTAJ VAR "
Yeni = 1
ENDIF
ADCIN 0,ADC_DEGER
IF ADC_DEGER<700 THEN
LCDOUT $fe,$D4," AKU DUSUK VOLTAJ:",dec2 VOLT," "
Yeni = Yeni + 2
ELSE
LCDOUT $fe,$D4," AKU NORML VOLTAJ:",dec2 VOLT," "
Yeni = Yeni + 3
ENDIF
PAUSE 200
RETURN


return ile geri donuş yaptıtan sonra orneğin mesaj atacaksanız


if Eski <> Yeni then Gosub SMS
Eski = Yeni


gibi bir etikete gidip sms atabilirsiniz. ve işlem sonrası Eski değişkeni güncelleyerek mevcut durumda değişim oluncaya kadar tekrar mesaj atmayacaktır.

eprom_20

Tşk ederim arkadaşım bu fikriniz uygun deneyeceğim sağolun

eprom_20

şifreli kilit programında karşılaştırma konusunda sıkıntım var arkadaşlar,bir yerde eksiğim var ama çözemedim,şifreyi tuş takımından yanlış girsemde bazen kabul ediyor;
Birde
WRITE I,SAYI:PAUSE 10 satırını yazdığımda hata veriyor kaydedemiyorum,İşlemci 16F877A
Symbol not previously defined (Write) uyarısı alıyorum


SAYI     VAR word    ; sanal bilgi
SIFRE    VAR word   ; şifre bilgisi
I            var word      ; döngüler için
TUS       var WORD      ; basilan tus 

Symbol YATAY_A= PORTC.3
Symbol YATAY_B= PORTC.4
Symbol YATAY_C= PORTC.5
Symbol YATAY_D= PORTD.0
Symbol DIKEY_1= PORTC.0
Symbol DIKEY_2= PORTC.1
Symbol DIKEY_3= PORTC.2


BASLAT:
LCDOut $FE,1, " SIFRE GIRINIZ : "
PORTC =254
YATAY_A=0
If DIKEY_1=0THEN
Tus=1:GOSUB EKRAN
While DIKEY_1=0
Wend
Endif
If DIKEY_2=0 Then
Tus=2:GOSUB EKRAN
While DIKEY_2=0
Wend
Endif
If DIKEY_3=0 Then
Tus=3:GOSUB EKRAN
While DIKEY_3=0
Wend
Endif
High YATAY_A
YATAY_B=0
If DIKEY_1=0 Then
Tus=4:GOSUB EKRAN
While DIKEY_1=0
Wend
Endif
If DIKEY_2=0 Then
Tus=5:GOSUB EKRAN
While DIKEY_2=0
Wend
Endif
If DIKEY_3=0 Then
Tus=6:GOSUB EKRAN
While DIKEY_3=0
Wend
Endif
High YATAY_B
YATAY_C=0
If DIKEY_1=0 Then
Tus=7:GOSUB EKRAN
While DIKEY_1=0
Wend
Endif
If DIKEY_2=0 Then
Tus=8:GOSUB EKRAN
While DIKEY_2=0
Wend
Endif
If DIKEY_3=0 Then
Tus=9:GOSUB EKRAN
While DIKEY_3=0
Wend
Endif
High YATAY_C
YATAY_D=0
If DIKEY_1=0 Then
Tus=11:GOSUB EKRAN
While DIKEY_1=0
Wend
Endif
If DIKEY_2=0 Then
Tus=0:GOSUB EKRAN
While DIKEY_2=0
Wend
Endif
If DIKEY_3=0 Then
Tus=12:GOSUB EKRAN
While DIKEY_3=0
Wend
Endif
High YATAY_D
pause 100
Goto BASLAT

EKRAN:
SAYI[I]=TUS   ;basılan tuşları sanal değişkene kaydet
LCDOUT $FE,($C0+x),"*"'42 ; basılan tuşları * şeklinde göster
I=I+1
if I=>5 then Gosub KONTROL_EKRAN 
IF TUS=12 THEN        '.......Yani * Tuşu ise Komple Silme yaptır
   SAYI=0
   TUS=0
ENDIF
IF TUS=11 THEN         '.....Yani  # Tuşu ise tek hane sildir.
   SAYI=SAYI/10
   TUS=0
 
ENDIF
Return


bunlarda karşılaştırma ekranı:

KONTROL_EKRAN:
IF SIFRE[I]=255 THEN
SIFRE[I]=12345
ENDIF
'I=1
if SAYI[I]<>SIFRE[I] then
   I=0
   ELSE
   I=1
   ENDIF
'WRITE I,SAYI:PAUSE 10 ' Bu satır aktif olunca hata veriyor

if I=1  THEN         ; Karşılaştırma aynı ise
     
      LCDOut $FE, 1, "      GIRIS     "
      LCDOUT $FE,$C0,"    ONAYLANDI   "
      pause 1000      ; 1 sn bekle
      LCDOut $FE, 1, "   HOSGELDINIZ  "
      LCDOUT $FE,$C0,"                "
      pause 1500      ; 1.5 sn bekle ve
     GOSUB ALARM_KAPA
     GOTO BASLA
     I=0   
      ELSE     
      LCDOut $FE,1,  "  SIFRE YANLIS  "
      LCDOUT $FE,$C0," TEKRAR DENEYIN "
      pause 1500
      LCDOut $FE,1,  " SIFRE GIRINIZ: "
      LCDOUT $FE,$C0,"                "
     
ENDIF

return


ETE Hocamın komutlarıyla da denedim ondada başarılı olamadım;yardımcı olursanız sevinirim,,,Selametle

SAYI=SAYI*10+TUS  şeklinde bir komut koyarım.
Program tuş kontrolünden döndükten sonra basılan tuşu ekrana yazdırmak için,
LCDOUT $FE,$C0,#SAYI,"  "

BASLA:
GOSUB BASLAT
SAYI=SAYI*10+TUS
LCDOUT $FE,$C0,#SAYI
PAUSE 200
GOTO BASLA

ete

Bütün program bu ise eksikler var demektir. Aradan bazı şeyleri çıkardığını anlıyorum yoksa parçalı program vereceğine hepsini bir arada vermen daha doğru olurdu.
Bakıyorum herhangi bir TRIS ayarlaması görünmüyor. Çıkardığın kısımdamıdır.?

İkinci kusur programda bir açılış gecikmesi gözükmüyor.
Değişken tanımlamasından sonra LCDOUT $FE,1 komutu verilmeli bu komut LCD yi açılışa hazırlar ve bu komuttan sonra en azından 200 ms gecikme koyulmalıdır. Pic registerlerinin hazırlanmasınıda düşünürsek oraya PAUSE 500 eklemek uygun olacaktır.
İşe başlamadan önce I ve SAYI değişkenlerini sıfırlamalısın. BASLA satırından önce bu işi yap ve oraya I=0:SAYI=0 komutlarını ekle.
Tuş tarama sonunda yer alan Pause 100 komutu tuş kontrolünü zorlaştırır. Bu işlem hızlı yapılmalıdır. Herhangi bir gecikme gerekmez orada onu kaldır.
Programda Dizi değişkeni (INDEX ile kullanılan değişken) tanımlamış olmamana rağmen kullanmaya çalışıyorsun.
SAYI[I] şeklinde bir dizi değişkeni kullanabilmen için önce onu tanımlaman gerekiyor. SAYI VAR BYTE[5] şeklinde bir tanımlama SAYI  isimli 5 boyutlu (0-4 arası kullanılır) bir değişken tanımlar. Bu değişkenler sırası ile SAYI[0], SAYI[1]...SAYI[4] şeklinde sıralanır ve aynı isim altında elinde 5 adet değişken olmuş olur. Yalnızca köşeli parantez içindeki değeri değiştirerek istediğin değişkene ulaşabilirsin. Bu bilgiyi verdim öğrenesin diye yoksa programda index değişkeni kullanmana gerek yok. Programın başında SAYI Byte WORD diye tanımlanmış değişken sana yeterli. Yeterli derken değişken değeri yada girilen şifre değeri 65535 den büyük olmamalıdır. Çünki Word değişkenleri maksimum 65535 değerini alabilirler.

Basılan tuslar 0-12 arası olacağına göre ve senin karşılaştıracağın tuşlar ise 0-9 aralığında olacağına göre senin kayda alman gereken tuş değerleri basılan tuş 10 dan küçük ise kayıt edilmeli. Sen TUS son değeri ne ise sürekli onu kayda alıyorsun halbuki orada biraz seçim yapman gerekiyor. Kısaca tus=12 isede kayda alıyorsun  (SAYI[I]=TUS komutu ile).  Aslında kayda alamıyorsun . Bu nedenle oradaki sistemi SAYI=SAYI*10+TUS şeklinde değiştirmek gerekiyor. Aşağıda nasıl olacağını gösterdim.
Ekran etiketi altındakiler şöyle olmalı;
EKRAN:
         IF TUS=12 THEN        '.......Yani * Tuşu ise Komple Silme yaptır
           SAYI=0
           TUS=0
           I=0
           SAYI=0
           RETURN
         ENDIF
         
         IF TUS=11 THEN         '.....Yani  # Tuşu ise tek hane sildir.
           SAYI=SAYI/10
           TUS=0
           IF I>0 THEN I=I-1
           RETURN 
         ENDIF 
         SAYI=SAYI*10+TUS ;basılan tuşları sanal değişkene kaydet             
         LCDOUT $FE,($C0+x),"*"'42 ; basılan tuşları * şeklinde göster
         I=I+1
         if I=>5 then Gosub KONTROL_EKRAN 
         Return

Böylece Önce 9 dan büyük tuş değerlerine göre yapılacak işleri yapıp onları atlıyoruz. Sonra tuş kaydına geçiyoruz

İşin karşılaştırma kısmı ise şöyle olmalı;
KONTROL_EKRAN:
    IF SIFRE=65535 THEN
       SIFRE=12345
    ENDIF

    IF SIFRE=SAYI THEN ONAY 'girilen şifreye eşit ise onay kısmına git değilse alta geçecek zaten

      LCDOut $FE,1,  "  SIFRE YANLIS  "
      LCDOUT $FE,$C0," TEKRAR DENEYIN "
      pause 1500
      LCDOut $FE,1,  " SIFRE GIRINIZ: "
      LCDOUT $FE,$C0,"                "
      SAYI=0:I=0
      RETURN

ONAY:     
      LCDOut $FE, 1, "      GIRIS     "
      LCDOUT $FE,$C0,"    ONAYLANDI   "
      pause 1000      ; 1 sn bekle
      LCDOut $FE, 1, "   HOSGELDINIZ  "
      LCDOUT $FE,$C0,"                "
      WRITE $10,SAYI.byte1,SAYI.BYTE0:PAUSE 10 ' Bu satır aktif olunca hata veriyor idi şimdi vermez. Yazme yeride burası olmalı     
      I=0:SAYI=0
      pause 1500      ; 1.5 sn bekle ve
      GOSUB ALARM_KAPA
      RETURN  'GOSUB ile GELDİN GOTO BASLA ile çıkamazsın buradan

Pic dahili eprom 8 bitlik hafıza guruplarından oluşur. 8 bitlik yere 16 bitlik değeri sığdıramıyacağına göre onu 2 parçaya ayırıp kayıt etmen gerekiyor. WRITE komutundaki hata bundan kaynaklanıyor. SYI değişkenin word tipinde. Yukarıda nasıl olması gerektiğini gösterdim.

Kullandığın sistemde iki önemli faktör var birisi SAYI değişkeni diğeride I index değişkeni. Index burada hane sayısını saymak için kullanılacak sadece. Bunların yeri geldiğinde sıfıranmaları gerek. Ben gerekli yerlerde sıfırlamayı yaptım.
Şimdi dene bakalım olacakmı?

Ete


eprom_20

Hocam yardımınız için teşekkür ederim;
dediklerinizi yaptım hocam fakat şifre karşılaştırma kısmında yine başaramadım,
word SAYI değişkenini kontol etiketinde
IF SIFRE=65535 THEN
       SIFRE=12345
    ENDIF
göstermeme rağmen şifreyi kabul etmiyor,bir de hocam TUS=11....TUS=12....ye verdiğimiz silme komutlarını kullanınca silme değil ekranda donma yapıyor benim proteusa has bir durum mu emin değilim lakin şifreyi girip açtıramadım bir türlü,program diğer komutları tam işliyor (alarm,menü,pic to pc gibi)
ekledim dosyaları hocam yardımcı olursanız sevinirim,,Selametle

aRci

suan sabit "12345" sifresine göre calışıyor. birkaç şey ekledim ve lcd de ğişiklik yaptım.

ete

Programda biraz ipin ucu kaçmış gibi gözüküyor. Şu anda şifre işini bende düzelttim.
Sorun sayı değişkeninin uygun bir yerde sıfırlanmaması ve SIFRE ilk değerininde yanlış değerlendirilmesinde.
Program değişkenleri açılışta garantili olmamakla birlikte sıfırlanırlar. Dolayısıyla Sifre değerin başlangıçta sıfırdır. Epromdan bir değer okuysaydınki bana göre öyle olması gerekiyordu (öylede yaptım) o zaman şifre değerin 65535 olacaktı. Çünki kayıt verilmemiş eprom değerleri $FF değerindenir 2i adet eprom ise $FFFF olur buda 65535 dir desimal olarak.
Bu düzeltmeleri yaptıktan sonra programı çalıştırdım onay veriliyor ama program sürekli Sifre girin işleminden kurtulmuyor.
Biraz takip yaptım. Şifre girişe ulaşmak için;
- MENU tuşuna basıyorsun GOTO AYAR_MENUSU NE GİDİYOR (goto İLE)
- Orada GOSUB durum ile DURUM etiketine gidiyor  (Dikkat GOSUB ile)*********** G1
- Durum etiketinden Goto AkTIF ile AKtif etiketine
- AKtif etiketinden sonra GOTO GERISAY ile GERISAY a
- Oradan ALA_AC etiketine GOTO ile gidiyor.
- Oradan GOTO ile KONTROL_ET etiketine
- Oradan GOTO KACAK etiketine
- Oradan GOSUB ile ALARM_AC etiketine (Dikkat GOSUB ile)******************* G2
- Oradan GOTO BASLAT ile BASLAT etiketine
- Oradan GOSUB EKRAN ile EKRAN etiketine (Dikkat GOSUB ile)**************** G3
- Oradan GOTO KONTROL_EKRAN a
- Oradan GOSUB ALARM_KAPA ya (Dikkat GOSUB ile)************************ G4
- Alarm kapa dan RETURN görerek  G4 e dönüyor yani KONTROL_EKRAN a
- Kontrol_Ekran dan Onay alarak G3'e yani BASLAT etiketine geri dönüyor
- BASLAT etiketinden G2 ye dönmesi gerek yani KACAK etiketine
- Oradan da G1 e yani Ayar Menüsüne dönmesi gerek.
Buradan da GOTO ile AYARLANDI etketine gitmesi gerek diye düşündüm.
Bütünbu sıralama aslında doğru çalışmıyor. Çalışması için ALRM_ONAY diye bir bayrak kullandım ve bütün o geri dönüşleri,
gerekli yerlere ve öncelik sırasına dikkat ederek IF ALRM_ONAY=1 THEN RETURN komut satırını ekleyerek sağladım.
Şu anda program BASLA satırına kadar geri dönüyor. Orada sabit kaldı daha fazla uğraşamadım.
Program ilişiktedir.
Program yazılırken şu hususlara çok dikkat edilmeli,
Kesme olan programda ara yerlerde kesinlikle Pause kullanılmamalı. Aksi halde program kesme emri geldiği zaman sağlıklı bir şekilde anında kesme etiketine atlayamaz. Pause süresi biter ondan sonra kesmeye gider. Veri alma işinde ise zamanlama çok önemlidir. Veri gelmiş sen pasue 500 desin 500 ms sonra gelen veriye bakıyorsun ama veri çoktan verilmişde bitmiş oluyor.
Pause ler yerine Döngüsel gecikmeler kullanılabilir. Döngü içine de Pauseus 2-5 arası bir değer konularak çok gecikme yaratılır.
Diğer bir konu ise nereye GOTO ile nereye GOSUB ile gidileceğine çok dikkat etmek gerekiyor.
GOSUB ile gidilmiş bir yerden dönüşler mutlaka RETURN ile olması gerekir. Yoksa program stack hatası verir ve kilitlenir bir yerde.

Ete


efehurkan

Hocam bu kumandalı alarm sistemini yaptım fakat kumanda ile alarmı açtığımda röle hemen aktif oluyor, pır ve kapının açılmasını beklemeden.



@ __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _MCLRE_OFF & _LVP_OFF & _CP_OFF & _BOREN_OFF & _PWRTE_OFF
DEFINE OSC 4
CMCON=7

TrisA=%01001111
TrisB=%10000001

PortA=0
PortB=0

Tel var PortA.4
Role var PortB.4
Led var PortB.3
PIR var PortB.7
Kap var PortA.6
Buzer var PortB.1
VT var PortB.0
D0 var PortA.0
D1 var PortA.1
D2 var PortA.2
D3 var PortA.3

i var byte
j var word
k var word
Bekleme Var Word
Sayac var word
Alarm var bit
Okunan var byte

Alarm=0
Bekleme=120 'Saniye /Kapı Kapatılsa Veya Sensör Hareket Algılamasa Bile Alarmın Çalma Süresi
Sayac=0
'*******************************************************************************
for i=0 to 59 'PIR Sensörü Isınana Kadar Bekle
    pause 1000
next
'*******************************************************************************
read 1,Okunan 'Elektrik Kesilip Geri Gelirse Kaldığın Yerden Devam Et
if Okunan=1 then
    Alarm=1
    high led
else
    Alarm=0
    low led
endif
'*******************************************************************************
high buzer 'Sistemin Devrede Olduğunu Ses Çıkararak Bildir
pause 100
low buzer
'*******************************************************************************
Basla:
    gosub Kumanda_Oku
   
    if Alarm=1 then
        Sayac=0
        Gosub Kontrol   
    else
        low tel
        low role
        Sayac=0
    endif   
goto Basla
'*******************************************************************************   
Kontrol:
    if PIR=1 or Kap=0 then
        gosub Kumanda_OKU
        high role
        high tel
    else
        while Sayac<=Bekleme*10 and Alarm=1
            gosub Kumanda_Oku
            pause 100
            Sayac=Sayac+1
            goto Kontrol
        wend
        low role
    endif
return
'*******************************************************************************
Kumanda_Oku:
    if Vt=1 then
   
        if D0=1 and D1=1 and D2=1 and D3=1 then toggle AlarM
   
        if Alarm=1 then
            Gosub Alarm_Ac
        else
            gosub Alarm_Kapat
        endif
   
    endif
return
'*******************************************************************************
Alarm_Ac:
    high led
    high Buzer
    pause 800
    low Buzer
    write 1,1
return
'*******************************************************************************
Alarm_Kapat:
    for i=0 to 2
        low led
        high buzer
        pause 100
        low buzer
        pause 100
    next
    write 1,0
return
'*******************************************************************************   
End

ete

Ne yapacak peki. Programda pır=1 ise röleyi çek demiş. Sen neye göre yaptın devreyi?
Nerden aldın ise onlara danış yada sor bence neden olduğunu.
Ete

eprom_20

Teşekkür ederim ETE hocam uyarılarınız doğrultusunda programı düzenleyeceğim emeklerinize sağlık,,,

Powered by EzPortal