Arduino EC (İletkenlik) Ölçer Yapımı
Bu Blog, akvaponik/hidroponik veya su kalitesiyle ilgili projeleriniz için ucuz bir EC ölçerin nasıl yapılacağını göreceğiz.
Malzemeler;
- 220v fiş (prob olarak kullanacağız şemada cn1 olarak belirttim)
- 1k direnç (elinizde yoksa 300 ohmdan küçük olmayan herhangi bir direç olur yazılımda düzeltmeniz gerekir.) arduino nano veya uno da olabilir.
- ds18b20 su geçirmez sıcaklık probu elinizde yok ise lm35 yalıtımlşı hale getirerek ve kodu düzenleyerek kullanabilirsiniz.
Çalışma Mantığı
PPM, bir sıvının EC'sinden hesaplanır, EC, sıvının elektrik direncinin tersidir. Bir sıvının EC'sini veya PPM'sini, fiş ilgili sıvıya daldırıldığında iki prob [Fiş pimleri] arasındaki direnci ölçerek tahmin ediyoruz.
Ec ölçümü AC kullanılarak yapılmalıdır, aksi takdirde ilgilenilen sıvı polarize olur ve kötü okumalar verir. Bu, bir ifadeyi gerçek olarak kabul etmek yerine , polarizasyona maruz kalmadan çok hızlı bir DC okuması alabiliriz. Bu da gerçekten ucuz bir EC sensörü yapabileceğimiz anlamına geliyor.
Sıcaklık Telafisi;
Sıcaklığın sıvıların iletkenliği üzerinde etkisi vardır, bu yüzden bunu telafi etmemiz önemlidir.
Küçük sıcaklık değişimleri için bunları 25*C'deki eşdeğer EC'lerine dönüştürmek amacıyla bir doğrusal yaklaşım kullanmak yaygındır.
EC25 = EC /( 1 + a (T - 25) )
EC25- 25°C'de eşdeğer EC
EC - Ölçülen EC
T- Ölçüm Sıcaklığı [Derece Santigrat]
a = 0,019 °C [Genellikle besin çözeltileri için kullanılır]
R1 değerine karar verme;
R1'i 300 ohm'dan daha düşük bir dirençle değiştirmeyin
Ölçmek istediğimiz EC aralığını değiştirmek için voltaj bölücüdeki R1 Değerini değiştirebiliriz. Aşağıda Eşdeğer Voltaj bölücü devresi bulunmaktadır.
Ra
Dijital pinlerin direnci datasheet'te belirtilmemiş bunun yerine bir grafikten çıkarmamız gerekiyor.
Atmel 2560 Veri Sayfasının [387] sayfasındaki grafikten yola çıkarak “Şekil 32-25. G/Ç Pin Çıkış Voltajı ve Kaynak Akımı (VCC = 5V)”
V=IR
Ra= V/I [Şekilden] V=0,4 I=1,5e-4 R=25 ohm tahmini
Rc
Rc, ölçülen sıvının EC [PPM]'sine göre değişecektir. Sıcaklık değişimlerini ve hücre sabiti K'yi hesaba katarak ölçmek istediğimiz sıvı aralığı için görmeyi beklediğimiz maksimum ve minimum değerleri hesaplayacağız. [Fiş probu için K'yi 3 olarak tahmin edeceğiz, önceki testlerden tahmin edeceğiz]
EC = EC25*( 1 + a (T - 25))
R=(1000/(EC*K)) +Ra
Min temp=0
Maksimum Sıcaklık = 40 *C
Minimum EC 25=0,3 EC= 0,3*(1+0,019*(0-25) Min EC= 0,16 S/sm
Maksimum EC 25 = 3 EC = 0,3*(1+0,019*(40-25) Maksimum EC = 3,9 S/cm
Min Direnç = 1000/(MaksEC*K)+25 = 1000(3,9*2,88) =114 ohm
Maksimum Direnç = 1000/(MinEC*K)+25 = 1000/(0,16*2,88) = 2195 ohm
R1
Artık amaçlanan ölçüm aralığımız üzerinde en iyi çözünürlüğü elde etmek için R1 için iyi bir değer hesaplamak için yeterli bilgiye sahibiz. Her şeyi matematiksel olarak toplayıp tepe noktasını bulmak için farklılaştırabiliriz, ancak bu kafamı ağrıtıyor, bu yüzden EC için Voltaj bölücüsü için hızlı bir excel elektronik tablosu yaptım ve şunları görmeyi bekliyorum:
Gördüğünüz gibi R1 için 500 ohm değerini kullanarak en büyük farkı elde ediyoruz, elimde sadece 1Kohm vardı bu yüzden biraz daha dar bir menzille yetinmek zorundayım.
Bu yüzden 500 ohm'luk bir direnç seçtik
EC – Aralık / Voltaj Aralığı * (5/ADC adımları)
(3.9-0.16)/3.14 * 5/1024 = 5.8e-3 çözünürlük yani 0.0058 çözünürlük
Bunu PPM olarak ifade etmek gerekirse [Tranchen [Avustralya] PPM dönüşümü: 0.7] bu 4ppm'lik bir çözünürlüktür .
Akvaponi veya hidroponi için ihtiyacımız olandan çok daha fazlası.
İçme suyunun kalitesini ölçmek istiyorsanız beklenen Ec değerlerini hesaplamanız ve buna göre R1'i artırmanız gerekecektir.
Kalibrasyon Kodu
Sensörün kalibrasyonu ve Hücre Sabiti K'nin ince ayarı için kullanılır
Sensörü ve sıcaklık probunu kalibrasyon solüsyonuna daldırın ve sıcaklık probunun yerleşmesi için bir süre bekleyin Kalibrasyon çözeltisinin değerini çözelti gücüne uyacak şekilde değiştirin
Çözeltinin iyi karıştığından emin olmak için probu karıştırın ve kodu arduinoya yükleyin
Tahmini Hücre Sabiti K'nin güncellemesi için terminali açın yaklaşık 3 olmalıdır ve bu yeni değeri ana EC kodunda kullanın.
Gerekli Olan Kütüphaneler;
#include <OneWire.h>
#include <DallasTemperature.h>
//************************* Kullanıcı Tarafından Tanımlanan Değişkenler ********************************************************//
float CalibrationEC = 4.80; //Kalibrasyon çözeltisinin EC değeri s / cm'dir
int R1 = 1000;
int Ra = 25; //iç direnç
int ECPin = A0;
int ECGround = A2;
int ECPower = A1;
float TemperatureCoef = 0.019; //su inceleme faktörü
//************ Sıcaklık Probu İlgili *********************************************//
#define ONE_WIRE_BUS 10
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
float Temperature = 0;
float EC = 0;
int ppm = 0;
float raw = 0;
float Vin = 5;
float Vdrop = 0;
float Rc = 0;
float K = 0;
int i = 0;
float buffer = 0;
void setup()
{
Serial.begin(9600);
pinMode(ECPin, INPUT);
pinMode(ECPower, OUTPUT);
pinMode(ECGround, OUTPUT);
digitalWrite(ECGround, LOW);
delay(100);
sensors.begin();
delay(100);
R1 = (R1 + Ra);
Serial.println("NRShield Arduino EC-PPM ölçümleri Kalibrasyonu");
Serial.println("By:NRShield nurisabanoglu2@gmail.com");
Serial.println("");
Serial.println("Prob ve Sıcaklık Sensörünün Çözelti içinde olduğundan ve çözeltinin iyi karıştırıldığından emin olun");
Serial.println("");
Serial.println("Kalibrasyona Başlama: Tahmini Süre 60 Saniye:");
}
void loop()
{
i = 1;
buffer = 0;
//************Sıvının Direncini Tahmin Eder ****************//
while (i <= 10)
{
digitalWrite(ECPower, HIGH);
raw = analogRead(ECPin);
raw = analogRead(ECPin);
digitalWrite(ECPower, LOW);
buffer = buffer + raw;
i++;
delay(5000);
}
raw = (buffer / 10);
sensors.requestTemperatures();
Temperature = sensors.getTempCByIndex(0);
//*************Sıcaklık için Telafi Etme********************//
EC = CalibrationEC * (1 + (TemperatureCoef * (Temperature - 25.0))) ;
//***************** Kalibrasyon sıvısı ile ilgili K'yi hesaplar **************************//
Vdrop = (((Vin) * (raw)) / 1024.0);
Rc = (Vdrop * R1) / (Vin - Vdrop);
Rc = Rc - Ra;
K = 1000 / (Rc * EC);
Serial.print("Calibration Fluid EC: ");
Serial.print(CalibrationEC);
Serial.print(" S ");
Serial.print("Hücre Sabiti K");
Serial.print(K);
}
EC ve PPM Ölçüm Kodu
#include <OneWire.h>
#include <DallasTemperature.h>
int R1 = 500;
int Ra = 25;
int ECPin = A0;
int ECGround = A2;
int ECPower = A1;
// Hana [USA] PPMconverion: 0.5 amerika alınacak dönüşüm değeri
// Eutech [EU] PPMconversion: 0.64 avrupada alınacak dönüşüm değeri
float PPMconversion = 0.64;
float TemperatureCoef = 0.019;
//Kalibrasyon Ölçülen değer
float K = 1.41;
#define ONE_WIRE_BUS 10
const int TempProbePossitive = 8;
const int TempProbeNegative = 9;
OneWire oneWire(ONE_WIRE_BUS); // Herhangi bir OneWire cihazıyla iletişim kurmak için bir oneWire örneği kuruldu
DallasTemperature sensors(&oneWire); // OneWire referansımızı Dallas Temperature'a aktarılıyor
float Temperature = 16.16;
float EC = 0;
float EC25 = 0;
int ppm = 0;
float raw = 0;
float Vin = 5;
float Vdrop = 0;
float Rc = 0;
float buffer = 0;
void setup() {
Serial.begin(9600);
pinMode(TempProbeNegative, OUTPUT);
digitalWrite(TempProbeNegative, LOW);
pinMode(TempProbePossitive, OUTPUT);
digitalWrite(TempProbePossitive, HIGH);
pinMode(ECPin, INPUT);
pinMode(ECPower, OUTPUT);
pinMode(ECGround, OUTPUT);
digitalWrite(ECGround, LOW);
delay(100);
sensors.begin();
delay(100);
R1 = (R1 + Ra);
Serial.println("NRShield Arduino EC-PPM ölçümleri Kalibrasyonu");
Serial.println("By:NRShield nurisabanoglu2@gmail.com");
Serial.println("");
Serial.println("Prob ve Sıcaklık Sensörünün Çözelti içinde olduğundan ve çözeltinin iyi karıştırıldığından emin olun");
Serial.println("");
Serial.println("5 saniyelik aralıklarla ölçümler:");
}
void loop() {
GetEC();
PrintReadings();
delay(5000); //su polarize olmasın diye bekleme süresi 5sn
}
void GetEC() {
sensors.requestTemperatures();
Temperature = sensors.getTempCByIndex(0);
digitalWrite(ECPower, HIGH);
raw = analogRead(ECPin);
raw = analogRead(ECPin);
digitalWrite(ECPower, LOW);
Vdrop = (Vin * raw) / 1024.0;
Rc = (Vdrop * R1) / (Vin - Vdrop);
Rc = Rc - Ra; //Dijital Pin Direncinin Hesaplanması
EC = 1000 / (Rc * K);
EC25 = EC / (1 + TemperatureCoef * (Temperature - 25.0));
ppm = (EC25) * (PPMconversion * 1000);
}
void PrintReadings() {
Serial.print("Rc: ");
Serial.print(Rc);
Serial.print(" EC: ");
Serial.print(EC25);
Serial.print(" mS/cm ");
Serial.print(ppm);
Serial.print(" ppm ");
Serial.print(Temperature);
Serial.println(" *C ");
/*
//********** Hata Ayıklama için ************
Serial.print("Vdrop: ");
Serial.println(Vdrop);
Serial.print("Rc: ");
Serial.println(Rc);
Serial.print(EC);
Serial.println("Siemens");
*/
}
Herhangi bir sorunuz varsa iletişe geçmekten çekinmeyin.
Yorumlar
Yorum Gönder
Düşüncelerini veya yorumlarını bizimle paylaş.