Attiny13a İle Açma Kapama Butonu + Buzzer V2 (230V Anahtarlama)

Gokrtl

Gökhan Kartal (TeknoDay)
Staff member
Katılım
27 Şubat 2019
Mesajlar
11,212
Yeni konuya hoş geldiniz.
Attiny13a ile açma kapama butonunu yapıyoruz.
Bu devre ile;
1-Butona basıldığında, buton üzerindeki ledi yakacağız.
2-Açılış için ayrı, kapanış için ayrı ikaz seslerini buzzer ile vereceğiz
3-Trafomzun 230VAC Primer kısmını anahtarlayacağız.

Konu devam ettikçe bu 1.mesajı gelişmelere göre güncelleyeceğim.


Bom list ile başlayalım.
Comp. Count:
36
Item
Qty
Reference(s)
Value
LibPart
Footprint
1​
1​
BZ1​
Buzzer​
Device:Buzzer​
Buzzer_Beeper:Buzzer_12x9.5RM7.6​
2​
2​
C1, C2​
100nF​
Device:C​
Capacitor_THT:C_Rect_L13.0mm_W5.0mm_P10.00mm_FKS3_FKP3_MKS4​
3​
2​
C3, C4​
1000uF​
Device:C_Polarized​
Capacitor_THT:CP_Radial_D10.0mm_P5.00mm​
4​
2​
C5, C6​
10uF​
Device:C_Polarized​
5​
2​
C7, C8​
22uF​
Device:C_Polarized​
6​
1​
C9​
10nF​
Device:C​
Capacitor_THT:C_Rect_L13.0mm_W5.0mm_P10.00mm_FKS3_FKP3_MKS4​
7​
1​
D1​
LED​
Device:LED​
Connector_JST:JST_EH_B2B-EH-A_1x02_P2.50mm_Vertical​
8​
1​
D2​
MB2S​
Diode_Bridge:MB2S​
Diode_SMD: Diode_Bridge_OnSemi_SDIP-4L​
9​
1​
F1​
Fuse​
Device:Fuse​
Fuse:Fuse_Littelfuse_372_D8.50mm​
10​
1​
J1​
230VAC IN​
Connector:Conn_01x03_Pin​
Connector_Molex:Molex_KK-396_A-41791-0003_1x03_P3.96mm_Vertical​
11​
1​
J2​
230VAC OUT​
Connector:Conn_01x03_Pin​
Connector_Molex:Molex_KK-396_A-41791-0003_1x03_P3.96mm_Vertical​
12​
3​
Q1, Q2, Q3​
BC847​
Transistor_BJT:BC847​
Package_TO_SOT_SMD:SOT-23​
13​
1​
Q4​
BTA41​
Triac_Thyristor:BTA16-800B​
Package_TO_SOT_THT:TO-3P-3_Vertical​
14​
1​
R1​
220R​
Device:R​
Resistor_SMD:R_1206_3216Metric_Pad1.30x1.75mm_HandSolder​
15​
5​
R2, R3, R4, R5, R8​
1K​
Device:R​
Resistor_SMD:R_1206_3216Metric_Pad1.30x1.75mm_HandSolder​
16​
2​
R6, R7​
5K​
Device:R​
Resistor_SMD:R_1206_3216Metric_Pad1.30x1.75mm_HandSolder​
17​
1​
R9​
360R​
Device:R​
Resistor_SMD:R_1206_3216Metric_Pad1.30x1.75mm_HandSolder​
18​
1​
R10​
360R​
Device:R​
Resistor_THT:R_Axial_DIN0309_L9.0mm_D3.2mm_P12.70mm_Horizontal​
19​
1​
R11​
330R​
Device:R​
Resistor_THT:R_Axial_DIN0309_L9.0mm_D3.2mm_P12.70mm_Horizontal​
20​
1​
R12​
39R​
Device:R​
Resistor_THT:R_Axial_DIN0309_L9.0mm_D3.2mm_P12.70mm_Horizontal​
21​
1​
SW1​
ON-OFF​
Switch:SW_DPST_x2​
Connector_JST:JST_EH_B2B-EH-A_1x02_P2.50mm_Vertical​
22​
1​
T1​
Tr_1P_1S​
Device:Transformer_1P_1S​
ELKOM_TRAFO:ELKOM_TR​
23​
1​
U1​
ATtiny13-20P​
MCU_Microchip_ATtiny:ATtiny13-20P​
Package_DIP: DIP-8_W7.62mm​
24​
1​
U2​
MOC3052M​
Relay_SolidState:MOC3052M​
Package_DIP: DIP-6_W7.62mm_LongPads​
25​
1​
U3​
AMS1117-5.0​
Regulator_Linear:AMS1117-5.0​
Package_TO_SOT_SMD:SOT-223-3_TabPin2​


Devre şemasında kapasitörleri düşük esr elde etmek adına 2'şer tane kullandım.
Aynı şeyi Attiny Beslemesinde de yaptım.

Ekran görüntüsü 2024-02-10 112042.png


Geniş geniş takıldım bu sefer. Öceki tasarımda trafo pcb nin karşı tarafındaydı. Oraya kadar 230vac yol çekmiştim. Şimdi hepsini bir yere toparladım.
Ekran görüntüsü 2024-02-10 134354.png


3D Görünümü
Ekran görüntüsü 2024-02-10 134855.png


Ekran görüntüsü 2024-02-10 134918.png
 
Son düzenleme:
Hemen bir kaç soru iliştireyim.
Attiny13'ün 7.bacağına switch bağlı. Oradaki R5 gerekli mi? emin olamadım, çünkü zaten 5v üzerine 1k koymuşuz.
Kondansatörleri L.ESR adına abartmış olabilir miyim?

Bu iki sorunun cevabını aldıktan sonra trafo ile başlayalım.
Elimde EL-KOM RN120221 6v 83mA bir trafo var.
İhtiyacım olan akımlar ise şöyle:
LED: 35mA
Attiny: 6mA
Buzzer: 30mA
MOC3052: 10mA
3xBC847 base akımı: 6mA

Toplamda 87mA yapıyor.
Bunlar benim datasheetlerden bakıp anlayabildiğim kadarıyla hesapladığım değerler.
Bu değerler düğmeye ilk basıldığında çekilecek. Sadece buzzer bir kaç sn öttükten sonra susacağı için 87mA - 30mA diyebiliriz.
Ama işte o ilk düğmeye basıldığı anda fındık trafo istenilen akımı veremezse bu trafodaki vınlamaya sebep olur mu?
Trafoyu bir 200mA ile değiştireyim mi?
 
Ledde seri direnç yok mu?
PCB çiziminde R6 yı sol üste biraz çekip, R1
mcu altına gelebilir.
DC gnd "ground plane" olmaz mı?
 
Attiny13'ün 7.bacağına switch bağlı. Oradaki R5 gerekli mi? emin olamadım, çünkü zaten 5v üzerine 1k koymuşuz.
R5 gereksiz. R4 en az 10k olsun ki switch kapalıyken boşuna oradan 5mA geçmesin.

Kondansatörleri L.ESR adına abartmış olabilir miyim?
Böyle iyi bence. O kondansatörlerin çoğu gerekli. Maliyet azaltmak gerekirse 1-2 tane eksiltebiliriz veya 100n ile değiştirebiliriz ama önce devre çalışsın

Elimde EL-KOM RN120221 6v 83mA bir trafo var.
Trafo bayıyor mu ona devre çalışınca osiloskopla bakmak lazım. 1117nin çalışması için girişinde en az 6V olmalı.

Bu değerler düğmeye ilk basıldığında çekilecek. Sadece buzzer bir kaç sn öttükten sonra susacağı için 87mA - 30mA diyebiliriz.
2 saniye ötse bile bunu kondansatörden karşılamak zor.
 
Ben eniyisi 200mA lik bir trafo alayım kafamız rahat olsun.
 
7.5v 1.5VA tarfo sipariş ettim. Gelince pcb tekrar basıp testlere başlayacağım. Attiny13'ü de yeniden yazacağım.
 
Eclipse veya AVR Studio ile yazın.
Vs Code ile yazmayı düşünüyordum. Eclipse'i bilmiyorum. Avr studioda da sanırım kod yazım şekli farklı. Arduino ide deki formüller geçerli değil. Bu bana zaman kaybettirir. Bu devreden kurtulup asıl uğraşmam gereken güç kaynağı devresine geçmek istiyorum artık.
 
Eclipse veya AVR Studio ile yazın.
Bunlara gerek yok arduino ide ham avr komutlarını derleyebiliyor.
Elzem bir optimizasyon sorunu yok devrede, A1 A2 yer değiştirilince susacaktı yüksek ihtimalle trafo sahte triyaklarda başıma çok geliyor yükü A1'e bağlıyorum göz kırpıyor triyak açılmıyor gate aşırı akım çekiyor vs. yer değişiyorum A2'ye bağlıyorum bütün sorunu yok oluyor devrenin ojrinal triyak bulmak çok zor artık. Ben kritik olacak yerlerde 2 tristör kullanarak yapıyorum triac'ı
 
Artık şu Arduino IDE denen garabetten forumca kurtulsak da vscode ve platformio'ya geçsek mi? :)
 
Arduino IDE yi terketmekteki en büyük sorun, okullarda programlama öğretmek için kullanılan defakto ortamın olması. Eğer bunu terkedersek, o konuda gelen ödev veya proje sorularına bir süre sonra kaliteli cevaplar verememeye başlayacağız, çünkü kendimiz de unutmuş olacağız. Benim açımdan bu önemli, ben forumu sadece aynı konular üzerinde çalışan insanların kahvehanesi olarak görmüyorum, ülkeye bir faydası olmasını istiyorum. Ne kadar faydalı olabiliyorum o tartışılır, ama hedefim bu en azından.
 
Arduino IDE yi terketmekteki en büyük sorun, okullarda programlama öğretmek için kullanılan defakto ortamın olması. Eğer bunu terkedersek, o konuda gelen ödev veya proje sorularına bir süre sonra kaliteli cevaplar verememeye başlayacağız, çünkü kendimiz de unutmuş olacağız. Benim açımdan bu önemli, ben forumu sadece aynı konular üzerinde çalışan insanların kahvehanesi olarak görmüyorum, ülkeye bir faydası olmasını istiyorum. Ne kadar faydalı olabiliyorum o tartışılır, ama hedefim bu en azından.
Kod iki ortamda da aynı olacağı için gelen soruların büyük çoğunluğunun cevabı değişmeyecektir. Geri kalan IDE ayarıyla ilgili sorular için bilgisayarda Arduino IDE bulundurmak mantıklı.
 
Artık yatmam lazım ama yatmadan önce bir soru sorayım. Yarın cevaplara göre hareket ederim.
Attiny13'e VSCode Platformio ile aşağıdaki kodu attım. Ama Butona basınca sistemi açmıyor. Kodlarda gözden kaçırdığım bir şey mi var acaba?

C++:
#define faz 3
#define buzzer 0
#define led 1

const int buttonPin = 2;
int buttonState;             
int lastButtonState = LOW;

unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;

int on_off =1;
unsigned long simdikiZaman, eskiZaman = 0;

void setup() {
  pinMode(faz, OUTPUT);
  pinMode(buzzer, OUTPUT);
  pinMode(led ,OUTPUT);
  pinMode(buttonPin, INPUT);
 
  digitalWrite(faz, LOW);
  digitalWrite(led, LOW);
  digitalWrite(buzzer, LOW);
}

void loop() {
  /////// BUTON DEBOUNCE KODLARI /////////////////
  int reading = digitalRead(buttonPin);
  if (reading != lastButtonState) {
    lastDebounceTime = millis();
  }

  if ((millis() - lastDebounceTime) > debounceDelay) {
    if (reading != buttonState) {
      buttonState = reading;

      if (buttonState == HIGH) {
        if (on_off == 0) {
          digitalWrite(buzzer, HIGH);
          delay(100);
          digitalWrite(buzzer, LOW);
          delay(100);
          digitalWrite(buzzer, HIGH);
          delay(100);
          digitalWrite(buzzer, LOW);
          delay(100);
          digitalWrite(buzzer, HIGH);
          delay(1500);
          digitalWrite(buzzer, LOW);
          digitalWrite(led, HIGH);
          digitalWrite(faz, HIGH);
          on_off = 1;
        } else if (on_off == 1) {
          digitalWrite(buzzer, HIGH);
          delay(2000);
          digitalWrite(buzzer, LOW);
          digitalWrite(led, LOW);
          digitalWrite(faz, LOW);
          on_off = 0;
        }
      }
    }
  }
  ///////////////////////////////////////////
}
 
Kodda bir gariplik var. lastButtonState tanımlanıyor ama asla değeri değişmiyor sabit kalmış. Bastınız buton high oldu diye varsayıyorum, ilk if i gördü program reading high, ve lastButtonState e eşit değil. Time değişkenini güncelledi, millis e baktım ms cinsinden programın çalışma süresini veriyormuş sürekli ilk if e girdiği için 50ms asla dolmayacak. İkinci if e girmeden tekrar ilk if e girecek, dolayısı ile asla ikinci if e girilmiyor gibi duruyor. Sanki en sonda lastButtonState güncellenirse bir şansı var. Ek bir bilgi olarak böyle run time veren değişkenlerin overflow olma ihtimali gözetilerek kod yazılmalı kesinlikle.
 
Eclipse veya AVR Studio ile deneyebilirsiniz.

C:
/*
 * main.c
 *
 *  Created on: 03 Şubat 2024
 *      Author: mbmb
 *
 *      https://mekatronik.org/forum/threads/attiny13a-ile-acma-kapama-butonu-buzzer-230v-anahtarlama.2622/#post-43935
 *      Buradaki çizime göre kod yazıldı, test edilecek...
 */

#if defined F_CPU

#else
#define F_CPU 9600000  // 9,6 MHz
#endif

#include <avr/io.h>
//#include <avr/interrupt.h>
//#include <stdint.h>
#include <util/delay.h>
//#include <avr/pgmspace.h>
//#include <avr/eeprom.h>
//#include <avr/wdt.h>

/*
 * Makrolar
 */
#define _BV(bit)                (1 << (bit))
#define sbi(port, bit)     (port) |= _BV(bit)
#define cbi(port, bit)     (port) &= ~_BV(bit)
/* Bit Operation macros */
//#define sbi(b,n) ((b) |=   (1<<(n)))        /* Set bit number n in byte b   */
//#define cbi(b,n) ((b) &= (~(1<<(n))))       /* Clear bit number n in byte b */
#define rbi(b,n) ((b) &    (1<<(n)))        /* Read bit number n in byte b  */
#define fbi(b,n) ((b) ^=   (1<<(n)))        /* Flip bit number n in byte b  */
#define pinToggle(PORT, n)  (PORT ^= 1 << n)

#define bit_is_set(sfr, bit) (_SFR_BYTE(sfr) & _BV(bit))
#define bit_is_clear(sfr, bit) (!(_SFR_BYTE(sfr) & _BV(bit)))
#define loop_until_bit_is_set(sfr, bit) do { } while (bit_is_clear(sfr, bit))
#define loop_until_bit_is_clear(sfr, bit) do { } while (bit_is_set(sfr, bit))

#define LED PB2
#define BUZZER    PB1

#define BTN_PIN    PIN3
//#define BTN_PORT PORTB
#define RLY_PORT PB4
#define RLY_PIN PIN4
//#define RLY_PORT PORTB

/*
 * init MCU
 */
void initMcu(void)
{
    PORTB = 0x00;
    DDRB = 0b11110111;
}

/*
 *
 */
void buzzerOn(unsigned char durum)
{
    unsigned char say = 0;

    if (durum == 1)
    {
        for (say = 0; say < 2; say++)
        {
            sbi(PORTB, BUZZER);
            _delay_ms(500);
            cbi(PORTB, BUZZER);
            _delay_ms(500);
        }
    }
    else if (durum == 2)
    {
        sbi(PORTB, BUZZER);
        _delay_ms(1000);
        cbi(PORTB, BUZZER);
        _delay_ms(1000);
    }
}

/*
 *
 */
int main(void)
{
    unsigned char say = 0, cal = 0;

    initMcu();

    while (1)
    {
        if (bit_is_clear(PINB, PIN3))
        {
            _delay_ms(20);
            if (bit_is_clear(PINB, PIN3))
            {
                while (bit_is_clear(PINB, PIN3))
                {
                    sbi(PORTB, LED);
                    _delay_ms(5);
                }
                cbi(PORTB, LED);
                if (++say > 1)
                {
                    say = 0;
                }
            }
        }

        if (say == 1)
        {
            sbi(PORTB, RLY_PIN);
            if (cal == 0)
            {
                buzzerOn(1);
                cal = 1;
            }
        }
        else if (say == 0)
        {
            cbi(PORTB, RLY_PIN);
            if (cal == 1)
            {
                buzzerOn(2);
                cal = 0;
            }
        }
        //_delay_ms(100);
    }
}
 
Kodda bir gariplik var. lastButtonState tanımlanıyor ama asla değeri değişmiyor sabit kalmış. Bastınız buton high oldu diye varsayıyorum, ilk if i gördü program reading high, ve lastButtonState e eşit değil. Time değişkenini güncelledi, millis e baktım ms cinsinden programın çalışma süresini veriyormuş sürekli ilk if e girdiği için 50ms asla dolmayacak. İkinci if e girmeden tekrar ilk if e girecek, dolayısı ile asla ikinci if e girilmiyor gibi duruyor. Sanki en sonda lastButtonState güncellenirse bir şansı var. Ek bir bilgi olarak böyle run time veren değişkenlerin overflow olma ihtimali gözetilerek kod yazılmalı kesinlikle.
Bir türlü fırsat bulamadım. Yarın akşama bakacağım.

Eclipse veya AVR Studio ile deneyebilirsiniz.

C:
/*
 * main.c
 *
 *  Created on: 03 Şubat 2024
 *      Author: mbmb
 *
 *      https://mekatronik.org/forum/threads/attiny13a-ile-acma-kapama-butonu-buzzer-230v-anahtarlama.2622/#post-43935
 *      Buradaki çizime göre kod yazıldı, test edilecek...
 */

#if defined F_CPU

#else
#define F_CPU 9600000  // 9,6 MHz
#endif

#include <avr/io.h>
//#include <avr/interrupt.h>
//#include <stdint.h>
#include <util/delay.h>
//#include <avr/pgmspace.h>
//#include <avr/eeprom.h>
//#include <avr/wdt.h>

/*
 * Makrolar
 */
#define _BV(bit)                (1 << (bit))
#define sbi(port, bit)     (port) |= _BV(bit)
#define cbi(port, bit)     (port) &= ~_BV(bit)
/* Bit Operation macros */
//#define sbi(b,n) ((b) |=   (1<<(n)))        /* Set bit number n in byte b   */
//#define cbi(b,n) ((b) &= (~(1<<(n))))       /* Clear bit number n in byte b */
#define rbi(b,n) ((b) &    (1<<(n)))        /* Read bit number n in byte b  */
#define fbi(b,n) ((b) ^=   (1<<(n)))        /* Flip bit number n in byte b  */
#define pinToggle(PORT, n)  (PORT ^= 1 << n)

#define bit_is_set(sfr, bit) (_SFR_BYTE(sfr) & _BV(bit))
#define bit_is_clear(sfr, bit) (!(_SFR_BYTE(sfr) & _BV(bit)))
#define loop_until_bit_is_set(sfr, bit) do { } while (bit_is_clear(sfr, bit))
#define loop_until_bit_is_clear(sfr, bit) do { } while (bit_is_set(sfr, bit))

#define LED PB2
#define BUZZER    PB1

#define BTN_PIN    PIN3
//#define BTN_PORT PORTB
#define RLY_PORT PB4
#define RLY_PIN PIN4
//#define RLY_PORT PORTB

/*
 * init MCU
 */
void initMcu(void)
{
    PORTB = 0x00;
    DDRB = 0b11110111;
}

/*
 *
 */
void buzzerOn(unsigned char durum)
{
    unsigned char say = 0;

    if (durum == 1)
    {
        for (say = 0; say < 2; say++)
        {
            sbi(PORTB, BUZZER);
            _delay_ms(500);
            cbi(PORTB, BUZZER);
            _delay_ms(500);
        }
    }
    else if (durum == 2)
    {
        sbi(PORTB, BUZZER);
        _delay_ms(1000);
        cbi(PORTB, BUZZER);
        _delay_ms(1000);
    }
}

/*
 *
 */
int main(void)
{
    unsigned char say = 0, cal = 0;

    initMcu();

    while (1)
    {
        if (bit_is_clear(PINB, PIN3))
        {
            _delay_ms(20);
            if (bit_is_clear(PINB, PIN3))
            {
                while (bit_is_clear(PINB, PIN3))
                {
                    sbi(PORTB, LED);
                    _delay_ms(5);
                }
                cbi(PORTB, LED);
                if (++say > 1)
                {
                    say = 0;
                }
            }
        }

        if (say == 1)
        {
            sbi(PORTB, RLY_PIN);
            if (cal == 0)
            {
                buzzerOn(1);
                cal = 1;
            }
        }
        else if (say == 0)
        {
            cbi(PORTB, RLY_PIN);
            if (cal == 1)
            {
                buzzerOn(2);
                cal = 0;
            }
        }
        //_delay_ms(100);
    }
}
Teşekkür ederim. Emek vermiş hazırlamışsın ama daha öncede söylemiştim, Eclipse yada Avr Studio ya bulaşmak istemiyorum. Arduino IDE den VS Code'a bile geçmek şuan zulüm gibi zaten. Yenilerini öğrenmeye hem zamanım yok hemde azmim.
 
Son düzenleme:

Forum istatistikleri

Konular
5,844
Mesajlar
99,693
Üyeler
2,481
Son üye
rfdog12

Son kaynaklar

Son profil mesajları

gruptaki arkadaşlara selamlar. sıteyi bu gün fark ettim. Asansör için 2x7 segment LCD gösterge üretmek istiyorum. acaba bu sayfadaki arkadaşlardan destek alabilirmiyim. LCD nin mantık açılımı ektedir.
deneyci wrote on TA3UIS's profile.
Selam.
Amatör telsiz lisansı nasıl alınıyor?
Lisansı olmayanı forumlarına almıyorlar. :)
Bilgi alamıyoruz.
cemalettin keçeci wrote on HaydarBaris's profile.
barış kardeşim bende bu sene akıllı denizaltı projesine girdim ve sensörleri arastırıyorum tam olarak hangi sensör ve markaları kullandınız yardımcı olabilir misin?
m.white wrote on Altair's profile.
İyi akşamlar.Arabanız ne marka ve sorunu nedir.Ben araba tamircisi değilim ama tamirden anlarım.
* En mühim ve feyizli vazifelerimiz millî eğitim işleridir. Millî eğitim işlerinde mutlaka muzaffer olmak lâzımdır. Bir milletin hakikî kurtuluşu ancak bu suretle olur. (1922)
Back
Top