RGB LED KONTROLCÜSÜ DIY

Ahmet

S38>S85
Katılım
31 Mayıs 2021
Mesajlar
6,052
Bir süredir @Gokrtl abi ile olur mu? nasıl olur? diye üstüne konuştuğumuz ikea svarta ranzayı almış bulundum ve üstteki yatağın gölgelediği alana aydınlatma yapmam gerektiğini gördüm.

Bu aydınlatma için ihtiyacıma göre birşey yapmaya karar verdim hazır uzaktan kumandalı olanı almadım çünkü bu ışığı sadece masa başındayken kullanacağım renk değiştirmem gerektiğinde veya kapatmam gerektiğinde çokta güzel çalışmayan kumandasıyla komut vermek için elimi yılan gibi oynatmam gerekecekti.

Devremizde;
Kontrolcü olarak Pro Mini yani Atmega328P kullandım.

3 Adet renk seçici buton bulunuyor.

1 Adet butonlu rotary encoder(
Encoder Butonu ON-OFF Yapıyor.
Encoder Kısmı parlaklık ayarı)


3 Adet renk süren transistörümüz bulunuyor(
BD139
Bu transistörler ile pwm yapmadan tam açık şekilde 1 saat boyunca 1.85 metre şerit ledi yakarak test yaptım
Ortaya çıkan ısı soğutucu kullanmama gerek olmadığını gösterdi.
Fakat daha uzun veya daha fazla akım çeken led kullanırsanız daha güçlü transistör veya soğutmaya ihtiyaç duyabilirsiniz)

Ben proje kutusu olarak hurda bir power bank kutusu kullandım kutu için kendi alternatifinizi üretmelisiniz.

Malzeme Listesi;
1x 328P Tabanlı herhangi bir arduino kartı olur.

1x Butonlu Rotary Encoder

3x Buton NO

3x Renk Sürücü Transistör Ihtiyacınıza göre seçmelisiniz Ben BD139 kullandım.

1x 5v Regulatör Ben 7805 kullandım.

1x 1N4007 veya 1N4001 Diyot.

2x 100nF Kutupsuz Kondansatör

1x 100uF Kutuplu Kondansatör

6x 1k Direnç 1/4W

3x 10k Direnç 1/4W

Led bağlantısı ve 12V besleme yapmak için kutunuza uygun soket seçebilirsiniz ben besleme için barrel jack kullandım.
Led bağlantısı için direkt kablo çıkardım.

Şema ve programı alttaki mesajlarda vereceğim lütfen güncelleme veya iyileştirme yapanlar konu altında paylaşırsa bende kendiminkinkini
güncellemiş olurum.

Programda veya şemamda yaptığım hatalarıda yazabilirsiniz biraz karışmış olabilir program ama bu haliyle sorunsuz çalışıyor.
 
Schematic.png
 
rgb:
/*
 __  __ ______ _  __       _______ _____   ____  _   _ _____ _  __
|  \/  |  ____| |/ /    /\|__   __|  __ \ / __ \| \ | |_   _| |/ /
| \  / | |__  | ' /    /  \  | |  | |__) | |  | |  \| | | | | ' / 
| |\/| |  __| |  <    / /\ \ | |  |  _  /| |  | | . ` | | | |  <  
| |  | | |____| . \  / ____ \| |  | | \ \| |__| | |\  |_| |_| . \ 
|_|  |_|______|_|\_\/_/    \_\_|  |_|  \_\\____/|_| \_|_____|_|\_\
                                                                  
*/



#define CLK 2
#define DT 3
#define SW 4

#define red 9
#define grn 5
#define blue 6

bool cnt = 0;
bool cnt1 = 0;
bool cnt2 = 0;
int enc = 0;


#define b1 10
#define b2 11
#define b3 12

int rval = 0;
int gval = 0;
int bval = 0;
int yc = 0;

int counter = 150;
int currentStateCLK;
int lastStateCLK;
unsigned long lastButtonPress = 0;

void setup() {

  pinMode(CLK, INPUT);
  pinMode(DT, INPUT);
  pinMode(SW, INPUT);

  pinMode(red, OUTPUT);
  pinMode(grn, OUTPUT);
  pinMode(blue, OUTPUT);
  digitalWrite(red, LOW);
  digitalWrite(grn, LOW);
  digitalWrite(blue, LOW);

  pinMode(b1, INPUT_PULLUP);
  pinMode(b2, INPUT_PULLUP);
  pinMode(b3, INPUT_PULLUP);

  lastStateCLK = digitalRead(CLK);
}

void loop() {

  currentStateCLK = digitalRead(CLK);

  if (currentStateCLK != lastStateCLK  && currentStateCLK == 1) {
    if (digitalRead(DT) != currentStateCLK) {
      counter = counter - 10;
      if (counter <= 1) {
        counter = 0;
      }
    }

    else {
      counter = counter + 10;
      if (counter >= 240) {
        counter = 250;
      }
    }
  }

  lastStateCLK = currentStateCLK;
  int btnState = digitalRead(SW);

  if (btnState == LOW) {
    if (millis() - lastButtonPress > 250) {
      enc++;
    }
    lastButtonPress = millis();
  }

  if(enc == 1 && counter > 9){
    counter = counter - 10;
    delay(80);
  }
 
  if(enc == 2){
    counter = 100;
    enc = 0;
  }

/*
 __  __ ______ _  __       _______ _____   ____  _   _ _____ _  __
|  \/  |  ____| |/ /    /\|__   __|  __ \ / __ \| \ | |_   _| |/ /
| \  / | |__  | ' /    /  \  | |  | |__) | |  | |  \| | | | | ' / 
| |\/| |  __| |  <    / /\ \ | |  |  _  /| |  | | . ` | | | |  <  
| |  | | |____| . \  / ____ \| |  | | \ \| |__| | |\  |_| |_| . \ 
|_|  |_|______|_|\_\/_/    \_\_|  |_|  \_\\____/|_| \_|_____|_|\_\
                                                                  
*/

  if (digitalRead(b1) == LOW && cnt == 0) {
    rval++;
    cnt = 1;
  }
  if (digitalRead(b1) == HIGH && cnt == 1) {
    cnt = 0;
  }


  if (digitalRead(b2) == LOW && cnt1 == 0) {
    gval++;
    cnt1 = 1;
  }
  if (digitalRead(b2) == HIGH && cnt1 == 1) {
    cnt1 = 0;
  }


  if (digitalRead(b3) == LOW && cnt2 == 0) {
    bval++;
    cnt2 = 1;
  }
  if (digitalRead(b3) == HIGH && cnt2 == 1) {
    cnt2 = 0;
  }


  
  if (rval == 1) {
    analogWrite(red, counter);
  }

  if (gval == 1) {
    analogWrite(grn, counter);
  }

  if (bval == 1) {
    analogWrite(blue, counter);
   }


  if (rval == 0) {
    analogWrite(red, 0);
  }
  if (bval == 0) {
    analogWrite(blue, 0);
  }

  if (gval == 0) {
    analogWrite(grn, 0);
  }

  if (rval > 1) {
    rval = 0;
  }

  if (gval > 1) {
    gval = 0;
  }

  if (bval > 1) {
    bval = 0;
    }
 
  }
 
Son düzenleme:
3 renk mi var?
Hepsini aynı anda yakıp beyaz da elde edebilirdin sanırım.
 
3 renk mi var?
Hepsini aynı anda yakıp beyaz da elde edebilşrdin sanırım.
Evet o şekilde yapıyorum.

Fazla buton olmaması için ara renklere buton eklemedim.

MAVİ-KIRMIZI birlikte yakıp MOR-PEMBE tonları elde ediyorum.
KIRMIZI-YEŞİL birlikte yakıp SARI elde ediyorum.
MAVİ-YEŞİL birlikte yakıp TURKUAZ elde ediyorum.
3ünü birlikte yakıp BEYAZ elde ediyorum.
 
Evet o şekilde yapıyorum.

Fazla buton olmaması için ara renklere buton eklemedim.

MAVİ-KIRMIZI birlikte yakıp MOR-PEMBE tonları elde ediyorum.
KIRMIZI-YEŞİL birlikte yakıp SARI elde ediyorum.
MAVİ-YEŞİL birlikte yakıp TURKUAZ elde ediyorum.
3ünü birlikte yakıp BEYAZ elde ediyorum.
Çok iyi o zaman. Ben biri yanınca diğeri sönüyor sandım. Sen her bir butonu on-off şeklinde yapmışsın.
 
V1.1
Mükemmel şebekemiz sebebiyle güncelleme geldi yazılıma.
Sürekli elektrik kesintisi yaşıyoruz ben ledi ayarlıyorum gece uyuyorum sabah bir kalkıyorum veya gece uyanıp bakıtğımda odada ışık yok.
Elektrik gidip geldiğinde kendi uyanacak son halinde devam edecek bir yazılım düzenlemesi yaptım atmega328p içindeki dahili eeproma led durumu ve led parlaklığını yazdım işlemci uyandığında bunları okuyup buradan devam edecek.


rgb-v1.1:
/*
 __  __ ______ _  __       _______ _____   ____  _   _ _____ _  __
|  \/  |  ____| |/ /    /\|__   __|  __ \ / __ \| \ | |_   _| |/ /
| \  / | |__  | ' /    /  \  | |  | |__) | |  | |  \| | | | | ' /
| |\/| |  __| |  <    / /\ \ | |  |  _  /| |  | | . ` | | | |  < 
| |  | | |____| . \  / ____ \| |  | | \ \| |__| | |\  |_| |_| . \
|_|  |_|______|_|\_\/_/    \_\_|  |_|  \_\\____/|_| \_|_____|_|\_\

__      ____  __
\ \    / /_ |/_ |
 \ \  / / | | | |
  \ \/ /  | | | |
   \  /   | |_| |
    \/    |_(_)_|
                  
                                                                  
*/


#include <EEPROM.h>
// ADRES 0 PWM DEĞERİ
// ADRES 1 KIRMIZI
// ADRES 2 MAVİ
// ADRES 3 YEŞİL

#define CLK 2
#define DT 3
#define SW 4

#define red 9
#define grn 5
#define blue 6

bool cnt = 0;
bool cnt1 = 0;
bool cnt2 = 0;
int enc = 0;


#define b1 10
#define b2 11
#define b3 12

int rval = 0;
int gval = 0;
int bval = 0;
int yc = 0;

int counter = 0;
int currentStateCLK;
int lastStateCLK;
unsigned long lastButtonPress = 0;

void setup() {

  pinMode(CLK, INPUT);
  pinMode(DT, INPUT);
  pinMode(SW, INPUT);

  pinMode(red, OUTPUT);
  pinMode(grn, OUTPUT);
  pinMode(blue, OUTPUT);
  digitalWrite(red, LOW);
  digitalWrite(grn, LOW);
  digitalWrite(blue, LOW);

  pinMode(b1, INPUT_PULLUP);
  pinMode(b2, INPUT_PULLUP);
  pinMode(b3, INPUT_PULLUP);

  counter = EEPROM.read(0);//PWM
  rval = EEPROM.read(1);//KIRMIZI DURUMU
  bval = EEPROM.read(2);//MAVI DURUMU
  gval = EEPROM.read(3);//YESIL DURUMU

  lastStateCLK = digitalRead(CLK);
}

void loop() {

  currentStateCLK = digitalRead(CLK);

  if (currentStateCLK != lastStateCLK  && currentStateCLK == 1) {
    if (digitalRead(DT) != currentStateCLK) {
      counter = counter - 10;
      EEPROM.write(1, counter);
      if (counter <= 1) {
        counter = 0;
      }
    }

    else {
      counter = counter + 10;
      EEPROM.write(1, counter);
      if (counter >= 240) {
        counter = 250;
      }
    }
  }

  lastStateCLK = currentStateCLK;
  int btnState = digitalRead(SW);

  if (btnState == LOW) {
    if (millis() - lastButtonPress > 250) {
      enc++;
    }
    lastButtonPress = millis();
  }

  if(enc == 1 && counter > 9){
    counter = counter - 10;
    delay(80);
  }
 
  if(enc == 2){
    counter = 100;
    enc = 0;
  }

/*
 __  __ ______ _  __       _______ _____   ____  _   _ _____ _  __
|  \/  |  ____| |/ /    /\|__   __|  __ \ / __ \| \ | |_   _| |/ /
| \  / | |__  | ' /    /  \  | |  | |__) | |  | |  \| | | | | ' /
| |\/| |  __| |  <    / /\ \ | |  |  _  /| |  | | . ` | | | |  < 
| |  | | |____| . \  / ____ \| |  | | \ \| |__| | |\  |_| |_| . \
|_|  |_|______|_|\_\/_/    \_\_|  |_|  \_\\____/|_| \_|_____|_|\_\
                                                                  
*/

  if (digitalRead(b1) == LOW && cnt == 0) {
    rval++;
    EEPROM.write(1,1);
    cnt = 1;
  }
  if (digitalRead(b1) == HIGH && cnt == 1) {
    cnt = 0;
  }


  if (digitalRead(b2) == LOW && cnt1 == 0) {
    gval++;
    EEPROM.write(3,1);
    cnt1 = 1;
  }
  if (digitalRead(b2) == HIGH && cnt1 == 1) {
    cnt1 = 0;
  }


  if (digitalRead(b3) == LOW && cnt2 == 0) {
    bval++;
    EEPROM.write(2,1);
    cnt2 = 1;
  }
  if (digitalRead(b3) == HIGH && cnt2 == 1) {
    cnt2 = 0;
  }


 
  if (rval == 1) {
    analogWrite(red, counter);
  }

  if (gval == 1) {
    analogWrite(grn, counter);
  }

  if (bval == 1) {
    analogWrite(blue, counter);
   }


  if (rval == 0) {
    analogWrite(red, 0);
  }
  if (bval == 0) {
    analogWrite(blue, 0);
  }

  if (gval == 0) {
    analogWrite(grn, 0);
  }

  if (rval > 1) {
    rval = 0;
    EEPROM.write(1,0);
  }

  if (gval > 1) {
    EEPROM.write(3,0);
    gval = 0;
  }

  if (bval > 1) {
    EEPROM.write(2,0);
    bval = 0;
    }
 
  }
 
V1.2
Bu versiyonda EEPROMA kayıtta yaşanan sorunlar çözdüm.
Şöyle bir sorun yaşıyorduk PWM değerini EEPROMA kaydederken eğer sayı 0-99 arasındaysa hafızada tutuyor 100 ve 100'den büyükse EEPROMA rastgele bir şey yazıyordu.
Bunu hazır bir kütüphane ile çözdüm neden hazır kullandın zor bir şey değil derseniz bundan önemli projelerim vardı, bu konuya değineceğim ayrıca eeproma büyük veri yazmak başlığı altında.
KULLANDIĞIM KÜTÜPAHNE

Birde @ozkarah abimle konuştuğumuz biraz kapsamlı akıllı ev projeme bu devreyi dahil etmek için'de alt yapı oluşturdum.
UART üstünden komut alıp butonlara basılmış enkoderden ayar yapılmış gibi ledi sürebiliyoruz artık.
Basit bir DATA BUS oluşturdum bunları bölüp işlem yapıyorum böylelikle akıllı evin parçası olacak RGB ledime fazladan IO kullanmadan UART üstünden komut vererek ayarlayabilir hale getirdim bu işlem yapılırken üstündeki butonlar enkoder aktif çalışmaya devam ediyor.
örn: uzaktan rengi mavi yapıp yanına gittiğimizde üstündeki butonlardan değiştirebiliriz rengi.


Data bus şu şekilde çalışıyor.
3 bit led durumu 0-250 arasında da parlaklık ayarı.
örn: 1.0.1.125 Mavi ve kırmızı aktif pwm değeri 125.

daha rahat data split yapmak için araları '.' ile böldüm.

V1.2:
#include <EEPROMex.h>
// ADRES 0-3 PWM DEĞERİ
// ADRES 6 KIRMIZI
// ADRES 7 MAVİ
// ADRES 8 YEŞİL

#define CLK 2
#define DT 3
#define SW 4

#define red 9
#define grn 5
#define blue 6

bool cnt = 0;
bool cnt1 = 0;
bool cnt2 = 0;

bool slp = 0;
int enc = 0;


#define b1 10
#define b2 11
#define b3 12

int rval = 0;
int gval = 0;
int bval = 0;
int yc = 0;

int counter = 0;
int currentStateCLK;
int lastStateCLK;
unsigned long lastButtonPress = 0;

String r = "0";
String g = "0";
String b = "0";
String sbr = "0";
String readString = "";



void setup() {
 
  pinMode(CLK, INPUT_PULLUP);
  pinMode(DT,  INPUT_PULLUP);
  pinMode(SW,  INPUT_PULLUP);

  pinMode(red,  OUTPUT);
  pinMode(grn,  OUTPUT);
  pinMode(blue, OUTPUT);
  digitalWrite(red,  LOW);
  digitalWrite(grn,  LOW);
  digitalWrite(blue, LOW);

  pinMode(b1, INPUT_PULLUP);
  pinMode(b2, INPUT_PULLUP);
  pinMode(b3, INPUT_PULLUP);

  counter = EEPROM.readInt(0);//PWM
  slp = 1;
  rval = EEPROM.read(6);//KIRMIZI DURUMU
  bval = EEPROM.read(7);//MAVI DURUMU
  gval = EEPROM.read(8);//YESIL DURUMU
  Serial.begin(115200);
  Serial.print('1');


  lastStateCLK = digitalRead(CLK);
}

void loop() {

  if (Serial.available() > 0) {
    String c = Serial.readString();
    readString += c;

   /*DATA SPLIT*/
   /* DATA BUS = 'R.G.B.0-250' VALUE*/
    r = readString.substring(0, 1);
    g = readString.substring(2, 3);
    b = readString.substring(4, 5);
    sbr = readString.substring(6, 9);
   /*DATA SPLIT*/

   /*CONVER STRING TO INT*/
    rval = r.toInt();
    gval = g.toInt();
    bval = b.toInt();
    counter = sbr.toInt();
    /*CONVER STRING TO INT*/
  
    /*SAVING EEPROM*/
    EEPROM.update(6, rval);//KIRMIZI DURUM
    EEPROM.update(7, bval);//MAVI DURUM
    EEPROM.update(8, gval);//YESIL DURUM
    EEPROM.writeInt(0, counter);//PWM DEGERI
    /*SAVING EEPROM*/

    readString=""; 
  }

  currentStateCLK = digitalRead(CLK);

  if (currentStateCLK != lastStateCLK  && currentStateCLK == 1 || slp == 1) {
    if (digitalRead(DT) != currentStateCLK || slp == 1) {
      counter = counter - 10;
      EEPROM.writeInt(0, counter);
      slp = 0;
      if (counter <= 1) {
        counter = 0;
      }
    }

    else {
      counter = counter + 10;
      EEPROM.writeInt(0, counter);
      if (counter >= 240) {
        counter = 250;
      }
    }
  }

  lastStateCLK = currentStateCLK;
  int btnState = digitalRead(SW);

  if (btnState == LOW) {
    if (millis() - lastButtonPress > 250) {
      enc++;
    }
    lastButtonPress = millis();
  }

  if (enc == 1 && counter > 1) {
    counter = counter - 2;
    delay(20);
  
    if(counter == 4){
      EEPROM.writeInt(0, 0);//PWM DEGERI
    }
  }


  if (enc == 2) {
    counter = 100;
    enc = 0;
  }

  // ADRES 6 KIRMIZI
  // ADRES 7 MAVİ
  // ADRES 8 YEŞİL


  if (digitalRead(b1) == LOW && cnt == 0) {
    rval++;
    EEPROM.write(6, 1);
    cnt = 1;
  }
  if (digitalRead(b1) == HIGH && cnt == 1) {
    cnt = 0;
  }


  if (digitalRead(b2) == LOW && cnt1 == 0) {
    gval++;
    EEPROM.write(8, 1);
    cnt1 = 1;
  }
  if (digitalRead(b2) == HIGH && cnt1 == 1) {
    cnt1 = 0;
  }


  if (digitalRead(b3) == LOW && cnt2 == 0) {
    bval++;
    EEPROM.write(7, 1);
    cnt2 = 1;
  }
  if (digitalRead(b3) == HIGH && cnt2 == 1) {
    cnt2 = 0;
  }



  if (rval == 1 ) {
    analogWrite(red, counter);
  }

  if (gval == 1) {
    analogWrite(grn, counter);
  }

  if (bval == 1) {
    analogWrite(blue, counter);
  }


  if (rval == 0) {
    analogWrite(red, 0);
  }
  if (bval == 0) {
    analogWrite(blue, 0);
  }

  if (gval == 0) {
    analogWrite(grn, 0);
  }

  if (rval > 1) {
    rval = 0;
    EEPROM.write(6, 0);
  }

  if (gval > 1) {
    EEPROM.write(8, 0);
    gval = 0;
  }

  if (bval > 1) {
    EEPROM.write(7, 0);
    bval = 0;
  }

}
 
Son düzenleme:
Bu seferki bug'ımız enkoderin butonundan kapattıktan sonra enkoderi parlaklık arttırma yönünde çevirince parlaklığın artıp sonra tekrar kısılması gibi bir döngüye giriyor bunu çözeceğiz.

Sorunun kaynağı enkoder butonu ile yaptırdığımız sayma eğer kapatıldıysa led sürme kısmını işleme yaparsak sorun ortadan kalkacak bunun içinde led süren kısımı bir if içine aldım bu ifin şartı eğer enkoder buton değeri 1 değilse içeri gir.

V1.3:
#include <EEPROMex.h>
// ADRES 0-3 PWM DEĞERİ
// ADRES 6 KIRMIZI
// ADRES 7 MAVİ
// ADRES 8 YEŞİL

#define CLK 2
#define DT 3
#define SW 4

#define red 9
#define grn 5
#define blue 6

bool cnt = 0;
bool cnt1 = 0;
bool cnt2 = 0;

bool slp = 0;
int enc = 0;


#define b1 10
#define b2 11
#define b3 12

int rval = 0;
int gval = 0;
int bval = 0;
int yc = 0;

int counter = 0;
int currentStateCLK;
int lastStateCLK;
unsigned long lastButtonPress = 0;

String r = "0";
String g = "0";
String b = "0";
String sbr = "0";
String readString = "";



void setup() {
 
  pinMode(CLK, INPUT_PULLUP);
  pinMode(DT,  INPUT_PULLUP);
  pinMode(SW,  INPUT_PULLUP);

  pinMode(red,  OUTPUT);
  pinMode(grn,  OUTPUT);
  pinMode(blue, OUTPUT);
  digitalWrite(red,  LOW);
  digitalWrite(grn,  LOW);
  digitalWrite(blue, LOW);

  pinMode(b1, INPUT_PULLUP);
  pinMode(b2, INPUT_PULLUP);
  pinMode(b3, INPUT_PULLUP);

  counter = EEPROM.readInt(0);//PWM
  slp = 1;
  rval = EEPROM.read(6);//KIRMIZI DURUMU
  bval = EEPROM.read(7);//MAVI DURUMU
  gval = EEPROM.read(8);//YESIL DURUMU
  Serial.begin(115200);
  Serial.print('1');


  lastStateCLK = digitalRead(CLK);
}

void loop() {

  if (Serial.available() > 0) {
    String c = Serial.readString();
    readString += c;

   /*DATA SPLIT*/
   /* DATA BUS = 'R.G.B.0-250' VALUE*/
    r = readString.substring(0, 1);
    g = readString.substring(2, 3);
    b = readString.substring(4, 5);
    sbr = readString.substring(6, 9);
   /*DATA SPLIT*/

   /*CONVER STRING TO INT*/
    rval = r.toInt();
    gval = g.toInt();
    bval = b.toInt();
    counter = sbr.toInt();
    /*CONVER STRING TO INT*/
 
    /*SAVING EEPROM*/
    EEPROM.update(6, rval);//KIRMIZI DURUM
    EEPROM.update(7, bval);//MAVI DURUM
    EEPROM.update(8, gval);//YESIL DURUM
    EEPROM.writeInt(0, counter);//PWM DEGERI
    /*SAVING EEPROM*/

    readString="";
  }

  currentStateCLK = digitalRead(CLK);

  if (currentStateCLK != lastStateCLK  && currentStateCLK == 1 || slp == 1) {
    if (digitalRead(DT) != currentStateCLK || slp == 1) {
      counter = counter - 10;
      EEPROM.writeInt(0, counter);
      slp = 0;
      if (counter <= 1) {
        counter = 0;
      }
    }

    else {
      counter = counter + 10;
      EEPROM.writeInt(0, counter);
      if (counter >= 240) {
        counter = 250;
      }
    }
  }

  lastStateCLK = currentStateCLK;
  int btnState = digitalRead(SW);

  if (btnState == LOW) {
    if (millis() - lastButtonPress > 250) {
      enc++;
    }
    lastButtonPress = millis();
  }

  if (enc == 1 && counter > 1) {
    counter = counter - 2;
    delay(20);
 
    if(counter == 4){
      EEPROM.writeInt(0, 0);//PWM DEGERI
    }
  }
 
  if (enc == 2) {
    counter = 100;
    enc = 0;
  }
 

  // ADRES 6 KIRMIZI
  // ADRES 7 MAVİ
  // ADRES 8 YEŞİL

  if( ! enc == 1){
 
  if (digitalRead(b1) == LOW && cnt == 0) {
    rval++;
    EEPROM.write(6, 1);
    cnt = 1;
  }
  if (digitalRead(b1) == HIGH && cnt == 1) {
    cnt = 0;
  }


  if (digitalRead(b2) == LOW && cnt1 == 0) {
    gval++;
    EEPROM.write(8, 1);
    cnt1 = 1;
  }
  if (digitalRead(b2) == HIGH && cnt1 == 1) {
    cnt1 = 0;
  }


  if (digitalRead(b3) == LOW && cnt2 == 0) {
    bval++;
    EEPROM.write(7, 1);
    cnt2 = 1;
  }
  if (digitalRead(b3) == HIGH && cnt2 == 1) {
    cnt2 = 0;
  }



  if (rval == 1 ) {
    analogWrite(red, counter);
  }

  if (gval == 1) {
    analogWrite(grn, counter);
  }

  if (bval == 1) {
    analogWrite(blue, counter);
  }


  if (rval == 0) {
    analogWrite(red, 0);
  }
  if (bval == 0) {
    analogWrite(blue, 0);
  }

  if (gval == 0) {
    analogWrite(grn, 0);
  }

  if (rval > 1) {
    rval = 0;
    EEPROM.write(6, 0);
  }

  if (gval > 1) {
    EEPROM.write(8, 0);
    gval = 0;
  }

  if (bval > 1) {
    EEPROM.write(7, 0);
    bval = 0;
   }
  }
}
 
@Ahmet kodu biraz inceledim. Bu şekilde hataya çok açık kod yazarsın. Bir de EEPROMa yazma işi ne kadar sürüyor? Onu yazarken enkoder adım atlayabilir. Eğer öyle bi rirsk varsa yazma işini enkoder boştayken yapmalısın. Sana iki tane ödev vereyim:

1- Kodu çok daha sade yazabilirsin. Aynı işler farklı pinler için tekrar ediyor. Fonksiyon kullanmaya alışmalısın.

2- İlk maddeyi bitirdikten sonra, şöyle birşey deneyebilirsin:
  • Üç düğmeden birisine kısa bastığında sadece o rengin PWM değerini ayarlayacaksın. Böylece istediğin rengi hızlıca ayarlayabileceksin.
  • Üç düğmeden birisine çok uzun (5 sn +) bastığında o düğmeye aktif renk ayarını makro gibi kaydedeceksin.
  • Üç düğmeden birisine çok uzun (1-5 sn) bastığında o düğmeye kaydettiğin ayarı çağıracaksın. İstiyorsan burada düğme kombinasyonları olayını da ekleyebilirsin.
  • EEPROMda en son R,G,B değerini ve düğmelere kaydettiğin PWM değerlerini saklayacaksın.
 
@Ahmet kodu biraz inceledim. Bu şekilde hataya çok açık kod yazarsın. Bir de EEPROMa yazma işi ne kadar sürüyor? Onu yazarken enkoder adım atlayabilir. Eğer öyle bi rirsk varsa yazma işini enkoder boştayken yapmalısın. Sana iki tane ödev vereyim:

1- Kodu çok daha sade yazabilirsin. Aynı işler farklı pinler için tekrar ediyor. Fonksiyon kullanmaya alışmalısın.

2- İlk maddeyi bitirdikten sonra, şöyle birşey deneyebilirsin:
  • Üç düğmeden birisine kısa bastığında sadece o rengin PWM değerini ayarlayacaksın. Böylece istediğin rengi hızlıca ayarlayabileceksin.
  • Üç düğmeden birisine çok uzun (5 sn +) bastığında o düğmeye aktif renk ayarını makro gibi kaydedeceksin.
  • Üç düğmeden birisine çok uzun (1-5 sn) bastığında o düğmeye kaydettiğin ayarı çağıracaksın. İstiyorsan burada düğme kombinasyonları olayını da ekleyebilirsin.
  • EEPROMda en son R,G,B değerini ve düğmelere kaydettiğin PWM değerlerini saklayacaksın.
Bunu çok acele yazmıştım sonra oturup baştan daha güzel şekilde yazmadım işimi görüyor diye.
Bug oldukça çözüyorum sonra çalışmaya devam ediyor hardware müsade etitği sürece geliştirmeyede zaman ayırmayı deniyorum ama hep ilave donanım isteyen özellik eklemek isteyip vazgeçiyorum.

1-) Kodu foniksiyonlar dahil ederek %50 kısaltabilirim 100 satırda bitecek hale gelebilir örn:
C++:
void Renk_PWM(bool r; bool g; bool b; int pwm;) {
  if (bool r == 1 ) {
    analogWrite(..., pwm);
  }
  else{
    analogWrite(..., 0);
  }
 
  if (bool g == 1 ) {
    analogWrite(..., pwm);
  }
    else{
    analogWrite(..., 0);
  }
 
  if (bool b == 1 ) {
    analogWrite(..., pwm);
  }
    else{
    analogWrite(..., 0);
  }
}

Aslında en başta bu projeyi 1 enkoder ile yapacaktım, enkoder butonuna bastıkça renkler değişecek o hangi renk aktifse döndürerek onun parlaklığı ayarlanacak şekilde çalışacaktı sonra elimde renkli buton kapakları olduğunu görünce butonlarıda ekleyeyim dedim bir kere tek enkoder ve tüm sistemi kontrol şeklinde çalışacağı için butonlara göre çevirip devam ettim kullanmaya enkoder butonu on/off şeklini aldı.

ödevleri ilk fırsatta yapacağım :))
 
Güzel :)
Durum Makinası (State Machine) programlama işine biraz bakmalısın. Öğrenince, işler sadeleşecek ve kolaylaşacak.

Şuraya da bir bakarsın. Bu şekilde hiç 240'a ayarlayamazsın (ama EEPROM'da 240 kalır):

Kod:
else {
      counter = counter + 10;
      EEPROM.writeInt(0, counter);
      if (counter >= 240) {
        counter = 250;
      }
    }
 
Güzel :)
Durum Makinası (State Machine) programlama işine biraz bakmalısın. Öğrenince, işler sadeleşecek ve kolaylaşacak.

Şuraya da bir bakarsın. Bu şekilde hiç 240'a ayarlayamazsın (ama EEPROM'da 240 kalır):

Kod:
else {
      counter = counter + 10;
      EEPROM.writeInt(0, counter);
      if (counter >= 240) {
        counter = 250;
      }
    }
durum makinesini hep duyuyorum ama genelde okuyup kalıyorum birkaç uygulama yapsam öğrenirim.

aslında zamanında soracaktım abi ama aklımdan çıkmış.
RTOS projesi olur mu bu projeden yoksa RTOS öğrenmek için daha kapsamlı bir şeyi mi RTOS ile yapayım.
 

Forum istatistikleri

Konular
5,789
Mesajlar
99,015
Üyeler
2,464
Son üye
s4met

Son kaynaklar

Son profil mesajları

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)
Kesici/Spindle hızı hesaplamak için SpreadSheet UDF'leri kullanın, hesap makinesi çok eski kalan bir yöntem :)
Dr. Bülent Başaran,
Elektrik ve Elektronik Mühendisi
Yonga Tasarım Özdevinimcisi
Üç güzel "çocuk" babası
Ortahisar/Ürgüp/Konya/Ankara/Pittsburgh/San Francisco/Atlanta/Alaçatı/Taşucu...

Back
Top