Soru & Cevap

Arduino İki farkli sensöre ait kodu birleştirme

21.07.2018 - 12:31

Merhaba;

Çok uğraşmama rağmen bir türlü yapamıyorum.İki sensöre ait kodları birleştirmem gerekiyor;

1- ) sharp 2Y0A710K0F kızılötesi sensör;

const int signalPin= 0; //yellow wire connects to analog pin A0
const int LEDPin= 12; //LED connects to digital pin 13
int signal;//this variable, signal, will hold the analog value read by the arduino

void setup() {
Serial.begin(9600); //sets the baud rate for data transfer in bits/second
pinMode(signalPin, INPUT); //the infrared sensor signal line will be an input to the arduino
pinMode(LEDPin, OUTPUT); //the LED serves an output in the circuit
}

void loop() {
signal= analogRead(signalPin); //arduino reads the value from the infrared sensor
Serial.println(signal); //prints out analog value
delay(500); //delays the next analog reading by 500 ms or a half a second

if(signal < 500){ //if the analog value is less than 200, the object is within a few inches
digitalWrite(LEDPin, HIGH);
delay (3000);
digitalWrite (LEDPin, LOW);
delay(1000);
}
else{
digitalWrite(LEDPin, LOW);
}
}

2-) Ses sensörüne ait kod;

const int LEDPin = 12;
const int Sensor = 1;

int seviye;
const int esik = 550;

void setup()
{
pinMode (LEDPin, OUTPUT);
Serial.begin(9600);
}

void loop() {
seviye = analogRead(Sensor);
if (seviye > esik)
{
digitalWrite (LEDPin, HIGH);
delay (3000);
digitalWrite (LEDPin, LOW);
delay(1000);
}
else
{
digitalWrite(LEDPin, LOW);
}
}

Yardımcı olursanız çok sevinirim.

3,690 Görüntülenme

4 Cevap

Sitedeki sorulara cevap verebilmek için giriş yapın ya da üye olun.

Profile picture for user neronkadir
neronkadir
06.08.2018 - 11:17

Yardımlarınız için teşekkür ederim. Ben şuan için çözümü iki farklı sensör için iki arduino kart kullanmakta bulabildim. Sizden son bir ricam olacak yardımcı olursanız mutlu olurum. Kullanmakta olduğum bu ses sensörü ve sharp sensörünün tetiklemesi ile bağladığım sim800l modülü üzerinden sesli arama yapmam gerekiyor, yani sadece arayacak konuşma olmayacak. Ama bu sim800l entegre edilirken kütüphane kullanmadan sadece komutlarla yapabilirsek iyi olur, çünkü kütüphaneler güncellenince güncelleme yapılmazsa kod çalışmıyormuş; onun için kütüphane kullanmadan sadece komutlarla bunu yapabilirsek iyi olur. Teşekkür ederim

Profile picture for user neronkadir
neronkadir
30.07.2018 - 11:42

Sayın üstadım birkaç günlük işimden dolayı pc'ye bakamadım ama ilginizden dolayı tekrar teşekkür ederim.  sorularınızı sırasıyla hem yazı hemde fotoğraflarla cevaplamaya çalışıyım

1- ses sensörürümü aliexpressten aldım linkini tıklayarak görebilirsiniz,(https://tr.aliexpress.com/item/Sound-Detector-module/32569653599.html?spm=a2g0s.9042311.0.0.27424c4dpt0rgH)

2- uygulamanın bağlantı şemasını ekleyeceğim fotoğraflarda ayrıntılı olarak mevcuttur,

3- güç kaynağı olarak şimdilik bilgisayardan kullanıyorum.

kullanacağım sharp kızılötesi sensör ise linke ( https://tr.aliexpress.com/item/GP2Y0A710K0F-100-NEW-SHARP-2Y0A710K-100-550cm-Infrared-distance-sensor-INCLUDING-WIRES/32773034122.html?spm=a2g0s.9042311.0.0.74154c4dQr9GOV) tıklayarak daha rahat inceleyebilirsiniz ve bu sensör 100 ile 550 cm arası iş yapmaktadır, fakat ; sharp sensörü 100 cm mesafeden daha uzaklara tutsamda 400, 500 veya 550 hatta 600 cm olarak algılayıyor. Halbuki ben ise 100 ile 200 cm arası mesafeye tutarken onun serial porttan gördüğüm kadarıyla 400 ile 600 cm arası okuması normal değil. Yardımcı olabilirseniz teşekkür ederim.

/sites/default/files/cevaplar/dosya/2020/file-20180730_223112.jpg /sites/default/files/cevaplar/dosya/2020/file-20180730_223148.jpg /sites/default/files/cevaplar/dosya/2020/file-20180730_223200.jpg /sites/default/files/cevaplar/dosya/2020/file-20180730_223230.jpg /sites/default/files/cevaplar/dosya/2020/file-20180730_223242.jpg /sites/default/files/cevaplar/dosya/2020/file-20180730_223248.jpg /sites/default/files/cevaplar/dosya/2020/file-3e.jpg
TURGUT
31.07.2018 - 12:41
Mustafa Bey, Ürün bilgileri için tşk. Yazacaklarım probleminize tam sonuç olacak mı bilmiyorum. Fakat galiba uygulamalarınızda bazı teknik yanlışlar var. Buraya ilk yüklediğiniz kodla çalıştığınızı farz ederek şu önerileri sunuyorum: - Kodlamayı kolaylaştırmak için GITHUB dan SHARP kütüphanesini indirin ve uygulayın: https://github.com/guillaume-rico/SharpIR . Nasıl kullanılacağı kütüphane sayfasında yazılıdır. İsterseniz bunu kapasitör uygulamasından önce deneyin. Aldığınız sonuçlar uygunsa kapasitöre belki lüzüm kalmaz. Bu kütüphane hem okumayı 25 kere yapıp averajını aldığı için tek okuma problemini ortadan kaldırır, hem de analog ADC çıkışını voltaja orantıladığı için aşağıdaki orantı problemini çözer. - analogRead(signalPin) işlem sonucu aldığınız veri IR ın ölçtüğü MESAFE değildir. Burada gördüğünüz rakamlar Arduino nun ADC çıkışlarıdır ve 0 ile 1023 arası değişir. Bunları doğru mesafe ortamına çevirmek için SHARP datasheet deki ( https://acroname.com/sites/default/files/assets/sharp_gp2y0a710yk0f_datasheet.pdf ) grafiklere göre bir orantı ayarlamanız ve okuduğunuz verilere uygulamanız gerekir: sensör 100cm de 2,5V ve 550cm de 1,55V verdiğine göre. Bu arada dıkkat ve kontrol etmeniz gereken bir nokta da Arduino nun ADC çıkış rakamlarının ne kadar doğru olduğudur. Bunu tespit için ufak bir döngüye analogRead(signalPin) kodunu yazarak ve bu pin e 0V ve 5V vererek aldığınız verileri kontrol edin. Eğer 0 ve 1023 alınmıyorsa, kütüphane uygulamasındaki orantı uygulama kodunda ufak değişiklik yapmak gerekebilir. - Ayrıca bu tip sensörlerin okumalarındaki dalgalanmalardan dolayı tek okumayla doğru veri almak garantili bir şey değildir. Bu teknik problemi aşmak için ilk yapabileceğiniz şey 220mF kapasitörü okuma devresinin 5V ve GND bağlantıları arasına bağlamanız (lehimlemeniz). Bu uygulama güç devresini biraz daha kontrol altına alır. Eğer kapasitör uygulayacaksanız + ve - kutuplarına dikkat edin ! - Son olarak, her ortamda belli miktarda arka plan IR radyasyon olduğundan alacağınız sonuçlar 100% doğru olmayabilir. Bu olanağı da yok edebilmek için ufak bir kalibrasyonla sensörün normal ortamdaki IR okuma verisiyle ve içindeki LED ile yapılan mesafe okuma verisi arasındaki farkı da gözden geçirebilirsiniz. Bu uygulamayı yapabilmeniz için sensörün IR LED devresini direkt 5V a bağlamak yerine programla kontrol etmeniz gerekir. Umarım bu uygulamalar projenizi düzeltmenize yardımcı olur.
Profile picture for user neronkadir
neronkadir
21.07.2018 - 11:19

Sayın üstadım elinize emeğinize sağlık, zahmet etmiş ve zaman ayırarak yardımcı olmuşsunuz size çok teşekkür ederim. Herşeyden öte ilgi ve alakanızdan ötörü minnettarım.Benim gibi bu konularla yeni tanışanlara yardımcı olmanız bizleri çok sevindiriyor.

Üstadım emeğinizi harcayarak zahmet vererek düzenlediğiniz kodu denedim ve bir iki konuda yardımcı olursanız sevinirim;

- Ses sensörünü takınca led sürekli yanıyor, eşik seviyesini artırıyorum ve potansiyometresi ile oynuyorum hiçbir şekilde led sönmüyor. Ses sensörünü söküp çıkarırsak iş düzeliyor ve led sönüyor,

-kullanmış olduğum sharp 2Y0A710K0F kızılötesi sensörde ise ; önce sinyal seviyesini 300 e düşürdüm ve serial portu açıp baktığımda ise önüne 20,30 ve 40 cm veya daha uzaktaki cisimlere tutmama rağmen serial porttan gördüğüm kadarıyla sinyal seviyesi sürekli 500,400 değerlerinden hiç aşağı inmiyor yani gerçekçi bir algılama yapamıyor.

Bu iki konuda yardımcı olursanız çok müteşekkir olurum.

TURGUT
22.07.2018 - 11:47
Detayli araştırma için: 1. Ses sensör modeli 2. Uygulamanın bağlantı şemaları 3. Güç kaynak detayı gerekir. Çabucak bir araştırdığımda kullandığınız sensörün algılama mesafeleri bahsettiğinizin dışında: SHARP IR RANGE COMPARISON MODEL OUTPUT MIN. RANGE MAX RANGE GP2D120/GP2Y0A41 Analog 1.5" 11.8" GP2Y0A02 Analog 8" 59" GP2Y0A21 Analog 4" 30" GP2Y0A710 Analog 36" 216" GP2D15 Digital 9.5" Bu veriye göre sensörünüz yalnız 91.44cm ve 548.64cm arasında dogru algılama yapacaktır. Bahsettiğiniz 20 - 40cm geçerli değildir.
picture-158072-1530701953.jpg
TGUNEYSU
21.07.2018 - 01:05

Mustafa Bey

Aşağıdaki kodlama INTERRUPT (KESME) kullanarak yapılan bir uyguama.Bunun sebebi ARDUINOnun normalde yalnız tek işlem yapabilmesi.
Birden fazla işlemi aşağı yukarı aynı zamanda yapabilmek için 1ms ayarla KESME ayarlayıp değişik TIMER sayaçlarıyla gereken işlemleri
düzenlemek gerekir.


ARDUINO nun 2ci TIMER ı kesme için 1ms aralıkla çalışacak şekilde ayarlanıyor.
İki tane TASK (iş) tanımlanıyor: KIZILoku ve LEDsöndür.

KIZILoku her 500ms de oluşturuluyor. LED de 3000ms saniyede söndürülüyor.

SES sensör okuma devamlı yapılıyor.

Bu uygulamnın bir problemi sizin her iki sensör içinde aynı LEDi kullanmış olmanız.
Daha belirli çalışması için iki ayrı LED kullanmak daha doğru olur. Bu versiyonda her iki sensörün okuma devresi aynı LEDi yakıp söndürdüğünden LED13 tam doğru çalışmayabilir.

Bunu yapmak için de bir tane daha TASKFLAG ve TASKTIMER eklemek gerekir.

Kod incelerseniz bu ufak değişikliğin kolayca uygulanabileceğini görürsünüz. Ayrıca LEDi yakıp söndürmek için:

  digitalWrite(LEDpin, !digitalRead(LEDpin));

kodu daha uygun olabilir.

Elimde bu sensörler olmadığından tam test yapılmamıştır. Önemli olan KESME tekniğinin uygulanması ve istenen aralıklarla TASKTIMERn ve TASKFLAGn rutinlerinin kodlaması.

Kolay Gelsin..

 

 

 

 

​
// iki sensör kodunun birleştirilmiş versiyonu:
 
//sharp 2Y0A710K0F kızılötesi sensör;
const int signalPin= 0; //yellow wire connects to analog pin A0
const int LEDPin= 13; //LED connects to digital pin 13
int signal;//this variable, signal, will hold the analog value read by the arduino
 
 
//SES sensör 
const int Sensor = 1;
int seviye;
const int esik = 550;
 
 
// ----- task scheduler (KESME Service Routine)
int
TaskTimer1 = 0,
TaskTimer2 = 0;
 
bool
TaskFlag1 = false,
TaskFlag2 = false;
 
 
//KESME degiskenleri
long kizilOkumaZamani = 500;  //ms
long LEDyakZamani = 3000;     //ms
long LEDsondurZamani = 1000;  //ms
 
void setup() {
  Serial.begin(9600); //sets the baud rate for data transfer in bits/second
  pinMode(signalPin, INPUT); //the infrared sensor signal line will be an input to the arduino
  pinMode(LEDPin, OUTPUT); //the LED serves an output in the circuit
 
  // ----- ARDUINO TIMER2 her 1mS da KESME için ayarlanıyor
  noInterrupts();            // disable interrupts
  TCCR2A = 0;                // clear control registers
  TCCR2B = 0;
  TCCR2B |= (1 << CS22) |    // 16MHz/128=8uS
            (1 << CS20) ;
  TCNT2 = 0;                 // clear counter
  OCR2A = 125 - 1;           // 8uS*125=1mS (allow for clock propagation)
  TIMSK2 |= (1 << OCIE2A);   // enable output compare interrupt
  interrupts();              // enable interrupts
 
 
}
 
void loop() {
 
  //Eğer gereken TASKFLAG aktifse o işi yap:
 
 
  // ----- KIZIL oku 500ms
  if (TaskFlag1) {
    TaskFlag1 = false;
    kızıl();
  }
 
  // ----- 3 saniyede LED sondur
  if (TaskFlag2) {
    TaskFlag2 = false;
    LEDoff();
  }
 
  ses();
 
}
 
 
void kizil() {
  signal= analogRead(signalPin); //arduino reads the value from the infrared sensor
  Serial.println(signal); //prints out analog value
 
  if(signal < 500)
  {
    LEDon(); //if the analog value is less than 200, the object is within a few inches
    TaskTimer2 = 0;
  }
}
 
 
void ses() {
  seviye = analogRead(Sensor);
  if (seviye > esik) 
  {
    LEDon(); //if the analog value is less than 200, the object is within a few inches
    TaskTimer2 = 0;
  }
}
 
 
void LEDon() {
  digitalWrite (LEDPin, HIGH);
}
 
 
void LEDoff() {
  digitalWrite (LEDPin, LOW);
}
 
 
// -------------------------------
// task scheduler (1mS interrupt)
// -------------------------------
ISR(TIMER2_COMPA_vect)
{
  // ----- timers
  /*
     Her TIMER kendi işinin zamanını sayar.
     Her yeni İŞ ayrı bir TIMER ve FLAG gerektirir.
  */
  TaskTimer1++;
  TaskTimer2++;
 
  // ----- task1
  if (TaskTimer1 > kizilOkumaZamani - 1) { // KIZILoku 500ms
    TaskTimer1 = 0;
    TaskFlag1 = true;
  }
 
  // ----- task2
  if (TaskTimer2 > LEDyakZamani - 1) {  // LED sondur @ 3000ms
    TaskTimer2 = 0;
    TaskFlag2 = true;
  }
 
 
}
 
 
 ​