Daftar Isi:

Cara Membuat Data Logger untuk Suhu, PH, dan Oksigen Terlarut: 11 Langkah (Berikut Gambar)
Cara Membuat Data Logger untuk Suhu, PH, dan Oksigen Terlarut: 11 Langkah (Berikut Gambar)

Video: Cara Membuat Data Logger untuk Suhu, PH, dan Oksigen Terlarut: 11 Langkah (Berikut Gambar)

Video: Cara Membuat Data Logger untuk Suhu, PH, dan Oksigen Terlarut: 11 Langkah (Berikut Gambar)
Video: Materi Hidrometri 2024, November
Anonim
Image
Image
Gambar
Gambar

Tujuan:

  • Buat pencatat data seharga $500. Ini menyimpan data untuk suhu, pH, dan DO dengan cap waktu dan menggunakan komunikasi I2C.
  • Mengapa I2C (Inter-Integrated Circuit)? Seseorang dapat menumpuk sebanyak mungkin sensor di baris yang sama mengingat masing-masing sensor memiliki alamat yang unik.

Langkah 1:

Langkah 2: Beli Bagian Di Bawah Ini:

Membeli Bagian Di Bawah Ini
Membeli Bagian Di Bawah Ini
  1. Arduino MEGA 2560, $35,
  2. Adaptor daya untuk papan Arduino, $5,98,
  3. Modul LCD I2C (tampilan), $8,99,
  4. Penembusan Jam Waktu Nyata (RTC), $7,5,
  5. Papan pelarian kartu MicroSD, $7,5,
  6. Kartu SD 4 GB, $6,98,
  7. Sensor Digital DS18B20 tahan air, $9,95,
  8. Probe pH + Kits+ Buffer standar, $149,15,
  9. DO probe + Kits+ Buffer standar, $247,45,
  10. Papan tempat memotong roti, kabel jumper, $7,98,
  11. (Opsional) Isolator Tegangan, $24,

Total: $510,48

* Bagian tertentu (seperti papan generik) dapat dibeli dari vendor lain (eBay, penjual Cina) dengan harga lebih rendah. Probe pH dan DO direkomendasikan untuk mendapatkannya dari Atlas Scientific.

* Sebuah multimeter dianjurkan untuk memeriksa konduktivitas dan tegangan. Biayanya sekitar $10-15 (https://goo.gl/iAMDJo)

Langkah 3: Pengkabelan

Pengkabelan
Pengkabelan
  • Gunakan kabel jumper/DuPont untuk menghubungkan bagian-bagian seperti yang ditunjukkan pada sketsa di bawah ini.
  • Gunakan multimeter untuk memeriksa konduksi.
  • Periksa Pasokan Tegangan Positif (VCC) dan Ground (GND) (mudah bingung jika Anda tidak terbiasa dengan sirkuit)
  • Colokkan adaptor daya dan periksa indikator daya di setiap bagian. Jika ragu, gunakan multimeter untuk memeriksa tegangan antara VCC dan GND menjadi (5V)

Langkah 4: Siapkan Sirkuit PH, DO, Kartu SD

Siapkan Sirkuit PH, DO, SD Card
Siapkan Sirkuit PH, DO, SD Card
  1. Beralih ke I2C untuk sirkuit pH dan DO
  2. Jerawat pH dan DO dikirimkan dengan komunikasi Serial sebagai mode default Transmit/Receive (TX/RX). Untuk menggunakan mode I2C Clock line (SCL), dan Data line (SDA), alihkan mode dengan (1): cabut kabel VCC, TX, RX, (2): lompat TX ke Ground for Probe, PGND (bukan GND), (3) pasang VCC ke rangkaian, (4): tunggu sampai LED berubah dari Hijau menjadi Biru. Selengkapnya cek di halaman 39 (Datasheet untuk rangkaian pH,
  3. Lakukan langkah yang sama dengan sirkuit DO
  4. (jika Anda tahu cara mengunggah kode sampel ke papan, Anda dapat melakukannya melalui monitor Serial)
  5. Format kartu SD ke format FAT

Langkah 5: Siapkan Perangkat Lunak

Siapkan Perangkat Lunak
Siapkan Perangkat Lunak
Siapkan Perangkat Lunak
Siapkan Perangkat Lunak
Siapkan Perangkat Lunak
Siapkan Perangkat Lunak
Siapkan Perangkat Lunak
Siapkan Perangkat Lunak
  1. Unduh Lingkungan Pengembangan Terpadu Arduino (IDE),
  2. Instal perpustakaan ke Arduino IDE:
  3. Kebanyakan dari mereka datang dengan perangkat lunak Arduino. LiquidCrystal_I2C.h tersedia melalui GitHub
  4. Instal driver untuk USB. Untuk Arduino asli, Anda mungkin tidak perlu menginstalnya. Untuk yang generik, Anda perlu menginstal driver CH340 (GitHub:
  5. Periksa apakah Anda menghubungkan papan dengan benar dengan menjalankan tes LED berkedip
  6. Bagaimana menemukan alamat MAC dari suhu digital 18B20. Menggunakan template pemindai I2C di Arduino IDE dengan probe terpasang. Setiap perangkat memiliki alamat MAC yang unik, sehingga Anda dapat menggunakan probe suhu sebanyak mungkin dengan satu saluran bersama (#9). 18B20 menggunakan satu kabel I2C, jadi ini adalah kasus khusus dari metode komunikasi I2C. Di bawah ini adalah salah satu metode untuk menemukan MAC – Medical Access Control (“ROM” saat Anda menjalankan prosedur di bawah).

Langkah 6: Mulai Pengodean

Mulai Pengkodean
Mulai Pengkodean
  • Copy paste kode di bawah ini ke Arduino IDE:
  • Atau unduh kode (.ino) dan jendela baru akan muncul di Arduino IDE.

/*

Tutorial referensi:

1. Temperatur, ORP, pH logger:

2. Secured Digital (SD) Shield:

Kode ini akan menampilkan data ke monitor serial Arduino. Ketik perintah ke monitor serial Arduino untuk mengontrol Sirkuit pH EZO dalam mode I2C.

Dimodifikasi dari referensi tutorial di atas, sebagian besar dari kode I2C oleh Atlas-Scientific

Terakhir diperbarui: 26 Juli 2017 oleh Binh Nguyen

*/

#include //aktifkan I2C.

#define pH_address 99 //nomor ID I2C default untuk Sirkuit pH EZO.

#define DO_address 97 //nomor ID I2C default untuk Sirkuit EZO DO.

#include "RTClib.h" // Fungsi tanggal dan waktu menggunakan RTC DS1307 yang terhubung melalui I2C dan Wire lib

RTC_DS1307 rtc;

#include // Untuk perpustakaan SD

#include // kartu SD untuk menyimpan data

const int chipPilih = 53; // perlu mencari tahu tentang Adafruit SD breakout//https://learn.adafruit.com/adafruit-micro-sd-breakout-board-card-tutorial/wiring

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

char logFileName = "dataLT.txt"; // ubah logFileName untuk mengidentifikasi eksperimen Anda, misalnya PBR_01_02, datalog1

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

#termasuk

LiquidCrystal_I2C lcd (0x27, 20, 4);

#termasuk

#termasuk

#define ONE_WIRE_BUS 9 //tentukan pin # untuk pemeriksaan 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 probe

String dataString; // varian utama untuk menyimpan semua data

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

char data komputer[20]; //instruksi dari Atlas Scientific: kita membuat array karakter 20 byte untuk menampung data yang masuk dari pc/mac/other.

byte diterima_dari_komputer=0; //kita perlu tahu berapa banyak karakter yang telah diterima.

byte serial_event=0;//tanda untuk memberi sinyal saat data telah diterima dari pc/mac/other.

kode byte = 0; //digunakan untuk menyimpan kode respon I2C.

char pH_data[20]; //kita membuat array karakter 20 byte untuk menampung data yang masuk dari rangkaian pH.

byte in_char=0; //digunakan sebagai buffer 1 byte untuk menyimpan byte terikat dari Sirkuit pH.

byte i=0; // counter digunakan untuk array ph_data.

int waktu_=1800; //digunakan untuk mengubah penundaan yang diperlukan tergantung pada perintah yang dikirim ke Sirkuit pH Kelas EZO.

mengapung pH_mengambang; //float var digunakan untuk menyimpan nilai float dari pH.

char DO_data[20];

//mengambang suhu_C;

void setup() // inisialisasi perangkat keras.

{

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

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

Wire.begin(DO_address);

lcd.init();

lcd.begin(20, 4);

lcd.lampu latar();

lcd.rumah();

lcd.print("Halo PBR!");

lcd.setCursor(0, 1);

lcd.print("Inisialisasi…");

Serial.print("RTC adalah…");

jika (! rtc.begin())

{

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

while (1);// (Serial.println("RTC: Jam waktu-nyata…DITEMUKAN"));

}

Serial.println("MENJALANKAN");

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

jika (! rtc.isrunning())

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

}

Serial.println("BEKERJA");

lcd.setCursor(0, 0);

lcd.println("RTC: Oke");

Serial.print("Kartu SD…"); // lihat apakah kartu ada dan dapat diinisialisasi:

if (!SD.begin(chipSelect))

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

kembali;

}

Serial.println("Oke");

lcd.setCursor(0, 1);

lcd.println("Kartu SD: Oke");

Serial.print("Berkas Catatan: ");

Serial.print(logFileName);

Serial.print("…");

File logFile = SD.open(logFileName, FILE_WRITE); // buka filenya. "datalog" dan cetak header

jika (logFile)

{

logFile.println(",,, "); //menunjukkan ada data di run sebelumnya

String header = "Tanggal -Waktu, Temp(C), pH, DO";

logFile.println(tajuk);

logFile.close();

Serial.println("SIAP");

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

}

else { Serial.println("kesalahan membuka datalog"); } // jika file tidak terbuka, muncul kesalahan:

lcd.setCursor(0, 2);

lcd.print("Berkas log:");

lcd.println(logFileName);

penundaan (1000);

sensor.mulai();

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

lcd.clear();

nomor = 0;

}

lingkaran kosong()

{ //loop utama.

dataString = String(id);

dataString = String(',');

DateTime sekarang = rtc.now();

dataString = String(sekarang.tahun(), DES);

dataString += String('/');

dataString += String(sekarang.bulan(), DES);

dataString += String('/');

dataString += String(sekarang.hari(), DES);

dataString += String(' ');

dataString += String(sekarang.jam(), DES);

dataString += String(':');

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

dataString += String(':');

dataString += String(sekarang.detik(), DEC);

lcd.rumah();

lcd.print(dataString);

sensor.requestTemperatures();

tampilanSuhu (ProbeP);

Wire.beginTransmission(pH_address); // panggil sirkuit dengan nomor ID-nya

Wire.write('r'); //kode keras r untuk dibaca terus-menerus

Kawat.endTransmisi(); //mengakhiri transmisi data I2C.

waktu penundaan_); //menunggu jumlah waktu yang tepat agar rangkaian menyelesaikan instruksinya.

Wire.requestFrom(pH_address, 20, 1); //panggil sirkuit dan minta 20 byte (ini mungkin lebih dari yang kita butuhkan)

while(Wire.available()) //apakah ada byte yang akan diterima

{

in_char = Kawat.baca(); //menerima satu byte.

if ((in_char > 31) && (in_char <127)) //periksa apakah karakter tersebut dapat digunakan (dapat dicetak)

{

pH_data= in_char; // muat byte ini ke dalam array kita.

saya+=1;

}

if(in_char==0) //jika kita melihat bahwa kita telah dikirimi perintah null.

{

saya=0; //reset penghitung i ke 0.

Kawat.endTransmisi(); //mengakhiri transmisi data I2C.

merusak; //keluar dari perulangan while.

}

}

serial_event=0; //setel ulang bendera acara serial.

dataString2 += ", ";

dataString2 += String(pH_data);

Wire.beginTransmission(DO_address); // panggil sirkuit dengan nomor ID-nya

Wire.write('r');

Kawat.endTransmisi(); //mengakhiri transmisi data I2C

waktu penundaan_); //tunggu jumlah waktu yang tepat agar rangkaian menyelesaikan instruksinya

Wire.requestFrom(DO_address, 20, 1); //panggil sirkuit dan minta 20 byte

while(Wire.available()) //apakah ada byte yang akan diterima.

{

in_char = Kawat.baca(); //menerima satu byte.

if ((in_char > 31) && (in_char <127)) //periksa apakah char dapat digunakan (printable), jika tidak, in_char berisi simbol di awal file.txt

{ DO_data= in_char; // muat byte ini ke dalam array kita

saya+=1; //mendapatkan penghitung untuk elemen array

}

jika(dalam_char==0)

{ //jika kita melihat bahwa kita telah dikirimi perintah null

saya=0; //reset penghitung i ke 0.

Kawat.endTransmisi(); //mengakhiri transmisi data I2C.

merusak; //keluar dari perulangan while.

}

}

serial_event=0; //setel ulang bendera acara serial

pH_float = atof (pH_data);

dataString2 += ", ";

dataString2 += String(DO_data);

lcd.setCursor(0, 1);

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

lcd.setCursor(0, 2);

lcd.print(dataString2);

dataString += ', ';

dataString += dataString2;

File dataFile = SD.open(logFileName, FILE_WRITE); // buka filenya. perhatikan bahwa hanya satu file yang dapat dibuka pada satu waktu, jadi Anda harus menutup file ini sebelum membuka file lainnya.

if (dataFile) // jika file tersedia, tulis ke sana:

{

dataFile.println(dataString);

dataFile.close();

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

}

else { Serial.println("kesalahan membuka file datalog"); } // jika file tidak terbuka, muncul kesalahan:

lcd.setCursor(0, 3);

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

lcd.setCursor(15, 3);

lcd.print(id);

identitas++; // tingkatkan satu ID iterasi berikutnya

dataString = "";

penundaan (300000); //tunda 5 menit = 5*60*1000 md

lcd.clear();

} //akhiri loop utama

void displayTemperature(DeviceAddress deviceAddress)

{

float tempC = sensor.getTempC(deviceAddress);

if (tempC == -127.00) lcd.print("Kesalahan Suhu");

lain dataString2 = String(tempC);

}//kode berakhir di sini

  • Pilih port COM yang tepat melalui Arduino IDE di bawah Tools/Port
  • Pilih papan Arduino yang tepat. Saya menggunakan Mega 2560 karena memiliki lebih banyak memori internal. Arduino Nano atau Uno berfungsi dengan baik dengan pengaturan ini.
  • Periksa dan kode dan unggah kode

Langkah 7: Hasil pada Pengkabelan (dapat Ditingkatkan) dan Layar LCD

Hasil pada Pengkabelan (dapat Ditingkatkan) dan Layar LCD
Hasil pada Pengkabelan (dapat Ditingkatkan) dan Layar LCD
Hasil pada Pengkabelan (dapat Ditingkatkan) dan Layar LCD
Hasil pada Pengkabelan (dapat Ditingkatkan) dan Layar LCD
Hasil pada Pengkabelan (dapat Ditingkatkan) dan Layar LCD
Hasil pada Pengkabelan (dapat Ditingkatkan) dan Layar LCD
Hasil pada Pengkabelan (dapat Ditingkatkan) dan Layar LCD
Hasil pada Pengkabelan (dapat Ditingkatkan) dan Layar LCD
  • Pemberitahuan: Saya menemukan noise dari probe DO ke probe pH setelah 2-3 bulan operasi terus menerus. Menurut Atlas Scientific, in-line voltage isolator direkomendasikan ketika pH, probe konduktivitas beroperasi bersama. Selengkapnya ada di halaman 9 (https://goo.gl/d62Rqv)
  • Data yang dicatat (yang pertama memiliki karakter yang belum dicetak sebelum data pH dan DO). Saya memfilter ke kode dengan hanya mengizinkan karakter yang dapat dicetak.

Langkah 8: Impor Data dan Buat Grafik

Impor Data dan Buat Grafik
Impor Data dan Buat Grafik
Impor Data dan Buat Grafik
Impor Data dan Buat Grafik
Impor Data dan Buat Grafik
Impor Data dan Buat Grafik
  1. Impor data Dari Teks Di bawah tab DATA (Excel 2013)
  2. Pisahkan data dengan koma (itulah sebabnya koma setelah setiap input data sangat membantu)
  3. Plot datanya. Setiap data di bawah ini memiliki sekitar 1700 poin. Interval pengukuran adalah 5 menit (dapat disesuaikan). Minimum untuk sirkuit DO dan pH untuk membaca data adalah 1,8 detik.

Langkah 9: Kalibrasi

Kalibrasi
Kalibrasi
  1. Sensor suhu digital (18B20) dapat dikalibrasi dengan menyesuaikan perbedaan langsung ke. Sebaliknya, jika kompensasi dan kemiringan memerlukan kalibrasi, Anda dapat melakukannya dengan mengubah nilai pada baris #453, DallasTemperature.cpp di folder \libraries\DallasTemperature.
  2. Untuk probe pH dan DO, Anda dapat mengkalibrasi probe dengan larutan yang menyertainya. Anda harus menggunakan kode sampel oleh Atlas Scientific dan ikuti instruksi dari file ini.
  3. Ikuti halaman 26 dan 50 untuk pemeriksaan pH (https://goo.gl/d62Rqv) untuk kalibrasi dan kompensasi suhu, dan juga halaman, 7-8 dan 50 untuk pemeriksaan DO (https://goo.gl/mA32mp). Pertama, silakan unggah ulang kode generik yang disediakan oleh Atlas, buka Serial Monitor dan masukkan perintah yang tepat.

Langkah 10: Terlalu Banyak Pengkabelan?

  1. Anda dapat menghilangkan kartu SD dan modul jam waktu nyata dengan menggunakan Dragino Yun Shield untuk papan Arduino (https://goo.gl/J9PBTH). Kode perlu dimodifikasi untuk bekerja dengan Yun Shield. Inilah tempat yang baik untuk memulai (https://goo.gl/c1x8Dm)
  2. Masih terlalu banyak kabel: Atlas Scientific membuat panduan untuk sirkuit 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 terbiasa dengan perintah di Raspbian (versi Debian Linux) yang berjalan di Raspberry Pi (https://goo.gl/549xvk)

Langkah 11: Pengakuan:

Ini adalah proyek sampingan saya selama penelitian pascadoktoral yang saya kerjakan pada fotobioreaktor tingkat lanjut untuk membudidayakan mikroalga. Jadi saya pikir perlu kredit para pihak telah memberikan syarat untuk mewujudkannya. Pertama, hibah, DE-EE0007093: “Pengayaan dan Pengiriman CO2 Atmosfer (ACED),” dari Departemen Energi AS, Kantor Efisiensi Energi dan Biofuel dan Bioproduk Alga Bertarget Energi Terbarukan. Saya berterima kasih kepada Dr. Bruce E. Rittmann di Pusat Biodesign Swette untuk Bioteknologi Lingkungan, Universitas Negeri Arizona karena telah memberi saya kesempatan untuk mengotak-atik elektronik dan Arduino. Saya dilatih di bidang teknik lingkungan, kebanyakan kimia, sedikit mikrobiologi.

Direkomendasikan: