Inhoudsopgave:
- Stap 1:
- Stap 2: Koop de onderstaande onderdelen:
- Stap 3: Bedrading
- Stap 4: Bereid de PH, DO Circuits, SD-kaart voor
- Stap 5: Software voorbereiden
- Stap 6: Begin met coderen
- Stap 7: Resultaten op bedrading (kan worden verbeterd) en LCD-scherm
- Stap 8: Gegevens importeren en een grafiek maken
- Stap 9: Kalibratie
- Stap 10: Te veel bedrading?
- Stap 11: Erkenning:
2025 Auteur: John Day | [email protected]. Laatst gewijzigd: 2025-01-13 06:57
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:
- Arduino MEGA 2560, $ 35,
- Voedingsadapter voor Arduino-bord, $ 5,98,
- LCD-module I2C (display), $8,99,
- Real-Time Clock (RTC) breakout, $ 7,5,
- MicroSD-kaart breakout board, $ 7,5,
- 4 GB SD-kaart, $ 6,98,
- Waterdichte DS18B20 Digitale sensor, $ 9,95,
- pH-sonde + Kits+ Standaardbuffers, $ 149,15,
- DO-sonde + Kits+ Standaardbuffers, $ 247,45,
- Breadboard, startkabel, $ 7,98,
- (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
- 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
- Schakel over naar I2C voor pH- en DO-circuits
- 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,
- Doe dezelfde stap met DO circuit
- (als u weet hoe u de voorbeeldcode naar het bord moet uploaden, kunt u dit doen via de seriële monitor)
- SD-kaart formatteren naar FAT-formaat
Stap 5: Software voorbereiden
- Download Arduino Integrated Development Environment (IDE),
- Installeer bibliotheek naar Arduino IDE:
- De meeste worden geleverd met Arduino-software. LiquidCrystal_I2C.h is beschikbaar via GitHub
- 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:
- Controleer of je het bord correct hebt aangesloten door een knipperende LED-test uit te voeren
- 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
- 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
- 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 uit tekst onder het tabblad DATA (Excel 2013)
- Scheid de gegevens door de komma (daarom is het handig om komma's te plaatsen na elke gegevensinvoer)
- 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
- 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.
- 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.
- 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?
- 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)
- 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.