Indholdsfortegnelse:

Sådan laver du en datalogger for temperatur, PH og opløst ilt: 11 trin (med billeder)
Sådan laver du en datalogger for temperatur, PH og opløst ilt: 11 trin (med billeder)

Video: Sådan laver du en datalogger for temperatur, PH og opløst ilt: 11 trin (med billeder)

Video: Sådan laver du en datalogger for temperatur, PH og opløst ilt: 11 trin (med billeder)
Video: Gennemgang af h log-p diagrammet 2024, Juli
Anonim
Image
Image
Billede
Billede

Mål:

  • Lav en datalogger til ≤ $ 500. Det gemmer data for temperatur, pH og DO med et tidsstempel og ved hjælp af I2C -kommunikation.
  • Hvorfor I2C (interintegreret kredsløb)? Man kan stable så mange sensorer i samme linje, da hver af dem har en unik adresse.

Trin 1:

Trin 2: Køb delene herunder:

Køb delene herunder
Køb delene herunder
  1. Arduino MEGA 2560, $ 35,
  2. Strømadapter til Arduino -bord, $ 5,98,
  3. LCD -modul I2C (display), $ 8,99,
  4. Real-time Clock (RTC) breakout, $ 7.5,
  5. MicroSD -kort breakout board, $ 7,5,
  6. 4 GB SD -kort, $ 6,98,
  7. Vandtæt DS18B20 Digital sensor, $ 9,95,
  8. pH-probe + kits + standardbuffere, $ 149,15,
  9. DO sonde + kits + standardbuffere, $ 247,45,
  10. Brødbræt, jumperkabel, $ 7,98,
  11. (Valgfrit) Spændingsisolator, $ 24,

I alt: $ 510,48

* Visse dele (som det generiske bord) kan købes fra andre leverandører (eBay, kinesisk sælger) til en lavere pris. pH- og DO -sonder anbefales for at få dem fra Atlas Scientific.

* Et multimeter anbefales for at kontrollere ledningsevne og spænding. Det koster omkring $ 10-15 (https://goo.gl/iAMDJo)

Trin 3: Ledningsføring

Ledninger
Ledninger
  • Brug jumper-/DuPont -kabler til at forbinde delene som vist på skitsen herunder.
  • Brug multimeteret til at kontrollere ledningen.
  • Kontroller positiv spændingsforsyning (VCC) og jord (GND) (det er let at forveksle, hvis du ikke er bekendt med kredsløb)
  • Tilslut strømadapteren, og kontroller strømindikatoren i hver del. Når du er i tvivl, skal du bruge multimåleren til at kontrollere spændingen mellem VCC og GND til (5V)

Trin 4: Forbered PH, DO kredsløb, SD -kort

Forbered PH, DO kredsløb, SD -kort
Forbered PH, DO kredsløb, SD -kort
  1. Skift til I2C for pH- og DO -kredsløb
  2. PH- og DO -afbrydelserne sendes med seriel kommunikation som standardtilstand Send/modtag (TX/RX). For at bruge I2C-tilstand Urlinje (SCL) og Datalinje (SDA), skift tilstand med (1): afbryd VCC-, TX-, RX-kabler, (2): spring TX til jorden for sonde, PGND (ikke GND), (3) tilslut VCC til kredsløbet, (4): vent på LED'en skifter fra grøn til blå. Flere detaljer tjek på side 39 (Datablad til pH -kredsløb,
  3. Gør det samme trin med DO -kredsløb
  4. (hvis du ved, hvordan du uploader prøvekoden til tavlen, kan du gøre det via seriel skærm)
  5. Formater SD -kort til FAT -format

Trin 5: Forbered software

Forbered software
Forbered software
Forbered software
Forbered software
Forbered software
Forbered software
Forbered software
Forbered software
  1. Download Arduino Integrated Development Environment (IDE),
  2. Installer bibliotek til Arduino IDE:
  3. De fleste af dem kommer med Arduino -software. LiquidCrystal_I2C.h er tilgængelig via GitHub
  4. Installer driveren til USB. For ægte Arduino behøver du muligvis ikke at installere en. For en generisk skal du installere CH340 -driveren (GitHub:
  5. Kontroller, om du tilslutter kortet korrekt ved at køre en blinkende LED -test
  6. Sådan finder du MAC -adressen på den 18B20 digitale temperatur. Brug af I2C -scannerskabelon i Arduino IDE med sonden tilsluttet. Hver enhed har en unik MAC -adresse, så du kan bruge så mange temperatursonder med en delt linje (#9). 18B20 bruger en en -tråds I2C, så det er et specielt tilfælde af I2C -kommunikationsmetode. Nedenfor er en metode til at finde MAC - Medical Access Control (“ROM”, når du kører proceduren herunder).

Trin 6: Start kodning

Start kodning
Start kodning
  • Kopier indsæt koden herunder til Arduino IDE:
  • Eller download koden (.ino), og et nyt vindue skulle dukke op i Arduino IDE.

/*

Referencevejledninger:

1. Temperatur, ORP, pH-logger:

2. Secured Digital (SD) Shield:

Denne kode sender data til Arduino seriel skærm. Indtast kommandoer i den serielle Arduino -skærm for at styre EZO pH -kredsløbet i I2C -tilstand.

Ændret fra de refererede tutorials ovenfor, hovedsagelig fra I2C-koden af Atlas-Scientific

Sidst opdateret: 26. juli 2017 af Binh Nguyen

*/

#include // aktiver I2C.

#define pH_address 99 // standard I2C ID -nummer for EZO pH -kredsløb.

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

#include "RTClib.h" // Dato- og tidsfunktioner ved hjælp af en DS1307 RTC tilsluttet via I2C og Wire lib

RTC_DS1307 rtc;

#include // Til SD libarary

#include // SD -kort til lagring af data

const int chipSelect = 53; // skal finde ud af Adafruit SD breakout //

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

char logFileName = "dataLT.txt"; // rediger logFileName for at identificere dit eksperiment, for eksempel PBR_01_02, datalog1

lang id = 1; // id -nummeret for at indtaste logrækkefølgen

#omfatte

LiquidCrystal_I2C lcd (0x27, 20, 4);

#omfatte

#omfatte

#define ONE_WIRE_BUS 9 // definer stiften # til 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 til at gemme alle data

String dataString2; // en midlertidig variant til opbevaring af temperatur/pH/DO til udskrivning

char computerdata [20]; // instruktion fra Atlas Scientific: vi laver et 20 -byte karakter array til at gemme indgående data fra en pc/mac/other.

byte modtaget_fra_computer = 0; // vi skal vide, hvor mange tegn der er modtaget.

byte serial_event = 0; // et flag, der skal signalere, når data er modtaget fra pc/mac/other.

byte kode = 0; // bruges til at holde I2C -svarskoden.

kul pH_data [20]; // vi laver et 20 byte karakter array til at gemme indgående data fra pH -kredsløbet.

byte in_char = 0; // bruges som en 1 byte buffer til at gemme i bundne bytes fra pH -kredsløbet.

byte i = 0; // tæller brugt til ph_data array.

int tid_ = 1800; // bruges til at ændre den nødvendige forsinkelse afhængigt af kommandoen sendt til EZO klasse pH -kredsløb.

float pH_flyd; // float var bruges til at holde pH -værdien.

char DO_data [20];

// float temp_C;

void setup () // hardware initialisering.

{

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

Wire.begin (pH_adresse); // aktiver I2C -port til pH -probe

Wire.begin (DO_adresse);

lcd.init ();

lcd.begin (20, 4);

lcd.backlight ();

lcd.home ();

lcd.print ("Hej PBR!");

lcd.setCursor (0, 1);

lcd.print ("Initialiserer …");

Serial.print ("RTC er …");

hvis (! rtc.begin ())

{

Serial.println ("RTC: Real-time ur … NOT FOUND");

mens (1); // (Serial.println ("RTC: Real-time ur … FOUND"));

}

Serial.println ("KØRER");

Serial.print ("Ur i realtid …");

hvis (! rtc.isrunning ())

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

}

Serial.println ("ARBEJD");

lcd.setCursor (0, 0);

lcd.println ("RTC: OK");

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

hvis (! SD.begin (chipSelect))

{Serial.println ("mislykkedes"); // gør ikke mere:

Vend tilbage;

}

Serial.println ("OK");

lcd.setCursor (0, 1);

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

Serial.print ("Logfil:");

Serial.print (logFileName);

Serial.print ("…");

Fil logFile = SD.open (logFileName, FILE_WRITE); // Åbn filen. "datalog" og udskriv overskriften

hvis (logFile)

{

logFile.println (",,,"); // angiver, at der var data i den forrige kørsel

String header = "Dato -tid, Temp (C), pH, DO";

logFile.println (header);

logFile.close ();

Serial.println ("KLAR");

//Serial.println(dataString); // udskriv også til den serielle port:

}

ellers {Serial.println ("fejl ved åbning af datalog"); } // hvis filen ikke er åben, dukker der op en fejl:

lcd.setCursor (0, 2);

lcd.print ("Logfil:");

lcd.println (logFileName);

forsinkelse (1000);

sensorer.begynd ();

sensorer.setResolution (ProbeP, 10); // 10 er opløsningen (10bit)

lcd.clear ();

id = 0;

}

hulrum ()

{// hovedsløjfen.

dataString = String (id);

dataString = String (',');

DateTime nu = rtc.now ();

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

dataString += String ('/');

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

dataString += String ('/');

dataString += String (nu. dag (), DEC);

dataString += String ('');

dataString += String (nu. time (), DEC);

dataString += String (':');

dataString += String (nu. minut (), DEC);

dataString += String (':');

dataString += String (nu. sekund (), DEC);

lcd.home ();

lcd.print (dataString);

sensorer.anmodningstemperaturer ();

displayTemperatur (ProbeP);

Wire.beginTransmission (pH_adresse); // kalder kredsløbet med sit ID -nummer

Wire.write ('r'); // hård kode r til konstant at læse

Wire.endTransmission (); // afslutte I2C -datatransmissionen.

forsinkelse_); // vent den korrekte tid for kredsløbet at fuldføre sin instruktion.

Wire.requestFrom (pH_adresse, 20, 1); // ring til kredsløbet og anmod om 20 bytes (dette kan være mere end vi har brug for)

mens (Wire.available ()) // er der bytes at modtage

{

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

hvis ((in_char> 31) && (in_char <127)) // tjek om røg kan bruges (kan udskrives)

{

pH_data = in_char; // indlæs denne byte i vores array.

i+= 1;

}

hvis (in_char == 0) // hvis vi ser, at vi har fået tilsendt en null -kommando.

{

i = 0; // nulstil tælleren i til 0.

Wire.endTransmission (); // afslutte I2C -datatransmissionen.

pause; // afslut while -sløjfen.

}

}

serie_event = 0; // nulstil det serielle hændelsesflag.

dataString2 += ",";

dataString2 += String (pH_data);

Wire.beginTransmission (DO_adresse); // kalder kredsløbet med sit ID -nummer

Wire.write ('r');

Wire.endTransmission (); // afslutte I2C -datatransmissionen

forsinkelse_); // vent den korrekte tid for kredsløbet at fuldføre sin instruktion

Wire.requestFrom (DO_adresse, 20, 1); // ring til kredsløbet og anmod om 20 bytes

mens (Wire.available ()) // er der bytes at modtage.

{

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

hvis ((in_char> 31) && (in_char <127)) // tjek om char kan bruges (udskrives), ellers indeholder in_char et symbol i begyndelsen i.txt -filen

{DO_data = in_char; // indlæs denne byte i vores array

i+= 1; // påtage sig tælleren for array -elementet

}

hvis (in_char == 0)

{// hvis vi ser, at vi er blevet sendt en null -kommando

i = 0; // nulstil tælleren i til 0.

Wire.endTransmission (); // afslutte I2C -datatransmissionen.

pause; // afslut while -sløjfen.

}

}

serie_event = 0; // nulstil det serielle hændelsesflag

pH_flyd = 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); // Åbn filen. Bemærk, at kun en fil kan være åben ad gangen, så du skal lukke denne, før du åbner en anden.

hvis (dataFile) // hvis filen er tilgængelig, skal du skrive til den:

{

dataFile.println (dataString);

dataFile.close ();

Serial.println (dataString); // udskriv også til den serielle port:

}

ellers {Serial.println ("fejl ved åbning af datalogfil"); } // hvis filen ikke er åben, dukker der op en fejl:

lcd.setCursor (0, 3);

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

lcd.setCursor (15, 3);

lcd.print (id);

id ++; // forøg ét ID næste iteration

dataString = "";

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

lcd.clear ();

} // slut hovedsløjfe

ugyldig displayTemperatur (DeviceAddress deviceAddress)

{

float tempC = sensorer.getTempC (deviceAddress);

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

else dataString2 = String (tempC);

} // koden slutter her

  • Vælg den rigtige COM -port via Arduino IDE under Værktøjer/Port
  • Vælg det rigtige Arduino -bord. Jeg brugte Mega 2560, fordi den har mere intern hukommelse. Arduino Nano eller Uno fungerer fint med denne opsætning.
  • Kontroller og kode og upload kode

Trin 7: Resultater om ledninger (kan forbedres) og LCD -display

Resultater om ledninger (kan forbedres) og LCD -display
Resultater om ledninger (kan forbedres) og LCD -display
Resultater om ledninger (kan forbedres) og LCD -display
Resultater om ledninger (kan forbedres) og LCD -display
Resultater om ledninger (kan forbedres) og LCD -display
Resultater om ledninger (kan forbedres) og LCD -display
Resultater om ledninger (kan forbedres) og LCD -display
Resultater om ledninger (kan forbedres) og LCD -display
  • Bemærk: Jeg stødte på støj fra DO-sonden til pH-sonden efter 2-3 måneders kontinuerlig drift. Ifølge Atlas Scientific anbefales en in-line spændingsisolator, når pH-, konduktivitetsprober fungerer sammen. Flere detaljer findes på side 9 (https://goo.gl/d62Rqv)
  • De loggede data (den første har ikke -udskrevne tegn før pH- og DO -data). Jeg filtrerede til kode ved kun at tillade tegn, der kan udskrives.

Trin 8: Importer data, og lav en graf

Importer data og lav en graf
Importer data og lav en graf
Importer data og lav en graf
Importer data og lav en graf
Importer data og lav en graf
Importer data og lav en graf
  1. Importer data fra tekst under fanen DATA (Excel 2013)
  2. Adskil dataene med kommaet (derfor er det nyttigt at have kommaer efter hver dataindgang)
  3. Plot dataene. Hver data herunder har omkring 1700 point. Måleintervallet er 5 minutter (justerbart). Minimum for DO- og pH -kredsløb til at læse dataene er 1,8 sekunder.

Trin 9: Kalibrering

Kalibrering
Kalibrering
  1. Den digitale temperatursensor (18B20) kan kalibreres ved at justere forskellen direkte til. Ellers, hvis kompensationen og hældningen krævede kalibrering, kan du gøre det ved at ændre værdier på linje #453, DallasTemperature.cpp i mappen / libraries / DallasTemperature.
  2. For pH- og DO -prober kan du kalibrere proberne med ledsagende opløsninger. Du skal bruge prøvekoden fra Atlas Scientific og følge instruktionerne i denne fil.
  3. Følg venligst side 26 og 50 for pH-probe (https://goo.gl/d62Rqv) for kalibrering og temperaturkompensation, og også siderne 7-8 og 50 for DO-probe (https://goo.gl/mA32mp). Først skal du uploade den generiske kode fra Atlas igen, åbne Serial Monitor og indtaste den korrekte kommando.

Trin 10: For meget ledningsføring?

  1. Du kan fjerne SD -kortet og realtidsurmodulet ved at bruge Dragino Yun Shield til Arduino -tavler (https://goo.gl/J9PBTH). Koden skulle ændres for at fungere med Yun Shield. Her er et godt sted at starte (https://goo.gl/c1x8Dm)
  2. Stadig for meget ledningsføring: Atlas Scientific lavede en vejledning til deres EZO -kredsløb (https://goo.gl/dGyb12) og loddeløst bord (https://goo.gl/uWF51n). Integrering af 18B20 digital temperatur er her (https://goo.gl/ATcnGd). Du skal være fortrolig med kommandoer på Raspbian (en version af Debian Linux), der kører på Raspberry Pi (https://goo.gl/549xvk)

Trin 11: Anerkendelse:

Dette er mit sideprojekt under min postdoktorale forskning, som jeg arbejdede på en fotobioreaktor på forhånd for at dyrke mikroalger. Så jeg tænkte, at det er nødvendigt at kreditere, at parterne har givet betingelser for at få dette til at ske. For det første bevillingen DE-EE0007093: "Atmosfærisk CO2-berigelse og levering (ACED)" fra det amerikanske energiministerium, Office of Energy Efficiency and Renewable Energy Targeted Algal Biobrændstoffer og bioprodukter. Jeg takker Dr. Bruce E. Rittmann ved Biodesign Swette Center for Environmental Biotechnology, Arizona State University for at give mig mulighed for at pille ved elektronik og Arduino. Jeg blev uddannet i miljøteknik, mest kemi, lidt mikrobiologi.

Anbefalede: