Binary encoder

Başlatan veliusta, 11 Eylül 2015, 22:33:08

veliusta



Böyle yaptım.
Daha basit ve daha az komut ile yapılabilir mi?

sovalye

data = !(digitalRead(2)) + !(digitalRead(4)) * 2 + !(digitalRead(6)) * 4;


pinler low iken 1 kabul ettiğiniz için başlarına ! koydum.

veliusta

@sovalye Teşekkürler. Güzel düşünmüşsün.

veliusta

byte sayi_1;
byte sayi_2;
byte sayi_3;
byte binary;

long SAYICI_1;
long SAYICI_2;
long SAYICI_3;

void setup(){
  Serial.begin(9600);
  pinMode(2, INPUT_PULLUP);
  pinMode(4, INPUT_PULLUP);
  pinMode(6, INPUT_PULLUP);
}

void loop(){
if(digitalRead(2)==LOW){
 if(SAYICI_1==0){
  if(sayi_1==1){
    sayi_1=0;
    }else{
    sayi_1=1;   
    }
    }
     SAYICI_1 = 50;
   }

if(digitalRead(4)==LOW){
 if(SAYICI_2==0){
  if(sayi_2==2){
    sayi_2=0;
    }else{
    sayi_2=2;   
    }
    }
     SAYICI_2 = 50;
   }

if(digitalRead(6)==LOW){
 if(SAYICI_3==0){
  if(sayi_3==4){
    sayi_3=0;
    }else{
    sayi_3=4;   
    }
    }
     SAYICI_3 = 50;
   }
    
    
  if(SAYICI_1 != 0){
    SAYICI_1 = SAYICI_1-1;
}
  if(SAYICI_2 != 0){
    SAYICI_2 = SAYICI_2-1;
}
    if(SAYICI_3 != 0){
    SAYICI_3 = SAYICI_3-1;
}

  binary=sayi_1+sayi_2+sayi_3;
  Serial.println(binary);
}


Birde Toggle + Filtre'li kod tasarladım. Denedim güzel çalışıyor.

Bu kodlar Daha basit ve daha az komut ile yapılabilir mi?  :'(

sovalye

void loop() {
		temp = SAYICI_1;
		if ( (SAYICI_1 = 50 * (!digitalRead(2))) && !temp) 
			sayi_1 = bool(sayi_1 - 1) *1; 
		
		temp = SAYICI_2;
		if ((SAYICI_2 = 50 * (!digitalRead(4))) && !temp) 
			sayi_2 = bool(sayi_2 - 2) * 2;

		temp = SAYICI_3;
		if ((SAYICI_3 = 50 * (!digitalRead(6))) && !temp) 
			sayi_3 = bool(sayi_3 - 4) *4;

		SAYICI_1 = bool(SAYICI_1)*(SAYICI_1 - 1);
		SAYICI_2 = bool(SAYICI_2)*(SAYICI_2 - 1);
		SAYICI_3 = bool(SAYICI_3)*(SAYICI_3 - 1);

		binary = sayi_1 + sayi_2 + sayi_3;
		Serial.println(binary);
	}

Yukarda bir de long tipinde temp tanımladım.


Arduino ya atıp deneme yapmadım ama oldu galiba. Hatalı çıkarsa yazarsınız tekrar bakarım.
Basit oldu mu bilmiyorum ama kısalttım :)

veliusta

Çalışıyor fakat bekleme filtresini yapmıyor. 50 yi 11999 yaptım yinede bekleme yapmıyor.

bool nedir? boolean olarak değiştirsek ne olur?

sovalye

Dikkatim dağılmış ya da uykuluymuşum :) SAYICI 'ların sadece 50 veya 0 olacağını düşünerek işlem yapıyordu kod. Alttaki gibi düzeltebilirsin.
Bool standart c++ için bir keyword (int, double, if,else gibi). C++'ta Boolean şekilde bir ifade yok . Arduinuo da ikisi de geçerli ve aynı şeyi yapıyorlar.

temp = SAYICI_1;
if (( (SAYICI_1 = (50 * !digitalRead(2))) || ((SAYICI_1 = temp) && 0) ) && !temp)
	sayi_1 = bool(sayi_1 - 1) * 1;
temp = SAYICI_2;
if (( (SAYICI_2 = (50 * !digitalRead(4))) || ((SAYICI_2 = temp) && 0) ) && !temp)
	sayi_2 = bool(sayi_3 - 2) * 2;
temp = SAYICI_3;
if (( (SAYICI_3 = (50 * !digitalRead(6))) || ((SAYICI_3 = temp) && 0) ) && !temp)
	sayi_3 = bool(sayi_3 - 4) * 4;

SAYICI_1 = bool(SAYICI_1)*(SAYICI_1 - 1);
SAYICI_2 = bool(SAYICI_2)*(SAYICI_2 - 1);
SAYICI_3 = bool(SAYICI_3)*(SAYICI_3 - 1);

binary = sayi_1 + sayi_2 + sayi_3;
Serial.println(binary);

sovalye

derleyici açınca dikkatimi çekti. ikinci if 'in içinde "sayi_2" yazmalıydı. kopyala yapıştır yaparken "sayi_3" olarak kalmış.