Innehållsförteckning:

Hur man gör en datalogger för temperatur, PH och upplöst syre: 11 steg (med bilder)
Hur man gör en datalogger för temperatur, PH och upplöst syre: 11 steg (med bilder)

Video: Hur man gör en datalogger för temperatur, PH och upplöst syre: 11 steg (med bilder)

Video: Hur man gör en datalogger för temperatur, PH och upplöst syre: 11 steg (med bilder)
Video: Boot program - PC-logger 2024, November
Anonim
Image
Image
Bild
Bild

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:

Köp delarna nedan
Köp delarna nedan
  1. Arduino MEGA 2560, $ 35,
  2. Strömadapter för Arduino -kort, $ 5,98,
  3. LCD -modul I2C (display), $ 8,99,
  4. Realtidsklocka (RTC), 7,5 dollar,
  5. MicroSD -kortutbrottskort, $ 7,5,
  6. 4 GB SD -kort, 6,98 dollar,
  7. Vattentät DS18B20 Digital sensor, $ 9,95,
  8. pH-sond + kit + standardbuffertar, $ 149,15,
  9. DO-sond + kit + standardbuffertar, $ 247,45,
  10. Brödbräda, bygelkabel, $ 7,98,
  11. (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

Kabeldragning
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

Förbered PH, DO -kretsarna, SD -kortet
Förbered PH, DO -kretsarna, SD -kortet
  1. Byt till I2C för pH- och DO -kretsar
  2. 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,
  3. Gör samma steg med DO -krets
  4. (om du vet hur du laddar upp provkoden till kortet kan du göra det via seriell bildskärm)
  5. Formatera SD -kort till FAT -format

Steg 5: Förbered programvara

Förbered programvara
Förbered programvara
Förbered programvara
Förbered programvara
Förbered programvara
Förbered programvara
Förbered programvara
Förbered programvara
  1. Ladda ner Arduino Integrated Development Environment (IDE),
  2. Installera bibliotek till Arduino IDE:
  3. De flesta har Arduino -programvara. LiquidCrystal_I2C.h är tillgänglig via GitHub
  4. 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:
  5. Kontrollera om du ansluter kortet korrekt genom att köra ett blinkande LED -test
  6. 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

Starta kodning
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

Resultat på ledningar (kan förbättras) och LCD -skärm
Resultat på ledningar (kan förbättras) och LCD -skärm
Resultat på ledningar (kan förbättras) och LCD -skärm
Resultat på ledningar (kan förbättras) och LCD -skärm
Resultat på ledningar (kan förbättras) och LCD -skärm
Resultat på ledningar (kan förbättras) och LCD -skärm
Resultat på ledningar (kan förbättras) och LCD -skärm
Resultat på ledningar (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 och skapa en graf
Importera data och skapa en graf
Importera data och skapa en graf
Importera data och skapa en graf
Importera data och skapa en graf
Importera data och skapa en graf
  1. Importera data från text under fliken DATA (Excel 2013)
  2. Separera data med kommatecken (det är därför det är bra att ha kommatecken efter varje datainmatning)
  3. 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

Kalibrering
Kalibrering
  1. 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.
  2. 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.
  3. 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?

  1. 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)
  2. 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: