Innehållsförteckning:
- Steg 1:
- Steg 2: Köp delarna nedan:
- Steg 3: Kabeldragning
- Steg 4: Förbered PH, DO -kretsarna, SD -kortet
- Steg 5: Förbered programvara
- Steg 6: Starta kodning
- Steg 7: Resultat på kabeldragning (kan förbättras) och LCD -skärm
- Steg 8: Importera data och skapa en graf
- Steg 9: Kalibrering
- Steg 10: För mycket ledningar?
- Steg 11: Bekräftelse:
Video: Hur man gör en datalogger för temperatur, PH och upplöst syre: 11 steg (med bilder)
2024 Författare: John Day | [email protected]. Senast ändrad: 2024-01-30 12:45
Mål:
- Gör en datalogger för ≤ $ 500. Den lagrar data för temperatur, pH och DO med en tidsstämpel och använder I2C -kommunikation.
- Varför I2C (interintegrerad krets)? Man kan stapla upp så många sensorer i samma rad med tanke på att var och en av dem har en unik adress.
Steg 1:
Steg 2: Köp delarna nedan:
- Arduino MEGA 2560, $ 35,
- Strömadapter för Arduino -kort, $ 5,98,
- LCD -modul I2C (display), $ 8,99,
- Realtidsklocka (RTC), 7,5 dollar,
- MicroSD -kortutbrottskort, $ 7,5,
- 4 GB SD -kort, 6,98 dollar,
- Vattentät DS18B20 Digital sensor, $ 9,95,
- pH-sond + kit + standardbuffertar, $ 149,15,
- DO-sond + kit + standardbuffertar, $ 247,45,
- Brödbräda, bygelkabel, $ 7,98,
- (Valfritt) Spänningsisolator, $ 24,
Totalt: $ 510,48
* Vissa delar (som generisk tavla) kan köpas från andra leverantörer (eBay, kinesisk säljare) för ett lägre pris. pH- och DO -sonder rekommenderas för att få dem från Atlas Scientific.
* En multimeter rekommenderas för att kontrollera konduktivitet och spänning. Det kostar cirka $ 10-15 (https://goo.gl/iAMDJo)
Steg 3: Kabeldragning
- Använd bygel-/DuPont -kablar för att ansluta delarna som visas i skissen nedan.
- Använd multimetern för att kontrollera ledningen.
- Kontrollera positiv spänningsförsörjning (VCC) och jord (GND) (det är lätt att förväxla om du inte är bekant med krets)
- Anslut nätadaptern och kontrollera strömindikatorn i varje del. Vid tvivel, använd multimätaren för att kontrollera spänningen mellan VCC och GND till (5V)
Steg 4: Förbered PH, DO -kretsarna, SD -kortet
- Byt till I2C för pH- och DO -kretsar
- PH- och DO -utbrottet levereras med seriell kommunikation som standardläge för sändning/mottagning (TX/RX). För att använda I2C-läget Clock line (SCL) och Data line (SDA), växla läge med (1): koppla ur VCC-, TX-, RX-kablar, (2): hoppa TX till Ground för Probe, PGND (inte GND), (3) anslut VCC till kretsen, (4): vänta tills lysdioden ändras från grönt till blått. Mer information finns på sidan 39 (Datablad för pH -krets,
- Gör samma steg med DO -krets
- (om du vet hur du laddar upp provkoden till kortet kan du göra det via seriell bildskärm)
- Formatera SD -kort till FAT -format
Steg 5: Förbered programvara
- Ladda ner Arduino Integrated Development Environment (IDE),
- Installera bibliotek till Arduino IDE:
- De flesta har Arduino -programvara. LiquidCrystal_I2C.h är tillgänglig via GitHub
- Installera drivrutinen för USB. För äkta Arduino behöver du kanske inte installera en. För en generisk måste du installera CH340 -drivrutinen (GitHub:
- Kontrollera om du ansluter kortet korrekt genom att köra ett blinkande LED -test
- Hur man hittar MAC -adressen för den digitala temperaturen 18B20. Använda I2C -skannermall i Arduino IDE med sonden inkopplad. Varje enhet har en unik MAC -adress, så att du kan använda lika många temperatursonder med en delad linje (#9). 18B20 använder en en tråd I2C, så det är ett specialfall av I2C kommunikationsmetod. Nedan finns en metod för att hitta MAC - Medical Access Control (“ROM” när du kör proceduren nedan).
Steg 6: Starta kodning
- Kopiera klistra in koden nedan till Arduino IDE:
- Eller ladda ner koden (.ino) och ett nytt fönster ska dyka upp i Arduino IDE.
/*
Referenshandledning:
1. Temperatur, ORP, pH-logger:
2. Secured Digital (SD) Shield:
Denna kod kommer att mata ut data till Arduino seriell bildskärm. Skriv kommandon i Arduino seriell bildskärm för att styra EZO pH -kretsen i I2C -läge.
Modifierad från de refererade självstudierna ovan, mestadels från I2C-koden av Atlas-Scientific
Senast uppdaterad: 26 juli 2017 av Binh Nguyen
*/
#include // aktivera I2C.
#define pH_address 99 // standard I2C ID -nummer för EZO pH -krets.
#define DO_address 97 // standard I2C ID -nummer för EZO DO Circuit.
#inkludera "RTClib.h" // Datum- och tidsfunktioner med en DS1307 RTC ansluten via I2C och Wire lib
RTC_DS1307 rtc;
#include // För SD -bibliotek
#inkludera // SD -kort för att lagra data
const int chipSelect = 53; // måste räkna ut för Adafruit SD-utbrott //
// DO = MISO, DI = MOSI, på ATmega pin#: 50 (MISO), 51 (MOSI), 52 (SCK), 53 (SS)
char logFileName = "dataLT.txt"; // ändra logFileName för att identifiera ditt experiment, för exampe PBR_01_02, datalog1
lång id = 1; // id -numret för att ange loggordningen
#omfatta
LiquidCrystal_I2C lcd (0x27, 20, 4);
#omfatta
#omfatta
#define ONE_WIRE_BUS 9 // definiera stiftet # för temperatursond
OneWire oneWire (ONE_WIRE_BUS);
DallasTemperatursensorer (& oneWire);
DeviceAddress ProbeP = {0x28, 0xC2, 0xE8, 0x37, 0x07, 0x00, 0x00, 0xBF}; // MAC -adress, unik för varje sond
String dataString; // huvudvarianten för att lagra all data
String dataString2; // en tillfällig variant för att lagra temperatur/pH/DO för utskrift
char computerdata [20]; // instruktion från Atlas Scientific: vi gör en 20 byte teckenuppsättning för att hålla inkommande data från en pc/mac/annan.
byte mottagen_från_dator = 0; // vi behöver veta hur många tecken som har tagits emot.
byte serial_event = 0; // en flagga för att signalera när data har tagits emot från pc/mac/other.
byte -kod = 0; // används för att hålla I2C -svarskoden.
röding pH_data [20]; // vi gör en 20 byte teckenuppsättning för att hålla inkommande data från pH -kretsen.
byte in_char = 0; // används som en 1 byte buffert för att lagra i bundna byte från pH -kretsen.
byte i = 0; // räknare som används för ph_data -array.
int tid_ = 1800; // används för att ändra den fördröjning som behövs beroende på kommandot som skickas till EZO -klassens pH -krets.
flyta pH_flöde; // float var används för att hålla pH -värdet.
char DO_data [20];
// float temp_C;
void setup () // initialisering av maskinvara.
{
Serial.begin (9600); // aktivera seriell port.
Wire.begin (pH_adress); // aktivera I2C -port för pH -sond
Wire.begin (DO_adress);
lcd.init ();
lcd.begin (20, 4);
lcd.backlight ();
lcd.home ();
lcd.print ("Hej PBR!");
lcd.setCursor (0, 1);
lcd.print ("Initierar …");
Serial.print ("RTC är …");
om (! rtc.begin ())
{
Serial.println ("RTC: Realtidsklocka … NOT FOUND");
medan (1); // (Serial.println ("RTC: Realtidsklocka … HITTAD"));
}
Serial.println ("RUNNING");
Serial.print ("Realtidsklocka …");
om (! rtc.isrunning ())
{rtc.adjust (DateTime (F (_ DATE_), F (_ TIME_)));
}
Serial.println ("WORKING");
lcd.setCursor (0, 0);
lcd.println ("RTC: OK");
Serial.print ("SD -kort …"); // se om kortet finns och kan initieras:
om (! SD.begin (chipSelect))
{Serial.println ("misslyckades"); // gör inget mer:
lämna tillbaka;
}
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); // öppna filen. "datalogg" och skriv ut rubriken
if (logFile)
{
logFile.println (",,,"); // ange att det fanns data i föregående körning
String header = "Date -Time, Temp (C), pH, DO";
logFile.println (rubrik);
logFile.close ();
Serial.println ("KLAR");
//Serial.println(dataString); // Skriv ut till serieporten också:
}
annars {Serial.println ("fel vid öppning av datalogg"); } // om filen inte är öppen, visas ett felmeddelande:
lcd.setCursor (0, 2);
lcd.print ("Loggfil:");
lcd.println (logFileName);
fördröjning (1000);
sensorer.start ();
sensorer.setResolution (ProbeP, 10); // 10 är upplösningen (10bit)
lcd.clear ();
id = 0;
}
void loop ()
{// huvudslingan.
dataString = String (id);
dataString = String (',');
DateTime nu = rtc.now ();
dataString = String (nu.år (), DEC);
dataString += String ('/');
dataString += String (nu. månad (), DEC);
dataString += String ('/');
dataString += String (nu. dag (), DEC);
dataString += String ('');
dataString += String (nu. timme (), DEC);
dataString += String (':');
dataString += String (nu. minut (), DEC);
dataString += String (':');
dataString += String (nu. sekund (), DEC);
lcd.home ();
lcd.print (dataString);
sensors.requestTemperatures ();
displayTemperature (ProbeP);
Wire.beginTransmission (pH_adress); // ring kretsen med dess ID -nummer
Wire.write ('r'); // hård kod r att läsa kontinuerligt
Wire.endTransmission (); // avsluta I2C -dataöverföringen.
försening_); // vänta rätt tid för kretsen att slutföra sin instruktion.
Wire.requestFrom (pH_adress, 20, 1); // ring kretsen och begär 20 byte (detta kan vara mer än vi behöver)
medan (Wire.available ()) // finns det byte att ta emot
{
in_char = Wire.read (); // ta emot en byte.
if ((in_char> 31) && (in_char <127)) // kolla om char är användbar (utskrivbar)
{
pH_data = in_char; // ladda denna byte i vår array.
i+= 1;
}
if (in_char == 0) // om vi ser att vi har skickats ett nullkommando.
{
i = 0; // återställ räknaren i till 0.
Wire.endTransmission (); // avsluta I2C -dataöverföringen.
ha sönder; // avsluta medan loop.
}
}
seriehändelse = 0; // återställ den seriella händelseflaggan.
dataString2 += ",";
dataString2 += String (pH_data);
Wire.beginTransmission (DO_adress); // ringa kretsen med dess ID -nummer
Wire.write ('r');
Wire.endTransmission (); // avsluta I2C -dataöverföringen
försening_); // vänta rätt tid för kretsen att slutföra sin instruktion
Wire.requestFrom (DO_adress, 20, 1); // ring kretsen och begär 20 byte
medan (Wire.available ()) // finns det byte att ta emot.
{
in_char = Wire.read (); // ta emot en byte.
if ((in_char> 31) && (in_char <127)) // kontrollera om char är användbar (utskrivbar), annars innehåller in_char en symbol i början i.txt -filen
{DO_data = in_char; // ladda denna byte i vår array
i+= 1; // ådra sig räknaren för matriselementet
}
om (in_char == 0)
{// om vi ser att vi har skickats ett nullkommando
i = 0; // återställ räknaren i till 0.
Wire.endTransmission (); // avsluta I2C -dataöverföringen.
ha sönder; // avsluta medan loop.
}
}
seriehändelse = 0; // återställ den seriella händelseflaggan
pH_flöde = 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); // öppna filen. Observera att bara en fil kan vara öppen åt gången, så du måste stänga den här innan du öppnar en annan.
if (dataFile) // om filen är tillgänglig, skriv till den:
{
dataFile.println (dataString);
dataFile.close ();
Serial.println (dataString); // Skriv ut till serieporten också:
}
annars {Serial.println ("fel vid öppning av dataloggfil"); } // om filen inte är öppen, visas ett felmeddelande:
lcd.setCursor (0, 3);
lcd.print ("Kör (x5m):");
lcd.setCursor (15, 3);
lcd.print (id);
id ++; // öka ett ID nästa iteration
dataString = "";
fördröjning (300000); // fördröjning 5 minuter = 5*60*1000 ms
lcd.clear ();
} // avsluta huvudslingan
void displayTemperature (DeviceAddress deviceAddress)
{
float tempC = sensorer.getTempC (deviceAddress);
if (tempC == -127.00) lcd.print ("Temperaturfel");
annars dataString2 = String (tempC);
} // koden slutar här
- Välj rätt COM -port via Arduino IDE under Verktyg/Port
- Välj rätt Arduino -bräda. Jag använde Mega 2560 eftersom det har mer internt minne. Arduino Nano eller Uno fungerar bra med den här inställningen.
- Kontrollera och koda och ladda upp koden
Steg 7: Resultat på kabeldragning (kan förbättras) och LCD -skärm
- Observera: Jag stötte på ljudet från DO-sonden till pH-sonden efter 2-3 månaders kontinuerlig drift. Enligt Atlas Scientific rekommenderas en in-line spänningsisolator när pH, konduktivitetsprober arbetar tillsammans. Mer information finns på sidan 9 (https://goo.gl/d62Rqv)
- Den loggade data (den första har outskrivna tecken före pH- och DO -data). Jag filtrerade till kod genom att bara tillåta utskrivbara tecken.
Steg 8: Importera data och skapa en graf
- Importera data från text under fliken DATA (Excel 2013)
- Separera data med kommatecken (det är därför det är bra att ha kommatecken efter varje datainmatning)
- Rita upp data. Varje data nedan har cirka 1700 poäng. Mätintervallet är 5 minuter (justerbart). Minimum för DO- och pH -kretsar för att läsa data är 1,8 sekunder.
Steg 9: Kalibrering
- Den digitala temperatursensorn (18B20) kan kalibreras genom att justera skillnaden direkt till. Om kompensationen och lutningen kräver kalibrering kan du göra det genom att ändra värden på rad #453, DallasTemperature.cpp i mappen / libraries / DallasTemperature.
- För pH- och DO -sonder kan du kalibrera sonderna med medföljande lösningar. Du måste använda provkoden från Atlas Scientific och följa instruktionerna i den här filen.
- Följ sidorna 26 och 50 för pH-sond (https://goo.gl/d62Rqv) för kalibrering och temperaturkompensation, och även sidorna 7-8 och 50 för DO-sonden (https://goo.gl/mA32mp). Först, ladda upp den generiska koden från Atlas igen, öppna seriell bildskärm och ange ett korrekt kommando.
Steg 10: För mycket ledningar?
- Du kan ta bort SD -kortet och klockmodulen i realtid genom att använda Dragino Yun Shield för Arduino -kort (https://goo.gl/J9PBTH). Koden behövde ändras för att fungera med Yun Shield. Här är ett bra ställe att börja (https://goo.gl/c1x8Dm)
- Fortfarande för mycket kabeldragning: Atlas Scientific gjorde en guide för deras EZO -kretsar (https://goo.gl/dGyb12) och lödlös kartong (https://goo.gl/uWF51n). Integrering av 18B20 digital temperatur finns här (https://goo.gl/ATcnGd). Du måste vara bekant med kommandon på Raspbian (en version av Debian Linux) som körs på Raspberry Pi (https://goo.gl/549xvk)
Steg 11: Bekräftelse:
Detta är mitt sidoprojekt under min postdoktorala forskning som jag arbetade med en avancerad fotobioreaktor för att odla mikroalger. Så jag tyckte att det är nödvändigt att berömma att parterna har tillhandahållit villkor för att detta ska ske. För det första bidraget DE-EE0007093: “Atmospheric CO2 Enrichment and Delivery (ACED)” från U. S. Department of Energy, Office of Energy Efficiency and Renewable Energy Targeted Algal Biobränslen och bioprodukter. Jag tackar Dr. Bruce E. Rittmann vid Biodesign Swette Center for Environmental Biotechnology, Arizona State University för att jag fick möjlighet att pyssla med elektronik och Arduino. Jag utbildade mig i miljöteknik, mestadels kemi, lite mikrobiologi.
Rekommenderad:
Hur man lägger upp upplöst syre till WiFi Hydroponics -mätaren: 6 steg
Så här lägger du till upplöst syre i WiFi Hydroponics -mätaren: Denna handledning visar hur du lägger till EZO D.O -krets och sond till WiFi Hydroponics Kit från Atlas Scientific. Det antas att användaren har wifi hydroponics -kit som fungerar och nu är redo att tillsätta upplöst syre.VARNINGAR: Atlas Sci
Hur man gör luftfuktighet och temperatur i realtid Data Recorder med Arduino UNO och SD-kort - DHT11 Datalogger Simulering i Proteus: 5 steg
Hur man gör luftfuktighet och temperatur i realtid Data Recorder med Arduino UNO och SD-kort | DHT11 Datalogger Simulering i Proteus: Introduktion: hej, det här är Liono Maker, här är YouTube-länk. Vi gör kreativa projekt med Arduino och arbetar med inbäddade system.Data-Logger: En datalogger (även datalogger eller dataregistrator) är en elektronisk enhet som registrerar data över tid med
Hur man gör en drönare med Arduino UNO - Gör en quadcopter med mikrokontroller: 8 steg (med bilder)
Hur man gör en drönare med Arduino UNO | Gör en Quadcopter Med Microcontroller: Introduktion Besök min Youtube -kanal En Drone är en mycket dyr gadget (produkt) att köpa. I det här inlägget ska jag diskutera, hur gör jag det billigt ?? Och hur kan du göra din egen så här till billigt pris … Tja i Indien alla material (motorer, ESC
Hur man gör säkerhetsbrytare för lås för K40 laserskärare: 4 steg (med bilder)
Hur man gör säkerhetsbrytare för lås för K40 laserskärare: VIKTIG REDIGERA! Anslut inte dina spärrar till maskinens elnät. Anslut istället till PG -stiften på PSU: n. Kommer att göra en fullständig uppdatering inom kort. -Tony 7/30-19Vad är en av de första råden på internet för när din helt nya, (ma
Temperatur och fuktighet Display och datainsamling med Arduino och bearbetning: 13 steg (med bilder)
Temperatur- och luftfuktighetsvisning och datainsamling med Arduino och bearbetning: Intro: Detta är ett projekt som använder ett Arduino -kort, en sensor (DHT11), en Windows -dator och ett bearbetningsprogram (ett gratis nedladdningsbart) för att visa temperatur, luftfuktighetsdata i digital och stapeldiagramform, visa tid och datum och kör en räkningstid