Talaan ng mga Nilalaman:

Paano Gumawa ng isang Data Logger para sa Temperatura, PH, at Dissolved Oxygen: 11 Mga Hakbang (na may Mga Larawan)
Paano Gumawa ng isang Data Logger para sa Temperatura, PH, at Dissolved Oxygen: 11 Mga Hakbang (na may Mga Larawan)

Video: Paano Gumawa ng isang Data Logger para sa Temperatura, PH, at Dissolved Oxygen: 11 Mga Hakbang (na may Mga Larawan)

Video: Paano Gumawa ng isang Data Logger para sa Temperatura, PH, at Dissolved Oxygen: 11 Mga Hakbang (na may Mga Larawan)
Video: Yieryi 6 in 1 Water Quality Meter review 2024, Nobyembre
Anonim
Image
Image
Larawan
Larawan

Mga Layunin:

  • Gumawa ng isang data logger sa halagang 500 $ 500. Nag-iimbak ito ng data para sa temperatura, pH, at DO na may time stamp at paggamit ng komunikasyon ng I2C.
  • Bakit I2C (Inter-Integrated Circuit)? Ang isa ay maaaring mag-stack ng maraming mga sensor sa parehong linya na ibinigay na ang bawat isa sa kanila ay may isang natatanging address.

Hakbang 1:

Hakbang 2: Bilhin ang Mga Bahagi sa ibaba:

Bilhin ang Mga Bahagi sa ibaba
Bilhin ang Mga Bahagi sa ibaba
  1. Arduino MEGA 2560, $ 35,
  2. Power adapter para sa Arduino board, $ 5.98,
  3. LCD module I2C (display), $ 8.99,
  4. Breakout ng Real-Time Clock (RTC), $ 7.5,
  5. Breakout board ng MicroSD card, $ 7.5,
  6. 4GB SD card, $ 6.98,
  7. Hindi tinatagusan ng tubig DS18B20 Digital sensor, $ 9.95,
  8. pH probe + Kit + Standard buffers, $ 149.15, https://www.atlas-s Scientific.com/product_pages/kit…
  9. Suriin ang DO + Mga Kit + Mga Karaniwang buffer, $ 247.45, https://www.atlas-s Scientific.com/product_pages/kit…
  10. Breadboard, jumper cable, $ 7.98,
  11. (Opsyonal) Voltage Isolator, $ 24, https://www.atlas-s Scientific.com/product_pages/cir…

Kabuuan: $ 510.48

* Ang ilang mga bahagi (tulad ng generic board) ay maaaring mabili mula sa iba pang mga vendor (eBay, nagbebenta ng Intsik) para sa isang mas mababang presyo. Inirerekumenda ang mga probe ng pH at DO na makuha ang mga ito mula sa Atlas Scientific.

* Inirerekumenda ang isang multimeter upang suriin ang kondaktibiti at boltahe. Nagkakahalaga ito ng humigit-kumulang na $ 10-15 (https://goo.gl/iAMDJo)

Hakbang 3: Mga kable

Kable
Kable
  • Gumamit ng mga jumper / DuPont cable upang ikonekta ang mga bahagi tulad ng ipinakita sa sketch sa ibaba.
  • Gamitin ang multimeter upang suriin ang pagpapadaloy.
  • Suriin ang Positive-Voltage Supply (VCC) at Ground (GND) (madaling malito kung hindi ka pamilyar sa circuit)
  • I-plug ang power adapter at suriin ang tagapagpahiwatig ng kuryente sa bawat bahagi. Kapag may pag-aalinlangan, gamitin ang multi-meter upang suriin ang boltahe sa pagitan ng VCC at GND na (5V)

Hakbang 4: Ihanda ang PH, DO Circuits, SD Card

Ihanda ang PH, DO Circuits, SD Card
Ihanda ang PH, DO Circuits, SD Card
  1. Lumipat sa I2C para sa mga circuit ng PH at DO
  2. Ang mga breakout ng PH at DO ay ipinadala sa Serial na komunikasyon bilang default mode na Transmit / Receive (TX / RX). Upang magamit ang I2C mode Clock line (SCL), at linya ng Data (SDA), switch mode ng (1): un-plug VCC, TX, RX cables, (2): jump TX to Ground for Probe, PGND (not GND), (3) plug VCC sa circuit, (4): maghintay para sa LED na baguhin mula sa Green hanggang Blue. Higit pang mga detalye suriin sa pahina 39 (Datasheet para sa PH circuit,
  3. Gawin ang parehong hakbang sa DO circuit
  4. (kung alam mo kung paano i-upload ang sample code sa board, magagawa mo ito sa pamamagitan ng Serial monitor)
  5. I-format ang SD card sa format na FAT

Hakbang 5: Maghanda ng Software

Maghanda ng Software
Maghanda ng Software
Maghanda ng Software
Maghanda ng Software
Maghanda ng Software
Maghanda ng Software
Maghanda ng Software
Maghanda ng Software
  1. I-download ang Arduino Integrated Development Environment (IDE),
  2. I-install ang library sa Arduino IDE:
  3. Karamihan sa kanila ay mayroong Arduino software. Ang LiquidCrystal_I2C.h ay magagamit sa pamamagitan ng GitHub
  4. I-install ang driver para sa USB. Para sa tunay na Arduino, maaaring hindi mo kailangang mag-install ng isa. Para sa isang pangkaraniwan, kailangan mong i-install ang driver ng CH340 (GitHub:
  5. Suriin kung ikinonekta mo ang board nang tama sa pamamagitan ng pagpapatakbo ng isang blinking LED test
  6. Paano makahanap ng MAC address ng 18B20 digital na temperatura. Paggamit ng template ng scanner ng I2C sa Arduino IDE na naka-plug in ang probe. Ang bawat aparato ay may natatanging MAC address, kaya maaari mong gamitin ang maraming mga pagsisiyasat sa temperatura sa isang nakabahaging linya (# 9). Ang 18B20 ay gumagamit ng isang wire I2C, kaya't ito ay isang espesyal na kaso ng I2C na paraan ng komunikasyon. Nasa ibaba ang isang pamamaraan upang makahanap ng MAC - Medical Access Control ("ROM" kapag pinatakbo mo ang pamamaraan sa ibaba).

Hakbang 6: Simulan ang Coding

Simulan ang Coding
Simulan ang Coding
  • Kopyahin i-paste ang code sa ibaba sa Arduino IDE:
  • O i-download ang code (.ino) at ang isang bagong window ay dapat na mag-pop up sa Arduino IDE.

/*

Mga tutorial sa sanggunian:

1. Temperatura, ORP, ph logger:

2. Secured Digital (SD) Shield:

Ang code na ito ay maglalabas ng data sa serial monitor ng Arduino. I-type ang mga utos sa serial monitor ng Arduino upang makontrol ang EZO pH Circuit sa I2C mode.

Binago mula sa mga sanggunian na mga tutorial sa itaas, karamihan ay mula sa I2C code ng Atlas-Scientific

Huling na-update: Hulyo 26, 2017 ni Binh Nguyen

*/

# isama // paganahin ang I2C.

# tukuyin ang pH_address 99 // default I2C ID number para sa EZO pH Circuit.

#define DO_address 97 // default I2C ID number for EZO DO Circuit.

# isama ang "RTClib.h" // Mga pag-andar ng petsa at oras gamit ang isang DS1307 RTC na konektado sa pamamagitan ng I2C at Wire lib

RTC_DS1307 rtc;

#include // For SD libarary

#include // SD card upang mag-imbak ng data

const int chipSelect = 53; // kailangang alamin para sa breakout ng Adafruit SD //

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

char logFileName = "dataLT.txt"; // baguhin ang logFileName upang makilala ang iyong eksperimento, para sa halimbawang PBR_01_02, datalog1

mahabang id = 1; // ang id number upang ipasok ang order ng log

# isama

LiquidCrystal_I2C lcd (0x27, 20, 4);

# isama

# isama

# tukuyin ang ONE_WIRE_BUS 9 // tukuyin ang pin # para sa probe ng temperatura

OneWire oneWire (ONE_WIRE_BUS);

Mga sensor ng DallasTemperature (& oneWire);

DeviceAddress ProbeP = {0x28, 0xC2, 0xE8, 0x37, 0x07, 0x00, 0x00, 0xBF}; // MAC address, natatangi sa bawat pagsisiyasat

String dataString; // ang pangunahing variant upang maiimbak ang lahat ng data

String dataString2; // isang pansamantalang variant upang mag-imbak ng Temperatura / pH / DO para ma-print

char computerdata [20]; // tagubilin mula sa Atlas Scientific: gumawa kami ng isang 20 byte character array upang hawakan ang papasok na data mula sa isang pc / mac / iba pa.

byte received_from_computer = 0; // kailangan nating malaman kung ilang character ang natanggap.

byte serial_event = 0; // isang watawat upang mag-signal kapag natanggap ang data mula sa pc / mac / iba pa.

byte code = 0; // ginamit upang hawakan ang I2C code ng pagtugon.

char pH_data [20]; // gumawa kami ng isang 20 byte character array upang hawakan ang papasok na data mula sa circuit ng pH.

byte in_char = 0; // ginamit bilang isang 1 byte buffer upang maiimbak sa mga nakagapos na byte mula sa PH Circuit.

byte i = 0; // counter na ginagamit para sa ph_data array.

int time_ = 1800; // ginamit upang baguhin ang pagkaantala na kinakailangan depende sa utos na ipinadala sa EZO Class pH Circuit.

lumutang pH_float; // float var na ginamit upang hawakan ang float halaga ng ph.

char DO_data [20];

// float temp_C;

void setup () // hardware initialization.

{

Serial.begin (9600); // paganahin ang serial port.

Wire.begin (pH_address); // paganahin ang I2C port para sa probe ng 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 ("Initializing…");

Serial.print ("Ang RTC ay …");

kung (! rtc.begin ())

{

Serial.println ("RTC: Oras ng real-time … HINDI NAKITA");

habang (1); // (Serial.println ("RTC: Oras na real-time … Nahanap"));

}

Serial.println ("RUNNING");

Serial.print ("Real-time Clock …");

kung (! rtc.isrunning ())

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

}

Serial.println ("TRABAHO");

lcd.setCursor (0, 0);

lcd.println ("RTC: OK");

Serial.print ("SD card…"); // tingnan kung ang kard ay naroroon at maaaring mapasimulan:

kung (! SD.begin (chipSelect))

{Serial.println ("Nabigo"); // huwag ka nang gumawa ng anumang bagay:

bumalik;

}

Serial.println ("OK");

lcd.setCursor (0, 1);

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

Serial.print ("Log File:");

Serial.print (logFileName);

Serial.print ("…");

File logFile = SD.open (logFileName, FILE_WRITE); // buksan ang file. "datalog" at i-print ang header

kung (logFile)

{

logFile.println (",,,"); // ipahiwatig na mayroong mga data sa nakaraang pagtakbo

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

logFile.println (header);

logFile.close ();

Serial.println ("HANDA");

//Serial.println(dataString); // print sa serial port din:

}

iba pa {Serial.println ("error opening datalog"); } // kung hindi bukas ang file, mag-pop up ng isang error:

lcd.setCursor (0, 2);

lcd.print ("Mag-log file:");

lcd.println (logFileName);

pagkaantala (1000);

sensor. simula ();

sensors.setResolution (ProbeP, 10); // 10 ang resolusyon (10bit)

lcd.clear ();

id = 0;

}

walang bisa loop ()

{// ang pangunahing loop.

dataString = String (id);

dataString = String (',');

DateTime ngayon = rtc.now ();

dataString = String (now.year (), DEC);

dataString + = String ('/');

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

dataString + = String ('/');

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

dataString + = String ( );

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

dataString + = String (':');

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

dataString + = String (':');

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

lcd.home ();

lcd.print (dataString);

sensors.requestTemperature ();

displayTemperature (ProbeP);

Wire.beginTransmission (pH_address); // tawagan ang circuit sa pamamagitan ng numero ng ID nito

Wire.write ('r'); // hard code r upang mabasa nang tuloy-tuloy

Wire.endTransmission (); // tapusin ang paghahatid ng data ng I2C.

antala (oras_); // hintayin ang tamang dami ng oras para makumpleto ng circuit ang tagubilin nito.

Wire.requestFrom (pH_address, 20, 1); // tawagan ang circuit at humiling ng 20 bytes (maaaring higit ito sa kailangan namin)

habang (Wire.available ()) // may mga byte na matatanggap

{

in_char = Wire.read (); // makatanggap ng isang byte.

kung ((in_char> 31) && (in_char <127)) // suriin kung magagamit ang char (mai-print)

{

pH_data = in_char; // load this byte into our array.

ako + = 1;

}

kung (in_char == 0) // kung nakikita namin na pinadalhan kami ng isang null na utos.

{

i = 0; // reset ang counter i sa 0.

Wire.endTransmission (); // tapusin ang paghahatid ng data ng I2C.

pahinga; // exit the habang loop.

}

}

serial_event = 0; // reset ang flag ng pangyayari sa serial.

dataString2 + = ",";

dataString2 + = String (pH_data);

Wire.beginTransmission (DO_address); // tawagan ang circuit sa pamamagitan ng numero ng ID nito

Wire.write ('r');

Wire.endTransmission (); // tapusin ang paghahatid ng data ng I2C

antala (oras_); // hintayin ang tamang dami ng oras para makumpleto ng circuit ang tagubilin nito

Wire.requestFrom (DO_address, 20, 1); // tawagan ang circuit at humiling ng 20 bytes

habang (Wire.available ()) // may mga byte na matatanggap.

{

in_char = Wire.read (); // makatanggap ng isang byte.

kung ((in_char> 31) && (in_char <127)) // suriin kung magagamit ang char (mai-print), kung hindi man naglalaman ang in_char ng isang simbolo sa simula sa.txt file

{DO_data = in_char; // load this byte into our array

ako + = 1; // incur the counter para sa elemento ng array

}

kung (in_char == 0)

{// kung nakita namin na pinadalhan kami ng isang null na utos

i = 0; // reset ang counter i sa 0.

Wire.endTransmission (); // tapusin ang paghahatid ng data ng I2C.

pahinga; // exit the habang loop.

}

}

serial_event = 0; // reset ang flag ng pangyayari sa serial

pH_float = atof (pH_data);

dataString2 + = ",";

dataString2 + = String (DO_data);

lcd.setCursor (0, 1);

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

lcd.setCursor (0, 2);

lcd.print (dataString2);

dataString + = ',';

dataString + = dataString2;

File dataFile = SD.open (logFileName, FILE_WRITE); // buksan ang file. tandaan na ang isang file lamang ang maaaring buksan nang paisa-isa, kaya kailangan mong isara ang isang ito bago buksan ang isa pa.

kung (dataFile) // kung ang file ay magagamit, sumulat dito:

{

dataFile.println (dataString);

dataFile.close ();

Serial.println (dataString); // print sa serial port din:

}

iba pa {Serial.println ("error sa pagbubukas ng file ng datalog"); } // kung hindi bukas ang file, mag-pop up ng isang error:

lcd.setCursor (0, 3);

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

lcd.setCursor (15, 3);

lcd.print (id);

id ++; // taasan ang isang ID sa susunod na pag-ulit

dataString = "";

pagkaantala (300000); // delay 5 mintues = 5 * 60 * 1000 ms

lcd.clear ();

} // pagtatapos ng pangunahing loop

void displayTemperature (DeviceAddress aparatoAddress)

{

float tempC = sensors.getTempC (deviceAddress);

kung (tempC == -127.00) lcd.print ("Temperatura Error");

iba dataString2 = String (tempC);

} // natapos ang code dito

  • Piliin ang tamang COM port sa pamamagitan ng Arduino IDE sa ilalim ng Tools / Port
  • Piliin ang tamang board ng Arduino. Gumamit ako ng Mega 2560 sapagkat mayroon itong mas panloob na memorya. Ang Arduino Nano o Uno ay gumagana nang maayos sa pag-setup na ito.
  • Suriin at i-code at i-upload ang code

Hakbang 7: Mga Resulta sa Mga Kable (Maaaring Pagbutihin) at LCD Display

Mga resulta sa Mga Kable (maaaring Mapabuti) at LCD Display
Mga resulta sa Mga Kable (maaaring Mapabuti) at LCD Display
Mga resulta sa Mga Kable (maaaring Mapabuti) at LCD Display
Mga resulta sa Mga Kable (maaaring Mapabuti) at LCD Display
Mga resulta sa Mga Kable (maaaring Mapabuti) at LCD Display
Mga resulta sa Mga Kable (maaaring Mapabuti) at LCD Display
Mga resulta sa Mga Kable (maaaring Mapabuti) at LCD Display
Mga resulta sa Mga Kable (maaaring Mapabuti) at LCD Display
  • Paunawa: Nakatagpo ako ng ingay mula sa DO probe hanggang sa pH probe pagkatapos ng 2-3 buwan ng patuloy na operasyon. Ayon sa Atlas Scientific, inirerekumenda ang isang in-line voltage isolator kapag ang pH, ang mga probe ng conductivity ay magkakasamang umaandar. Ang higit pang mga detalye ay nasa pahina 9 (https://goo.gl/d62Rqv)
  • Ang naka-log na data (ang una ay may hindi naka-print na mga character bago ang data ng PH at DO). Nasala ko sa code sa pamamagitan ng pagpapahintulot sa mga naka-print na character lamang.

Hakbang 8: Mag-import ng Data at Gumawa ng isang Grap

Mag-import ng Data at Gumawa ng isang Grap
Mag-import ng Data at Gumawa ng isang Grap
Mag-import ng Data at Gumawa ng isang Graph
Mag-import ng Data at Gumawa ng isang Graph
Mag-import ng Data at Gumawa ng isang Graph
Mag-import ng Data at Gumawa ng isang Graph
  1. Mag-import ng data Mula sa Teksto Sa ilalim ng tab na DATA (Excel 2013)
  2. Paghiwalayin ang data sa pamamagitan ng kuwit (iyon ang dahilan kung bakit kapaki-pakinabang ang pagkakaroon ng mga kuwit pagkatapos ng bawat input ng data)
  3. I-plot ang data. Ang bawat data sa ibaba ay may tungkol sa 1700 puntos. Ang agwat ng pagsukat ay 5 minuto (nababagay). Ang pinakamaliit para sa DO at pH circuit upang mabasa ang data ay 1.8 secs.

Hakbang 9: Pagkakalibrate

Pagkakalibrate
Pagkakalibrate
  1. Ang sensor ng temperatura ng digital (18B20) ay maaaring mai-calibrate sa pamamagitan ng pag-aayos ng pagkakaiba nang direkta sa. Kung hindi man, kung ang bayad at ang slope ay nangangailangan ng pagkakalibrate, magagawa mo sa pamamagitan ng pagbabago ng mga halaga sa linya # 453, DallasTemperature.cpp sa folder ng / mga aklatan / DallasTemperature.
  2. Para sa mga probe ng pH at DO, maaari mong i-calibrate ang mga probe na may kasamang mga solusyon. Kailangan mong gamitin ang sample code sa pamamagitan ng Atlas Scientific at sundin ang tagubilin ng file na ito.
  3. Mangyaring sundin ang mga pahina 26 at 50 para sa probe ng pH (https://goo.gl/d62Rqv) para sa pagkakalibrate at bayad sa temperatura, at mga pahina din, 7-8 at 50 para sa DO probe (https://goo.gl/mA32mp). Una, mangyaring muling i-upload ang generic code na ibinigay ng Atlas, buksan ang Serial Monitor at susi sa isang wastong utos.

Hakbang 10: Napakaraming Kable?

  1. Maaari mong alisin ang SD card at ang module ng real time na orasan sa pamamagitan ng paggamit ng Dragino Yun Shield para sa Arduino boards (https://goo.gl/J9PBTH). Kailangang mabago ang code upang gumana kasama ang Yun Shield. Narito ang isang magandang lugar upang magsimula (https://goo.gl/c1x8Dm)
  2. Masyadong maraming kable: ang Atlas Scientific ay gumawa ng isang gabay para sa kanilang mga EZO circuit (https://goo.gl/dGyb12) at solderless board (https://goo.gl/uWF51n). Ang pagsasama ng 18B20 digital na temperatura ay narito (https://goo.gl/ATcnGd). Kailangan mong maging pamilyar sa mga utos sa Raspbian (isang bersyon ng Debian Linux) na tumatakbo sa Raspberry Pi (https://goo.gl/549xvk)

Hakbang 11: Pagkilala:

Ito ang aking proyekto sa panig sa panahon ng aking pagsasaliksik na postdoctoral kung saan nagtrabaho ako sa isang paunang photobioreactor upang malinang ang microalgae. Kaya naisip ko na kinakailangan na kredito ang mga partido na nagbigay ng mga kundisyon upang mangyari ito. Una, ang bigay, DE-EE0007093: "Atmospheric CO2 Pagpapayaman at Paghahatid (ACED)," mula sa Kagawaran ng Enerhiya ng Estados Unidos, Opisina ng Kakayahang Enerhiya at Nababago na Enerhiya na Na-target sa Algal Biofuels at Bioproduct. Pinasalamatan ko si Dr. Bruce E. Rittmann sa Biodesign Swette Center para sa Environmental Biotechnology, Arizona State Univesity para sa pagbibigay sa akin ng pagkakataong mag-tinker ng electronics at Arduino. Sanay ako sa engineering sa kapaligiran, karamihan ay kimika, isang kaunting microbiology.

Inirerekumendang: