Merhaba arkadaşlar. C ile şu formülleri yazmam gerekiyor vakti olan yardımcı olabilir mi acaba ?
ppb= ((VB/ VC - 1 ) *RL/Ro *10-c)^1 /m
Rs/Ro=(VB/ VC - 1) *RL/Ro
Arduino da ppm hesaplmam için gerekli Arduino idede yazıcam. Aynı şekilde stm32f4 içinde yazmam gerekiyor. Keil de
Yazmışsın işte :)
float ppb;
float RsRo;
ppb = ((VB/VC - 1) * (RL/Ro) * (10-c)) ^ (1 /m);
RsRo = (VB/VC - 1) * (RL/Ro);
(10-c)) ^ (1 /m); burada ^ işareti üs anlamına gelmez, dikkat!!
kök ile üs arasında ohm ile siemens arasındaki bağıntı olduğundan
o yazım şekli ile üs anlamına gelir ama kodlarken m. dereceden kök işlemi daha hızlı olabilir,
iki türlü de denemek lazım
Alıntı yapılan: ErsinErce - 29 Mayıs 2014, 10:55:41
kök ile üs arasında ohm ile siemens arasındaki bağıntı olduğundan
o yazım şekli ile üs anlamına gelir ama kodlarken m. dereceden kök işlemi daha hızlı olabilir,
iki türlü de denemek lazım
Hocam C 'de ^ operatörü XOR işlemini temsil ediyor. O yazımda xor işlemi yapılmış olmuyor mu?
Pardon benim hatam. Doğru ^ üst almaz XOR yapar. Aceleyle cevap yazdım. Doğrusu aşağıdaki gibi olacak.
#include <math.h>
float ppb;
float RsRo;
ppb = pow((VB/VC - 1) * (RL/Ro) * (10-c), 1 /m);
RsRo = (VB/VC - 1) * (RL/Ro);
Burada verdiğim üst alma standart C kütüphanesi kullanıyor. Hızlı olsun derseniz pow() fonksiyonunu kendiniz uygun bir optimizasyonla yazmalısınız.
Hız için x^y = e^(y*ln(x)) olduğundan bunu optimize etmek gerekiyor.
Alıntı yapılan: muuzoo - 29 Mayıs 2014, 11:10:34
Hocam C 'de ^ operatörü XOR işlemini temsil ediyor. O yazımda xor işlemi yapılmış olmuyor mu?
doğru xor işlemi, artık ezbere gittiğimizden herhalde 1/m den dolayı direk üs mü kök mü sorusunun üzerine gittim =)
Bu ^ işaretinin gözümüzden kaçması çok önemli bir hata aslında. Bu tip şeylere çok dikkat etmek gerekli. Çünkü eğer hayatı ilgilendiren bir projede kod yazıyor olsaydık derleyici burada hata vermeden kodu derleyecekti. PC-Lint bile bu hatanın üstesinden gelemez.
Alıntı yapılan: ByteMaster - 29 Mayıs 2014, 12:02:18
Bu ^ işaretinin gözümüzden kaçması çok önemli bir hata aslında. Bu tip şeylere çok dikkat etmek gerekli. Çünkü eğer hayatı ilgilendiren bir projede kod yazıyor olsaydık derleyici burada hata vermeden kodu derleyecekti. PC-Lint bile bu hatanın üstesinden gelemez.
üniter testler de çikmaz mi ? Bu tip formülleri elbet tek tek çalistirip sonuçlarini karsilastirmak gerekir.
Alıntı yapılan: picusta - 29 Mayıs 2014, 22:06:22
üniter testler de çikmaz mi ? Bu tip formülleri elbet tek tek çalistirip sonuçlarini karsilastirmak gerekir.
Evet çıkar. :) Oralara girersek TDD nedir diye kökten anlatmak lazım. Ben kısa kısa geçtim. Zira bu konuları benden çook çook daha iyi anlatabilecek üstadlarım var forumda.
Alıntı yapılan: ByteMaster - 29 Mayıs 2014, 12:02:18
Bu ^ işaretinin gözümüzden kaçması çok önemli bir hata aslında. Bu tip şeylere çok dikkat etmek gerekli. Çünkü eğer hayatı ilgilendiren bir projede kod yazıyor olsaydık derleyici burada hata vermeden kodu derleyecekti. PC-Lint bile bu hatanın üstesinden gelemez.
Float degiskenler uzerinde logic islemler yapilabilirmi? Derleyicinin hata vermesi lazim.
Alıntı yapılan: z - 29 Mayıs 2014, 22:29:01
Float degiskenler uzerinde logic islemler yapilabilirmi? Derleyicinin hata vermesi lazim.
Bende bilmiyorum bir deneyin hocam sonucu bizimle paylaşın. Hatta eğer hata veriyorsa float değişkenleri XOR etmek mümkün müdür acaba ? Yada bu mantıklı mıdır ?
Bence mümkündür ancak mantıklı değildir. Derleyici bunları iki tane 32 bitlik veri gibi görür ve XOR yapar. Çıkan sonucun da hiçbir anlamı olmaz. Bence hata değil ama uyarı vermesi gerekir.
Aslında integral veri türü gerektirdiğine dair hata verir. Yani @z hocam haklı. Ayrıca float sayıların XOR edilmesi anlamsız olduğundan derleyiciler ve ben yukarıda hernekadar aksini belirtmiş gibi görünsemde (sadece acaba kim araştıracak diye düşünmüştüm.) PC-Lint gibi static analiz araçları buna müsade etmez. Ancak her ne kadar mantıksız olsa da yapılamaz ve her derleyici tarafından algılanabilir değildir.
float işlemler için XOR bu sebeple tanımlanmamıştır. Ama ben psikopatım ve bunu yapacam derseniz yapılır. Buna benzer birşeyde '%' mod operatörüdür. ama bunun için fonksiyon fmod() kullanımı vardır. Çünkü float sayılarda mod mantıklı bir işlemdir.
Arkadaşlar yorumlara göre ortaya cıkan formul ve ortamdaki ozon miktarını hesaplayıp PPB değerini gösteren formülüm
//VARIABLES FOR OZONE SENSOR
float Vc=0.0;
float ratio=0.0;
float x=0.0;
float ppbvalue=0.0;
float ppb=0.0;
float c=1.505;
float m=-0.903;
float Ro=23850.0;
float Rs=0.0;
float Rl=10000.0; //or 20000k ohm
//MQ-131 Ozone Sensor Read
float Vc=5.0*analogRead(Ozone_sensor_pin)/1024;
Rs=(float)(5.0/Vc-1)*Rl;
ratio=(float)Rs/Ro;
x=pow(10,-c);
ppbvalue=ratio*x;
ppb=(float)pow(ppbvalue,1/m);
Sadece formülazasyon kısmı burada bu kod arduino içinde yazılmıstır.
Kullanılan sensörün datasheet i ----> https://www.futurlec.com/Datasheet/Sensor/MQ-131.pdf (https://www.futurlec.com/Datasheet/Sensor/MQ-131.pdf)
Bu sensör için verilen grafiğe göre formül çıkardım ve değerlerim yukarıda bulabilirsiniz. Bana göre formül güzel çalışmıyor. yani İstediğim değerleri göremiyorum absürd degerleri gördüm hep , Ro hesaplayamadım sabit değer alıyorum sürekli 20 k ohm civarı ve RL yide aynı şekilde kafama göre 10k yada 20 k alarak işlemlerimi yapıyorum. Belkide sorun katsayılarımda da olabilir bilemiyorum vakti olan varsa ilgilenebilirse cok makbule geçer. Datasheette grafik logaritmik kagıda yazılmıs yani çözerken ona dikkat ederek çözebilirisniz
logaritmik kagıt ile ilgili ders içinde ---> https://www.lhup.edu/~dsimanek/scenario/errorman/graphs2.htm (https://www.lhup.edu/~dsimanek/scenario/errorman/graphs2.htm) linkini kullanabilirsiniz. Şimdiden teşekkür ediyorum
//MQ-131 Ozone Sensor Read
float Vc=5.0*analogRead(Ozone_sensor_pin)/1024;
Rs=(float)(5.0/Vc-1)*Rl;
Diğer kısımlarda hata olup olmadığını bilmiyorum. İncelemedim. ama bu kısım doğruluğu etkiler.
5.0 olarak gösterdiğiniz değer 5V 1024 ADC çözünürlüğü sanırım.
Meslek hayatık boyunca , bir kere bile (referans / çözünürlük * adc_değeri) formülüne değerleri bu şekilde girip doğru sonucu alamadım.
çok istedim ama olmadı.
formüle 5.0 şeklinde bir değer girmek için doğruluk sınıfı çoook yüksek bir referans kullanmanız gerek.
ADC'den gelen değeri bbu şekilde doğrudan girebilmek için, sensör çıkışının çook yüksek doğrulukta olması gerek. Datasheetten gördüğüm kadarıyla doğruluk %2 , ölçüm doğruluğu %5
Doğru sonucu almak için yapmanız gereken şey; kalibrasyon.
Önce hiç ozon olmayan bir ortamda ADC değerini okuyup, Offset değerini bulacaksınız. Sonra sensörün ölçebildiği en yüksek ozon miktarına mümkün olduğunca yaklaşıp , kalibreli bir ozon sensöründen okuduğunuz değeri ve sizin ADCden okuduğunuz değeri alıp bunu span olarak belirleyeceksiniz, sonra da, linearizasyon gerektiriyorsa, linearizasyon yapacaksınız.
Diğer ksımları incelemediğim için, başka hatalar var mı bilmiyorum. Ama bu dediklerimi apmadığınız sürece, diğer hataları düzeltseniz bile asla doğru sonucu alamazsınız.
Alıntı yapılan: Klein - 03 Haziran 2014, 12:16:34
5.0 olarak gösterdiğiniz değer 5V 1024 ADC çözünürlüğü sanırım.
Meslek hayatık boyunca , bir kere bile (referans / çözünürlük * adc_değeri) formülüne değerleri bu şekilde girip doğru sonucu alamadım.
çok istedim ama olmadı.
Hocam ADC'yi voltaj olarak göstermek için
(referans / çözünürlük * adc_değeri)
yerine hangi metodu tavsiye edersiniz?
mesajın altında anlattım. Hiç bir zaman oraya girilen değerler tutmaz.
5.0 dediniz ama referansınız gerekten 5.000V değildir, R1=1000 dersiniz ama hiç bir zaman o direncin değeri 1000 değildir.
Ancak her cihaz için bu değerleri tek tek ölçer ve formüle girerseniz, o zaman tutar.
Yani önce hangi aralıklarda, hangi ADC değerleri alıyorum ona bakıp geniş bir liste yapacağız.
MCU ile ölçüm yaparken bu liste ile karşılaştıracağız, kabaca hangi aralıktaysa o iki değer arasında olduğuna kanıt getireceğiz.
Sonra bir formülle, orantı kurup gerçek değere daha(oldukça) yakın bir sonuç göstereceğiz.
Sonucun gerçekliğe olan yakınlığı ilk yaptığımız listenin büyüklüğü ile doğru orantılı.
Doğru anlamış mıyım?
Alıntı yapılan: Klein - 03 Haziran 2014, 12:16:34
//MQ-131 Ozone Sensor Read
float Vc=5.0*analogRead(Ozone_sensor_pin)/1024;
Rs=(float)(5.0/Vc-1)*Rl;
Diğer kısımlarda hata olup olmadığını bilmiyorum. İncelemedim. ama bu kısım doğruluğu etkiler.
5.0 olarak gösterdiğiniz değer 5V 1024 ADC çözünürlüğü sanırım.
Meslek hayatık boyunca , bir kere bile (referans / çözünürlük * adc_değeri) formülüne değerleri bu şekilde girip doğru sonucu alamadım.
çok istedim ama olmadı.
formüle 5.0 şeklinde bir değer girmek için doğruluk sınıfı çoook yüksek bir referans kullanmanız gerek.
ADC'den gelen değeri bbu şekilde doğrudan girebilmek için, sensör çıkışının çook yüksek doğrulukta olması gerek. Datasheetten gördüğüm kadarıyla doğruluk %2 , ölçüm doğruluğu %5
Doğru sonucu almak için yapmanız gereken şey; kalibrasyon.
Önce hiç ozon olmayan bir ortamda ADC değerini okuyup, Offset değerini bulacaksınız. Sonra sensörün ölçebildiği en yüksek ozon miktarına mümkün olduğunca yaklaşıp , kalibreli bir ozon sensöründen okuduğunuz değeri ve sizin ADCden okuduğunuz değeri alıp bunu span olarak belirleyeceksiniz, sonra da, linearizasyon gerektiriyorsa, linearizasyon yapacaksınız.
Diğer ksımları incelemediğim için, başka hatalar var mı bilmiyorum. Ama bu dediklerimi apmadığınız sürece, diğer hataları düzeltseniz bile asla doğru sonucu alamazsınız.
Hocam dediğinizi anladım zaten ben ölçüm yaptıgımda avometre ile kodun söylediği arasında 0.5v akdar bir fark oluyor. http://www.sensorsportal.com/DOWNLOADS/MQ131.pdf (http://www.sensorsportal.com/DOWNLOADS/MQ131.pdf) bu datasheete göre 1. sayfanın altıdna formüller var bizde ona göre yazmıs bulunmaktayız. diğer referans bir örnek te burada http://www.iitk.ac.in/dord/power/documents/projects/aqms-phase1.pdf (http://www.iitk.ac.in/dord/power/documents/projects/aqms-phase1.pdf) bu linke olayı daha iyi anlatıyor. Olay benim parametrelerde sanırsam. Yani NŞA da oda kşullarında ozon değeri 30- 50 ppb arası falan diyorlar ben bunu referans aldım. Söyle bir durumda var mesela ben buradan VC yi ekrana bastırdıgımda 5.0 hiç olmuyor mak 3.7 falan kalıyor başlangıc değeri olarak da 1.5 volt falan oluyor.
Birde özellikle dedğiniz yerde bir hata yok sanırım ben mi göremedim. Oradaki ADC den okuyup voltaj hesaplatma işlemi dogru değil mi her ne kadar tam değer vermemiş olsada :)
Hata hesaplamada değil.
Ama şuna da dikkat et. Linear olmayan sistemlerin kalibrasyonundaki küçük farklar , sonuç üzerinde çok büyük farklara neden olabilir. Atmosferdeki ozon oranını tahmini olarak aldığınızı da düşünüp , hata payına bunu da eklersek, sonu hiç tahmin etmediğin bir yere gidebilir.
Belki de hesaplamaların , formüllerin doğru , ancak buradaki kayıklıkların toplamı + inear olmayan sistem faktörü birleşince böyle oluyor.
Edit : Ama yine de başka bir yerlerde hata olup olmadığını iyi araştır. Sonra aleti kalibre edeceğim diye günlerce uğraştıktan sonra , hata başka yerde çıkarsa, kulaklarım çınlasın istemem :)
haklısınız hocam sanırm bende değerlerimi buna göre değiştirmeliyim mesela ben ortamda ki ozon değerini 150 ppb ile 500 ppb arasında tutmaya calısıyordum bunu 75 e 300 gibi değer aralıgıdna ceksem mantıklı olucak . Sizce ?
Ortamdaki ozon değeri hakkında hiç fikrim yok. ne desem boş.
Önerim şu olur. Eğer bu bir hobi projesiyse, çok dert etmeye gerek yok. üç aşağı beş yukarı tutuyorsa, amacına ulaşmıştır. Ama ticari projeyse, ve kullanılacağı yerde doğruluk önemliyse, bu iş tahminle olmaz. Muhakkak kalibreli bir cihaz temin edip , referanslarınızı buna göre düzeltmeniz gerekir.
Ticari olucak hocam. Sorunda su dediğinizi gibi bir cihaza denk gelmedim dhaa önce o yuzden referans değerlerine göre gidiyoruz sürekli. Ozon değerlerini ölçen cihazlar ile ilgili fikriniz var mı ?
Bu işle hiç uğraşmadım. İnternette bir ka link buldum. Onlar da aşağıda.
Belki de kalibratör lmadan da farklı yollarla kalibrasyon yapma yöntemleri vardır. Bilimsel yayınların yapıldığı sitelerden veya patent sitelerinden araştırmak faydalı olabilir.
http://www.twobtech.com/model_306.htm (http://www.twobtech.com/model_306.htm)
http://www.coleparmer.com/Product/Eco_Sensors_A_21ZX_Ozone_Monitor_digital/SC-86316-30 (http://www.coleparmer.com/Product/Eco_Sensors_A_21ZX_Ozone_Monitor_digital/SC-86316-30)
http://www.environics.com/Product/ambient-monitor-calibrator-with-ozone-generator/series-6100/ (http://www.environics.com/Product/ambient-monitor-calibrator-with-ozone-generator/series-6100/)
http://www.directindustry.com/prod/teledyne-advanced-pollution-instrumentation/calibrators-ozone-o3-analyzers-22283-1253625.html (http://www.directindustry.com/prod/teledyne-advanced-pollution-instrumentation/calibrators-ozone-o3-analyzers-22283-1253625.html)
http://www.ozonesolutions.com/info/ozone-monitor-calibration (http://www.ozonesolutions.com/info/ozone-monitor-calibration)
http://www.ecotech.com/calibration/gas-calibrator (http://www.ecotech.com/calibration/gas-calibrator)
Teşekkürler hocam yardımlarınız için. :)