Innholdsfortegnelse:
- Trinn 1:
- Trinn 2: Kjøp delene nedenfor:
- Trinn 3: Kabling
- Trinn 4: Forbered PH, DO -kretsene, SD -kortet
- Trinn 5: Forbered programvare
- Trinn 6: Start kodingen
- Trinn 7: Resultater på ledninger (kan forbedres) og LCD -skjerm
- Trinn 8: Importer data og lag en graf
- Trinn 9: Kalibrering
- Trinn 10: For mye ledninger?
- Trinn 11: Bekreftelse:
Video: Hvordan lage en datalogger for temperatur, PH og oppløst oksygen: 11 trinn (med bilder)
2024 Forfatter: John Day | [email protected]. Sist endret: 2024-01-30 11:24
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:
- Arduino MEGA 2560, $ 35,
- Strømadapter for Arduino -kort, $ 5,98,
- LCD -modul I2C (skjerm), $ 8,99,
- Sanntidsklokke (RTC), $ 7,5,
- Kort for utbrudd av MicroSD -kort, $ 7,5,
- 4 GB SD -kort, 6,98 dollar,
- Vanntett DS18B20 Digital sensor, $ 9,95,
- pH-probe + sett + standardbuffere, $ 149,15,
- DO sonde + sett + standardbuffere, $ 247,45,
- Brødbrett, startkabel, $ 7,98,
- (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
- 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
- Bytt til I2C for pH- og DO -kretser
- 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,
- Gjør det samme trinnet med DO -kretsen
- (hvis du vet hvordan du laster opp prøvekoden til brettet, kan du gjøre det via seriell skjerm)
- Formater SD -kortet til FAT -format
Trinn 5: Forbered programvare
- Last ned Arduino Integrated Development Environment (IDE),
- Installer bibliotek til Arduino IDE:
- De fleste av dem kommer med Arduino -programvare. LiquidCrystal_I2C.h er tilgjengelig via GitHub
- Installer driveren for USB. For ekte Arduino trenger du kanskje ikke å installere en. For en generisk må du installere CH340 -driveren (GitHub:
- Kontroller om du kobler kortet korrekt ved å kjøre en blinkende LED -test
- 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
- 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
- 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 fra tekst under kategorien DATA (Excel 2013)
- Skill dataene med komma (det er derfor det er nyttig å ha komma etter hver datainngang)
- 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
- 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.
- 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.
- 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?
- 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)
- 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:
ARDUINO OPPLØST OXYGEN SENSOR KALIBRERING: 4 trinn
ARDUINO OPPLØST OXYGEN SENSOR KALIBRERING: I denne opplæringen skal vi kalibrere Atlas Scientifics EZO oppløst oksygen (D.O) sensor ved hjelp av Arduino Uno. KALIBRERINGSTEORI Den viktigste delen av kalibrering er å se avlesningene under kalibreringsprosessen. Det er lettest å kalibrere
Hvordan legge til oppløst oksygen til WiFi Hydroponics Meter: 6 trinn
Slik legger du til oppløst oksygen i WiFi Hydroponics Meter: Denne opplæringen viser hvordan du legger til EZO D.O -krets og sonde til WiFi Hydroponics Kit fra Atlas Scientific. Det antas at brukeren har wifi hydroponics -settet som fungerer og nå er klart til å tilsette oppløst oksygen. ADVARSEL: Atlas Sci
Hvordan lage fuktighet og temperatur sanntids datarekorder med Arduino UNO og SD-kort - DHT11 Datalogger Simulering i Proteus: 5 trinn
Hvordan lage fuktighet og temperatur sanntids datarekorder med Arduino UNO og SD-kort | DHT11 Datalogger Simulering i Proteus: Introduksjon: hei, dette er Liono Maker, her er YouTube-lenken. Vi lager kreative prosjekter med Arduino og jobber med innebygde systemer. Data-Logger: En datalogger (også datalogger eller dataregistrator) er en elektronisk enhet som registrerer data over tid
Hvordan lage en delt skjermvideo med fire trinn: 4 trinn (med bilder)
Hvordan lage en delt skjermvideo med fire trinn: Vi ser ofte en samme person vise i en scene to ganger i et TV -spill. Og så vidt vi vet har ikke skuespilleren en tvillingbror. Vi har også sett at to sangvideoer blir satt på en skjerm for å sammenligne sangferdighetene sine. Dette er kraften til spl
Hvordan lage en besteforeldres kalender & Utklippsbok (selv om du ikke vet hvordan du skal utklippsbok): 8 trinn (med bilder)
Hvordan lage en besteforeldres kalender & Utklippsbok (selv om du ikke vet hvordan du skal utklippsbok): Dette er en veldig økonomisk (og mye verdsatt!) Feriegave til besteforeldre. Jeg laget 5 kalendere i år for mindre enn $ 7 hver. Materialer: 12 flotte bilder av barnet ditt, barn, nieser, nevøer, hunder, katter eller andre slektninger 12 forskjellige stykker