Dimmer ve lamba sönme problemi

Başlatan aRci, 12 Şubat 2026, 23:05:13

aRci

Merhaba kümesimde gün süresini uzatmak için dimmer lamba yaptım resimde görülen devre ve zero cross ile lambayı çalıştırmaktayım. hava kararınca lambanın parlaklığı 10 dakika boyunca yavaş şekilde arttırıp gece bir kaç saat sonra ise yavaş şekilde lamba karartıyorum.

lamba olarak halojen ve akkor lamba kullandım. 40-60w güçlerinde idi. iki lambada belli belirsiz sürelerde söndü. Köyde elektrik şebekesinde voltaj dalagalanması oluyor. Bu dalgalanmalar bazen anlık bazen birkaç saniye sürüyor. Bundan dolayı lambalar söner mi.

Devrede snubber kullanmadım aslında resistans kontrol ediyorum devre ile ancak lambanın da omik yük olmasından gerek duymadım. Resistans hakkında problem yaşamadım. devre lamba sönmesine sebep olur mu.



Not: Geçen sene OMRON marka 5v ssr röle ile de aynı problemleri yaşadım.
Şebeke kaynaklı olduğunu düşünüyorum bunun için yapabileceğim bir şey var mı?
Omron röle
https://www.direnc.net/12v-omron-12vdcout-240v-ac-2a-solid-state-relay



ete

Bu konu hakkına sesli düşünmek lazım.
Şebeke ne yaparda senin yan diye emir verdiğin bir lambayı söndürebilir?
Bu soruyu sorarken lambayı yavaş yavaş yakıp ileriki saatlerde yavaş yavaş kararttığını göz önüne alarak devrede bir işlemci kullandığını varsayıyorum.

Şimdi sorunun olası cevaplarına bakalım. İşlemci öncelikle yavaş yavaşda olsa yan emrini (Triac=1) vermiş ise lambanın yanmasını sürdürmesi gerekir. Söz konusu olan bir dimmer ise öncelikle sıfır noktası tespit edilip hemen ardından toplamda 9000-9500 us lik gecikme ile lambaya yan emri verilmesi gerekiyor. Süre ne kadar kısa olursa lamba o kadar parlak yanacak.
Burada triac'a verlien emrin en azından 100us süre ile verilmesi gerekiyorki triac tetiklenip yanabilsin. Bazı triaclar 5us süren emir ile de yanabiliyor ama bir müddet sonra devreyi kestiklerini gördüm. Yan emri düzenli geliyormu bakmak lazım. Bu olay her gün meydana geliyor ise sebebi şebekede aramak bence yanlış olur. Ancak şebeke tamamen kesilince ne olur ona bakalım. Program da yarıda kesilir. İşlemci kapanır ve şayet verilen emir bir yerlerde kayıtlı değil ise, yada süre denilen şey pil ile beslenen bir RTC nin tuttuğu zamana bağlı bir elemandan geliyor ise o programın yapacağı iş yarıda kalıp lamba sönecektir. Burada programdaki yanma emrinin nasıl ve neya bağlı olarak verildiğini bilmek lazım. Muhtemelen hava kararınca bu emir geldiğine göre sistemin bir şekilde havanın karardığını bilmesi gerekiyor. Nasıl bilecek ya bir RTC ye bağlı zaman tutarak bunu bilecek yada bir fotosel yada LDR kullanarak havanın karardığını bilecek. Bunlar olur ise şebeke kesilip geri geldiğinde sistem yeniden kaldığı yerden çalışmasını sürdürebilir. Değilse şaşırıp kalır.
Bunu anlamak için ben olsam işlemci tarafını en azından bir batarya gurubu ile bir geceklik de olsa çalıştırıp kesilme yaşanıyormu gözlemlerdim.

Ete
 

aRci

#2
     Cevap için teşekkürler aslında açıklamam eksik kalmış yaşadığım problem lambanın çalışamaz hale gelmesi sönmeden kastım lambanın patlamış olmasıdır. Konuyu  açıklarken bu detayı doğru aktaramamışım kusura bakmayın.

     Devre üzerinde Pic16f886,Lcd,ds3231, 3 Buton, buzzer ve Ldr var. yazılım içi beklemeler zerocross a bağlı döngülerle sağlanıyor. Program içerisinde sadece bir adet pauseus komutu var oda triakı tetiklerken kullanıyorum. Deneyerek min ve max dimmer çıkışlarına göre 0-16000  (Pic 8Mhz Dahili osilatörle çalışıyor) arası dimmer değerini kullanıyorum. Hesaplanan bu değer pid_out atlı değişkende tutuluyor. bu değeri timer a aktarırken 65535 den farkını alarak Dimmer adlı değişkende tutuyorum ve gecikme zamanını timer a yüklüyorum.
    Dimmer değeri max parlaklığıa yaklaştıkca yani 65035 ve üzeri olduğunda timer iptal edilip triak tetik ucunu sürekli çalıştırır hale getiriyorum. Diğer yandan tam tersi olarak dimmer değeri en yüksek değere yaklaştığında ise timer kapatılıp çıkış tetiklemesi yapılmıyor. devre lambayı max çıkışla açık tutarken triak ı sürekli açık tutması bu probleme sebep olurmu.
    Devre beslemesi trafolı besleme devresi
   
   

DISABLE
TmrSay var byte
KESME:
GIE = 0        
         
         if INT0IF = 1 then
             ttt = portb     
             RBIF = 0
             INT0IF = 0 
             if Dimmer > 65035 then 
                 High Portb.1
             else
                 if pid_out >= 500 then
                     TMR1L = Dimmer.lowbyte
                     TMR1H = Dimmer.highbyte 
                     TmrFl = 0
                     TmrOn = 1
                 endif
                 low portb.1
             endif
             Ekran = Ekran + 1
             RBmesgul = RBmesgul + 1
             KsmSay = KsmSay + 1
             if SayMod != 0 then SayMod = SayMod - 1
             if KsmSay > 99 then 
                 KsmSay = 0:MtrSay = MtrSay + 1
                 SistemZaman = SistemZaman + 1
                 LoraSay = LoraSay + 1
             endif
             goto gec
         endif
         
         if TmrFl = 1 then
             TmrOn = 0
             TmrFl = 0
             High portb.1
             pauseus 50
             low portb.1
         endif
Gec:
GIE = 1
RESUME
ENABLE

ete


Yaptığın yeni açıklamaya bakarak bu sorunu yaratabilecek iki şey olabilir diye düşünüyorum. Birincisi çok sık yapılan lambanın açılıp kapanması işlemi.
İkincisi ise şebeke kesilme , bakım vs çalışmalarından sonra abonelere trifaze voltaj verilmesi. Çok sık yaşanmasa da bunun yaşandığını iki defa gözlemledim.
O lamba 220V için tasarlanmış ve ona 380 V verirsen elbette lamba patlayacaktır.

Akkor lambaların içinde yer alan Tungsten tel yada rezistans ömrü lambanın kaç defa aç-kapa işlemine maruz kaldığı ile ters orantılıdır. Çok aç kapa az ömür az aç-kapa çok ömür şeklinde değerlendirmek gerekir.
Şayet bu lamba çok fazla aç kapaya maruz kalıyor ise kısa sürede rezistans kopmasına maruz kalacağı aşikardır. Bu sık aç kapayı yazılım yapıyor ise elbette yazılım bu işte baş suçlu olabilir. Zira lambaya voltaj verildiğinde tungsten tel ısınır ve uzar ve buna bağlı olarak zaman zaman gözle görülecek kadar uzar. Voltaj kesildiğine ani soğuma yaşanır ve tel büzüşür ve gerilir.
Bu işlem telin bir müddet sonra kopmasına sebep olur. Bu olayıda pek çok kere gözlemlemişliğim vardır.

Bunun haricinde triac sürekli iletimde bırakılsa bile sıfır geçiş noktalarından otomatikman kesime gider. Ama yazılımdan tekrar aktif ol emrini alınca iletime geçer. İletimde iken triac=0 yapsanız bile iletimde kalır ve ancak sıfır geçiş noktasında kesime gider. Bu nedenle triac bu işte suçlu olamaz.
Bu kadar açıklama sonrasında umarım kafanda birşeyler oluşur da sorunu tespit edersin. Zira daha fazla yardımcı olabileceğim bir konu yok maalesef.
Bir tespit yaparsanda sorunun kaynağını burada görmek isteriz.

Ete

aRci

Resistans kullanırken göremediğim elektrik dalgalanmasını lamba takınca fark etmiştim. Aslında lamba yazılımdaki lcd yazma ve rtc okumasında anlık olarak geçikmeler oluyor ve buda traik ın tetikleme zamanında gecikmelre sebep oluyor özellikle alt ve üst limitlere yaklaştıkca daha belirgin oluyor. bu sebeple dimmer alt üst değere 500 den az bir değer kalınca timer iptal edip sürekli açma yada kapatma sinyali veriyorum. ek olrak lcd ekran ve rtc de işlem yapmadan önce bir zerocross kesmesi bekleyip ardından okuma ve yazmayı yapıyorum bu lambadaki kırpmaları büyük ölçüde azalttı. Genede tam olarak engelleyemedim. lambayı izlediğimde anlık karartı oluyor belli belirsiz zamanda. Musait zamanda değerlendirme için kodu paylaşıyorum.

    Belkide asıl sorunum şuda olabilir. Tavukların lambaya vurma ihtimalini düşünmeliyim. Geçen yaz bu devreyi ve temelde bu programı hem kuluçka makinasında hemde ana kucağında kullandım. Sadece ana kucağında bu problemi yaşadım. Bir keresinde yağmurlu günde elektrikler kesildi. 1 dakika sonra geldiğinde lamba patlamıştı lambayı kontrol ettiğim triak da gövdesinde çatlak oluştu. sonraki zamanda enerji kesintisi olmadığı halde 40W halojen lambalarım patlıyordu ve bazen de lambaları kontrol ettiğim OMRON ssr de bozulup kısa devreye geçiyordu.

   tavuk civciv ve bıldırcın civcivi için yaptığım ana kucaklarında kullandım. Tabi ozaman lambayı ısıtıcı olarak kullandım. O zaman lamba sönme problemlerimden bahsettiğimde civcivlerin zamanla lambaya ulaşacak boya geldiklerinde gagalarıyla vurduğunu ve bundan sönmüş olacağını tarif etmişlerdi. Bu duruma engel olmak için Kümesimde Lambayı yerden 2 metre den fazla yukarı monte ettim. tavukların kumes içinde lambaya çarpma ihtimali de buna sebep oluyor olabilir fakat bunu hiç görmedim. lambayı koruyacak bir muhafaza bakacağım.
'****************************************************************
'*  Name    : KumesLamba.BAS                                    *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2025 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                              *
'*  Date    : 20.12.2025                                        *
'*  Version : 1.0                                              *
'*  Notes  : 16F886                                            *
'*          :                                                  *
'****************************************************************
asm
 __CONFIG    _CONFIG1, _INTOSCIO & _WDT_OFF & _PWRTE_OFF & _MCLRE_ON & _CP_ON & _CPD_ON & _BOR_OFF & _IESO_OFF & _FCMEN_OFF & _LVP_OFF & _DEBUG_OFF 
 __CONFIG    _CONFIG2, _BOR21V 
endasm 
    OSCCON = %01110001      '8 mhz internal clock
    define OSC 8
    clear
    option_reg = %01000000
    CM1CON0 = 0
    CM2CON0 = 0
    ANSEL = 3
    ANSELH = 0
    INTCON= %01010000
    T1CON = 0
    PIE1.0 = 1
    Symbol TmrFl    = PIR1.0
    Symbol TmrOn    = T1CON.0
    pause 300
    while OSCCON.2= 0:wend
    
    Symbol RCIE      = PIE1.5      'EUSART alma kesmesi              
    Symbol RCIF      = PIR1.5      'EUsart Kesme Bayrağı            
    'Symbol RCIP      = IPR1.5      'EUsart ALma Kesintisi Öncelik    
    Symbol SPEN      = RCSTA.7    'Seri Bağlantı Noktası Etkin = 1
    Symbol CREN      = RCSTA.4    'Sürekli veri alma etkin = 1
    Symbol OERR      = RCSTA.1    'Sürekli veri alma etkin = 1
    Symbol FERR      = RCSTA.2 
    
    Symbol GIE      = INTCON.7    'genel kesmeler aktif  
    Symbol INT0      = INTCON.4    'RB0 Kesme Etkinleştir
    Symbol RBIE      = INTCON.3    'RB Değişim Kesme 
    Symbol TMR0IF    = INTCON.2    'TMR0 Taşma Bayrağı Ouyarak Sıfırlanmalı
    Symbol INT0IF    = INTCON.1    'INT0 harici Kesme Bayrağı Okutarak Sıfırla
    Symbol RBIF      = INTCON.0    'RB7-4 harici Kesme Bayrağı Okutarak Sıfırla
    ON INTERRUPT GoTo KESME  'kesme oluşursa KESME adlı etikete git.
    
    DEFINE ADC_BITS 10    ' ADCIN resolution  (Bits)
    DEFINE ADC_CLOCK 5    ' ADC clock source  (Fosc/16)
    DEFINE ADC_SAMPLEUS 11 ' ADC sampling time (uSec)

    porta = %11110111
    portb = 1 
    portc = 0
    
    TrisA = 3
    TrisB = %11111101 
    TrisC = %10000000 
    IOCB  = %00000000
    WPUB  = %01111101 
    pause 500
    gosub LcdBasla
    
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
DEFINE HSER_SPBRG 51  ' 9600 Baud @ 8MHz, 0,16%
SPBRGH = 0
BAUDCTL.3 = 1        ' Enable 16 bit baudrate generator

'RCSTA = $90  ' Enable serial port & continuous receive
'TXSTA = $24  ' Enable transmit, BRGH = 1
'SPBRG = 64    ' 9600 Baud @ 32MHz, 0,04%
'SPBRGH = 3
'BAUDCTL.3 = 1 ' Enable 16 bit baudrate generator

'===============================================================================
'===============================================================================    
    AY              var byte
    YIL              var byte
    SN              VAR BYTE
    DAK              VAR BYTE
    SAAT            VAR BYTE
    GUN              VAR BYTE
    HGUN            VAR BYTE
    HAFTA            VAR BYTE
    'Temp            var byte
    MEM              var byte
    OncekiDk        var byte
    DS_Adr          VAR BYTE : DS_Adr = %11010000
    ZAMAN_REG        VAR BYTE : ZAMAN_REG= $00
    Rtci            var byte
    ZAMAN            var byte[7]
    'TempRegister    var byte    ' variable to hold DS3231 register address to read/write      
    RtcDerece        var byte            ' Variable for temperature integer from register 11h
    RtcOndalik      var byte          ' Variable for temperature fraction for register 12h 
    Ds1              var byte
    RtcWrd          var word
    RtcSay          var byte
'===============================================================================
'===============================================================================
    Say              var word
    f                var word
    ttt              var byte
    T                var byte
    KsmSay          var byte
    MtrSay          var word
    AlrSay          var word
    Yuzde            var word
    Menu            var byte
    BtSay            var word
    SayMod          var word
    Deger            var word
    temp            var byte
    SKlb            var word
    NKlb            var word

    MinMax          var word
    MinDrc          var word
    MaxDrc          var word
    MinMaxSay        var word
                    
    Nem              var word
    Drce            var word
    DrcTemp          var word
    NemTemp          var word
    CnfTemp          var byte
    SnsTemp          var byte
    HdrSay          var word
    HdcTemp          var byte
    AcOff            var word
    HdcKont          var word
    HEAT            var HdcKont.13
    pause 500
'===============================================================================
'===============================================================================
    Symbol DIO      = PortA.0
    Symbol CLK      = PortA.1
    Symbol Thl      = PortA.2
    Symbol Bzr      = PortA.3
    Symbol Rl1      = PortA.4  'RL1
    Symbol Rl2      = PortA.5  'RL2
    SymBOL Rl4      = PortA.6
    SymBOL Rl3      = PortA.7
    
    Symbol SDA      = PortB.2
    Symbol SCL      = PortB.3
    Symbol Ykr      = Portb.4  'B1
    Symbol Asg      = Portb.5  'B2
    Symbol Mnu      = Portb.6  'B3
'===============================================================================
'===============================================================================
    RBmesgul        var bit
    Rbtemp          var bit
    Dimmer          var word 
    Setpoint        VAR WORD
    NemSet          var word
    NemHst          var word                

    ekran            var word
    EkrMod          var byte
    DimHedef        var word
    PidOn            var word
    DmmOn            var bit
    Direction        var bit 
    
    Tmp              var byte
    Tmp1            var byte
    UartSay          var byte
    SistemZaman      var word
    SistemOnc        var word
    TmpW1            var word
    TmpW2            var word
    CvrSureOff      var word
    CvrSureOn        var word
    
    Lamba1          var byte
    Lamba2          var byte
  
    AngTmp var byte
    Kabin1 var word
    Kabin2 var word
    OrtDeger var word
    Hamdeger var word
    symbol ADONE = Adcon0.0
    symbol GODONE = Adcon0.1
    ADCON1 = 128

    DrcHst      var word
    SetKabin1  var word
    SetKabin2  var word
    Carpan1    var word
    Carpan2    var word
    SureSay1    var word
    SureSay2    var word
    LDRSet      var word
    
'===============================================================================
'===============================================================================
    pause 500
    lcdout  $fe,1, " RG AnaKucagi  "
    Lcdout $fe,$c0," 0541 560 47 60"
    f = portb
    RBIF=0
    INT0IF = 0 
    GIE = 1

    pause 500
    gosub VeriGnc
    gosub Bip
    ekran            = 0
    SayMod          = 0
    Menu            = 0
    BtSay            = 0
    Ekran            = 90
    AlrSay          = 0
    Rl1 = 1: Rl2 = 1:Rl3 = 1: Rl4 = 1:Thl = 0
    MtrSay = 0 
    EkrMod = 0
    SistemZaman = 21000 
    SistemOnc  = 0 
    Lamba1      = 1
    Lamba2      = 1
    
    high Rl4
    High Rl3
    
    pause 1000
    Lcdout $fe,1
      
    'SetKabin1  = 380
    'SetKabin2  = 300
    '
    'DrcHst      = 4
    'Carpan1      = 83
    'Carpan2      = 83
    
    SureSay1 = 90 
    SureSay2 = 90 
    
    lcdout $FE,$40,6,9,9,6,0,0,0,0
    
    pause 100
    Saat = 0 
    Dak = 0 
    Sn = 0 
    Gun = 1
    Ay = 1
    Yil = 25
    Hafta = 1
    HGUN    =  1
    'Gosub Zaman_Yaz
    Lcdout $FE,1
    Dimmer = 40000 
    SistemZaman = 0
    DimHedef  = 0 
'===============================================================================
'===============================================================================
Basla:
    if Mnu = 0 and EkrMod = 0 then                                              '1234567890123456
        Menu = 0:BtSay= 0 
        low bzr                                                      '37,7>37,5  %100
        goto BtBasBkl                                                          '58,0>58,2
    endif
    
    Gosub SensorOku
    if Ekran >= 100 then
        Gosub Zaman_Oku
        Gosub IntBkl
        Lcdout $FE,$80
        Gosub IntBkl
        Lcdout dec5 Kabin1
        Gosub IntBkl
        lcdout "  "
        Gosub IntBkl
        Lcdout dec5 Dimmer
        Gosub IntBkl
        Lcdout $FE,$C0
        Gosub IntBkl
        lcdout dec2 Saat,":",dec2 Dak
        Gosub IntBkl
        Lcdout ":",dec2 Sn
        Ekran = 0
    endif
    
    
    if Saat = 21 and Dak > 0 then 
        if Dak != OncekiDk then
            OncekiDk = DAK
            if Dimmer > 42000 then Dimmer = Dimmer - 2000
        endif
    endif
    
    if Saat = 4 and Dak > 30 then 
        if Dak != OncekiDk then
            OncekiDk = DAK
            if Dimmer < 61000 then Dimmer = Dimmer + 2000
        endif
    endif
    
    Gosub IntBkl
    Ekran = Ekran + 1
goto Basla
'===============================================================================
'===============================================================================
BtBasBkl: 
    if Mnu = 0 then 
      Menu = Menu + 1
      if Menu = 1  then Deger          = Saat
      if Menu = 2  then Saat            = Deger:Deger = DAk
      if Menu = 3  then DAK            = Deger:Gosub ZAMAN_YAZ:Deger = LDRSet
      if Menu = 4  then LDRSet          = Deger: T= 30 :Gosub VeriYaz
    endif 
    if Ykr = 0 then Deger = Deger + 1
    if Asg = 0 then Deger = Deger - 1
    
    if Menu = 1 then
    lcdout $fe,1  ,"Saat"
    endif
    if Menu = 2 then
    lcdout $fe,1  ,"Dakika"
    endif
    if Menu = 3 then
    lcdout $fe,1  ,"LDR"
    endif      
    
    if Menu = 4 then
        lcdout $fe,1  ,"Kaydedildi"
        Menu = 0
        gosub VeriGnc
        pause 500
        lcdout $fe,1
        goto Basla
    else
        lcdout $fe,$c0,dec Deger
    endif

    Gosub BtBekle
    
    if BtSay >= 50 then
      temp = temp + 1
      if Ykr = 0 then Deger = ((Deger/10)*10) + (9 + (( Temp / 10) * 90))
      if Asg = 0 then Deger = ((Deger/10)*10) - (9 +(( Temp / 10) * 90))
      BtSay = 40
      if temp > 10 then Temp = 10
    else
        Temp = 0
        BtSay = 0
    endif
    SayMod = 100  
    while Mnu = 1 and Ykr = 1 and Asg = 1 
          f = f + 1
          'if SayMod = 0 then exit
    wend
GOTO BtBasBkl
;===============================================================================
;===============================================================================
VeriYaz:
    write T,deger.highbyte:pause 10: T = T + 1: write T,deger.lowbyte:pause 10
return
;===============================================================================
;===============================================================================
VeriOku:
    read T,deger.highbyte:pause 10: T = T + 1: read T,deger.Lowbyte:pause 10
return
'===============================================================================
;=============================================================================== 
BtBekle:
    high Bzr
    while BtSay < 50 and (Mnu = 0 or Ykr = 0 or Asg = 0)
          BtSay = BtSay + 1
          gosub IntBkl
          low Bzr
          f = f + 1
    wend
    low Bzr
return
'===============================================================================
;=============================================================================== 
VeriGnc:
    T = 10  :Gosub VeriOku:SetKabin1      = Deger
    T = 20  :Gosub VeriOku:SetKabin2      = Deger
    T = 30  :Gosub VeriOku:DrcHst        = Deger
    T = 40  :Gosub VeriOku:Carpan1        = Deger
    T = 50  :Gosub VeriOku:Carpan2        = Deger
    
Return
'===============================================================================
'=============================================================================== 
SensorOku:        
    AngTmp = 0
    for AngTmp = 0 to 1
        OrtDeger = 0 
        Hamdeger = 0 
        while OrtDeger <= 9
            lookup AngTmp,[0,4,12],ADCON0 
            ADONE  = 1  'Dönüştürme Modülü Etkin = 1
            GODONE = 1
            while GODONE = 1
            wend
            ADONE  = 0
            HamDeger = Hamdeger + ((ADRESh*256) + ADRESL ) '(((ADRESh*256) + ADRESL)*/  133)  '24/1023 =0,0234 * 256
            OrtDeger = OrtDeger + 1
            pauseus 1
            pauseus 1
            pauseus 1
            pauseus 1
            pauseus 1
            pauseus 1
            pauseus 1
            pauseus 1
            pauseus 1
            pauseus 1
        wend
        HamDeger = Hamdeger / 10
        'Hamdeger = 1023-Hamdeger
        if AngTmp = 1 then Kabin2  = Hamdeger
        if AngTmp = 0 then Kabin1  = Hamdeger 
    next AngTmp 
Return
'===============================================================================
'===============================================================================
IntBkl:
RbTemp = RBmesgul
AcOff = 0 
while RbTemp = RBmesgul and AcOff < 160
pauseus 1
AcOff = AcOff + 1
wend
if AcOff >= 160 then gosub Bip
RbTemp = RBmesgul
AcOff = 0 
while RbTemp = RBmesgul and AcOff < 160
pauseus 1
AcOff = AcOff + 1
wend
if AcOff >= 160 then gosub Bip
return
'===============================================================================
'===============================================================================
RtcKnt var byte 
EskiSn var byte  
ZAMAN_OKU:
    Gosub IntBkl
    i2cread SDA,SCL,$d0,0,[ZAMAN[0],ZAMAN[1],ZAMAN[2],ZAMAN[3],ZAMAN[4],ZAMAN[5],ZAMAN[6]]  'ZAMAN_REG
    RtcSay = 0 
    for Rtci=0 to 6
        ZAMAN[Rtci]  = ((ZAMAN[Rtci] >> 4) *10) + (ZAMAN[Rtci] & %00001111)
    next Rtci
    sn  =ZAMAN[0]
    DAK  =ZAMAN[1]
    SAAT =ZAMAN[2]
    HAFTA=ZAMAN[3]
    GUN  =ZAMAN[4]
    AY  =ZAMAN[5]
    YIL  =ZAMAN[6] 
    RtcWrd = (Saat * 100) + Dak 
    Gosub IntBkl
    I2Cread SDA,SCL, $d0, $11, [RtcDerece, RtcOndalik]    
    'RtcOndalik = (RtcOndalik >> 6)  ' Shift <b7:b6> to <b1:b0>
    'RtcOndalik = (RtcOndalik * 25)  ' Fractional portion is in .25 increments. Increment values are 0-3 (.00, .25, .50, .75)
    '
    'RtcIsaret = "-"
    'if Rtcderece.7 = 0 then  RtcIsaret = "+"  ' save the sign bit for later    
    '''If TempSign = 1 then  TempInt = (TempInt XOR $FF) + 1    'Do not use this, the DS3231 uses simple <b7> sign with <b6:b0> as absolute temperature value
RETURN 
'===============================================================================
'===============================================================================    
ZAMAN_YAZ:
    ZAMAN[0]=sn      ' saniye
    ZAMAN[1]=DAK    ' dakika
    ZAMAN[2]=SAAT    ' saat
    ZAMAN[3]=hafta  ' haftanin gunu
    ZAMAN[4]=gun    ' Gün
    ZAMAN[5]=ay      ' ay
    ZAMAN[6]=yil    ' Yil
    for Rtci=0 to 6
        ZAMAN[Rtci] = ((ZAMAN[Rtci] dig 1) << 4 ) + ZAMAN[Rtci] dig 0
    next Rtci
    i2cwrite SDA,SCL,DS_Adr,ZAMAN_REG,[ZAMAN[0],ZAMAN[1],ZAMAN[2],ZAMAN[3],ZAMAN[4],ZAMAN[5],ZAMAN[6],$10]
return  
'===============================================================================
'===============================================================================
Bip:high Bzr:pause 100:low bzr:pause 50:return
'===============================================================================
'===============================================================================
LcdBasla:
    ' Set LCD Data port
    DEFINE LCD_DREG PORTC
    ' Set starting Data bit (0 or 4) if 4-bit bus
    DEFINE LCD_DBIT 0
    ' Set LCD Register Select port
    DEFINE LCD_RSREG PORTC
    ' Set LCD Register Select bit
    DEFINE LCD_RSBIT 5
    ' Set LCD Enable port
    DEFINE LCD_EREG PORTC
    ' Set LCD Enable bit
    DEFINE LCD_EBIT 4
    ' Set LCD bus size (4 or 8 bits)
    DEFINE LCD_BITS 4
    ' Set number of lines on LCD
    DEFINE LCD_LINES 2
    ' Set command delay time in us
    DEFINE LCD_COMMANDUS 2000
    ' Set data delay time in us
    DEFINE LCD_DATAUS 50 
return
'===============================================================================
'===============================================================================
DISABLE
TmrSay var byte
KESME:
GIE = 0        
        if INT0IF = 1 then
            ttt = portb    
            RBIF = 0
            INT0IF = 0
            TMR1L = Dimmer.lowbyte
            TMR1H = Dimmer.highbyte 
            TmrFl = 0
            TmrOn = 1 
            RBmesgul = RBmesgul + 1 
            if SayMod != 0 then SayMod = SayMod - 1
        endif
        
        if TmrFl = 1 then
            TmrOn = 0
            TmrFl = 0
            High portb.1
            pauseus 5
            low portb.1
        endif
Gec:
GIE = 1
RESUME
ENABLE

ete

Programına bakıyorum. Özellikle TMR1 kullanım şekline bakıyorum.
OSC frelansın 8Mhz ve bu osc değeri ile TMR1 ile 10ms lik gecikme yaratabilmek için TMR1 ön yükleme değerin 45543 olmalı. Bu 1/1 bölme oranı ile geçerli olan değerki sende zaten 1/1 bölme kullanıyorsun.
Ancak sen saydırmaya 40000 ile başlıyorsun duruma bağlı olarak dakika bazında +2000 ekleyerek dimmer görevini yerine getiriyorsun. Hemen belirteyim. Yüzlerce kez çeşitli dimmer devreleri yapıp çalıştırdım. Bu tecrübeden edindiğim bilgiye göre sıfır geçişinden sonra en fazla 9500 us gecikme verebilirsin. Komut gecikmelerinden dolayı normal şartlarda 10ms olması gereken bu süre genelde 9000-9500 aralığında olmaktadır. Senin yaptığın gibi bu değerden fazla değer verdiğinde bir sonraki sıfır geçiş alanına taşarsın ve buda lambada kırpışmalara sebep olur. Ben olsam o programın başında verdiğin Dimmer=40000 yerine Dimmer=46000 değerini bir kullanır durumu görürdüm.

Programda bazı yerlerde farklı fikirler vermek isterim.
	    if Saat = 4 and Dak > 30 then 
	        if Dak != OncekiDk then
	            OncekiDk = DAK
	            if Dimmer < 61000 then Dimmer = Dimmer + 2000
	        endif
	    endif
kodlarında saniye değerinide işin içine sokarsan OncekiDk diye bir şey kullanman gerekmez. Programında kısalır.
	    if Saat = 4 and Dak > 30 and SN=0 then 
	        if Dimmer < 61000 then Dimmer = Dimmer + 2000
	    endif
SN değerinin sıfır olduğu an dakikanın değiştiği andır. Böylece önceki dakika diye bir değişkeni takip etmen gerekmez.
Ya programın değişken tanımlamalarına bakınca hayatımda gördüğün en fazla değişken tanımlanan program olduğunu söyleyebilirim. Programın tamamını buraya koymadın ise koymadığın kısmının kullandıkları olabilir değilse fazlalıkları temizlemende yarar var.

Ete


aRci

Alıntı yapılan: ete - 14 Şubat 2026, 20:42:14Programına bakıyorum. Özellikle TMR1 kullanım şekline bakıyorum.
OSC frelansın 8Mhz ve bu osc değeri ile TMR1 ile 10ms lik gecikme yaratabilmek için TMR1 ön yükleme değerin 45543 olmalı. Bu 1/1 bölme oranı ile geçerli olan değerki sende zaten 1/1 bölme kullanıyorsun.
Ancak sen saydırmaya 40000 ile başlıyorsun duruma bağlı olarak dakika bazında +2000 ekleyerek dimmer görevini yerine getiriyorsun. Hemen belirteyim. Yüzlerce kez çeşitli dimmer devreleri yapıp çalıştırdım. Bu tecrübeden edindiğim bilgiye göre sıfır geçişinden sonra en fazla 9500 us gecikme verebilirsin. Komut gecikmelerinden dolayı normal şartlarda 10ms olması gereken bu süre genelde 9000-9500 aralığında olmaktadır. Senin yaptığın gibi bu değerden fazla değer verdiğinde bir sonraki sıfır geçiş alanına taşarsın ve buda lambada kırpışmalara sebep olur. Ben olsam o programın başında verdiğin Dimmer=40000 yerine Dimmer=46000 değerini bir kullanır durumu görürdüm.

Programda bazı yerlerde farklı fikirler vermek isterim.
        if Saat = 4 and Dak > 30 then 
            if Dak != OncekiDk then
                OncekiDk = DAK
                if Dimmer < 61000 then Dimmer = Dimmer + 2000
            endif
        endif
kodlarında saniye değerinide işin içine sokarsan OncekiDk diye bir şey kullanman gerekmez. Programında kısalır.
        if Saat = 4 and Dak > 30 and SN=0 then 
            if Dimmer < 61000 then Dimmer = Dimmer + 2000
        endif
SN değerinin sıfır olduğu an dakikanın değiştiği andır. Böylece önceki dakika diye bir değişkeni takip etmen gerekmez.
Ya programın değişken tanımlamalarına bakınca hayatımda gördüğün en fazla değişken tanımlanan program olduğunu söyleyebilirim. Programın tamamını buraya koymadın ise koymadığın kısmının kullandıkları olabilir değilse fazlalıkları temizlemende yarar var.

Ete



  Açıklamalar için teşekkürler. Programı başka programdan bu hale dönüştürdüğüm için gereksiz tanımlamalar mevcut. Kümes lamba ya ait tüm kod burada kodlarımdaki fazlalıklar genelde hafıza problemi yaşamaya başladığımda düzeltmeye gidiyorum.
  Dimmer alt değerini ölçü aleti ile deneyerek belirledim sizin gibi işin hesaplama kısmını yapmıyor yada yapamadığım için. yazdığim bu değer ac volt olarak 10v civarını vermekte. bahsettiğiniz saykılı kaçırma ve sonraki saykılda triakı tetikleme durumunu lambalı ısıtıcı projemde karşılaştım. Bunuda tam lamba kapanmışken arada gerçekleşen flash seklinde anlık yanıp sönmeler olduğunda anladım daha sonra alt değeri arttırrarak bu problemi çözdüm yazılımdaki bu değerler deneme yanılma ile bulduğum değerlerdir. Vakit bulursam başka denemeler yapıp paylaşırım.
  Saniye ye bağlı kısımla ilgili olarak rtc den saat verisini okuma aralığını 1 saniyeden uzun olacak şekilde ayarlıyorum. her saniye de bir okuma yapmayı bu çalışmada gereksiz gördüğüm için dakika ya odaklandım. Basla rutunu saniyede 100e yakın bir döngü yapmakta eğer saniye bazında dimmer değerini verirsem o vakit bir saniye 100 kez dimmere 2000 eklemiş olacağım. Onceki Dak hangi anda olursa olsun o dakika içerisinde sadece bir kere çalışmaya izin veriyorki bu benim için yeterli.
   Şu an için yeni lamba yı kullanmaya devam ediyorum gözlem yaparak sorunu bulmaya çalışıyorum. Gelişme olursa paylaşım yaparım teşekkürler.

mehmet

#7
Lamba olayı ısıtma ile ilgili  olduğu için, dimmer/AC faz kıyma işlemine gerek yok.

Alternans sayın. Mesela: 10 alternas bir periyot olsun.
1/10 güç için; 9 alternans kapalı, 1 alternans açık yapılır. Böylece zero-cros triyak sürücü kullanılabilir.

İleriki zamanlarda lamba yerine 20-100W rezistans yaptırılabilir. Hatta güç dirençleri de kullanılabilir.
Bazı çaydanlık-su ısıtıcısı bekleme resistansları 10-15W, bu da kullanılabilir.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr
CC BY

Powered by EzPortal
▲