Hoe maak je een datalogger voor de temperatuur, PH en opgeloste zuurstof - Ajarnpa
Hoe maak je een datalogger voor de temperatuur, PH en opgeloste zuurstof - Ajarnpa
Anonim
Image
Image
Afbeelding
Afbeelding

Doelen:

  • Maak een datalogger voor ≤ $500. Het slaat gegevens op voor temperatuur, pH en DO met een tijdstempel en met behulp van I2C-communicatie.
  • Waarom I2C (Inter-Integrated Circuit)? Men kan zoveel sensoren in dezelfde lijn stapelen, aangezien elk van hen een uniek adres heeft.

Stap 1:

Stap 2: Koop de onderstaande onderdelen:

Koop onderstaande onderdelen
Koop onderstaande onderdelen
  1. Arduino MEGA 2560, $ 35,
  2. Voedingsadapter voor Arduino-bord, $ 5,98,
  3. LCD-module I2C (display), $8,99,
  4. Real-Time Clock (RTC) breakout, $ 7,5,
  5. MicroSD-kaart breakout board, $ 7,5,
  6. 4 GB SD-kaart, $ 6,98,
  7. Waterdichte DS18B20 Digitale sensor, $ 9,95,
  8. pH-sonde + Kits+ Standaardbuffers, $ 149,15,
  9. DO-sonde + Kits+ Standaardbuffers, $ 247,45,
  10. Breadboard, startkabel, $ 7,98,
  11. (Optioneel) Spanningsisolator, $24,

Totaal: $ 510,48

* Bepaalde onderdelen (zoals het generieke bord) kunnen voor een lagere prijs bij andere leveranciers (eBay, Chinese verkoper) worden gekocht. pH- en DO-sondes worden aanbevolen om ze bij Atlas Scientific te verkrijgen.

* Een multimeter wordt aanbevolen om geleidbaarheid en spanning te controleren. Het kost ongeveer $10-15 (https://goo.gl/iAMDJo)

Stap 3: Bedrading

Bedrading
Bedrading
  • Gebruik jumper/DuPont-kabels om de onderdelen aan te sluiten zoals weergegeven in de onderstaande schets.
  • Gebruik de multimeter om de geleiding te controleren.
  • Controleer de positieve spanningstoevoer (VCC) en aarde (GND) (het is gemakkelijk te verwarren als u niet bekend bent met het circuit)
  • Sluit de stroomadapter aan en controleer de stroomindicator in elk onderdeel. Gebruik bij twijfel de multimeter om de spanning tussen VCC en GND te controleren (5V)

Stap 4: Bereid de PH, DO Circuits, SD-kaart voor

Bereid de PH, DO Circuits, SD-kaart voor
Bereid de PH, DO Circuits, SD-kaart voor
  1. Schakel over naar I2C voor pH- en DO-circuits
  2. De pH- en DO-breakouts worden geleverd met seriële communicatie als de standaardmodus Verzenden/ontvangen (TX/RX). Om de kloklijn (SCL) en datalijn (SDA) in de I2C-modus te gebruiken, schakelt u de modus met (1): ontkoppel VCC-, TX-, RX-kabels, (2): spring TX naar aarde voor sonde, PGND (niet GND), (3) sluit VCC aan op het circuit, (4): wacht tot de LED verandert van groen naar blauw. Kijk voor meer details op pagina 39 (Datasheet voor pH-circuit,
  3. Doe dezelfde stap met DO circuit
  4. (als u weet hoe u de voorbeeldcode naar het bord moet uploaden, kunt u dit doen via de seriële monitor)
  5. SD-kaart formatteren naar FAT-formaat

Stap 5: Software voorbereiden

Software voorbereiden
Software voorbereiden
Software voorbereiden
Software voorbereiden
Software voorbereiden
Software voorbereiden
Software voorbereiden
Software voorbereiden
  1. Download Arduino Integrated Development Environment (IDE),
  2. Installeer bibliotheek naar Arduino IDE:
  3. De meeste worden geleverd met Arduino-software. LiquidCrystal_I2C.h is beschikbaar via GitHub
  4. Installeer het stuurprogramma voor USB. Voor echte Arduino hoeft u er mogelijk geen te installeren. Voor een generieke moet u de CH340-driver installeren (GitHub:
  5. Controleer of je het bord correct hebt aangesloten door een knipperende LED-test uit te voeren
  6. Hoe het MAC-adres van de 18B20 digitale temperatuur te vinden. I2C-scannersjabloon gebruiken in Arduino IDE met de sonde aangesloten. Elk apparaat heeft een uniek MAC-adres, zodat u zoveel temperatuursondes kunt gebruiken met één gedeelde lijn (#9). 18B20 gebruikt een eendraads I2C, dus het is een speciaal geval van I2C-communicatiemethode. Hieronder vindt u een methode om MAC – Medical Access Control (“ROM” wanneer u de onderstaande procedure uitvoert) te vinden.

Stap 6: Begin met coderen

Begin met coderen
Begin met coderen
  • Kopieer en plak de onderstaande code in Arduino IDE:
  • Of download de code (.ino) en er zou een nieuw venster moeten verschijnen in Arduino IDE.

/*

Referentie-tutorials:

1. Temperatuur, ORP, pH-logger:

2. Secured Digital (SD) Shield:

Deze code voert gegevens uit naar de seriële monitor van Arduino. Typ opdrachten in de Arduino seriële monitor om het EZO pH-circuit in I2C-modus te besturen.

Aangepast van de hierboven genoemde tutorials, meestal van de I2C-code door Atlas-Scientific

Laatst bijgewerkt: 26 juli 2017 door Binh Nguyen

*/

#include // schakel I2C in.

#define pH_address 99 // standaard I2C ID-nummer voor EZO pH-circuit.

#define DO_address 97 // standaard I2C ID-nummer voor EZO DO Circuit.

#include "RTClib.h" // Datum- en tijdfuncties met behulp van een DS1307 RTC aangesloten via I2C en Wire lib

RTC_DS1307 rtc;

#include // Voor SD-bibliotheek

#include // SD-kaart om gegevens op te slaan

const int chipSelect = 53; // moet uitzoeken voor Adafruit SD breakout//https://learn.adafruit.com/adafruit-micro-sd-breakout-board-card-tutorial/wiring

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

char logFileName = "dataLT.txt"; // wijzig logFileName om uw experiment te identificeren, bijvoorbeeld PBR_01_02, datalog1

lange id = 1; // het id-nummer om de logvolgorde in te voeren

#erbij betrekken

LiquidCrystal_I2C lcd (0x27, 20, 4);

#erbij betrekken

#erbij betrekken

#define ONE_WIRE_BUS 9 //definieer de pin # voor temperatuursonde

OneWire éénWire(ONE_WIRE_BUS);

DallasTemperatuursensoren (&oneWire);

DeviceAddress ProbeP = { 0x28, 0xC2, 0xE8, 0x37, 0x07, 0x00, 0x00, 0xBF }; // MAC-adres, uniek voor elke sonde

String dataString; // de hoofdvariant om alle gegevens op te slaan

String dataString2; // een tijdelijke variant om Temperatuur/pH/DO op te slaan om uit te printen

char computergegevens[20]; // instructie van Atlas Scientific: we maken een 20 byte karakterarray om binnenkomende gegevens van een pc/mac/andere te bewaren.

byte ontvangen_van_computer=0; // we moeten weten hoeveel tekens er zijn ontvangen.

byte serial_event=0;//een vlag om aan te geven wanneer gegevens zijn ontvangen van de pc/mac/andere.

bytecode=0; // wordt gebruikt om de I2C-antwoordcode vast te houden.

char pH_data[20]; // we maken een tekenreeks van 20 bytes om binnenkomende gegevens van het pH-circuit vast te houden.

byte in_char=0; // gebruikt als een buffer van 1 byte om in gebonden bytes van het pH-circuit op te slaan.

byte i=0; // teller gebruikt voor ph_data-array.

int tijd_=1800; // wordt gebruikt om de benodigde vertraging te wijzigen, afhankelijk van de opdracht die naar het EZO-klasse pH-circuit wordt gestuurd.

float pH_float; //float var gebruikt om de float-waarde van de pH vast te houden.

char DO_data[20];

//float temp_C;

void setup () // hardware-initialisatie.

{

Serieel.begin(9600); //Schakel seriële poort in.

Wire.begin(pH_adres); // I2C-poort voor pH-sonde inschakelen

Wire.begin(DO_adres);

lcd.init();

lcd.begin(20, 4);

lcd.achtergrondverlichting();

lcd.home();

lcd.print("Hallo PBR!");

lcd.setCursor(0, 1);

lcd.print("Initialiseren…");

Serial.print("RTC is…");

if (! rtc.begin())

{

Serial.println("RTC: Realtime klok…NIET GEVONDEN");

while (1);// (Serial.println ("RTC: Realtime klok… GEVONDEN"));

}

Serial.println("LOPEND");

Serial.print ("Real-time klok…");

als (! rtc.isrunning())

{rtc.adjust(DateTime(F(_DATE_), F(_TIME_)));

}

Serial.println ("WERKT");

lcd.setCursor(0, 0);

lcd.println("RTC: OK");

Serial.print("SD-kaart…"); // kijk of de kaart aanwezig is en kan worden geïnitialiseerd:

if (!SD.begin(chipSelect))

{ Serial.println ("Mislukt"); // doe niets meer:

opbrengst;

}

Serieel.println("OK");

lcd.setCursor(0, 1);

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

Serial.print("Logbestand: ");

Serial.print(logFileName);

Serieel.print("…");

Bestand logFile = SD.open(logFileName, FILE_WRITE); // open het bestand. "datalog" en druk de kop af

als (logbestand)

{

logFile.println(",,, "); // geeft aan dat er gegevens waren in de vorige run

String header = "Datum -Tijd, Temp(C), pH, DO";

logFile.println(koptekst);

logFile.close();

Serial.println("KLAAR");

//Serial.println(dataString); // print ook naar de seriële poort:

}

else { Serial.println("fout bij openen datalog"); } // als het bestand niet geopend is, verschijnt er een foutmelding:

lcd.setCursor(0, 2);

lcd.print("Logbestand:");

lcd.println(logbestandsnaam);

vertraging (1000);

sensoren.begin();

sensoren.setResolution (ProbeP, 10); //10 is de resolutie (10bit)

lcd.wissen();

id = 0;

}

lege lus()

{ //de hoofdlus.

dataString = String (id);

dataString = String(', ');

DateTime nu = rtc.now();

dataString = String (nu.jaar (), DEC);

dataString += String('/');

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

dataString += String('/');

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

dataString += String(' ');

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

dataString += String(':');

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

dataString += String(':');

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

lcd.home();

lcd.print(dataString);

sensoren.requestTemperatures();

displayTemperatuur (ProbeP);

Wire.beginTransmission (pH_adres); // bel het circuit met zijn ID-nummer

Wire.write('r'); // harde code r om continu te lezen

Wire.endTransmission(); // beëindig de I2C-gegevensoverdracht.

vertragingstijd_); // wacht de juiste hoeveelheid tijd voor het circuit om zijn instructie te voltooien.

Wire.requestFrom(pH_address, 20, 1); // bel het circuit en vraag 20 bytes aan (dit kan meer zijn dan we nodig hebben)

while(Wire.available()) //zijn er bytes om te ontvangen

{

in_char = Draad.lezen(); // ontvang een byte.

if ((in_char > 31) && (in_char <127)) // controleer of de char bruikbaar is (afdrukbaar)

{

pH_data= in_char; // laad deze byte in onze array.

i+=1;

}

if(in_char==0) //als we zien dat we een null-opdracht hebben ontvangen.

{

ik=0; // zet de teller i op 0.

Wire.endTransmission(); // beëindig de I2C-gegevensoverdracht.

pauze; // verlaat de while-lus.

}

}

serial_event=0; // reset de seriële gebeurtenisvlag.

dataString2 += ", ";

dataString2 += String (pH_data);

Wire.beginTransmission (DO_adres); // bel het circuit met zijn ID-nummer

Wire.write('r');

Wire.endTransmission(); // beëindig de I2C-gegevensoverdracht

vertragingstijd_); // wacht de juiste hoeveelheid tijd voor het circuit om zijn instructie te voltooien

Wire.requestFrom (DO_address, 20, 1); // bel het circuit en vraag 20 bytes aan

while(Wire.available()) //zijn er bytes om te ontvangen.

{

in_char = Draad.lezen(); // ontvang een byte.

if ((in_char > 31) && (in_char <127)) //controleer of de char bruikbaar is (afdrukbaar), anders bevat de in_char een symbool aan het begin in het.txt-bestand

{ DO_data= in_char; // laad deze byte in onze array

i+=1; // maak de teller op voor het array-element

}

if(in_char==0)

{ // als we zien dat we een null-commando hebben ontvangen

ik=0; // zet de teller i op 0.

Wire.endTransmission(); // beëindig de I2C-gegevensoverdracht.

pauze; // verlaat de while-lus.

}

}

serial_event=0; // reset de seriële gebeurtenisvlag

pH_float = atof (pH_data);

dataString2 += ", ";

dataString2 += String (DO_data);

lcd.setCursor(0, 1);

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

lcd.setCursor(0, 2);

lcd.print(dataString2);

dataString += ', ';

dataString += dataString2;

Bestand dataFile = SD.open(logFileName, FILE_WRITE); // open het bestand. Houd er rekening mee dat er slechts één bestand tegelijk kan zijn geopend, dus u moet dit bestand sluiten voordat u een ander opent.

if (dataFile) // als het bestand beschikbaar is, schrijf er dan naar:

{

dataFile.println(dataString);

dataFile.close();

Serial.println(dataString); // print ook naar de seriële poort:

}

else { Serial.println("fout bij openen datalogbestand"); } // als het bestand niet geopend is, verschijnt er een foutmelding:

lcd.setCursor(0, 3);

lcd.print("Hardlopen(x5m):");

lcd.setCursor(15, 3);

lcd.print(id);

id ++; // verhoog één ID volgende iteratie

dataString = "";

vertraging(300000); //vertraging 5 minuten = 5*60*1000 ms

lcd.wissen();

} // Einde hoofdlus

void displayTemperature (DeviceAddress deviceAddress)

{

float tempC = sensors.getTempC(deviceAddress);

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

anders dataString2 = String (tempC);

}//de code eindigt hier

  • Kies de juiste COM-poort via Arduino IDE onder Tools/Port
  • Kies het juiste Arduino-bord. Ik heb Mega 2560 gebruikt omdat deze meer intern geheugen heeft. Arduino Nano of Uno werkt prima met deze opstelling.
  • Controleer en codeer en upload code

Stap 7: Resultaten op bedrading (kan worden verbeterd) en LCD-scherm

Resultaten op bedrading (kan worden verbeterd) en LCD-scherm
Resultaten op bedrading (kan worden verbeterd) en LCD-scherm
Resultaten op bedrading (kan worden verbeterd) en LCD-scherm
Resultaten op bedrading (kan worden verbeterd) en LCD-scherm
Resultaten op bedrading (kan worden verbeterd) en LCD-scherm
Resultaten op bedrading (kan worden verbeterd) en LCD-scherm
Resultaten op bedrading (kan worden verbeterd) en LCD-scherm
Resultaten op bedrading (kan worden verbeterd) en LCD-scherm
  • Opmerking: ik kwam het geluid van de DO-sonde naar de pH-sonde tegen na 2-3 maanden continu gebruik. Volgens Atlas Scientific wordt een in-line spanningsisolator aanbevolen wanneer pH- en geleidbaarheidssondes samen werken. Meer details staan op pagina 9 (https://goo.gl/d62Rqv)
  • De gelogde gegevens (de eerste heeft niet-afgedrukte tekens vóór pH- en DO-gegevens). Ik heb gefilterd op code door alleen afdrukbare tekens toe te staan.

Stap 8: Gegevens importeren en een grafiek maken

Gegevens importeren en een grafiek maken
Gegevens importeren en een grafiek maken
Gegevens importeren en een grafiek maken
Gegevens importeren en een grafiek maken
Gegevens importeren en een grafiek maken
Gegevens importeren en een grafiek maken
  1. Gegevens importeren uit tekst onder het tabblad DATA (Excel 2013)
  2. Scheid de gegevens door de komma (daarom is het handig om komma's te plaatsen na elke gegevensinvoer)
  3. Plot de gegevens. Elke onderstaande data heeft ongeveer 1700 punten. Het meetinterval is 5 minuten (instelbaar). Het minimum voor DO- en pH-circuits om de gegevens te lezen is 1,8 sec.

Stap 9: Kalibratie

Kalibratie
Kalibratie
  1. De digitale temperatuursensor (18B20) kan worden gekalibreerd door het verschil rechtstreeks aan te passen aan de. Anders, als de compensatie en de helling kalibratie vereisen, kunt u dit doen door de waarden te wijzigen op regel #453, DallasTemperature.cpp in de map \libraries\DallasTemperature.
  2. Voor pH- en DO-sondes kunt u de sondes kalibreren met bijbehorende oplossingen. U moet de voorbeeldcode van Atlas Scientific gebruiken en de instructies in dit bestand volgen.
  3. Volg pagina's 26 en 50 voor pH-sonde (https://goo.gl/d62Rqv) voor kalibratie en temperatuurcompensatie, en ook pagina's 7-8 en 50 voor DO-sonde (https://goo.gl/mA32mp). Upload eerst de generieke code van Atlas opnieuw, open de seriële monitor en voer een juiste opdracht in.

Stap 10: Te veel bedrading?

  1. U kunt de SD-kaart en de realtimeklokmodule verwijderen door Dragino Yun Shield voor Arduino-boards te gebruiken (https://goo.gl/J9PBTH). De code moest worden aangepast om met Yun Shield te werken. Hier is een goede plek om te beginnen (https://goo.gl/c1x8Dm)
  2. Nog steeds te veel bedrading: de Atlas Scientific heeft een handleiding gemaakt voor hun EZO-circuits (https://goo.gl/dGyb12) en soldeerloze bord (https://goo.gl/uWF51n). Integratie van 18B20 digitale temperatuur is hier (https://goo.gl/ATcnGd). Je moet bekend zijn met commando's op Raspbian (een versie van Debian Linux) die op Raspberry Pi draaien (https://goo.gl/549xvk)

Stap 11: Erkenning:

Dit is mijn zijproject tijdens mijn postdoctoraal onderzoek waarin ik werkte aan een geavanceerde fotobioreactor om microalgen te kweken. Dus ik dacht dat het nodig is om te erkennen dat de partijen voorwaarden hebben gesteld om dit mogelijk te maken. Ten eerste de subsidie, DE-EE0007093: "Atmospheric CO2 Enrichment and Delivery (ACED)," van het Amerikaanse ministerie van Energie, Office of Energy Efficiency and Renewable Energy Targeted Algal Biofuels and Bioproducts. Ik dank Dr. Bruce E. Rittmann van het Biodesign Swette Center for Environmental Biotechnology, Arizona State University, voor het feit dat hij me de kans heeft gegeven om te sleutelen aan elektronica en Arduino. Ik ben opgeleid in milieutechniek, meestal scheikunde, een beetje microbiologie.