Obsah:

Jak vytvořit záznamník dat pro teplotu, PH a rozpuštěný kyslík: 11 kroků (s obrázky)
Jak vytvořit záznamník dat pro teplotu, PH a rozpuštěný kyslík: 11 kroků (s obrázky)

Video: Jak vytvořit záznamník dat pro teplotu, PH a rozpuštěný kyslík: 11 kroků (s obrázky)

Video: Jak vytvořit záznamník dat pro teplotu, PH a rozpuštěný kyslík: 11 kroků (s obrázky)
Video: Digitální PH metr AD12 použití a kalibrace 2024, Červenec
Anonim
Image
Image
obraz
obraz

Cíle:

  • Vytvořte záznamník dat za ≤ 500 $. Ukládá data pro teplotu, pH a DO s časovým razítkem a pomocí komunikace I2C.
  • Proč I2C (Inter-Integrated Circuit)? Jeden může naskládat tolik senzorů na stejný řádek, protože každý z nich má jedinečnou adresu.

Krok 1:

Krok 2: Kupte si níže uvedené součásti:

Kupte si níže uvedené díly
Kupte si níže uvedené díly
  1. Arduino MEGA 2560, 35 $,
  2. Napájecí adaptér pro desku Arduino, 5,98 $,
  3. LCD modul I2C (displej), 8,99 $,
  4. Průlom hodin v reálném čase (RTC), 7,5 $,
  5. Deska pro odlomení karty MicroSD, 7,5 $,
  6. 4 GB SD karta, 6,98 $,
  7. Vodotěsný digitální senzor DS18B20, 9,95 $,
  8. pH sonda + soupravy + standardní pufry, 149,15 $,
  9. Sonda DO + soupravy + standardní nárazníky, 247,45 $,
  10. Breadboard, propojovací kabel, 7,98 $,
  11. (Volitelné) Izolátor napětí, 24 $,

Celkem: 510,48 $

* Některé součásti (jako generická deska) lze zakoupit u jiných prodejců (eBay, čínský prodejce) za nižší cenu. Doporučuje se získat sondy pH a DO od společnosti Atlas Scientific.

* Ke kontrole vodivosti a napětí se doporučuje použít multimetr. Stojí to asi 10-15 $ (https://goo.gl/iAMDJo)

Krok 3: Zapojení

Elektrické vedení
Elektrické vedení
  • Pomocí propojovacích kabelů/kabelů DuPont připojte součásti podle obrázku níže.
  • Pomocí multimetru zkontrolujte vedení.
  • Zkontrolujte napájení s kladným napětím (VCC) a uzemnění (GND) (snadno se zaměníte, pokud nejste obeznámeni s obvodem)
  • Zapojte napájecí adaptér a zkontrolujte indikátor napájení v každé části. V případě pochybností zkontrolujte pomocí multimetru napětí mezi VCC a GND na (5V)

Krok 4: Připravte si obvody PH, DO, SD kartu

Připravte si obvody PH, DO, SD kartu
Připravte si obvody PH, DO, SD kartu
  1. Přepněte na I2C pro obvody pH a DO
  2. Průlomky pH a DO jsou dodávány se sériovou komunikací jako výchozím režimem vysílání/příjem (TX/RX). Chcete-li použít taktovací linku (SCL) a datovou linku (SDA) v režimu I2C, přepněte režim pomocí (1): odpojte kabely VCC, TX, RX, (2): přeskočte TX na Ground for Probe, PGND (ne GND), (3) zapojte VCC do obvodu, (4): počkejte, až se LED změní ze zelené na modrou. Další podrobnosti naleznete na straně 39 (Datový list pro obvod pH,
  3. Stejný krok proveďte s obvodem DO
  4. (pokud víte, jak nahrát ukázkový kód na desku, můžete to provést pomocí sériového monitoru)
  5. Formátujte kartu SD do formátu FAT

Krok 5: Příprava softwaru

Připravte software
Připravte software
Připravte software
Připravte software
Připravte software
Připravte software
Připravte software
Připravte software
  1. Stáhněte si Arduino Integrated Development Environment (IDE),
  2. Nainstalujte si knihovnu do Arduino IDE:
  3. Většina z nich je dodávána se softwarem Arduino. LiquidCrystal_I2C.h je k dispozici prostřednictvím GitHub
  4. Nainstalujte ovladač pro USB. U originálního Arduina možná nebudete muset žádné instalovat. Pro obecný je třeba nainstalovat ovladač CH340 (GitHub:
  5. Spusťte test blikající LED a zkontrolujte, zda je deska připojena správně
  6. Jak zjistit MAC adresu digitální teploty 18B20. Použití šablony skeneru I2C v Arduino IDE se zapojenou sondou. Každé zařízení má jedinečnou adresu MAC, takže můžete použít tolik teplotních sond s jednou sdílenou linkou (#9). 18B20 používá jednovodičovou I2C, jde tedy o speciální případ komunikační metody I2C. Níže je jeden způsob, jak najít MAC - Medical Access Control („ROM“, když spustíte níže uvedený postup).

Krok 6: Začněte kódovat

Začněte kódovat
Začněte kódovat
  • Zkopírujte níže uvedený kód do Arduino IDE:
  • Nebo si stáhněte kód (.ino) a v Arduino IDE by se mělo objevit nové okno.

/*

Referenční návody:

1. Záznamník teploty, ORP, pH:

2. Zabezpečený digitální (SD) štít:

Tento kód přenese data na sériový monitor Arduino. Zadejte příkazy do sériového monitoru Arduino pro ovládání obvodu EZO pH v režimu I2C.

Upraveno z výše uvedených referenčních výukových programů, většinou z kódu I2C společností Atlas-Scientific

Poslední aktualizace: 26. července 2017 od Binh Nguyen

*/

#include // povolit I2C.

#define pH_address 99 // výchozí I2C ID číslo pro EZO pH Circuit.

#define DO_address 97 // výchozí I2C ID číslo pro EZO DO Circuit.

#include "RTClib.h" // Funkce data a času pomocí RTC DS1307 připojeného přes I2C a Wire lib

RTC_DS1307 rtc;

#include // Pro SD libarary

#include // SD karta pro ukládání dat

const int chipSelect = 53; // potřeba vymyslet Adafruit SD breakout //

// DO = MISO, DI = MOSI, na kolíku ATmega#: 50 (MISO), 51 (MOSI), 52 (SCK), 53 (SS)

char logFileName = "dataLT.txt"; // úprava logFileName k identifikaci vašeho experimentu, například PBR_01_02, datalog1

dlouhé id = 1; // číslo ID pro zadání pořadí protokolů

#zahrnout

LiquidCrystal_I2C lcd (0x27, 20, 4);

#zahrnout

#zahrnout

#define ONE_WIRE_BUS 9 // definujte pin # pro teplotní sondu

OneWire oneWire (ONE_WIRE_BUS);

Senzory teploty Dallas (& oneWire);

DeviceAddress ProbeP = {0x28, 0xC2, 0xE8, 0x37, 0x07, 0x00, 0x00, 0xBF}; // MAC adresa, jedinečná pro každou sondu

Řetězec dataString; // hlavní varianta pro uložení všech dat

Řetězec dataString2; // dočasná varianta pro uložení teploty/pH/DO pro tisk

char počítačová data [20]; // instrukce od společnosti Atlas Scientific: vytvoříme 20bajtové znakové pole pro uložení příchozích dat z počítače/mac/jiného.

byte receive_from_computer = 0; // potřebujeme vědět, kolik znaků bylo přijato.

byte serial_event = 0; // příznak signalizující přijetí dat z počítače/mac/jiného.

byte kód = 0; // slouží k uložení kódu odpovědi I2C.

char pH_data [20]; // vytvoříme 20bajtové znakové pole pro uchování příchozích dat z obvodu pH.

byte in_char = 0; // používá se jako 1bajtový buffer k ukládání do vázaných bytů z obvodu pH.

byte i = 0; // čítač používaný pro pole ph_data.

int čas_ = 1800; // slouží ke změně potřebného zpoždění v závislosti na příkazu odeslaném do obvodu pH třídy EZO.

float pH_float; // float var slouží k udržení floatové hodnoty pH.

char DO_data [20];

// float temp_C;

void setup () // inicializace hardwaru.

{

Serial.begin (9600); // povolit sériový port.

Wire.begin (pH_adresa); // povolit I2C port pro pH sondu

Wire.begin (DO_address);

lcd.init ();

lcd.begin (20, 4);

lcd.backlight ();

lcd.home ();

lcd.print („Ahoj PBR!“);

lcd.setCursor (0, 1);

lcd.print ("Inicializace …");

Serial.print („RTC je …“);

if (! rtc.begin ())

{

Serial.println ("RTC: Hodiny reálného času … NENÍ NALEZENO");

while (1); // (Serial.println ("RTC: hodiny reálného času … NALEZENÉ"));

}

Serial.println („BĚHÁ“);

Serial.print („Hodiny v reálném čase…“);

if (! rtc.isrunning ())

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

}

Serial.println ("PRÁCE");

lcd.setCursor (0, 0);

lcd.println ("RTC: OK");

Serial.print („SD karta…“); // zjistěte, zda je karta přítomna a lze ji inicializovat:

if (! SD.begin (chipSelect))

{Serial.println ("Selhalo"); // nedělej nic víc:

vrátit se;

}

Serial.println ("OK");

lcd.setCursor (0, 1);

lcd.println („SD karta: OK“);

Serial.print ("Soubor protokolu:");

Serial.print (logFileName);

Serial.print ("…");

Soubor logFile = SD.open (logFileName, FILE_WRITE); // otevřete soubor. „datalog“a vytiskněte záhlaví

if (logFile)

{

logFile.println (",,,"); // označte, že v předchozím běhu byla data

Záhlaví řetězce = "Datum -Čas, Teplota (C), pH, DO";

logFile.println (záhlaví);

logFile.close ();

Serial.println ("READY");

//Serial.println(dataString); // tisk i na sériový port:

}

else {Serial.println ("chyba při otevírání protokolu dat"); } // pokud soubor není otevřen, vyskočí chyba:

lcd.setCursor (0, 2);

lcd.print ("Soubor protokolu:");

lcd.println (logFileName);

zpoždění (1000);

sensor.begin ();

sensor.setResolution (ProbeP, 10); // 10 je rozlišení (10bit)

lcd.clear ();

id = 0;

}

prázdná smyčka ()

{// hlavní smyčka.

dataString = String (id);

dataString = String (',');

DateTime now = 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);

sensor.requestTemperatures ();

displayTemperature (ProbeP);

Wire.beginTransmission (pH_address); // volání obvodu podle jeho ID čísla

Wire.write ('r'); // tvrdý kód r pro nepřetržité čtení

Wire.endTransmission (); // ukončení přenosu dat I2C.

zpoždění_); // počkejte správný čas, než obvod dokončí své instrukce.

Wire.requestFrom (pH_address, 20, 1); // zavolejte obvod a požádejte o 20 bajtů (to může být více, než potřebujeme)

while (Wire.available ()) // existují bajty k přijetí

{

in_char = Wire.read (); // obdrží bajt.

if ((in_char> 31) && (in_char <127)) // zkontrolujte, zda je znak použitelný (tisknutelný)

{

pH_data = in_char; // načtěte tento bajt do našeho pole.

i+= 1;

}

if (in_char == 0) // pokud vidíme, že nám byl zaslán nulový příkaz.

{

i = 0; // reset počítadla i na 0.

Wire.endTransmission (); // ukončení přenosu dat I2C.

přestávka; // opuštění cyklu while.

}

}

serial_event = 0; // resetujte příznak sériové události.

dataString2 += ",";

dataString2 += String (pH_data);

Wire.beginTransmission (DO_address); // volání obvodu podle jeho ID čísla

Wire.write ('r');

Wire.endTransmission (); // ukončení přenosu dat I2C

zpoždění_); // počkejte správný čas, než obvod dokončí své instrukce

Wire.requestFrom (DO_address, 20, 1); // volání obvodu a požadavek 20 bytů

while (Wire.available ()) // are bytes to receive.

{

in_char = Wire.read (); // obdrží bajt.

if ((in_char> 31) && (in_char <127)) // check if the char is usable (printable), otherwise the in_char contains a symbol at the begin in the.txt file

{DO_data = in_char; // načtěte tento bajt do našeho pole

i+= 1; // vyvolání čítače pro prvek pole

}

pokud (in_char == 0)

{// pokud vidíme, že nám byl zaslán nulový příkaz

i = 0; // reset počítadla i na 0.

Wire.endTransmission (); // ukončení přenosu dat I2C.

přestávka; // opuštění cyklu while.

}

}

serial_event = 0; // resetujte příznak sériové události

pH_float = atof (pH_data);

dataString2 += ",";

dataString2 += String (DO_data);

lcd.setCursor (0, 1);

lcd.print („Teplota/ pH/ DO“);

lcd.setCursor (0, 2);

lcd.print (dataString2);

dataString += ',';

dataString += dataString2;

Soubor dataFile = SD.open (logFileName, FILE_WRITE); // otevřete soubor. Všimněte si, že současně lze otevřít pouze jeden soubor, takže tento musíte před otevřením dalšího zavřít.

if (dataFile) // pokud je soubor k dispozici, zapište do něj:

{

dataFile.println (dataString);

dataFile.close ();

Serial.println (dataString); // tisk i na sériový port:

}

else {Serial.println ("chyba při otevírání souboru datalog"); } // pokud soubor není otevřen, vyskočí chyba:

lcd.setCursor (0, 3);

lcd.print ("Běží (x5 m):");

lcd.setCursor (15, 3);

lcd.print (id);

id ++; // další iteraci zvětšit o jedno ID

dataString = "";

zpoždění (300 000); // zpoždění 5 minut = 5*60*1000 ms

lcd.clear ();

} // konec hlavní smyčky

void displayTemperature (DeviceAddress deviceAddress)

{

float tempC = sensor.getTempC (deviceAddress);

if (tempC == -127.00) lcd.print ("Chyba teploty");

else dataString2 = String (tempC);

} // zde kód končí

  • Vyberte správný COM port přes Arduino IDE v části Nástroje/Port
  • Vyberte si správnou desku Arduino. Použil jsem Mega 2560, protože má více vnitřní paměti. Arduino Nano nebo Uno s tímto nastavením funguje dobře.
  • Zkontrolujte a kódujte a nahrajte kód

Krok 7: Výsledky týkající se zapojení (lze zlepšit) a displeje LCD

Výsledky na zapojení (lze zlepšit) a LCD displeji
Výsledky na zapojení (lze zlepšit) a LCD displeji
Výsledky na zapojení (lze zlepšit) a LCD displeji
Výsledky na zapojení (lze zlepšit) a LCD displeji
Výsledky na zapojení (lze zlepšit) a LCD displeji
Výsledky na zapojení (lze zlepšit) a LCD displeji
Výsledky na zapojení (lze zlepšit) a LCD displeji
Výsledky na zapojení (lze zlepšit) a LCD displeji
  • Upozornění: S hlukem ze sondy DO na pH sondu jsem se setkal po 2-3 měsících nepřetržitého provozu. Podle společnosti Atlas Scientific se při měření pH a vodivosti sondy doporučuje použít in-line napěťový izolátor. Další podrobnosti jsou na straně 9 (https://goo.gl/d62Rqv)
  • Zaznamenaná data (první má nepotištěné znaky před údaji pH a DO). Filtroval jsem na kód povolením pouze tisknutelných znaků.

Krok 8: Importujte data a vytvořte graf

Importujte data a vytvořte graf
Importujte data a vytvořte graf
Importujte data a vytvořte graf
Importujte data a vytvořte graf
Importujte data a vytvořte graf
Importujte data a vytvořte graf
  1. Import dat z textu na kartě DATA (Excel 2013)
  2. Oddělte data čárkou (proto je užitečné mít čárky po každém zadání dat)
  3. Vykreslete data. Každá níže uvedená data mají přibližně 1700 bodů. Interval měření je 5 minut (nastavitelný). Minimum pro DO a pH obvody pro čtení dat je 1,8 s.

Krok 9: Kalibrace

Kalibrace
Kalibrace
  1. Digitální teplotní senzor (18B20) lze kalibrovat nastavením rozdílu přímo na. V opačném případě, pokud kompenzace a sklon vyžadují kalibraci, můžete to provést změnou hodnot na řádku #453, DallasTemperature.cpp ve složce / libraries / DallasTemperature.
  2. U sond pH a DO můžete sondy kalibrovat pomocí doprovodných roztoků. Musíte použít ukázkový kód od společnosti Atlas Scientific a řídit se pokyny v tomto souboru.
  3. Pro kalibraci a teplotní kompenzaci prosím sledujte strany 26 a 50 (https://goo.gl/d62Rqv) a také stránky 7-8 a 50 pro sondu DO (https://goo.gl/mA32mp). Nejprve znovu nahrajte generický kód poskytovaný společností Atlas, otevřete Serial Monitor a zadejte správný příkaz.

Krok 10: Příliš mnoho kabeláže?

  1. SD kartu a modul hodin v reálném čase můžete eliminovat pomocí Dragino Yun Shield pro desky Arduino (https://goo.gl/J9PBTH). Kód bylo potřeba upravit, aby fungoval s Yun Shield. Zde je dobré začít (https://goo.gl/c1x8Dm)
  2. Stále příliš mnoho kabeláže: Atlas Scientific vytvořil průvodce pro své obvody EZO (https://goo.gl/dGyb12) a bezspájkovou desku (https://goo.gl/uWF51n). Integrace digitální teploty 18B20 je zde (https://goo.gl/ATcnGd). Musíte být obeznámeni s příkazy na Raspbian (verze Debian Linux) běžícím na Raspberry Pi (https://goo.gl/549xvk)

Krok 11: Potvrzení:

Toto je můj vedlejší projekt během mého postdoktorandského výzkumu, na kterém jsem pracoval na pokročilém fotobioreaktoru na kultivaci mikrořas. Takže jsem si myslel, že je nutné připsat stranám, že poskytly podmínky, aby se to stalo. Za prvé, grant DE-EE0007093: „Obohacení a dodávka atmosférického CO2 (ACED)“od amerického ministerstva energetiky, Úřadu pro energetickou účinnost a biopaliva a bioprodukty zaměřené na řasy. Děkuji Dr. Bruceovi E. Rittmannovi z Biodesign Swette Center for Environmental Biotechnology, Arizona State Univesity, že mi poskytl příležitost hrát si s elektronikou a Arduinem. Byl jsem vyškolen v environmentálním inženýrství, většinou chemii, trochu mikrobiologii.

Doporučuje: