Cara Membuat Data Logger untuk Suhu, PH, dan Oksigen Terlarut: 11 Langkah (dengan Gambar)
Cara Membuat Data Logger untuk Suhu, PH, dan Oksigen Terlarut: 11 Langkah (dengan Gambar)
Anonim
Image
Image
Imej
Imej

Objektif:

  • Buat pencatat data dengan harga ≤ $ 500. Ia menyimpan data untuk suhu, pH, dan DO dengan cap waktu dan menggunakan komunikasi I2C.
  • Mengapa I2C (Inter-Integrated Circuit)? Seseorang dapat mengumpulkan seberapa banyak sensor dalam baris yang sama kerana masing-masing mempunyai alamat yang unik.

Langkah 1:

Langkah 2: Beli Bahagian di Bawah:

Beli Bahagian di Bawah
Beli Bahagian di Bawah
  1. Arduino MEGA 2560, $ 35,
  2. Penyesuai kuasa untuk papan Arduino, $ 5.98,
  3. Modul LCD I2C (paparan), $ 8.99,
  4. Penembusan Waktu Sebenar (RTC), $ 7.5,
  5. Papan pemecahan kad MicroSD, $ 7.5,
  6. Kad SD 4GB, $ 6.98,
  7. Sensor Digital DS18B20 kalis air, $ 9,95,
  8. Pemeriksaan pH + Kit + Penyangga standard, $ 149.15,
  9. DO probe + Kit + buffer Standard, $ 247.45,
  10. Papan roti, kabel pelompat, $ 7.98,
  11. (Pilihan) Voltan Isolator, $ 24,

Jumlah: $ 510.48

* Bahagian tertentu (seperti papan generik) boleh dibeli dari vendor lain (eBay, penjual China) dengan harga yang lebih rendah. Probe pH dan DO disyorkan untuk mendapatkannya dari Atlas Scientific.

* Multimeter disyorkan untuk memeriksa kekonduksian dan voltan. Harganya sekitar $ 10-15 (https://goo.gl/iAMDJo)

Langkah 3: Pendawaian

Pendawaian
Pendawaian
  • Gunakan kabel jumper / DuPont untuk menyambungkan bahagian-bahagian seperti yang ditunjukkan dalam lakaran di bawah.
  • Gunakan multimeter untuk memeriksa konduksi.
  • Periksa Bekalan Voltan Positif (VCC) dan Tanah (GND) (mudah mengelirukan jika anda tidak biasa dengan litar)
  • Pasangkan penyesuai kuasa dan periksa penunjuk kuasa di setiap bahagian. Sekiranya ragu-ragu, gunakan multi-meter untuk memeriksa voltan antara VCC dan GND (5V)

Langkah 4: Sediakan PH, DO Circuits, SD Card

Sediakan PH, DO Circuits, SD Card
Sediakan PH, DO Circuits, SD Card
  1. Tukar ke I2C untuk litar pH dan DO
  2. Penembusan pH dan DO dihantar dengan komunikasi Serial sebagai mod lalai Transmit / Receive (TX / RX). Untuk menggunakan garis mode mod I2C (SCL), dan garis Data (SDA), beralih mod dengan (1): cabut kabel VCC, TX, RX, (2): lompat TX ke Ground for Probe, PGND (bukan GND), (3) pasang VCC ke litar, (4): tunggu LED berubah dari Hijau ke Biru. Perincian lebih lanjut periksa di halaman 39 (Lembar Data untuk litar pH,
  3. Lakukan langkah yang sama dengan litar DO
  4. (jika anda tahu cara memuat naik kod sampel ke papan, anda boleh melakukannya melalui monitor Serial)
  5. Format kad SD ke format FAT

Langkah 5: Sediakan Perisian

Sediakan Perisian
Sediakan Perisian
Sediakan Perisian
Sediakan Perisian
Sediakan Perisian
Sediakan Perisian
Sediakan Perisian
Sediakan Perisian
  1. Muat turun Arduino Integrated Development Environment (IDE),
  2. Pasang perpustakaan ke Arduino IDE:
  3. Sebilangan besar daripadanya dilengkapi dengan perisian Arduino. LiquidCrystal_I2C.h boleh didapati melalui GitHub
  4. Pasang pemacu untuk USB. Untuk Arduino yang asli, anda mungkin tidak perlu memasangnya. Untuk yang generik, anda perlu memasang pemacu CH340 (GitHub:
  5. Periksa sama ada anda menyambungkan papan dengan betul dengan menjalankan ujian LED yang berkedip
  6. Bagaimana untuk mencari alamat MAC suhu digital 18B20. Menggunakan templat pengimbas I2C di Arduino IDE dengan probe terpasang. Setiap peranti mempunyai alamat MAC yang unik, jadi anda boleh menggunakan seberapa banyak probe suhu dengan satu baris bersama (# 9). 18B20 menggunakan satu wayar I2C, jadi ini adalah kes khas kaedah komunikasi I2C. Berikut adalah satu kaedah untuk mencari MAC - Kawalan Akses Perubatan ("ROM" semasa anda menjalankan prosedur di bawah).

Langkah 6: Mulakan Pengekodan

Mulakan Pengekodan
Mulakan Pengekodan
  • Salin tampal kod di bawah ke Arduino IDE:
  • Atau muat turun kod (.ino) dan tetingkap baru akan muncul di Arduino IDE.

/*

Tutorial rujukan:

1. Suhu, ORP, pencatat pH:

2. Perisai Digital Selamat (SD):

Kod ini akan mengeluarkan data ke monitor bersiri Arduino. Ketik perintah ke monitor bersiri Arduino untuk mengawal Litar pH EZO dalam mod I2C.

Diubah suai dari tutorial yang dirujuk di atas, kebanyakannya dari kod I2C oleh Atlas-Scientific

Terakhir dikemas kini: 26 Julai 2017 oleh Binh Nguyen

*/

#masuk // aktifkan I2C.

#tentukan pH_address 99 // nombor ID I2C lalai untuk Litar pH EZO.

#define DO_address 97 // nombor ID I2C lalai untuk EZO DO Circuit.

#include "RTClib.h" // Tarikh dan waktu berfungsi menggunakan DS1307 RTC yang disambungkan melalui I2C dan Wire lib

RTC_DS1307 rtc;

#masuk // Untuk perpustakaan SD

#sertakan // kad SD untuk menyimpan data

const int chipPilih = 53; // perlu mengetahui untuk pelarian SD Adafruit //

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

char logFileName = "dataLT.txt"; // ubah modFileName untuk mengenal pasti percubaan anda, untuk contoh PBR_01_02, datalog1

id panjang = 1; // nombor id untuk memasukkan urutan log

#sertakan

LiquidCrystal_I2C lcd (0x27, 20, 4);

#sertakan

#sertakan

#tentukan ONE_WIRE_BUS 9 // tentukan pin # untuk probe suhu

OneWire oneWire (ONE_WIRE_BUS);

Sensor suhu Dallas (& oneWire);

DeviceAddress ProbeP = {0x28, 0xC2, 0xE8, 0x37, 0x07, 0x00, 0x00, 0xBF}; // Alamat MAC, unik untuk setiap siasatan

String dataString; // varian utama untuk menyimpan semua data

String dataString2; // varian sementara untuk menyimpan Suhu / pH / DO untuk dicetak

char computerdata [20]; // arahan dari Atlas Scientific: kami membuat susunan aksara 20 bait untuk menyimpan data masuk dari komputer / mac / yang lain.

bait diterima_from_komputer = 0; // kita perlu mengetahui berapa banyak watak yang telah diterima.

byte serial_event = 0; // bendera untuk memberi isyarat apabila data telah diterima dari komputer / mac / yang lain.

kod bait = 0; // digunakan untuk menahan kod respons I2C.

char pH_data [20]; // kami membuat susunan aksara 20 bait untuk menyimpan data masuk dari rangkaian pH.

bait in_char = 0; // digunakan sebagai penyangga 1 bait untuk menyimpan bait terikat dari Litar pH.

bait i = 0; // kaunter digunakan untuk array ph_data.

int time_ = 1800; // digunakan untuk mengubah penundaan yang diperlukan bergantung pada perintah yang dikirim ke Litar pH Kelas EZO.

float pH_float; // float var digunakan untuk menahan nilai apungan pH.

char DO_data [20];

// terapung temp_C;

kekosongan persediaan () // permulaan perkakasan.

{

Serial.begin (9600); // aktifkan port bersiri.

Wire.begin (pH_address); // aktifkan port I2C untuk probe pH

Wire.begin (DO_address);

lcd.init ();

lcd.begin (20, 4);

lcd.backlight ();

lcd.home ();

lcd.print ("Hello PBR!");

lcd.setCursor (0, 1);

lcd.print ("Memulakan…");

Serial.print ("RTC adalah…");

jika (! rtc.begin ())

{

Serial.println ("RTC: Jam masa nyata … TIDAK DITEMUKAN");

sementara (1); // (Serial.println ("RTC: Jam masa nyata … DITEMUKAN"));

}

Serial.println ("MENJALANKAN");

Serial.print ("Jam Masa Nyata …");

jika (! rtc.isrunning ())

{rtc.adjust (DateTime (F (_ DATE_), F (_ TIME_)));

}

Serial.println ("KERJA");

lcd.setCursor (0, 0);

lcd.println ("RTC: OK");

Serial.print ("kad SD …"); // lihat apakah kad itu ada dan boleh diinisialisasi:

jika (! SD. mulakan (pilih chip))

{Serial.println ("Gagal"); // jangan buat apa-apa lagi:

kembali;

}

Serial.println ("OK");

lcd.setCursor (0, 1);

lcd.println ("kad SD: OK");

Serial.print ("Fail Log:");

Serial.print (logFileName);

Cetakan bersiri ("…");

Fail logFile = SD.open (logFileName, FILE_WRITE); // buka fail. "datalog" dan cetak tajuk

jika (logFile)

{

logFile.println (",,,"); // menunjukkan terdapat data dalam jangka masa sebelumnya

String header = "Date -Time, Temp (C), pH, DO";

logFile.println (pengepala);

logFile.close ();

Serial.println ("SIAP");

//Serial.println(dataString); // cetak ke port bersiri juga:

}

lain {Serial.println ("ralat membuka katalog"); } // jika fail tidak terbuka, muncul ralat:

lcd.setCursor (0, 2);

lcd.print ("Fail log:");

lcd.println (logFileName);

kelewatan (1000);

sensor.begin ();

sensor.setResolution (ProbeP, 10); // 10 adalah resolusi (10bit)

lcd.clear ();

id = 0;

}

gelung kosong ()

{// gelung utama.

dataString = Rentetan (id);

dataString = Rentetan (',');

DateTime now = rtc.now ();

dataString = Rentetan (sekarang.tahun (), DEC);

dataString + = Rentetan ('/');

dataString + = Rentetan (sekarang.bulan (), DEC);

dataString + = Rentetan ('/');

dataString + = Rentetan (sekarang.hari (), DEC);

dataString + = Rentetan ('');

dataString + = Rentetan (sekarang.jam (), DEC);

dataString + = Rentetan (':');

dataString + = Rentetan (sekarang.minit (), DEC);

dataString + = Rentetan (':');

dataString + = Rentetan (sekarang.second (), DEC);

lcd.home ();

lcd.print (dataString);

sensor.requestTemperatures ();

displayTemperature (ProbeP);

Wire.beginTransmission (pH_address); // panggil litar dengan nombor IDnya

Wire.write ('r'); // kod keras r untuk dibaca secara berterusan

Wire.endTransmission (); // tamatkan penghantaran data I2C.

kelewatan (masa_); // tunggu jumlah masa yang betul untuk litar menyelesaikan arahannya.

Wire.requestFrom (alamat_ pH, 20, 1); // panggil litar dan minta 20 bait (ini mungkin lebih banyak daripada yang kita perlukan)

sementara (Wire.available ()) // ada bait untuk diterima

{

in_char = Wire.read (); // terima bait.

jika ((in_char> 31) && (in_char <127)) // periksa sama ada char boleh digunakan (boleh dicetak)

{

pH_data = in_char; // muatkan bait ini ke dalam array kami.

i + = 1;

}

if (in_char == 0) // jika kita melihat bahawa kita telah dihantar perintah null.

{

i = 0; // tetapkan semula kaunter i ke 0.

Wire.endTransmission (); // tamatkan penghantaran data I2C.

rehat; // keluar dari gelung sementara.

}

}

serial_event = 0; // tetapkan semula bendera acara bersiri.

dataString2 + = ",";

dataString2 + = Rentetan (pH_data);

Wire.beginTransmission (DO_address); // panggil litar dengan nombor IDnya

Wire.write ('r');

Wire.endTransmission (); // tamatkan penghantaran data I2C

kelewatan (masa_); // tunggu jumlah masa yang betul untuk litar menyelesaikan arahannya

Wire.requestFrom (DO_address, 20, 1); // panggil litar dan minta 20 bait

sementara (Wire.available ()) // ada bait untuk diterima.

{

in_char = Wire.read (); // terima bait.

jika ((in_char> 31) && (in_char <127)) // periksa sama ada char boleh digunakan (boleh dicetak), jika tidak, in_char mengandungi simbol pada awal dalam fail.txt

{DO_data = in_char; // muatkan bait ini ke dalam array kami

i + = 1; // masukkan pembilang untuk elemen tatasusunan

}

jika (dalam_char == 0)

{// jika kita melihat bahawa kita telah dihantar perintah nol

i = 0; // tetapkan semula kaunter i ke 0.

Wire.endTransmission (); // tamatkan penghantaran data I2C.

rehat; // keluar dari gelung sementara.

}

}

serial_event = 0; // tetapkan semula bendera acara bersiri

pH_float = atof (pH_data);

dataString2 + = ",";

dataString2 + = Rentetan (DO_data);

lcd.setCursor (0, 1);

lcd.print ("Suhu / pH / DO");

lcd.setCursor (0, 2);

lcd.print (dataString2);

dataString + = ',';

dataString + = dataString2;

Data failFile = SD.open (logFileName, FILE_WRITE); // buka fail. perhatikan bahawa hanya satu fail yang dapat dibuka pada satu masa, jadi anda harus menutupnya sebelum membuka fail yang lain.

jika (dataFile) // jika fail itu tersedia, tuliskan kepadanya:

{

dataFile.println (dataString);

dataFile.close ();

Serial.println (dataString); // cetak ke port bersiri juga:

}

lain {Serial.println ("ralat membuka fail katalog"); } // jika fail tidak terbuka, muncul ralat:

lcd.setCursor (0, 3);

lcd.print ("Berlari (x5m):");

lcd.setCursor (15, 3);

lcd.print (id);

id ++; // tingkatkan satu ID lelaran seterusnya

dataString = "";

kelewatan (300000); // tunda 5 mintues = 5 * 60 * 1000 ms

lcd.clear ();

} // hujung gelung utama

paparan kosong Suhu (DeviceAddress deviceAddress)

{

float tempC = sensors.getTempC (deviceAddress);

jika (tempC == -127.00) lcd.print ("Ralat Suhu");

dataString2 lain = String (tempC);

} // kodnya berakhir di sini

  • Pilih port COM yang betul melalui Arduino IDE di bawah Tools / Port
  • Pilih papan Arduino yang betul. Saya menggunakan Mega 2560 kerana mempunyai memori dalaman yang lebih banyak. Arduino Nano atau Uno berfungsi dengan baik dengan persediaan ini.
  • Periksa dan kod dan muat naik kod

Langkah 7: Hasil pada Pendawaian (boleh Ditingkatkan) dan Paparan LCD

Hasil pada Pendawaian (boleh Ditingkatkan) dan Paparan LCD
Hasil pada Pendawaian (boleh Ditingkatkan) dan Paparan LCD
Hasil pada Pendawaian (boleh Ditingkatkan) dan Paparan LCD
Hasil pada Pendawaian (boleh Ditingkatkan) dan Paparan LCD
Hasil pada Pendawaian (boleh Ditingkatkan) dan Paparan LCD
Hasil pada Pendawaian (boleh Ditingkatkan) dan Paparan LCD
Hasil pada Pendawaian (boleh Ditingkatkan) dan Paparan LCD
Hasil pada Pendawaian (boleh Ditingkatkan) dan Paparan LCD
  • Perhatian: Saya menghadapi bunyi dari probe DO hingga probe pH setelah 2-3 bulan operasi berterusan. Menurut Atlas Scientific, pengasing voltan dalam talian disyorkan semasa pH, prob konduktiviti beroperasi bersama. Maklumat lanjut terdapat di halaman 9 (https://goo.gl/d62Rqv)
  • Data yang dicatat (yang pertama mempunyai watak yang belum dicetak sebelum data pH dan DO). Saya menapis ke kod dengan hanya membenarkan watak yang boleh dicetak.

Langkah 8: Import Data dan Buat Grafik

Import Data dan Buat Grafik
Import Data dan Buat Grafik
Import Data dan Buat Grafik
Import Data dan Buat Grafik
Import Data dan Buat Grafik
Import Data dan Buat Grafik
  1. Import data Dari tab Di Bawah DATA (Excel 2013)
  2. Pisahkan data dengan koma (itulah sebabnya mempunyai koma setelah setiap input data bermanfaat)
  3. Petak data. Setiap data di bawah mempunyai kira-kira 1700 mata. Selang pengukuran adalah 5 minit (boleh laras). Minimum untuk litar DO dan pH untuk membaca data ialah 1.8 saat.

Langkah 9: Penentukuran

Penentukuran
Penentukuran
  1. Sensor suhu digital (18B20) dapat dikalibrasi dengan menyesuaikan perbezaan secara langsung ke. Jika tidak, jika pampasan dan cerun memerlukan penentukuran, anda boleh melakukannya dengan mengubah nilai pada baris # 453, DallasTemperature.cpp di folder / libraries / DallasTemperature.
  2. Untuk probe pH dan DO, anda boleh mengkalibrasi probe dengan penyelesaian yang disertakan. Anda mesti menggunakan contoh kod oleh Atlas Scientific dan mengikuti arahan oleh fail ini.
  3. Sila ikuti halaman 26 dan 50 untuk probe pH (https://goo.gl/d62Rqv) untuk penentukuran dan pampasan suhu, dan juga halaman, 7-8 dan 50 untuk probe DO (https://goo.gl/mA32mp). Pertama, muat naik semula kod generik yang disediakan oleh Atlas, buka Serial Monitor dan masukkan arahan yang betul.

Langkah 10: Pendawaian Terlalu Banyak?

  1. Anda boleh menghilangkan kad SD dan modul jam masa nyata dengan menggunakan Dragino Yun Shield untuk papan Arduino (https://goo.gl/J9PBTH). Kod perlu diubah suai untuk bekerja dengan Yun Shield. Inilah tempat yang baik untuk bermula (https://goo.gl/c1x8Dm)
  2. Masih terlalu banyak pendawaian: Atlas Scientific membuat panduan untuk litar EZO mereka (https://goo.gl/dGyb12) dan papan solderless (https://goo.gl/uWF51n). Mengintegrasikan suhu digital 18B20 ada di sini (https://goo.gl/ATcnGd). Anda harus biasa dengan perintah pada Raspbian (versi Debian Linux) yang berjalan di Raspberry Pi (https://goo.gl/549xvk)

Langkah 11: Pengakuan:

Ini adalah projek sampingan saya semasa penyelidikan pasca doktoral yang saya kerjakan sebagai photobioreactor maju untuk menanam mikroalga. Oleh itu, saya fikir perlu memberi penghargaan kepada pihak yang telah memberikan syarat untuk mewujudkannya. Pertama, pemberian, DE-EE0007093: "Pengayaan dan Pengantaran CO2 Atmosfera (ACED)," dari Jabatan Tenaga A. S., Pejabat Kecekapan Tenaga dan Tenaga Diperbaharui yang disasarkan Alga Biofuel dan Bioproduk. Saya mengucapkan terima kasih kepada Dr. Bruce E. Rittmann di Biodesign Swette Center for Environmental Biotechnology, Arizona State Univesity kerana memberi saya peluang untuk bermain elektronik dan Arduino. Saya dilatih dalam bidang kejuruteraan alam sekitar, kebanyakan kimia, sedikit mikrobiologi.

Disyorkan: