Innholdsfortegnelse:

Hvordan lage en datalogger for temperatur, PH og oppløst oksygen: 11 trinn (med bilder)
Hvordan lage en datalogger for temperatur, PH og oppløst oksygen: 11 trinn (med bilder)

Video: Hvordan lage en datalogger for temperatur, PH og oppløst oksygen: 11 trinn (med bilder)

Video: Hvordan lage en datalogger for temperatur, PH og oppløst oksygen: 11 trinn (med bilder)
Video: Cold condition suck back, metal vs plastic faucets, pressure fermenting, & brewing burnout - Ep. 270 2024, Juli
Anonim
Image
Image
Bilde
Bilde

Mål:

  • Lag en datalogger for ≤ $ 500. Den lagrer data for temperatur, pH og DO med et tidsstempel og bruker I2C -kommunikasjon.
  • Hvorfor I2C (interintegrert krets)? Man kan stable opp så mange sensorer på samme linje gitt at hver av dem har en unik adresse.

Trinn 1:

Trinn 2: Kjøp delene nedenfor:

Kjøp delene nedenfor
Kjøp delene nedenfor
  1. Arduino MEGA 2560, $ 35,
  2. Strømadapter for Arduino -kort, $ 5,98,
  3. LCD -modul I2C (skjerm), $ 8,99,
  4. Sanntidsklokke (RTC), $ 7,5,
  5. Kort for utbrudd av MicroSD -kort, $ 7,5,
  6. 4 GB SD -kort, 6,98 dollar,
  7. Vanntett DS18B20 Digital sensor, $ 9,95,
  8. pH-probe + sett + standardbuffere, $ 149,15,
  9. DO sonde + sett + standardbuffere, $ 247,45,
  10. Brødbrett, startkabel, $ 7,98,
  11. (Valgfritt) Spenningsisolator, $ 24,

Totalt: $ 510,48

* Enkelte deler (som det generiske kortet) kan kjøpes fra andre leverandører (eBay, kinesisk selger) til en lavere pris. pH- og DO -sonder anbefales for å få dem fra Atlas Scientific.

* Et multimeter anbefales for å kontrollere ledningsevne og spenning. Det koster omtrent $ 10-15 (https://goo.gl/iAMDJo)

Trinn 3: Kabling

Kabling
Kabling
  • Bruk jumper/DuPont -kabler til å koble delene som vist på skissen nedenfor.
  • Bruk multimeteret for å kontrollere ledningen.
  • Kontroller positiv spenningsforsyning (VCC) og jord (GND) (det er lett å forveksle hvis du ikke er kjent med krets)
  • Koble til strømadapteren og sjekk strømindikatoren i hver del. Når du er i tvil, bruk multimåleren til å kontrollere spenningen mellom VCC og GND til (5V)

Trinn 4: Forbered PH, DO -kretsene, SD -kortet

Forbered PH, DO -kretsene, SD -kortet
Forbered PH, DO -kretsene, SD -kortet
  1. Bytt til I2C for pH- og DO -kretser
  2. PH- og DO -utbruddene sendes med seriell kommunikasjon som standardmodus Send/motta (TX/RX). For å bruke I2C-modus Klokkelinje (SCL) og Datalinje (SDA), bytt modus med (1): Koble fra VCC-, TX-, RX-kabler, (2): hopp TX til bakken for sonde, PGND (ikke GND), (3) plugg VCC til kretsen, (4): vent på lysdioden endres fra grønt til blått. Flere detaljer se på side 39 (Dataark for pH -krets,
  3. Gjør det samme trinnet med DO -kretsen
  4. (hvis du vet hvordan du laster opp prøvekoden til brettet, kan du gjøre det via seriell skjerm)
  5. Formater SD -kortet til FAT -format

Trinn 5: Forbered programvare

Forbered programvare
Forbered programvare
Forbered programvare
Forbered programvare
Forbered programvare
Forbered programvare
Forbered programvare
Forbered programvare
  1. Last ned Arduino Integrated Development Environment (IDE),
  2. Installer bibliotek til Arduino IDE:
  3. De fleste av dem kommer med Arduino -programvare. LiquidCrystal_I2C.h er tilgjengelig via GitHub
  4. Installer driveren for USB. For ekte Arduino trenger du kanskje ikke å installere en. For en generisk må du installere CH340 -driveren (GitHub:
  5. Kontroller om du kobler kortet korrekt ved å kjøre en blinkende LED -test
  6. Hvordan finne MAC -adressen til den digitale temperaturen 18B20. Bruke I2C -skannermal i Arduino IDE med sonden plugget inn. Hver enhet har en unik MAC -adresse, slik at du kan bruke så mange temperatursonder med én delt linje (#9). 18B20 bruker en en -tråds I2C, så det er et spesielt tilfelle av I2C -kommunikasjonsmetode. Nedenfor er en metode for å finne MAC - Medical Access Control (“ROM” når du kjører prosedyren nedenfor).

Trinn 6: Start kodingen

Start koding
Start koding
  • Kopier lim inn koden nedenfor til Arduino IDE:
  • Eller last ned koden (.ino), og et nytt vindu skal dukke opp i Arduino IDE.

/*

Referanseopplæring:

1. Temperatur, ORP, pH-logger:

2. Secured Digital (SD) Shield:

Denne koden sender data til Arduino seriell skjerm. Skriv inn kommandoer i den serielle Arduino -monitoren for å kontrollere EZO pH -kretsen i I2C -modus.

Endret fra de refererte opplæringsprogrammene ovenfor, for det meste fra I2C-koden av Atlas-Scientific

Sist oppdatert: 26. juli 2017 av Binh Nguyen

*/

#include // aktiver I2C.

#define pH_adresse 99 // standard I2C ID -nummer for EZO pH -krets.

#define DO_adresse 97 // standard I2C ID -nummer for EZO DO Circuit.

#include "RTClib.h" // Dato og tid -funksjoner ved hjelp av en DS1307 RTC tilkoblet via I2C og Wire lib

RTC_DS1307 rtc;

#include // For SD libarary

#include // SD -kort for å lagre data

const int chipSelect = 53; // må finne ut om Adafruit SD breakout //

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

char logFileName = "dataLT.txt"; // endre logFileName for å identifisere eksperimentet ditt, for eksempel PBR_01_02, datalog1

lang id = 1; // ID -nummeret for å angi loggrekkefølgen

#inkludere

LiquidCrystal_I2C lcd (0x27, 20, 4);

#inkludere

#inkludere

#define ONE_WIRE_BUS 9 // definer pin # for temperatursonde

OneWire oneWire (ONE_WIRE_BUS);

DallasTemperatursensorer (& oneWire);

DeviceAddress ProbeP = {0x28, 0xC2, 0xE8, 0x37, 0x07, 0x00, 0x00, 0xBF}; // MAC -adresse, unik for hver sonde

String dataString; // hovedvarianten for å lagre alle data

String dataString2; // en midlertidig variant for lagring av temperatur/pH/DO for utskrift

char computerdata [20]; // instruksjon fra Atlas Scientific: vi lager et 20 -byte tegnarray for å lagre innkommende data fra en pc/mac/other.

byte mottatt_fra_datamaskin = 0; // vi trenger å vite hvor mange tegn som er mottatt.

byte serial_event = 0; // et flagg for å signalisere når data er mottatt fra pc/mac/other.

byte kode = 0; // brukes til å holde I2C -svarskoden.

røye pH -data [20]; // vi lager en 20 byte tegnmatrise for å lagre innkommende data fra pH -kretsen.

byte in_char = 0; // brukt som en 1 byte buffer for å lagre i bundne byte fra pH -kretsen.

byte i = 0; // teller brukt for ph_data array.

int tid_ = 1800; // brukes til å endre forsinkelsen som er nødvendig, avhengig av kommandoen som sendes til EZO klasse pH -krets.

flyte pH_flyte; // float var brukes til å holde flytverdien til pH.

røye DO_data [20];

// flyt temp_C;

ugyldig oppsett () // initialisering av maskinvare.

{

Serial.begin (9600); // aktiver seriell port.

Wire.begin (pH_adresse); // aktiver I2C -port for pH -sonde

Wire.begin (DO_adresse);

lcd.init ();

lcd.begin (20, 4);

lcd.backlight ();

lcd.home ();

lcd.print ("Hei PBR!");

lcd.setCursor (0, 1);

lcd.print ("Initialiserer …");

Serial.print ("RTC er …");

hvis (! rtc.begin ())

{

Serial.println ("RTC: sanntidsklokke … IKKE FUNNT");

mens (1); // (Serial.println ("RTC: sanntidsklokke … FOUND"));

}

Serial.println ("RUNNING");

Serial.print ("Sanntidsklokke …");

hvis (! rtc.isrunning ())

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

}

Serial.println ("ARBEID");

lcd.setCursor (0, 0);

lcd.println ("RTC: OK");

Serial.print ("SD -kort …"); // se om kortet er tilstede og kan initialiseres:

hvis (! SD.begin (chipSelect))

{Serial.println ("mislyktes"); // ikke gjør noe mer:

komme tilbake;

}

Serial.println ("OK");

lcd.setCursor (0, 1);

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

Serial.print ("Loggfil:");

Serial.print (logFileName);

Serial.print ("…");

File logFile = SD.open (logFileName, FILE_WRITE); // åpne filen. "datalog" og skriv ut overskriften

hvis (logFile)

{

logFile.println (",,,"); // angi at det var data i forrige kjøring

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

logFile.println (topptekst);

logFile.close ();

Serial.println ("KLAR");

//Serial.println(dataString); // Skriv ut til serieporten også:

}

annet {Serial.println ("feil ved åpning av datalog"); } // hvis filen ikke er åpen, dukker det opp en feil:

lcd.setCursor (0, 2);

lcd.print ("Loggfil:");

lcd.println (logFileName);

forsinkelse (1000);

sensorer.begynner ();

sensors.setResolution (ProbeP, 10); // 10 er oppløsningen (10bit)

lcd.clear ();

id = 0;

}

hulrom ()

{// hovedløkken.

dataString = String (id);

dataString = String (',');

DateTime nå = rtc.now ();

dataString = String (nå.år (), DEC);

dataString += String ('/');

dataString += String (nå. måned (), DEC);

dataString += String ('/');

dataString += String (nå. dag (), DEC);

dataString += String ('');

dataString += String (nå. time (), DEC);

dataString += String (':');

dataString += String (nå. minutt (), DEC);

dataString += String (':');

dataString += String (nå. sekund (), DEC);

lcd.home ();

lcd.print (dataString);

sensors.requestTemperatures ();

displayTemperature (ProbeP);

Wire.beginTransmission (pH_adresse); // ring kretsen med sitt ID -nummer

Wire.write ('r'); // hard kode r å lese kontinuerlig

Wire.endTransmission (); // avslutte I2C -dataoverføringen.

forsinkelsestid_); // vent riktig tid for kretsen å fullføre instruksjonen.

Wire.requestFrom (pH_adresse, 20, 1); // ring kretsen og be om 20 byte (dette kan være mer enn vi trenger)

mens (Wire.available ()) // er det byte å motta

{

in_char = Wire.read (); // motta en byte.

if ((in_char> 31) && (in_char <127)) // sjekk om røyken er brukbar (kan skrives ut)

{

pH_data = in_char; // last denne byte inn i matrisen vår.

i+= 1;

}

hvis (in_char == 0) // hvis vi ser at vi har blitt sendt en null -kommando.

{

i = 0; // nullstill telleren i til 0.

Wire.endTransmission (); // avslutte I2C -dataoverføringen.

gå i stykker; // avslutt mens -sløyfen.

}

}

seriehendelse = 0; // tilbakestill det serielle hendelsesflagget.

dataString2 += ",";

dataString2 += String (pH_data);

Wire.beginTransmission (DO_adresse); // ring kretsen med sitt ID -nummer

Wire.write ('r');

Wire.endTransmission (); // avslutte I2C -dataoverføringen

forsinkelsestid_); // vent riktig tid for kretsen å fullføre instruksjonene

Wire.requestFrom (DO_adresse, 20, 1); // ring kretsen og be om 20 byte

mens (Wire.available ()) // er det byte å motta.

{

in_char = Wire.read (); // motta en byte.

hvis ((in_char> 31) && (in_char <127)) // sjekk om røyken er brukbar (kan skrives ut), ellers inneholder in_char et symbol i begynnelsen i.txt -filen

{DO_data = in_char; // last denne byte inn i matrisen vår

i+= 1; // påta telleren for matriseelementet

}

hvis (in_char == 0)

{// hvis vi ser at vi har blitt sendt en null -kommando

i = 0; // nullstill telleren i til 0.

Wire.endTransmission (); // avslutte I2C -dataoverføringen.

gå i stykker; // avslutt mens -sløyfen.

}

}

seriehendelse = 0; // tilbakestill det serielle hendelsesflagget

pH_flyt = atof (pH_data);

dataString2 += ",";

dataString2 += String (DO_data);

lcd.setCursor (0, 1);

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

lcd.setCursor (0, 2);

lcd.print (dataString2);

dataString += ',';

dataString += dataString2;

File dataFile = SD.open (logFileName, FILE_WRITE); // åpne filen. Vær oppmerksom på at bare en fil kan være åpen om gangen, så du må lukke denne før du åpner en annen.

hvis (dataFile) // hvis filen er tilgjengelig, skriver du til den:

{

dataFile.println (dataString);

dataFile.close ();

Serial.println (dataString); // Skriv ut til serieporten også:

}

ellers {Serial.println ("feil ved åpning av datalogfil"); } // hvis filen ikke er åpen, dukker det opp en feil:

lcd.setCursor (0, 3);

lcd.print ("Kjører (x5m):");

lcd.setCursor (15, 3);

lcd.print (id);

id ++; // øke én ID neste iterasjon

dataString = "";

forsinkelse (300000); // forsinkelse 5 minutter = 5*60*1000 ms

lcd.clear ();

} // avslutt hovedsløyfen

ugyldig displayTemperatur (DeviceAddress deviceAddress)

{

flyt tempC = sensorer.getTempC (deviceAddress);

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

else dataString2 = String (tempC);

} // koden slutter her

  • Velg riktig COM -port via Arduino IDE under Verktøy/port
  • Velg riktig Arduino -brett. Jeg brukte Mega 2560 fordi den har mer internminne. Arduino Nano eller Uno fungerer fint med dette oppsettet.
  • Kontroller og kode og last opp kode

Trinn 7: Resultater på ledninger (kan forbedres) og LCD -skjerm

Resultater på ledninger (kan forbedres) og LCD -skjerm
Resultater på ledninger (kan forbedres) og LCD -skjerm
Resultater på ledninger (kan forbedres) og LCD -skjerm
Resultater på ledninger (kan forbedres) og LCD -skjerm
Resultater på ledninger (kan forbedres) og LCD -skjerm
Resultater på ledninger (kan forbedres) og LCD -skjerm
Resultater på ledninger (kan forbedres) og LCD -skjerm
Resultater på ledninger (kan forbedres) og LCD -skjerm
  • Merk: Jeg fant støy fra DO-sonden til pH-sonden etter 2-3 måneders kontinuerlig drift. I følge Atlas Scientific anbefales en in-line spenningsisolator når pH-, konduktivitetsprober fungerer sammen. Flere detaljer er på side 9 (https://goo.gl/d62Rqv)
  • De loggede dataene (den første har tegn som ikke er skrevet ut før pH- og DO -data). Jeg filtrerte til kode ved å tillate bare utskrivbare tegn.

Trinn 8: Importer data og lag en graf

Importer data og lag en graf
Importer data og lag en graf
Importer data og lag en graf
Importer data og lag en graf
Importer data og lag en graf
Importer data og lag en graf
  1. Importer data fra tekst under kategorien DATA (Excel 2013)
  2. Skill dataene med komma (det er derfor det er nyttig å ha komma etter hver datainngang)
  3. Plott dataene. Hver data nedenfor har omtrent 1700 poeng. Måleintervallet er 5 minutter (justerbart). Minimum for DO- og pH -kretser for å lese dataene er 1,8 sekunder.

Trinn 9: Kalibrering

Kalibrering
Kalibrering
  1. Den digitale temperatursensoren (18B20) kan kalibreres ved å justere differansen direkte til. Hvis kompensasjonen og skråningen krever kalibrering, kan du gjøre det ved å endre verdier på linje #453, DallasTemperature.cpp i mappen / libraries / DallasTemperature.
  2. For pH- og DO -sonder kan du kalibrere prober med medfølgende løsninger. Du må bruke prøvekoden fra Atlas Scientific og følge instruksjonene i denne filen.
  3. Følg side 26 og 50 for pH-sonde (https://goo.gl/d62Rqv) for kalibrering og temperaturkompensasjon, og også sider, 7-8 og 50 for DO-sonde (https://goo.gl/mA32mp). Først må du laste opp den generiske koden fra Atlas på nytt, åpne Serial Monitor og taste inn en riktig kommando.

Trinn 10: For mye ledninger?

  1. Du kan eliminere SD -kortet og sanntidsklokke -modulen ved å bruke Dragino Yun Shield for Arduino -kort (https://goo.gl/J9PBTH). Koden måtte endres for å fungere med Yun Shield. Her er et godt sted å starte (https://goo.gl/c1x8Dm)
  2. Fortsatt for mye ledninger: Atlas Scientific laget en veiledning for sine EZO -kretser (https://goo.gl/dGyb12) og loddfritt bord (https://goo.gl/uWF51n). Integrering av 18B20 digital temperatur er her (https://goo.gl/ATcnGd). Du må være kjent med kommandoer på Raspbian (en versjon av Debian Linux) som kjører på Raspberry Pi (https://goo.gl/549xvk)

Trinn 11: Bekreftelse:

Dette er mitt sideprosjekt under min postdoktorale forskning som jeg jobbet med en forhåndsbioreaktor for å dyrke mikroalger. Så jeg trodde det er nødvendig å kreditere at partene har gitt vilkår for å få dette til. For det første tilskuddet, DE-EE0007093: "Atmosfærisk CO2-berikelse og levering (ACED)" fra det amerikanske energidepartementet, Office of Energy Efficiency and Renewable Energy Targeted Algal Biodrivstoff og bioprodukter. Jeg takker Dr. Bruce E. Rittmann ved Biodesign Swette Center for Environmental Biotechnology, Arizona State University for å ha gitt meg muligheten til å pusle med elektronikk og Arduino. Jeg ble utdannet innen miljøteknikk, mest kjemi, litt mikrobiologi.

Anbefalt: