INHOUDSOPGAWE:

Hoe om 'n datalogger te maak vir die temperatuur, PH en opgeloste suurstof: 11 stappe (met foto's)
Hoe om 'n datalogger te maak vir die temperatuur, PH en opgeloste suurstof: 11 stappe (met foto's)

Video: Hoe om 'n datalogger te maak vir die temperatuur, PH en opgeloste suurstof: 11 stappe (met foto's)

Video: Hoe om 'n datalogger te maak vir die temperatuur, PH en opgeloste suurstof: 11 stappe (met foto's)
Video: ИБП APC Smart UPS 2200 PowerChute Business Edition Обзор Установка Настройка Мониторинг через SNMP 2024, November
Anonim
Image
Image
Beeld
Beeld

Doelwitte:

  • Maak 'n datalogger vir ≤ $ 500. Dit stoor data vir temperatuur, pH en DO met 'n tydstempel en met behulp van I2C -kommunikasie.
  • Waarom I2C (geïntegreerde stroombaan)? 'N Mens kan soveel sensors in dieselfde lyn stapel, aangesien elkeen 'n unieke adres het.

Stap 1:

Stap 2: Koop die onderdele hieronder:

Koop die onderdele hieronder
Koop die onderdele hieronder
  1. Arduino MEGA 2560, $ 35,
  2. Kragadapter vir Arduino -bord, $ 5,98,
  3. LCD -module I2C (skerm), $ 8,99,
  4. Real-time Clock (RTC) breakout, $ 7.5,
  5. MicroSD kaart -uitbreekbord, $ 7,5,
  6. 4 GB SD -kaart, $ 6,98,
  7. Waterdigte DS18B20 digitale sensor, $ 9,95,
  8. pH-sonde + kits + standaard buffers, $ 149,15,
  9. DOEN sonde + kits + standaard buffers, $ 247,45,
  10. Broodbord, springkabel, $ 7,98,
  11. (Opsioneel) Spanningsisolator, $ 24,

Totaal: $ 510,48

* Sekere onderdele (soos die generiese bord) kan teen 'n laer prys by ander verkopers (eBay, Chinese verkoper) gekoop word. Dit word aanbeveel om pH- en DO -ondersoeke by Atlas Scientific te kry.

* 'N Multimeter word aanbeveel om geleiding en spanning na te gaan. Dit kos ongeveer $ 10-15 (https://goo.gl/iAMDJo)

Stap 3: Bedrading

Bedrading
Bedrading
  • Gebruik jumper/DuPont -kabels om die onderdele aan te sluit soos in die skets hieronder getoon.
  • Gebruik die multimeter om die geleiding na te gaan.
  • Kontroleer die positiewe spanningsvoorsiening (VCC) en die aarding (GND) (dit is maklik om te verwar as u nie die stroombaan ken nie)
  • Koppel die kragadapter aan en kyk na die kragaanwyser in elke deel. As u twyfel, gebruik die multimeter om die spanning tussen VCC en GND te bepaal (5V)

Stap 4: Berei die PH, DO -stroombane, SD -kaart voor

Berei die PH, DO -stroombane, SD -kaart voor
Berei die PH, DO -stroombane, SD -kaart voor
  1. Skakel oor na I2C vir pH- en DO -stroombane
  2. Die pH- en DO -uitbrekings word gestuur met seriële kommunikasie as die standaardmodus Transmit/Receive (TX/RX). Om die I2C-modus kloklyn (SCL) en datalyn (SDA) te gebruik, skakel modus deur (1): ontkoppel VCC-, TX-, RX-kabels, (2): spring TX na grond vir sonde, PGND (nie GND nie), (3) koppel VCC aan die stroombaan, (4): wag totdat LED van groen na blou verander. Meer besonderhede op bladsy 39 (Gegevensblad vir pH -stroombaan,
  3. Doen dieselfde stap met die DO -kring
  4. (as u weet hoe u die voorbeeldkode na die bord kan oplaai, kan u dit via die seriële monitor doen)
  5. Formateer SD -kaart in FAT -formaat

Stap 5: Berei sagteware voor

Berei sagteware voor
Berei sagteware voor
Berei sagteware voor
Berei sagteware voor
Berei sagteware voor
Berei sagteware voor
Berei sagteware voor
Berei sagteware voor
  1. Laai Arduino Integrated Development Environment (IDE) af,
  2. Installeer biblioteek op Arduino IDE:
  3. Die meeste van hulle het Arduino -sagteware. LiquidCrystal_I2C.h is beskikbaar via GitHub
  4. Installeer die bestuurder vir USB. Vir egte Arduino hoef u moontlik nie een te installeer nie. Vir 'n generiese een moet u die CH340 -bestuurder installeer (GitHub:
  5. Kyk of u die bord korrek verbind deur 'n knipperende LED -toets uit te voer
  6. Hoe om die MAC -adres van die 18B20 digitale temperatuur te vind. Gebruik die I2C -skandeerder -sjabloon in Arduino IDE met die sonde ingeprop. Elke toestel het 'n unieke MAC -adres, sodat u soveel temperatuurmeters met een gedeelde lyn (#9) kan gebruik. 18B20 gebruik 'n eendraad I2C, dus dit is 'n spesiale geval van I2C -kommunikasiemetode. Hieronder is 'n metode om MAC - Mediese Toegangsbeheer ("ROM" te vind as u die onderstaande prosedure uitvoer).

Stap 6: Begin met kodering

Begin met kodering
Begin met kodering
  • Kopieer plak die onderstaande kode in Arduino IDE:
  • Of laai die kode (.ino) af, en 'n nuwe venster verskyn in Arduino IDE.

/*

Verwysingsstudies:

1. Temperatuur, ORP, pH-logger:

2. Secured Digital (SD) Shield:

Hierdie kode sal data na die Arduino -seriële monitor stuur. Tik opdragte in die Arduino seriële monitor om die EZO pH -stroombaan in die I2C -modus te beheer.

Gewysig uit die tutoriale hierbo, meestal uit die I2C-kode deur Atlas-Scientific

Laaste opgedateer: 26 Julie 2017 deur Binh Nguyen

*/

#include // aktiveer I2C.

#define pH_address 99 // default I2C ID number for EZO pH Circuit.

#define DO_address 97 // standaard I2C ID -nommer vir EZO DO Circuit.

#sluit "RTClib.h" // Datum- en tydfunksies in met behulp van 'n DS1307 RTC wat via I2C en Wire lib gekoppel is

RTC_DS1307 rtc;

#include // Vir SD -biblioteek

#include // SD -kaart om data te stoor

const int chipSelect = 53; // moet uitvind vir Adafruit SD breakout //

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

char logFileName = "dataLT.txt"; // wysig logFileName om u eksperiment te identifiseer, byvoorbeeld PBR_01_02, datalog1

lang id = 1; // die ID -nommer om die logbestelling in te voer

#insluit

LiquidCrystal_I2C lcd (0x27, 20, 4);

#insluit

#insluit

# definieer ONE_WIRE_BUS 9 // definieer die pen # vir temperatuursonde

OneWire oneWire (ONE_WIRE_BUS);

DallasTemperatuur sensors (& oneWire);

DeviceAddress ProbeP = {0x28, 0xC2, 0xE8, 0x37, 0x07, 0x00, 0x00, 0xBF}; // MAC -adres, uniek vir elke sonde

String dataString; // die hoofvariant om alle data te stoor

String dataString2; // 'n tydelike variant om temperatuur/pH/DO op te slaan om uit te druk

char computerdata [20]; // instruksie van Atlas Scientific: ons maak 'n 20 -byte karakterreeks om inkomende data van 'n rekenaar/mac/ander te hou.

byte ontvang_van_rekenaar = 0; // ons moet weet hoeveel karakters al ontvang is.

byte serial_event = 0; // 'n vlag om aan te dui wanneer data van die pc/mac/other ontvang is.

greepkode = 0; // gebruik om die I2C -reaksiekode te hou.

char pH_data [20]; // ons maak 'n 20 byte karakterreeks om inkomende data uit die pH -kring te hou.

byte in_char = 0; // gebruik as 'n buffer van 1 byte om in gebonde grepe vanaf die pH -kring op te slaan.

byte i = 0; // teller wat gebruik word vir ph_data -skikking.

int tyd_ = 1800; // word gebruik om die benodigde vertraging te verander, afhangende van die opdrag wat na die EZO Klas pH -stroombaan gestuur word.

float pH_dryf; // float var word gebruik om die vlotwaarde van die pH te hou.

char DO_data [20];

// vlot temp_C;

leemte -opstelling () // hardeware -inisialisering.

{

Serial.begin (9600); // aktiveer reekspoort.

Draad. begin (pH_adres); // aktiveer I2C -poort vir pH -sonde

Wire.begin (DO_adres);

lcd.init ();

lcd.begin (20, 4);

lcd.backlight ();

lcd.home ();

lcd.print ("Hallo PBR!");

lcd.setCursor (0, 1);

lcd.print ("Initialiseer …");

Serial.print ("RTC is …");

as (! rtc.begin ())

{

Serial.println ("RTC: Real-time klok … NIE GEVOND");

terwyl (1); // (Serial.println ("RTC: Real-time klok … GEVOND"));

}

Serial.println ("RUNNING");

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

as (! rtc.isrunning ())

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

}

Serial.println ("WERKEND");

lcd.setCursor (0, 0);

lcd.println ("RTC: OK");

Serial.print ("SD -kaart …"); // kyk of die kaart teenwoordig is en geïnisialiseer kan word:

as (! SD.begin (chipSelect))

{Serial.println ("misluk"); // doen niks meer nie:

terugkeer;

}

Serial.println ("OK");

lcd.setCursor (0, 1);

lcd.println ("SD -kaart: OK");

Serial.print ("Log File:");

Serial.print (logFileName);

Serial.print ("…");

File logFile = SD.open (logFileName, FILE_WRITE); // maak die lêer oop. "datalog" en druk die opskrif

as (logFile)

{

logFile.println (",,,"); // dui aan dat daar data in die vorige lopie was

String header = "Datum -tyd, temperatuur (C), pH, DO";

logFile.println (kop);

logFile.close ();

Serial.println ("GEREED");

//Serial.println(dataString); // druk ook na die seriële poort:

}

anders {Serial.println ("fout tydens die opening van 'n logboek"); } // as die lêer nie oop is nie, verskyn 'n fout:

lcd.setCursor (0, 2);

lcd.print ("Log file:");

lcd.println (logFileName);

vertraging (1000);

sensors.begin ();

sensors.setResolution (ProbeP, 10); // 10 is die resolusie (10bit)

lcd.clear ();

id = 0;

}

leemte lus ()

{// die hooflus.

dataString = String (id);

dataString = String (',');

DateTime nou = rtc.now ();

dataString = String (nou.jaar (), DEC);

dataString += String ('/');

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

dataString += String ('/');

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

dataString += String ('');

dataString += String (nou.uur (), DEC);

dataString += String (':');

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

dataString += String (':');

dataString += String (nou.sekonde (), DEC);

lcd.home ();

lcd.print (dataString);

sensors.versoekTemperature ();

vertoningstemperatuur (sondeP);

Wire.begin Transmissie (pH_adres); // bel die kring met sy ID -nommer

Wire.write ('r'); // harde kode r om voortdurend te lees

Wire.endTransmission (); // beëindig die I2C -data -oordrag.

vertraging (tyd_); // wag die korrekte tyd totdat die kring die instruksie voltooi het.

Wire.requestFrom (pH_adres, 20, 1); // bel die kring en versoek 20 grepe (dit kan meer wees as wat ons nodig het)

terwyl (Wire.available ()) // daar grepe is om te ontvang

{

in_char = Wire.read (); // ontvang 'n greep.

if ((in_char> 31) && (in_char <127)) // kyk of die char bruikbaar is (drukbaar)

{

pH_data = in_char; // laai hierdie byte in ons skikking.

ek+= 1;

}

as (in_char == 0) // as ons sien dat ons 'n null -opdrag gestuur is.

{

ek = 0; // stel die teller i terug op 0.

Wire.endTransmission (); // beëindig die I2C -data -oordrag.

breek; // verlaat die while -lus.

}

}

reeks_gebeurtenis = 0; // stel die reeksgebeurtenisvlag terug.

dataString2 += ",";

dataString2 += String (pH_data);

Wire.beginTransmission (DO_adres); // bel die kring met sy ID -nommer

Wire.write ('r');

Wire.endTransmission (); // beëindig die I2C -data -oordrag

vertraging (tyd_); // wag die korrekte tyd totdat die kring die instruksie voltooi het

Wire.requestFrom (DO_adres, 20, 1); // bel die kring en versoek 20 grepe

terwyl (Wire.available ()) // daar grepe is om te ontvang.

{

in_char = Wire.read (); // ontvang 'n greep.

as ((in_char> 31) && (in_char <127)) // kyk of die char bruikbaar is (drukbaar), anders bevat die in_char 'n simbool aan die begin in die.txt -lêer

{DO_data = in_char; // laai hierdie byte in ons skikking

ek+= 1; // die toonbank vir die skikking -element aangaan

}

as (in_char == 0)

{// as ons sien dat ons 'n nulopdrag ontvang het

ek = 0; // stel die teller i terug op 0.

Wire.endTransmission (); // beëindig die I2C -data -oordrag.

breek; // verlaat die while -lus.

}

}

reeks_gebeurtenis = 0; // stel die reeksgebeurtenisvlag terug

pH_vloei = atof (pH_data);

dataString2 += ",";

dataString2 += String (DO_data);

lcd.setCursor (0, 1);

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

lcd.setCursor (0, 2);

lcd.print (dataString2);

dataString += ',';

dataString += dataString2;

Lêer dataFile = SD.open (logFileName, FILE_WRITE); // maak die lêer oop. Let daarop dat slegs een lêer op 'n slag oop kan wees, dus moet u hierdie lêer sluit voordat u 'n ander een oopmaak.

as (dataFile) // as die lêer beskikbaar is, skryf daaraan:

{

dataFile.println (dataString);

dataFile.close ();

Serial.println (dataString); // druk ook na die seriële poort:

}

anders {Serial.println ("fout tydens die opening van die dataloglêer"); } // as die lêer nie oop is nie, verskyn 'n fout:

lcd.setCursor (0, 3);

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

lcd.setCursor (15, 3);

lcd.print (id);

id ++; // verhoog een ID volgende iterasie

dataString = "";

vertraging (300000); // vertraag 5 minute = 5*60*1000 ms

lcd.clear ();

} // eindig hooflus

leegte vertoning Temperatuur (DeviceAddress deviceAddress)

{

float tempC = sensors.getTempC (deviceAddress);

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

anders dataString2 = String (tempC);

} // die kode eindig hier

  • Kies die regte COM -poort via Arduino IDE onder Tools/Port
  • Kies die regte Arduino -bord. Ek het Mega 2560 gebruik omdat dit meer interne geheue het. Arduino Nano of Uno werk goed met hierdie opstelling.
  • Kontroleer en kodeer en laai kode op

Stap 7: Resultate oor bedrading (kan verbeter word) en LCD -skerm

Resultate oor bedrading (kan verbeter word) en LCD -skerm
Resultate oor bedrading (kan verbeter word) en LCD -skerm
Resultate oor bedrading (kan verbeter word) en LCD -skerm
Resultate oor bedrading (kan verbeter word) en LCD -skerm
Resultate oor bedrading (kan verbeter word) en LCD -skerm
Resultate oor bedrading (kan verbeter word) en LCD -skerm
Resultate oor bedrading (kan verbeter word) en LCD -skerm
Resultate oor bedrading (kan verbeter word) en LCD -skerm
  • Let op: ek het die geraas van die DO-sonde na die pH-sonde teëgekom na 2-3 maande aaneenlopende werking. Volgens Atlas Scientific word 'n in-line spanningsisolator aanbeveel wanneer pH-, geleidingsondes saam werk. Meer besonderhede is op bladsy 9 (https://goo.gl/d62Rqv)
  • Die aangetekende data (die eerste het ongedrukte karakters voor pH- en DO -data). Ek het na kode gefiltreer deur slegs drukbare karakters toe te laat.

Stap 8: Voer data in en maak 'n grafiek

Voer data in en maak 'n grafiek
Voer data in en maak 'n grafiek
Voer data in en maak 'n grafiek
Voer data in en maak 'n grafiek
Voer data in en maak 'n grafiek
Voer data in en maak 'n grafiek
  1. Voer data uit teks in onder die tabblad GEGEWENS (Excel 2013)
  2. Skei die data deur die komma (daarom is dit nuttig om komma's na elke data -invoer te hê)
  3. Skets die data. Elke gegewens hieronder het ongeveer 1700 punte. Die meetinterval is 5 minute (verstelbaar). Die minimum vir DO- en pH -stroombane om die data te lees, is 1,8 sekondes.

Stap 9: Kalibrasie

Kalibrasie
Kalibrasie
  1. Die digitale temperatuursensor (18B20) kan gekalibreer word deur die verskil direk aan die. Andersins, as die kompensasie en die helling kalibrasie vereis, kan u dit doen deur die waardes op reël #453, DallasTemperature.cpp in die map / libraries / DallasTemperature te verander.
  2. Vir pH- en DO -probes kan u die probes kalibreer met gepaardgaande oplossings. U moet die voorbeeldkode van Atlas Scientific gebruik en die instruksies in hierdie lêer volg.
  3. Volg bladsy 26 en 50 vir pH-sonde (https://goo.gl/d62Rqv) vir kalibrasie en temperatuurkompensasie, en ook bladsye 7-8 en 50 vir DO-sonde (https://goo.gl/mA32mp). Laai eers die generiese kode wat Atlas verskaf weer op, laai die Serial Monitor oop en voer die regte opdrag in.

Stap 10: Te veel bedrading?

  1. U kan die SD -kaart en die real -time klokmodule uitskakel deur Dragino Yun Shield te gebruik vir Arduino -borde (https://goo.gl/J9PBTH). Die kode moes gewysig word om met Yun Shield te werk. Hier is 'n goeie plek om te begin (https://goo.gl/c1x8Dm)
  2. Nog steeds te veel bedrading: die Atlas Scientific het 'n gids gemaak vir hul EZO -stroombane (https://goo.gl/dGyb12) en soldeerlose bord (https://goo.gl/uWF51n). Die integrasie van 18B20 digitale temperatuur is hier (https://goo.gl/ATcnGd). U moet vertroud wees met opdragte op Raspbian ('n weergawe van Debian Linux) wat op Raspberry Pi werk (https://goo.gl/549xvk)

Stap 11: Erkenning:

Dit is my byprojek tydens my postdoktorale navorsing wat ek aan 'n vooraf fotobioreaktor gewerk het om mikroalge te kweek. Ek het dus gedink dat dit nodig is om te erken dat die partye voorwaardes verskaf het om dit te laat gebeur. Eerstens die toekenning, DE-EE0007093: “Atmospheric CO2 Enrichment and Delivery (ACED)” van die Amerikaanse departement van energie, kantoor vir energie-doeltreffendheid en hernubare energie, gerig op algemene biobrandstof en bioprodukte. Ek bedank dr Bruce E. Rittmann by Biodesign Swette Center for Environmental Biotechnology, Arizona State University dat ek my die geleentheid gebied het om aan elektronika en Arduino te dink. Ek is opgelei in omgewingsingenieurswese, meestal chemie, 'n bietjie mikrobiologie.

Aanbeveel: