Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

C'de Basit Filtre

Başlatan veliusta, 11 Şubat 2016, 06:34:21

veliusta

Günaydın. Basit bir problemi çözemedim. Kafam karıştı.  ???

Okunan voltaj değeri Serial.print'e yazılacak. 2.kez yazılmaya kalktığında değer 0.19'dan büyük veya 0.19'dan küçük ise yazılmayacak.



float VOLT, ESKI_VOLT;

void setup(){
  Serial.begin(9600);
}

void loop(){
  VOLT = (analogRead(0)*4.35)/170.6;
 if(ESKI_VOLT!=VOLT){
  ESKI_VOLT = ESKI_VOLT+0.19;
  if(ESKI_VOLT<VOLT){
  Serial.print(VOLT);
  Serial.println(" Volt");
  ESKI_VOLT = VOLT;
  delay(100);
   }
  }
}

kantirici

#1
Float sayılar yapıları gereği eşitlik ile karşılaştırılmamalı. Sadece büyük veya küçük şeklinde karşılaştırma yapılmalı.

if(ESKI_VOLT!=VOLT) bu kısımı büyük veya küçük şeklinde bir kontrol yapısına getirmelisiniz. Ayrıca değişkenlere ilk değer ataması yapmalısınız.

Ayrıca; if(ESKI_VOLT<VOLT) bu şart; ilk döngüde  sağlandıktan sonra ikinci defa ESKI_VOLT = ESKI_VOLT+0.19; bu satırdan dolayı bir daha sağlanamaz.



veliusta

#2
Teşekkürler. Deneyeceğim.

mesaj birleştirme:: 11 Şubat 2016, 09:44:47

float VOLT, VOLT_1, VOLT_2;

void setup(){
   Serial.begin(9600);
}

void loop(){
  VOLT = (analogRead(0)*4.35)/170.6;

  if(VOLT>VOLT_1 && VOLT<VOLT_2){
  }else{
      Serial.print(VOLT);
      Serial.println(" Volt");
    }
    delay(100);
     VOLT_1 = VOLT - 0.20;
     VOLT_2 = VOLT + 0.20;
}


Denedim oldu.  :)

Şimdi sizde daha iyisini yapın.

bc_esd

 
  analog okumayı bir kere yapmışsınız. çok sayıda okuma yapıp bunların ortalamasını alırsanız daha doğru bir ölçüm yaparsınız.  tek okumada her seferinde büyük ihtimalle farklı bir değer okuyacaksınız.

veliusta

Alıntı yapılan: bc_esd - 11 Şubat 2016, 09:47:35

  analog okumayı bir kere yapmışsınız. çok sayıda okuma yapıp bunların ortalamasını alırsanız daha doğru bir ölçüm yaparsınız.  tek okumada her seferinde büyük ihtimalle farklı bir değer okuyacaksınız.

Evet hocam aklıma o geldi. Mesela burasını "VOLT = (analogRead(0)*4.35)/170.6; " 5 kez döndürüp en yüksek değeri alabiliririz.

bc_esd

sadece analogRead(0) kısmını  birçok kez otup ortalamsını alın daha sonra elde ettiğniz değeri formul içine yerleştirin

for(i=0;i<ornek;i++)
                {
                   okunan_toplam+=analogRead(0);    // analog okumalar toplanıyor
                 }

     okunan=okunan_toplam/ornek;       // analog okumaların ortalaması alınıyor

     VOLT = (okunan*4.35)/170.6;      // ortalama değere göre hesaplama yapılıyor

veliusta

#6


100K ile 20K Dirençler ile gerilimi böldüm fakat 12V gerilim verince sapıtıyor anlamadım.

mesaj birleştirme:: 12 Şubat 2016, 00:06:41

Seri 9V pil Bağladım. 18V u sorunsuz okuyor. Adaptörde sorun çıkartıyor ?

mesaj birleştirme:: 12 Şubat 2016, 00:08:50

Neyse şimdi sorun çıkartmıyor. Neden böyle birşey yaptı anlamadım.

mesaj birleştirme:: 11 Şubat 2016, 10:52:08

float VOLT, VOL_MIN, VOL_MAX;
float VOLT_1, VOLT_2, VOLT_3, VOLT_4, VOLT_5;

void setup(){
   Serial.begin(9600);
}

void loop(){
  for (int i = 0; i < 5; i++){
     switch (i){ 
      case 0: VOLT_1 = (analogRead(0)*4.36)/170.6; break;
      case 1: VOLT_2 = (analogRead(0)*4.36)/170.6; break;
      case 2: VOLT_3 = (analogRead(0)*4.36)/170.6; break;
      case 3: VOLT_4 = (analogRead(0)*4.36)/170.6; break;
      case 4: VOLT_5 = (analogRead(0)*4.36)/170.6; break;
     }
  }

  VOLT = VOLT_1 ile VOLT_5 Arasındaki En büyük değerin bir altı ile eşitlenecek.
  


if(VOLT>VOL_MIN && VOLT<VOL_MAX){
  }else{
      Serial.print(VOLT);
      Serial.println(" Volt");
    }
     VOL_MIN = VOLT - 0.16;
     VOL_MAX = VOLT + 0.16;
     delay(50);
}


Kodu biraz değiştirdim.
VOLT = VOLT_1 ile VOLT_5 Arasındaki En büyük değerin bir altı ile eşitlenecek.
Burasını nasıl yapacağız ?

sovalye

#7
float volts[5], volt = 0, temp = 0,Vmin=0,Vmax=0;
void setup() {
	Serial.begin(9600);
}
void loop() {
	for (int i = 0; i < 5; i++) {
		volts[i] = (analogRead(0)*4.36) / 170.6;
		if (volts[i] > temp) {
			volt = temp;
			temp = volts[i];
		}
		else if (volts[i] > volt) {
			volt = volts[i];
		}
	}
	if ((volt<Vmin) || (volt>Vmax)) {
		Serial.print(volt);
		Serial.println(" Volt");
	}
	Vmin = volt - 0.16;
	Vmax = volt + 0.16;
	delay(50);
}

veliusta

#8
@sovalye  olmadı. Sadece bir kez gönderiyor. Örnek: 12V gönderdiyse 12V'tun altındakileri göndermiyor. Yani 5V verirsem okumuyor 15V verirsem okuyor. Tekrar 12V verirsem okumuyor.

mesaj birleştirme:: 12 Şubat 2016, 06:19:58

float volt, Vmin, Vmax;

void setup(){
   Serial.begin(9600);
}

void loop(){
  
volt = (analogRead(0)*4.36)/170.6;  // Bu kısmı 5 kez okutacağım. Okunan 5 değerden en büyük değerin 2.sini alacağım. Bunu yapamıyorum.

if ((volt<Vmin) || (volt>Vmax)){
      Serial.print(volt);
      Serial.println(" Volt");
    }
     Vmin = volt - 0.16;
     Vmax = volt + 0.16;
     delay(50);
}

sovalye

kodu pc de yazıp sizinkinin üzerine koydum o yüzden gözümden kaçtı heralde. her loop 'un içinde volt ve temp değerlerini sıfırlamanız gerekiyor.
float volts[5], volt = 0, temp = 0,Vmin=0,Vmax=0;
void setup() {
	Serial.begin(9600);
}
void loop() {
        volt=temp=0;
	for (int i = 0; i < 5; i++) {
		volts[i] = (analogRead(0)*4.36) / 170.6;
		if (volts[i] > temp) {
			volt = temp;
			temp = volts[i];
		}
		else if (volts[i] > volt) {
			volt = volts[i];
		}
	}
	if ((volt<Vmin) || (volt>Vmax)) {
		Serial.print(volt);
		Serial.println(" Volt");
	}
	Vmin = volt - 0.16;
	Vmax = volt + 0.16;
	delay(50);
}

veliusta

@sovalye  Teşekkürler hocam oldu. Bu yazdığınız kod. En büyüğünü almıyor mu? Küçükten büyüğe doğru sıraladığımızda 4.sünü nasıl alırız?

sovalye

Alıntı yapılan: veliusta - 11 Şubat 2016, 16:45:41
@sovalye  Teşekkürler hocam oldu. Bu yazdığınız kod. En büyüğünü almıyor mu? Küçükten büyüğe doğru sıraladığımızda 4.sünü nasıl alırız?

en büyük ikinci ölçümü alıyor zaten.

mehmet

Diziyi sıralama algoritması ile küçükten büyüğe
doğru sıralayınız. İstediğiniz ortaya çıkar.

Sihirli kelimeler "bubble sort"...
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr