ARDUİNO İLE FARKLI ADC KULLANIMI

Başlatan karatekeli, 04 Ocak 2017, 02:34:06

karatekeli

Arkadaşlar ARDUİNO ile adcden okuduğum veriyi buzzerden çalmak yani gelen verinin büyüklüğüne göre sesin azalması yada artması birde bu sese eşik değeri atamam gerek bunuda bir pot ile ayarlamam lazım yani potla ayarladığım değer kadar tıkırdayacak adcden gelen veri pot verisinden büyük ise adcnin verisi kadar ötecek birde adcden okunan veri 0/-1024 arası olduğunda bir led 0/1024 arası olduğunda başka bir led yakmam gerek yazdığım kodu aşağıda paylaşıyorum ŞİMDİDEN YARDIMLARINIZ İÇİN ÇOK TEŞEKKÜRLER...

int led1 = 2; //2.digital pini led1 değişkenine atadık
int led2 = 3; //3.digital pini led2 değişkenine atadık
int buzzer = 9; //9. digital pini buzzer değişkenine atadık
int pot = A0; //A0 analog pini pot değişkenine atadık
int potdeger; //Kodlarımız içerisinde kullanacağımız potdeger değişkenini oluşturduk
int potesik = A1; //A1 analog pini potesik değişkenine atadık
int potesikdeger; //Kodlarımız içerisinde kullanacağımız potdegeresik değişkenini oluşturduk






void setup() {
  pinMode(led1, OUTPUT); //led1 i çıkış olarak ayarladık
  pinMode(led2, OUTPUT); //led2 yi çıkış olarak ayarladık
  pinMode(pot, INPUT);   //pot u giriş olarak ayarladık
  pinMode(buzzer,OUTPUT); // Buzzer ın bulunduğu pin çıkış olarak tanımlandı.
  Serial.begin(9600); // seripotun hızı 9600 baud yapılır

}

void loop() {
  potesikdeger = analogRead(potesik);//potesik değişkenine atadağımız A1 pinini dinliyoruz ve değerini potesikdeger değişkenine atıyoruz
  potdeger= analogRead(pot); //pot değişkenine atadağımız A0 pinini dinliyoruz ve değerini potdeger değişkenine atıyoruz
{
  if (potdeger>-1){ //potdeger -1 den büyükse sadece led1 i yak
    digitalWrite(led1, HIGH);
    digitalWrite(led2, LOW);

}
{
  if (potdeger>1){ //potdeger 1 den büyükse sadece led2 i yak
    digitalWrite(led1, LOW); 
    digitalWrite(led2, HIGH);
}
{
 
  if (potdeger >= potesikdeger) {
    tone(buzzer,(analogRead(potesikdeger))); //Potansiyometre ile okuduğumuz değere göre farklı tonlarda buzzer ötecek.
    tone(buzzer,(analogRead(potdeger))); //A0 ile okuduğumuz değere göre farklı tonlarda buzzer ötecek.
    Serial.println(potdeger);
  }
}

karatekeli

#1
kodlar tamam denedim çalışıyor sadece adc'den okunan veri - değere dönünce yakmam gereken ledi yakamadım yardımcı olursanız sevinirim

#include <SoftwareSerial.h>



int led1 = 2; //2.digital pini led1 değişkenine atadık
int led2 = 3; //3.digital pini led2 değişkenine atadık
int buzzer = 9; //9. digital pini buzzer değişkenine atadık
int pot = A0; //A0 analog pini pot değişkenine atadık
int potdeger; //Kodlarımız içerisinde kullanacağımız potdeger değişkenini oluşturduk
int potesik = A1; //A1 analog pini potesik değişkenine atadık
int potesikdeger; //Kodlarımız içerisinde kullanacağımız potdegeresik değişkenini oluşturduk
int butondurumu=0;
int Start=0;




void setup() {
  pinMode(led1, OUTPUT); //led1 i cikis olarak ayarladik
  pinMode(led2, OUTPUT); //led2 yi cikis olarak ayarladik
  pinMode(pot, INPUT);   //pot u giris olarak ayarladik
  pinMode(potesik, INPUT);   //potesik i giris olarak ayarladik
  pinMode(buzzer, OUTPUT); // Buzzer in bulunduğu pin cikis olarak tanimlandi.
  digitalWrite(led1, LOW); //led1 sondurduk
  digitalWrite(led2, LOW); //led2 sondurduk
  Serial.begin(9600); // seripotun hizi 9600 baud yapilir

}

void loop() {
potesikdeger = analogRead(potesik);//potesik degiskenine atadigimiz A1 pinini dinliyoruz ve degerini potesikdeger degiskenine atiyoruz
potdeger = analogRead(pot); //pot degiskenine atadigimiz A0 pinini dinliyoruz ve degerini potesikdeger degiskenine atiyoruz
Start = digitalRead(A2); //A2 girisine bagli butonu dinliyoruz ve degerini starta atiyoruz
tone(buzzer, (analogRead(potdeger))); //Potansiyometre ile okudugumuz degere göre farkli tonlarda buzzer otecek.
{
if (potesikdeger > -1) { //potesikdeger -1 den buyukse sadece led1 i yak /burasını planladığım gibi olmadı yani - değere düşünce led yanmadı
      digitalWrite(led1, HIGH);
      digitalWrite(led2, LOW);

    
  }
if (potesikdeger > potdeger) { //potesikdeger potdeger den buyukse sadece led2 i yak
    digitalWrite(led1, LOW);
    digitalWrite(led2, HIGH);

  }
if (potesikdeger >= potdeger) {
    
    tone(buzzer, (analogRead(potesikdeger))); //A1 ile okudugumuz degere gore farkli tonlarda buzzer otecek.
    
if (Start == LOW) { butondurumu=1; }
if (Start == HIGH) {butondurumu=0;  }
    Serial.println(potesikdeger);
    Serial.print(",");
    Serial.println(butondurumu);
    }
    delay(100);
  }
 }

mehmet

Kodlarınızı kod bloğu içinde yayınlayınız...
Örnek...
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

bocek

analogRead() fonksiyonu 0 ile 1023 arası değer döndürür. (-) olmaz.
karşılaştırma yaparken analog değerleri değerleri değil de aradaki farkı kontrol etmelisin.
mesela
int fark = potdeger - potesikdeger;
if (fark > -1) // sadece led1'i yak 
...
if(fark > 1) // sadece led2'yi yak
...

şeklinde..
1 ya da 0. işte 'bit'ün mesele..

karatekeli

#4
Sağolasın bocek deneyip bildireceğim

karatekeli

sayın bocek ok oldu tek sorun ses devamlı ötüyor adcden giren gerilime veriye göre azalıp çoğalmıyor onu nasıl ayarlarız

karatekeli

iki potunda değerleri eşit iken hiç bir ledin yanmaması ve buzzerin ötmemesi gerek potdeger arttıkça tıkırdaması gerek pot değer eşik değerim oluyor potesikdeger potdeger den büyük olunca yeşilin yanması lazım o tamam çalışıyor ama kırmızı led potlar eşitken neden yanıyor buzzer neden ötüyor





ayrıca yeni kodlarım son hali
#include <SoftwareSerial.h>



int led1 = 2; //2.digital pini led1 değişkenine atadık
int led2 = 3; //3.digital pini led2 değişkenine atadık
int buzzer = 9; //9. digital pini buzzer değişkenine atadık
int pot = A0; //A0 analog pini pot değişkenine atadık
int potdeger; //Kodlarımız içerisinde kullanacağımız potdeger değişkenini oluşturduk
int potesik = A1; //A1 analog pini potesik değişkenine atadık
int potesikdeger; //Kodlarımız içerisinde kullanacağımız potdegeresik değişkenini oluşturduk
int butondurumu=0;
int Start=0;




void setup() {
  pinMode(led1, OUTPUT); //led1 i cikis olarak ayarladik
  pinMode(led2, OUTPUT); //led2 yi cikis olarak ayarladik
  pinMode(pot, INPUT);   //pot u giris olarak ayarladik
  pinMode(potesik, INPUT);   //potesik i giris olarak ayarladik
  pinMode(buzzer, OUTPUT); // Buzzer in bulunduğu pin cikis olarak tanimlandi.
  digitalWrite(led1, LOW); //led1 sondurduk
  digitalWrite(led2, LOW); //led2 sondurduk
  digitalWrite(buzzer, LOW); //buzzer i sondurduk
  Serial.begin(9600); // seripotun hizi 9600 baud yapilir

}

void loop() {
potesikdeger = analogRead(potesik);//potesik degiskenine atadigimiz A1 pinini dinliyoruz ve degerini potesikdeger degiskenine atiyoruz
potdeger = analogRead(pot); //pot degiskenine atadigimiz A0 pinini dinliyoruz ve degerini potesikdeger degiskenine atiyoruz
Start = digitalRead(A2); //A2 girisine bagli butonu dinliyoruz ve degerini starta atiyoruz
tone(buzzer, (analogRead(potdeger))); //Potansiyometre ile okudugumuz degere göre farkli tonlarda buzzer otecek.
{
if (potesikdeger > -9) { //potdeger -10 den buyukse sadece led1 i yak
      digitalWrite(led1, HIGH);
      digitalWrite(led2, LOW);

    
  }
if (potesikdeger > potdeger) { //potesikdeger potdeger den buyukse +10 fazlasi olunca sadece led2 i yak
    digitalWrite(led1, LOW);
    digitalWrite(led2, HIGH);

  }
if (potesikdeger >= potdeger) {
    
    tone(buzzer, (analogRead(potesikdeger))); //A1 ile okudugumuz degere gore farkli tonlarda buzzer otecek.
    
if (Start == LOW) { butondurumu=1; }
if (Start == HIGH) {butondurumu=0;  }
    Serial.println(potesikdeger);
    Serial.print(",");
    Serial.println(butondurumu);
    }
    delay(100);
  }
 }

bocek

Alıntı yapılan: karatekeli - 05 Ocak 2017, 21:31:23
ama kırmızı led potlar eşitken neden yanıyor buzzer neden ötüyor

if (potesikdeger >= potdeger) {
buradaki >= 'ten dolayı olabilir mi?


bir de
tone(buzzer, (analogRead(potesikdeger))); //A1 ile okudugumuz degere gore farkli tonlarda buzzer otecek.

değil de

 tone(buzzer, (analogRead(potesik))); //A1 ile okudugumuz degere gore farkli tonlarda buzzer otecek.

ya da 
 tone(buzzer, (potesikdeger)); //A1 ile okudugumuz degere gore farkli tonlarda buzzer otecek.

olmalı gibi.
1 ya da 0. işte 'bit'ün mesele..

karatekeli

çok sağol bocek usta yardımların için ben kendimce çözdüm herşey tamam çalışıyor ama ses bir türlü benim istediğim gibi çıkmıyor ben adc den gelen değere göre sesin azalması yada artmasını istiyorum yani adc den okunan veri azalınca sesde azalacak veri artınca sesde artacak yeni kodlarımı aşağıda veriyorum şimdiden çok ama çok teşekkürler

#include <SoftwareSerial.h>



int led1 = 2; //2.digital pini led1 değişkenine atadık
int led2 = 3; //3.digital pini led2 değişkenine atadık
int buzzer = 9; //9. digital pini buzzer değişkenine atadık
int pot = A0; //A0 analog pini pot değişkenine atadık
int potdeger; //Kodlarımız içerisinde kullanacağımız potdeger değişkenini oluşturduk
int potesik = A1; //A1 analog pini potesik değişkenine atadık
int potesikdeger; //Kodlarımız içerisinde kullanacağımız potdegeresik değişkenini oluşturduk
int butondurumu=0;
int Start=0;




void setup() {
  pinMode(led1, OUTPUT); //led1 i cikis olarak ayarladik
  pinMode(led2, OUTPUT); //led2 yi cikis olarak ayarladik
  pinMode(pot, INPUT);   //pot u giris olarak ayarladik
  pinMode(potesik, INPUT);   //potesik i giris olarak ayarladik
  pinMode(buzzer, OUTPUT); // Buzzer in bulunduğu pin cikis olarak tanimlandi.
  digitalWrite(led1, LOW); //led1 sondurduk
  digitalWrite(led2, LOW); //led2 sondurduk
  digitalWrite(buzzer, LOW); //buzzer i sondurduk
  Serial.begin(9600); // seripotun hizi 9600 baud yapilir

}

void loop() {
potesikdeger = analogRead(potesik);//potesik degiskenine atadigimiz A1 pinini dinliyoruz ve degerini potesikdeger degiskenine atiyoruz
potdeger = analogRead(pot); //pot degiskenine atadigimiz A0 pinini dinliyoruz ve degerini potesikdeger degiskenine atiyoruz
Start = digitalRead(A2); //A2 girisine bagli butonu dinliyoruz ve degerini starta atiyoruz

{
if (potesikdeger == potdeger) { // potesikdeger potdeger e esit ise ledleri ve buzzeri sustur
     digitalWrite(led1, LOW); //led1 sondurduk
     digitalWrite(led2, LOW); //led2 sondurduk 
     digitalWrite(buzzer, LOW); //buzzer i sondurduk


}
if (potesikdeger != potdeger && potesikdeger > -9) { // potesikdeger potdeger e esit degilse ve potesikdeger -9 dan buyukse led1 i yak led2 yi sondur potesikder i buzzer e gonder
      digitalWrite(led1, HIGH);
      digitalWrite(led2, LOW);
      tone(buzzer, (analogRead(potesikdeger))); //A1 ile okudugumuz degere gore farkli tonlarda buzzer otecek.

    
}  
if (potesikdeger != potdeger && potesikdeger > potdeger) { // potesikdeger potdeger e esit degilse ve potesikdeger potdeger den buyukse led1 i sondur led2 yi yak potesikder i buzzer e gonder
    digitalWrite(led1, LOW);
    digitalWrite(led2, HIGH);
    tone(buzzer, (analogRead(potesikdeger))); //A1 ile okudugumuz degere gore farkli tonlarda buzzer otecek.

  
}    
if (Start == LOW) { butondurumu=1; } //buton a basilmadiysa 1 gonder
if (Start == HIGH) {butondurumu=0; } //buton a basildiysa 0 gonder
    Serial.println(potesikdeger); //potesikdeger i gonder
    Serial.print(","); //araya virgul koy
    Serial.println(butondurumu); //butondurumu nu gonder
    }
    delay(100); //degerler i her 100ms yede bir oku ve gonder
   }
 

bocek

analogRead(potesikdeger)
burada analogRead fonksiyonuna parametre olarak yine adc'den okuduğun değeri giriyorsun. Halbuki adc kanal no girmen lazım.
analogRead(potesik) olmalı.
1 ya da 0. işte 'bit'ün mesele..

karatekeli

Onuda denedim ses gene istenilen şekilde çıkmıyor herhâlde bu tone yi değiştirmek gerek ne yazmak lazım bir türlü bulamadım

karatekeli

adcden giren verinin haritasını çıkarmak gerekmiş şimdi oldu ama bir sorun daha çıktı sistem çalışınca misal veri artar ses çoğalır yeşil led yanarken adc potdeger ile potesikdeger tekrar eşit olunca led sönüyor ama ses ötmeye devam ediyor acaba nedendir yeni kodlarım

#include <SoftwareSerial.h>



int led1 = 2; //2.digital pini led1 değişkenine atadık
int led2 = 3; //3.digital pini led2 değişkenine atadık
int buzzer = 9; //9. digital pini buzzer değişkenine atadık
int pot = A0; //A0 analog pini pot değişkenine atadık
int potdeger; //Kodlarımız içerisinde kullanacağımız potdeger değişkenini oluşturduk
int potesik = A1; //A1 analog pini potesik değişkenine atadık
int potesikdeger; //Kodlarımız içerisinde kullanacağımız potdegeresik değişkenini oluşturduk
int butondurumu=0;
int Start=0;




void setup() {
  pinMode(led1, OUTPUT); //led1 i cikis olarak ayarladik
  pinMode(led2, OUTPUT); //led2 yi cikis olarak ayarladik
  pinMode(pot, INPUT);   //pot u giris olarak ayarladik
  pinMode(potesik, INPUT);   //potesik i giris olarak ayarladik
  pinMode(buzzer, OUTPUT); // Buzzer in bulunduğu pin cikis olarak tanimlandi.
  digitalWrite(led1, LOW); //led1 sondurduk
  digitalWrite(led2, LOW); //led2 sondurduk
  digitalWrite(buzzer, LOW); //buzzer i sondurduk
  Serial.begin(9600); // seripotun hizi 9600 baud yapilir

}

void loop() {
potesikdeger = analogRead(potesik);//potesik degiskenine atadigimiz A1 pinini dinliyoruz ve degerini potesikdeger degiskenine atiyoruz
potdeger = analogRead(pot); //pot degiskenine atadigimiz A0 pinini dinliyoruz ve degerini potesikdeger degiskenine atiyoruz
Start = digitalRead(A2); //A2 girisine bagli butonu dinliyoruz ve degerini starta atiyoruz
potdeger = map(potdeger, 0, 1023, 1, 2500);
potesikdeger = map(potesikdeger, 0, 1023, 1, 2500);


{
if (potesikdeger == potdeger) { // potesikdeger potdeger e esit ise ledleri ve buzzeri sustur
     digitalWrite(led1, LOW); //led1 sondurduk
     digitalWrite(led2, LOW); //led2 sondurduk 
     digitalWrite(buzzer, LOW); //buzzer i sondurduk


}
if (potesikdeger != potdeger && potesikdeger > -9) { // potesikdeger potdeger e esit degilse ve potesikdeger -9 dan buyukse led1 i yak led2 yi sondur potesikder i buzzer e gonder
      digitalWrite(led1, HIGH);
      digitalWrite(led2, LOW);
      tone(buzzer, potesikdeger); //A1 ile okudugumuz degere gore farkli tonlarda buzzer otecek.
      delay (10);
    
}  
if (potesikdeger != potdeger && potesikdeger > potdeger) { // potesikdeger potdeger e esit degilse ve potesikdeger potdeger den buyukse led1 i sondur led2 yi yak potesikder i buzzer e gonder
    digitalWrite(led1, LOW);
    digitalWrite(led2, HIGH);
    tone(buzzer, potesikdeger); //A1 ile okudugumuz degere gore farkli tonlarda buzzer otecek.
    delay (10);
  
}    
if (Start == LOW) { butondurumu=1; } //buton a basilmadiysa 1 gonder
if (Start == HIGH) {butondurumu=0; } //buton a basildiysa 0 gonder
    Serial.println(potesikdeger); //potesikdeger i gonder
    Serial.print(","); //araya virgul koy
    Serial.println(butondurumu); //butondurumu nu gonder
    }
    delay(100); //degerler i her 100ms yede bir oku ve gonder
   }
 

karatekeli

şöyle bir şey buldum ama istediğim gibi çıkıyor ses videosunda ama ben çalıştıramadım yardımcı olursanız sevinirim adc3 e 10k pot bağladım denedim olmadı ayrıca butona her basılışta çıkış sesini 1 arttırması lazım arttırmadı neyi yanlış yapıyorum

// Arduino based metal detector
// (C)Dzl july 2013
// http://dzlsevilgeniuslair.blogspot.dk/

// Connect search coil oscillator (20-200kHz) to pin 5
// Connect piezo between pin 13 and GND
// Connect NULL button between pin 12 anf GND

// REMEMBER TO PRESS NULL BUTTON AFTER POWER UP!!


#define SET(x,y) (x |=(1<<y))            //-Bit set/clear macros
#define CLR(x,y) (x &= (~(1<<y)))         // |
#define CHK(x,y) (x & (1<<y))             // |
#define TOG(x,y) (x^=(1<<y))              //-+

unsigned long t0=0;         //-Last time
int t=0;                    //-time between ints
unsigned char tflag=0;      //-Measurement ready flag

//-Generate interrupt every 1000 oscillations of the search coil
SIGNAL(TIMER1_COMPA_vect)
{
  OCR1A+=1000;
  t=micros()-t0;
  t0+=t;
  tflag=1;
}
int analogpin = 3;
int val=0;
void setup()
{
  Serial.begin(9600);
  pinMode(13,OUTPUT);    //-piezo pin
  digitalWrite(12,HIGH); //-NULL SW. pull up
  //-Set up counter1 to count at pin 5
  TCCR1A=0;
  TCCR1B=0x07;
  SET(TIMSK1,OCF1A);
}
//-Float ABS
float absf(float f)
{
  if(f<0.0)
    return -f;
  else
    return f;
}

int   v0=0;  //-NULL value
float f=0;   //-Measurement value
unsigned int FTW=0;    //-Click generator rate
unsigned int PCW=0;    //-Click generator phase
unsigned long timer=0; //-Click timer
void loop()
{
  if(tflag)
  {
    if(digitalRead(12)==LOW)  //-Check NULL SW.
      v0=t;                   //-Sample new null value
    f=f*0.9+absf(t-v0)*0.1;   //-Running average over 10 samples
    tflag=0;                  //-Reset flag
int sensorValue = analogRead(A3);
float voltage = sensorValue * (5.0/1023.0);
Serial.println(voltage);
    float clf=f*voltage;  //-Convert measurement to click frequency
    if(clf>voltage)            
      clf=voltage;
    FTW=clf;
    val = analogRead(3);
    Serial.println(voltage);
  }
  
  //-Click generator
  if(millis()>timer)
  {
    timer+=10;
    PCW+=FTW;
    if(PCW&0x8000)
    {
      digitalWrite(13,HIGH);
      PCW&=0x7fff; 
    }
    else
      digitalWrite(13,LOW);
  }
}


karatekeli