İçindekiler:

Sıcaklık, PH ve Çözünmüş Oksijen için Veri Kaydedici Nasıl Yapılır: 11 Adım (Resimlerle)
Sıcaklık, PH ve Çözünmüş Oksijen için Veri Kaydedici Nasıl Yapılır: 11 Adım (Resimlerle)

Video: Sıcaklık, PH ve Çözünmüş Oksijen için Veri Kaydedici Nasıl Yapılır: 11 Adım (Resimlerle)

Video: Sıcaklık, PH ve Çözünmüş Oksijen için Veri Kaydedici Nasıl Yapılır: 11 Adım (Resimlerle)
Video: Online Söyleşi-9 Sürekli Atıksu İzleme Sistemleri 2024, Kasım
Anonim
Image
Image
resim
resim

Hedefler:

  • ≤ 500 $ için bir veri kaydedici yapın. Sıcaklık, pH ve DO için verileri bir zaman damgasıyla ve I2C iletişimini kullanarak depolar.
  • Neden I2C (Entegre Devre)? Her birinin benzersiz bir adresi olduğu göz önüne alındığında, aynı hatta birçok sensör toplanabilir.

Aşama 1:

Adım 2: Aşağıdaki Parçaları Satın Alın:

Aşağıdaki Parçaları Satın Alın
Aşağıdaki Parçaları Satın Alın
  1. Arduino MEGA 2560, 35 $,
  2. Arduino kartı için güç adaptörü, 5,98 ABD doları,
  3. LCD modülü I2C (ekran), 8,99 ABD doları,
  4. Gerçek Zamanlı Saat (RTC) çıkışı, 7,5 ABD doları,
  5. MicroSD kart koparma kartı, 7,5 $,
  6. 4 GB SD kart, 6,98 ABD doları,
  7. Su geçirmez DS18B20 Dijital sensör, 9,95 ABD doları,
  8. pH probu + Kitler+ Standart tamponlar, 149,15 $,
  9. DO probu + Kitler+ Standart tamponlar, 247,45$,
  10. Breadboard, atlama kablosu, 7,98 ABD doları,
  11. (Opsiyonel) Voltaj İzolatörü, 24 $,

Toplam: 510,48$

* Belirli parçalar (jenerik kart gibi) diğer satıcılardan (eBay, Çinli satıcı) daha düşük bir fiyata satın alınabilir. Atlas Scientific'ten almak için pH ve DO probları önerilir.

* İletkenliği ve voltajı kontrol etmek için bir multimetre önerilir. Yaklaşık 10-15 dolar tutuyor (https://goo.gl/iAMDJo)

Adım 3: Kablolama

kablolama
kablolama
  • Parçaları aşağıdaki çizimde gösterildiği gibi bağlamak için atlama teli/DuPont kabloları kullanın.
  • İletimi kontrol etmek için multimetreyi kullanın.
  • Pozitif Voltaj Kaynağını (VCC) ve Topraklamayı (GND) kontrol edin (devreye aşina değilseniz karıştırılması kolaydır)
  • Güç adaptörünü prize takın ve her parçadaki güç göstergesini kontrol edin. Şüphe duyduğunuzda, VCC ve GND arasındaki voltajın (5V) olduğunu kontrol etmek için multimetreyi kullanın.

Adım 4: PH, DO Devreleri, SD Kartı hazırlayın

PH, DO Devreleri, SD Kartı hazırlayın
PH, DO Devreleri, SD Kartı hazırlayın
  1. pH ve DO devreleri için I2C'ye geçin
  2. pH ve DO kesintileri, varsayılan mod İletim/Alım (TX/RX) olarak Seri iletişim ile gönderilir. I2C modunu Saat hattını (SCL) ve Veri hattını (SDA) kullanmak için, modu (1) şu şekilde değiştirin: VCC, TX, RX kablolarını çıkarın, (2): Prob, PGND için TX'i Ground'a atlayın (GND değil)), (3) VCC'yi devreye takın, (4): LED'in Yeşilden Maviye dönmesini bekleyin. 39. sayfada daha fazla ayrıntı kontrol edin (pH devresi için veri sayfası,
  3. Aynı adımı DO devresi ile yapın
  4. (Örnek kodu panoya nasıl yükleyeceğinizi biliyorsanız Seri monitörden yapabilirsiniz)
  5. SD kartı FAT formatına biçimlendirin

Adım 5: Yazılımı Hazırlayın

Yazılım Hazırlayın
Yazılım Hazırlayın
Yazılım Hazırlayın
Yazılım Hazırlayın
Yazılım Hazırlayın
Yazılım Hazırlayın
Yazılım Hazırlayın
Yazılım Hazırlayın
  1. Arduino Entegre Geliştirme Ortamını (IDE) indirin,
  2. Arduino IDE'ye kütüphane kurun:
  3. Çoğu Arduino yazılımı ile birlikte gelir. LiquidCrystal_I2C.h, GitHub üzerinden edinilebilir
  4. USB için sürücüyü yükleyin. Orijinal Arduino için bir tane yüklemeniz gerekmeyebilir. Genel bir sürücü için CH340 sürücüsünü yüklemeniz gerekir (GitHub:
  5. Yanıp sönen bir LED testi çalıştırarak kartı doğru şekilde bağlayıp bağlamadığınızı kontrol edin.
  6. 18B20 dijital sıcaklığın MAC adresi nasıl bulunur. Arduino IDE'de prob takılıyken I2C tarayıcı şablonunu kullanma. Her cihazın benzersiz bir MAC adresi vardır, böylece bir paylaşılan hatla (#9) kadar çok sıcaklık probu kullanabilirsiniz. 18B20 tek kablolu I2C kullanır, bu nedenle I2C iletişim yönteminin özel bir durumudur. Aşağıda, MAC – Tıbbi Erişim Kontrolünü (aşağıdaki prosedürü çalıştırdığınızda “ROM”) bulmak için bir yöntem bulunmaktadır.

Adım 6: Kodlamaya Başlayın

Kodlamaya Başla
Kodlamaya Başla
  • Aşağıdaki kodu kopyalayıp Arduino IDE'ye yapıştırın:
  • Veya kodu (.ino) indirin ve Arduino IDE'de yeni bir pencere açılmalıdır.

/*

Referans öğreticiler:

1. Sıcaklık, ORP, pH kaydedici:

2. Güvenli Dijital (SD) Kalkan:

Bu kod, verileri Arduino seri monitörüne çıkaracaktır. EZO pH Devresini I2C modunda kontrol etmek için Arduino seri monitörüne komutları yazın.

Çoğunlukla Atlas-Scientific'in I2C kodundan olmak üzere, yukarıda atıfta bulunulan öğreticilerden değiştirilmiştir.

Son güncelleme: 26 Temmuz 2017, Binh Nguyen

*/

#include //I2C'yi etkinleştir.

#define pH_address 99 //EZO pH Devresi için varsayılan I2C ID numarası.

#define DO_address 97 //EZO DO Devresi için varsayılan I2C ID numarası.

#include "RTClib.h" // I2C ve Wire lib aracılığıyla bağlı bir DS1307 RTC kullanan tarih ve saat işlevleri

RTC_DS1307 rtc;

#include // SD kitaplığı için

#include // Verileri depolamak için SD kart

const int chipSelect = 53; // Adafruit SD koparmayı çözmemiz gerekiyor//https://learn.adafruit.com/adafruit-micro-sd-breakout-board-card-tutorial/wiring

//DO=MISO, DI=MOSI, ATmega pininde#: 50(MISO), 51(MOSI), 52(SCK), 53(SS)

char logFileName = "dataLT.txt"; // denemenizi tanımlamak için logFileName'i değiştirin, örneğin PBR_01_02, datalog1

uzun kimlik = 1; // günlük sırasını girmek için kimlik numarası

#Dahil etmek

LiquidCrystal_I2C lcd (0x27, 20, 4);

#Dahil etmek

#Dahil etmek

#define ONE_WIRE_BUS 9 //sıcaklık probu için # pinini tanımlayın

OneWire oneWire(ONE_WIRE_BUS);

DallasSıcaklık sensörleri(&oneWire);

DeviceAddress ProbeP = { 0x28, 0xC2, 0xE8, 0x37, 0x07, 0x00, 0x00, 0xBF }; // MAC adresi, her bir prob için benzersiz

String dataString; // tüm verileri depolamak için ana değişken

String dataString2; // Çıktı için Sıcaklık/pH/DO depolamak için geçici bir değişken

karakter bilgisayar verileri[20]; //Atlas Scientific'ten talimat: Bir pc/mac/diğerinden gelen verileri tutmak için 20 baytlık bir karakter dizisi oluşturuyoruz.

bayt alınan_from_bilgisayar=0; //kaç karakter alındığını bilmemiz gerekiyor.

byte serial_event=0;//pc/mac/other'dan veri alındığında sinyal vermek için bir bayrak.

bayt kodu = 0; //I2C yanıt kodunu tutmak için kullanılır.

char pH_data[20]; //pH devresinden gelen verileri tutmak için 20 baytlık bir karakter dizisi yapıyoruz.

bayt in_char=0; //pH Devresinden bağlı baytlarda depolamak için 1 baytlık bir tampon olarak kullanılır.

bayt i=0; // ph_data dizisi için kullanılan sayaç.

int zaman_=1800; //EZO Sınıfı pH Devresine gönderilen komuta bağlı olarak gereken gecikmeyi değiştirmek için kullanılır.

yüzer pH_float; //float var pH'ın şamandıra değerini tutmak için kullanılır.

char DO_data[20];

//kayan temp_C;

void setup() //donanım başlatma.

{

Seri.başla(9600); // seri bağlantı noktasını etkinleştir.

Wire.begin(pH_adresi); //pH probu için I2C portunu etkinleştir

Wire.begin(DO_adresi);

lcd.init();

lcd.başla(20, 4);

lcd.backlight();

lcd.home();

lcd.print("Merhaba PBR!");

lcd.setCursor(0, 1);

lcd.print("Başlatılıyor…");

Serial.print("RTC …");

if (! rtc.begin())

{

Serial.println("RTC: Gerçek zamanlı saat… BULUNAMADI");

while (1);// (Serial.println("RTC: Gerçek zamanlı saat… BULUNDU"));

}

Serial.println("ÇALIŞIYOR");

Serial.print("Gerçek Zamanlı Saat…");

if (! rtc.isrunning())

{rtc.adjust(DateTime(F(_DATE_), F(_TIME_)));

}

Serial.println("ÇALIŞIYOR");

lcd.setCursor(0, 0);

lcd.println("RTC: Tamam");

Serial.print("SD kart…"); // kartın mevcut olup olmadığına ve başlatılıp başlatılamayacağına bakın:

if (!SD.begin(chipSelect))

{ Serial.println("Başarısız"); // başka bir şey yapma:

dönüş;

}

Serial.println("Tamam");

lcd.setCursor(0, 1);

lcd.println("SD kart: Tamam");

Serial.print("Günlük Dosyası: ");

Serial.print(logFileName);

Seri.print("…");

Dosya logFile = SD.open(logFileName, FILE_WRITE); // dosyayı aç. "datalog" ve başlığı yazdır

eğer (logFile)

{

logFile.println(",,, "); // önceki çalıştırmada veri olduğunu belirtin

String başlığı = "Tarih -Saat, Sıcaklık(C), pH, DO";

logFile.println(başlık);

logFile.close();

Serial.println("HAZIR");

//Serial.println(dataString); // seri bağlantı noktasına da yazdır:

}

else { Serial.println("veri günlüğü açma hatası"); } // dosya açık değilse, bir hata açın:

lcd.setCursor(0, 2);

lcd.print("Günlük dosyası:");

lcd.println(logFileName);

gecikme(1000);

sensörler.begin();

sensor.setResolution(ProbeP, 10); //10 çözünürlüktür (10bit)

lcd.clear();

kimlik = 0;

}

boşluk döngüsü()

{ //ana döngü.

dataString = String(id);

dataString = Dize(', ');

DateTime şimdi = rtc.now();

dataString = String(şimdi.yıl(), Aralık);

dataString += Dize('/');

dataString += String(şimdi.ay(), Aralık);

dataString += Dize('/');

dataString += String(now.day(), DEC);

dataString += Dize(' ');

dataString += String(now.hour(), DEC);

dataString += Dize(':');

dataString += Dize(şimdi.dakika(), Aralık);

dataString += Dize(':');

dataString += String(now.second(), DEC);

lcd.home();

lcd.print(dataString);

sensörler.requestTemperatures();

displaySıcaklık(ProbeP);

Wire.beginTransmission(pH_adresi); // devreyi ID numarasına göre çağır

Wire.write('r'); //sürekli okunacak sabit kod r

Wire.endTransmission(); //I2C veri iletimini sonlandır.

gecikme süresi_); //devrenin talimatını tamamlaması için doğru süreyi bekleyin.

Wire.requestFrom(pH_adresi, 20, 1); //devreyi çağırın ve 20 bayt talep edin (bu, ihtiyacımız olandan fazla olabilir)

while(Wire.available()) //alınacak bayt var mı

{

in_char = Wire.read(); // bir bayt al.

if ((in_char > 31) && (in_char <127)) // karakterin kullanılabilir olup olmadığını kontrol edin (yazdırılabilir)

{

pH_data= in_char; //bu baytı dizimize yükleyin.

ben+=1;

}

if(in_char==0) //eğer bize boş bir komut gönderildiğini görürsek.

{

i=0; // i sayacını 0'a sıfırla.

Wire.endTransmission(); //I2C veri iletimini sonlandır.

kırmak; // while döngüsünden çık.

}

}

seri_event=0; // seri olay bayrağını sıfırla.

dataString2 += ", ";

dataString2 += Dize(pH_data);

Wire.beginTransmission(DO_adresi); // devreyi ID numarasına göre çağır

Wire.write('r');

Wire.endTransmission(); //I2C veri iletimini sonlandır

gecikme süresi_); //devrenin talimatını tamamlaması için doğru süreyi bekleyin

Wire.requestFrom(DO_address, 20, 1); //devreyi çağır ve 20 bayt iste

while(Wire.available()) //alınacak bayt var mı?

{

in_char = Wire.read(); // bir bayt al.

if ((in_char > 31) && (in_char <127)) //charın kullanılabilir (yazdırılabilir) olup olmadığını kontrol edin, aksi takdirde in_char.txt dosyasının başında bir sembol içerir

{ DO_data= in_char; //bu baytı dizimize yükle

ben+=1; // dizi elemanı için sayacı çalıştır

}

if(in_char==0)

{ // eğer bize boş bir komut gönderildiğini görürsek

i=0; // i sayacını 0'a sıfırla.

Wire.endTransmission(); //I2C veri iletimini sonlandır.

kırmak; // while döngüsünden çık.

}

}

seri_event=0; // seri olay bayrağını sıfırla

pH_float = atof (pH_data);

dataString2 += ", ";

dataString2 += Dize(DO_data);

lcd.setCursor(0, 1);

lcd.print("Sıcaklık/ pH/ DO");

lcd.setCursor(0, 2);

lcd.print(dataString2);

dataString += ', ';

dataString += dataString2;

Dosya dataFile = SD.open(logFileName, FILE_WRITE); // dosyayı aç. bir seferde yalnızca bir dosyanın açılabileceğine dikkat edin, bu nedenle başka bir dosyayı açmadan önce bunu kapatmanız gerekir.

if (dataFile) // dosya mevcutsa, ona şunu yazın:

{

dataFile.println(dataString);

dataFile.close();

Serial.println(dataString); // seri bağlantı noktasına da yazdır:

}

else { Serial.println("veri günlüğü dosyası açılırken hata oluştu"); } // dosya açık değilse, bir hata açın:

lcd.setCursor(0, 3);

lcd.print("Çalışıyor(x5m):");

lcd.setCursor(15, 3);

lcd.print(id);

kimlik ++; // sonraki yinelemede bir kimliği artır

dataString = "";

gecikme(300000); // 5 dakika gecikme = 5*60*1000 ms

lcd.clear();

} //ana döngüyü sonlandır

void displayTemperature(DeviceAddress deviceAddress)

{

float tempC = sensor.getTempC(deviceAddress);

if (tempC == -127.00) lcd.print("Sıcaklık Hatası");

başka dataString2 = String(tempC);

}//kod burada bitiyor

  • Araçlar/Port altında Arduino IDE üzerinden doğru COM portunu seçin
  • Doğru Arduino kartını seçin. Mega 2560'ı daha fazla dahili belleğe sahip olduğu için kullandım. Arduino Nano veya Uno bu kurulumla iyi çalışıyor.
  • Kontrol edin ve kodlayın ve kodu yükleyin

7. Adım: Kablolama (Geliştirilebilir) ve LCD Ekran Sonuçları

Kablolama (Geliştirilebilir) ve LCD Ekran ile İlgili Sonuçlar
Kablolama (Geliştirilebilir) ve LCD Ekran ile İlgili Sonuçlar
Kablolama (Geliştirilebilir) ve LCD Ekran ile İlgili Sonuçlar
Kablolama (Geliştirilebilir) ve LCD Ekran ile İlgili Sonuçlar
Kablolama (Geliştirilebilir) ve LCD Ekran ile İlgili Sonuçlar
Kablolama (Geliştirilebilir) ve LCD Ekran ile İlgili Sonuçlar
Kablolama (Geliştirilebilir) ve LCD Ekran ile İlgili Sonuçlar
Kablolama (Geliştirilebilir) ve LCD Ekran ile İlgili Sonuçlar
  • Uyarı: 2-3 aylık sürekli çalışmadan sonra DO probundan pH probuna gelen gürültüyle karşılaştım. Atlas Scientific'e göre, pH, iletkenlik probları birlikte çalıştığında bir hat içi voltaj izolatörü önerilir. Daha fazla ayrıntı 9. sayfadadır (https://goo.gl/d62Rqv)
  • Kaydedilen veriler (ilkinin pH ve DO verilerinden önce yazdırılmamış karakterleri vardır). Yalnızca yazdırılabilir karakterlere izin vererek koda filtre uyguladım.

8. Adım: Verileri İçe Aktarın ve Bir Grafik Yapın

Verileri İçe Aktarın ve Grafik Oluşturun
Verileri İçe Aktarın ve Grafik Oluşturun
Verileri İçe Aktarın ve Grafik Oluşturun
Verileri İçe Aktarın ve Grafik Oluşturun
Verileri İçe Aktarın ve Grafik Oluşturun
Verileri İçe Aktarın ve Grafik Oluşturun
  1. VERİ sekmesi altındaki Metinden veri içe aktarma (Excel 2013)
  2. Verileri virgülle ayırın (bu nedenle her veri girişinden sonra virgül kullanılması yararlıdır)
  3. Verileri çizin. Aşağıdaki her veri yaklaşık 1700 puana sahiptir. Ölçüm aralığı 5 dakikadır (ayarlanabilir). DO ve pH devrelerinin verileri okuması için minimum süre 1.8 saniyedir.

Adım 9: Kalibrasyon

kalibrasyon
kalibrasyon
  1. Dijital sıcaklık sensörü (18B20), farkı doğrudan sıcaklığa ayarlayarak kalibre edilebilir. Aksi takdirde, kompanzasyon ve eğim kalibrasyonu gerektiriyorsa, \libraries\DallasTemperature klasöründeki DallasTemperature.cpp #453 satırındaki değerleri değiştirerek yapabilirsiniz.
  2. pH ve DO probları için, probları beraberindeki solüsyonlarla kalibre edebilirsiniz. Atlas Scientific'in örnek kodunu kullanmalı ve bu dosyadaki talimatları izlemelisiniz.
  3. Lütfen kalibrasyon ve sıcaklık kompanzasyonu için pH probu için 26 ve 50. sayfaları (https://goo.gl/d62Rqv) ve ayrıca DO probu için 7-8 ve 50. sayfaları (https://goo.gl/mA32mp) takip edin. İlk olarak, lütfen Atlas tarafından sağlanan genel kodu yeniden yükleyin, Seri Monitörü açın ve uygun bir komut girin.

Adım 10: Çok Fazla Kablolama?

  1. Arduino kartları için Dragino Yun Shield (https://goo.gl/J9PBTH) kullanarak SD kartı ve gerçek zamanlı saat modülünü ortadan kaldırabilirsiniz. Yun Shield ile çalışmak için kodun değiştirilmesi gerekiyordu. İşte başlamak için iyi bir yer (https://goo.gl/c1x8Dm)
  2. Hala çok fazla kablolama: Atlas Scientific, EZO devreleri (https://goo.gl/dGyb12) ve lehimsiz devre kartları (https://goo.gl/uWF51n) için bir kılavuz hazırladı. 18B20 dijital sıcaklığı entegre etmek burada (https://goo.gl/ATcnGd). Raspberry Pi (https://goo.gl/549xvk) üzerinde çalışan Raspbian (Debian Linux'un bir sürümü) üzerindeki komutlara aşina olmanız gerekir.

Adım 11: Onay:

Bu, mikroalg yetiştirmek için gelişmiş bir fotobiyoreaktör üzerinde çalıştığım doktora sonrası araştırmam sırasındaki yan projem. Bu yüzden, bunun gerçekleşmesi için tarafların şartlarını sağladıklarına güvenmek gerektiğini düşündüm. İlk olarak, ABD Enerji Bakanlığı, Enerji Verimliliği ve Yenilenebilir Enerji Hedefli Algal Biyoyakıtlar ve Biyoürünler Dairesi'nden DE-EE0007093: “Atmosferik CO2 Zenginleştirme ve Dağıtımı (ACED)” hibesi. Arizona Eyalet Üniversitesi, Biodesign Swette Çevre Biyoteknoloji Merkezi'nden Dr. Bruce E. Rittmann'a elektronik ve Arduino ile uğraşma fırsatı verdiği için teşekkür ederim. Çevre mühendisliği, çoğunlukla kimya, biraz da mikrobiyoloji eğitimi aldım.

Önerilen: