Satura rādītājs:

Kā izveidot datu reģistrētāju temperatūrai, PH un izšķīdušajam skābeklim: 11 soļi (ar attēliem)
Kā izveidot datu reģistrētāju temperatūrai, PH un izšķīdušajam skābeklim: 11 soļi (ar attēliem)

Video: Kā izveidot datu reģistrētāju temperatūrai, PH un izšķīdušajam skābeklim: 11 soļi (ar attēliem)

Video: Kā izveidot datu reģistrētāju temperatūrai, PH un izšķīdušajam skābeklim: 11 soļi (ar attēliem)
Video: Использование Melexis MLX90614 Инфракрасный термометр с Arduino 2024, Novembris
Anonim
Image
Image
Attēls
Attēls

Mērķi:

  • Izveidojiet datu reģistrētāju par ≤ 500 USD. Tas saglabā datus par temperatūru, pH un DO ar laika zīmogu un izmantojot I2C sakarus.
  • Kāpēc I2C (integrētā shēma)? Vienā rindā var sakraut tik daudz sensoru, ņemot vērā, ka katram no tiem ir unikāla adrese.

1. darbība:

2. darbība: iegādājieties tālāk norādītās detaļas:

Pērciet detaļas zemāk
Pērciet detaļas zemāk
  1. Arduino MEGA 2560, 35 ASV dolāri,
  2. Strāvas adapteris Arduino plāksnei, 5,98 ASV dolāri,
  3. LCD modulis I2C (displejs), 8,99 ASV dolāri,
  4. Reālā laika pulksteņa (RTC) izlaide, 7,5 ASV dolāri,
  5. MicroSD karšu sadalīšanas panelis, 7,5 ASV dolāri,
  6. 4 GB SD karte, 6,98 USD,
  7. Ūdensnecaurlaidīgs digitālais sensors DS18B20, 9,95 ASV dolāri,
  8. pH zonde + komplekti + standarta buferi, 149,15 ASV dolāri,
  9. DO zonde + komplekti + standarta buferi, 247,45 USD,
  10. Maizes dēlis, džemperis, 7,98 ASV dolāri,
  11. (Pēc izvēles) Sprieguma izolators, 24 ASV dolāri,

Kopā: 510,48 ASV dolāri

* Atsevišķas detaļas (piemēram, vispārīgo plāksni) varēja iegādāties no citiem pārdevējiem (eBay, Ķīnas pārdevējs) par zemāku cenu. Lai iegūtu tos no Atlas Scientific, ieteicams izmantot pH un DO zondes.

* Lai pārbaudītu vadītspēju un spriegumu, ieteicams izmantot multimetru. Tas maksā apmēram 10-15 USD (https://goo.gl/iAMDJo)

3. darbība: elektroinstalācija

Elektroinstalācija
Elektroinstalācija
  • Izmantojiet džemperi/DuPont kabeļus, lai savienotu detaļas, kā parādīts zemāk esošajā skicē.
  • Izmantojiet multimetru, lai pārbaudītu vadītspēju.
  • Pārbaudiet pozitīvā sprieguma padevi (VCC) un zemējumu (GND) (ja jūs neesat pazīstams ar ķēdi, to ir viegli sajaukt)
  • Pievienojiet strāvas adapteri un pārbaudiet strāvas indikatoru katrā daļā. Ja rodas šaubas, izmantojiet multimetru, lai pārbaudītu spriegumu starp VCC un GND (5V)

4. darbība: sagatavojiet PH, DO shēmas, SD karti

Sagatavojiet PH, DO shēmas, SD karti
Sagatavojiet PH, DO shēmas, SD karti
  1. Pārslēdzieties uz I2C pH un DO ķēdēm
  2. PH un DO pārtraukumi tiek piegādāti ar seriālo komunikāciju kā noklusējuma režīmu Pārraide/saņemšana (TX/RX). Lai izmantotu I2C režīma pulksteņa līniju (SCL) un datu līniju (SDA), pārslēdziet režīmu līdz (1): atvienojiet VCC, TX, RX kabeļus, (2): pārejiet no TX uz Ground for Probe, PGND (nevis GND)), (3) pievienojiet VCC ķēdei, (4): pagaidiet, līdz gaismas diode mainās no zaļas uz zilu. Sīkāku informāciju skatiet 39. lpp. (PH shēmas datu lapa,
  3. Dariet to pašu ar DO ķēdi
  4. (ja jūs zināt, kā augšupielādēt parauga kodu uz tāfeles, varat to izdarīt, izmantojot sērijas monitoru)
  5. Formatējiet SD karti FAT formātā

5. solis: sagatavojiet programmatūru

Sagatavojiet programmatūru
Sagatavojiet programmatūru
Sagatavojiet programmatūru
Sagatavojiet programmatūru
Sagatavojiet programmatūru
Sagatavojiet programmatūru
Sagatavojiet programmatūru
Sagatavojiet programmatūru
  1. Lejupielādējiet Arduino integrēto attīstības vidi (IDE),
  2. Instalējiet bibliotēku Arduino IDE:
  3. Lielākajai daļai no tām ir Arduino programmatūra. LiquidCrystal_I2C.h ir pieejams vietnē GitHub
  4. Instalējiet USB draiveri. Oriģinālam Arduino jums tas, iespējams, nav jāinstalē. Lai iegūtu vispārēju, jums jāinstalē CH340 draiveris (GitHub:
  5. Pārbaudiet, vai pareizi pievienojat plāksni, veicot mirgojošu LED testu
  6. Kā atrast 18B20 digitālās temperatūras MAC adresi. Izmantojot I2C skenera veidni Arduino IDE ar pievienotu zondi. Katrai ierīcei ir unikāla MAC adrese, tāpēc ar vienu koplīniju varat izmantot tik daudz temperatūras zondes (#9). 18B20 izmanto viena stieples I2C, tāpēc tas ir īpašs I2C sakaru metodes gadījums. Zemāk ir viena metode, kā atrast MAC - medicīnas piekļuves kontrole (“ROM”, veicot tālāk norādīto procedūru).

6. darbība: sāciet kodēšanu

Sāciet kodēšanu
Sāciet kodēšanu
  • Kopējiet zemāk esošo kodu uz Arduino IDE:
  • Vai arī lejupielādējiet kodu (.ino), un Arduino IDE tiks parādīts jauns logs.

/*

Atsauces pamācības:

1. Temperatūra, ORP, pH reģistrētājs:

2. Drošs digitālais (SD) vairogs:

Šis kods izvadīs datus uz Arduino sērijas monitoru. Ievadiet komandas Arduino sērijas monitorā, lai kontrolētu EZO pH ķēdi I2C režīmā.

Modificēts no iepriekš minētajām apmācībām, galvenokārt no Atlas-Scientific I2C koda

Pēdējo reizi atjaunināts: Binh Nguyen, 2017. gada 26. jūlijs

*/

#include // iespējot I2C.

#define pH_address 99 // noklusējuma I2C ID numurs EZO pH ķēdei.

#define DO_address 97 // noklusējuma I2C ID numurs EZO DO ķēdei.

#include "RTClib.h" // Datuma un laika funkcijas, izmantojot DS1307 RTC, kas savienots, izmantojot I2C un Wire lib

RTC_DS1307 rtc;

#include // SD bibliotēkai

#include // SD karte datu glabāšanai

const int chipSelect = 53; // nepieciešams izdomāt Adafruit SD pārtraukumu //

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

char logFileName = "dataLT.txt"; // modificējiet logFileName, lai identificētu eksperimentu, piemēram, PBR_01_02, datalog1

garš id = 1; // ID numurs žurnāla pasūtījuma ievadīšanai

#iekļaut

LiquidCrystal_I2C LCD (0x27, 20, 4);

#iekļaut

#iekļaut

#define ONE_WIRE_BUS 9 // definējiet temperatūras zondes tapu #

OneWire oneWire (ONE_WIRE_BUS);

Dalasas temperatūras sensori (& oneWire);

DeviceAddress ProbeP = {0x28, 0xC2, 0xE8, 0x37, 0x07, 0x00, 0x00, 0xBF}; // MAC adrese, unikāla katrai zondei

String dataString; // galvenais variants visu datu glabāšanai

String dataString2; // pagaidu variants temperatūras/pH/DO uzglabāšanai drukāšanai

char datora dati [20]; // instrukcija no Atlas Scientific: mēs izveidojam 20 baitu rakstzīmju masīvu, lai turētu ienākošos datus no datora/mac/cita.

baits saņemts_ no datora = 0; // mums jāzina, cik rakstzīmju ir saņemtas.

baits serial_event = 0; // karodziņš, kas signalizē, kad dati ir saņemti no datora/mac/cita.

baitu kods = 0; // izmanto, lai turētu atbildes kodu I2C.

ogles pH_dati [20]; // mēs izveidojam 20 baitu rakstzīmju masīvu, lai turētu ienākošos datus no pH ķēdes.

baits in_char = 0; // izmanto kā 1 baitu buferšķīdumu, lai uzglabātu saistītos baitos no pH shēmas.

baits i = 0; // skaitītājs, ko izmanto masīvam ph_data.

int laiks_ = 1800; // izmanto, lai mainītu vajadzīgo aizkavi atkarībā no komandas, kas nosūtīta EZO klases pH shēmai.

pludiņš pH_float; // float var, ko izmanto, lai noturētu pH peldošo vērtību.

char DO_data [20];

// peldēt temp_C;

void setup () // aparatūras inicializācija.

{

Sērijas sākums (9600); // iespējot seriālo portu.

Wire.begin (pH_address); // iespējot I2C portu pH zondei

Wire.begin (DO_address);

lcd.init ();

lcd. sākums (20, 4);

lcd.fona apgaismojums ();

lcd.home ();

lcd.print ("Labdien PBR!");

lcd.setCursor (0, 1);

lcd.print ("Inicializēšana …");

Serial.print ("RTC ir …");

ja (! rtc.begin ())

{

Serial.println ("RTC: reāllaika pulkstenis … NOT FOUND");

while (1); // (Serial.println ("RTC: reālā laika pulkstenis… FOUND"));

}

Serial.println ("RUNNING");

Serial.print ("Reālā laika pulkstenis …");

ja (! rtc.isrunning ())

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

}

Serial.println ("DARBA");

lcd.setCursor (0, 0);

lcd.println ("RTC: Labi");

Serial.print ("SD karte …"); // pārbaudiet, vai karte ir pieejama un vai to var inicializēt:

ja (! SD.begin (chipSelect))

{Serial.println ("Neizdevās"); // neko vairāk nedari:

atgriešanās;

}

Serial.println ("Labi");

lcd.setCursor (0, 1);

lcd.println ("SD karte: Labi");

Serial.print ("Žurnāla fails:");

Serial.print (logFileName);

Serial.print ("…");

Fails logFile = SD.open (logFileName, FILE_WRITE); // atveriet failu. "datalog" un izdrukājiet galveni

ja (logFile)

{

logFile.println (",,"); // norādiet, ka iepriekšējā braucienā bija dati

String header = "Datums -laiks, temperatūra (C), pH, DO";

logFile.println (galvene);

logFile.close ();

Serial.println ("GATAVS");

//Serial.println(dataString); // drukājiet arī uz seriālo portu:

}

else {Serial.println ("kļūda, atverot datu katalogu"); } // ja fails nav atvērts, parādiet kļūdu:

lcd.setCursor (0, 2);

lcd.print ("Žurnāla fails:");

lcd.println (logFileName);

kavēšanās (1000);

sensor.begin ();

sensors.setResolution (ProbeP, 10); // 10 ir izšķirtspēja (10 biti)

lcd.clear ();

id = 0;

}

tukša cilpa ()

{// galvenā cilpa.

dataString = String (id);

dataString = Virkne (',');

DateTime now = rtc.now ();

dataString = String (tagad.gads (), DEC);

dataString += String ('/');

dataString += String (tagad.mēnesis (), DEC);

dataString += String ('/');

dataString += String (tagad.diena (), DEC);

dataString += String ('');

dataString += String (tagad.stunda (), DEC);

dataString += String (':');

dataString += String (tagad.minūte (), DEC);

dataString += String (':');

dataString += String (tagad.second (), DEC);

lcd.home ();

lcd.print (dataString);

sensors.requestTemperatures ();

displayTemperature (ProbeP);

Wire.beginTransmission (pH_address); // izsaukt ķēdi pēc tās ID numura

Wire.write ('r'); // cietais kods r, ko nepārtraukti lasīt

Wire.endTransmission (); // beigt I2C datu pārraidi.

kavēšanās (laiks_); // pagaidiet pareizo laiku, lai ķēde pabeigtu norādījumus.

Wire.requestFrom (pH_address, 20, 1); // piezvaniet ķēdei un pieprasiet 20 baitus (tas var būt vairāk, nekā mums nepieciešams)

kamēr (Wire.available ()) // vai ir baiti, ko saņemt

{

in_char = Wire.read (); // saņemt baitu.

if ((in_char> 31) && (in_char <127)) // pārbaudiet, vai ogles ir izmantojamas (izdrukājamas)

{

pH_dati = ogles; // ielādējiet šo baitu mūsu masīvā.

i+= 1;

}

if (in_char == 0) // ja redzam, ka mums ir nosūtīta komanda null.

{

i = 0; // atiestatīt skaitītāju i uz 0.

Wire.endTransmission (); // beigt I2C datu pārraidi.

pārtraukums; // iziet no cikla cikla.

}

}

sērijas_pasākums = 0; // atiestatīt sērijveida notikumu karodziņu.

dataString2 += ",";

dataString2 += Virkne (pH_dati);

Wire.beginTransmission (DO_address); // izsaukt ķēdi pēc tās ID numura

Wire.write ('r');

Wire.endTransmission (); // beigt I2C datu pārraidi

kavēšanās (laiks_); // pagaidiet pareizo laiku, lai ķēde pabeigtu norādījumus

Wire.requestFrom (DO_address, 20, 1); // zvaniet ķēdei un pieprasiet 20 baitus

kamēr (Wire.available ()) // vai ir baiti, ko saņemt.

{

in_char = Wire.read (); // saņemt baitu.

if ((in_char> 31) && (in_char <127)) // pārbaudiet, vai ogles ir izmantojamas (izdrukājamas), pretējā gadījumā in_char.txt faila sākumā ir simbols

{DO_data = in_char; // ielādējiet šo baitu mūsu masīvā

i+= 1; // uzlikt masīva elementa skaitītāju

}

ja (in_char == 0)

{// ja redzam, ka mums ir nosūtīta komanda null

i = 0; // atiestatīt skaitītāju i uz 0.

Wire.endTransmission (); // beigt I2C datu pārraidi.

pārtraukums; // iziet no cikla cikla.

}

}

sērijas_pasākums = 0; // atiestatīt sērijveida notikumu karodziņu

pH_float = atof (pH_dati);

dataString2 += ",";

dataString2 += String (DO_data);

lcd.setCursor (0, 1);

lcd.print ("Temperatūra/ pH/ DO");

lcd.setCursor (0, 2);

lcd.print (dataString2);

dataString += ',';

dataString += dataString2;

Fails dataFile = SD.open (logFileName, FILE_WRITE); // atveriet failu. Ņemiet vērā, ka vienlaikus var atvērt tikai vienu failu, tāpēc pirms cita faila atvēršanas tas ir jāaizver.

if (dataFile) // ja fails ir pieejams, rakstiet uz to:

{

dataFile.println (dataString);

dataFile.close ();

Serial.println (dataString); // drukājiet arī uz seriālo portu:

}

else {Serial.println ("kļūda, atverot datu kataloga failu"); } // ja fails nav atvērts, parādiet kļūdu:

lcd.setCursor (0, 3);

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

lcd.setCursor (15, 3);

lcd.print (id);

id ++; // palielināt vienu ID nākamajā iterācijā

dataString = "";

kavēšanās (300000); // aizkavēšanās 5 minūtes = 5*60*1000 ms

lcd.clear ();

} // beigt galveno cilpu

tukšs displejs Temperatūra (DeviceAddress deviceAddress)

{

pludiņa tempC = sensor.getTempC (deviceAddress);

if (tempC == -127,00) lcd.print ("Temperatūras kļūda");

else dataString2 = String (tempC);

} // kods beidzas šeit

  • Izvēlieties pareizo COM portu, izmantojot Arduino IDE sadaļā Rīki/ports
  • Izvēlieties pareizo Arduino dēli. Es izmantoju Mega 2560, jo tam ir vairāk iekšējās atmiņas. Ar šo iestatījumu Arduino Nano vai Uno darbojas labi.
  • Pārbaudiet un kodējiet un augšupielādējiet kodu

7. darbība: vadu (var uzlabot) un LCD displeja rezultāti

Vadu (var uzlabot) un LCD displeja rezultāti
Vadu (var uzlabot) un LCD displeja rezultāti
Vadu (var uzlabot) un LCD displeja rezultāti
Vadu (var uzlabot) un LCD displeja rezultāti
Vadu (var uzlabot) un LCD displeja rezultāti
Vadu (var uzlabot) un LCD displeja rezultāti
Vadu (var uzlabot) un LCD displeja rezultāti
Vadu (var uzlabot) un LCD displeja rezultāti
  • Piezīme: Es saskāros ar troksni no DO zondes līdz pH zondei pēc 2-3 mēnešu nepārtrauktas darbības. Saskaņā ar Atlas Scientific teikto, ja pH, vadītspējas zondes darbojas kopā, ieteicams izmantot līnijas sprieguma izolatoru. Sīkāka informācija atrodama 9. lappusē (https://goo.gl/d62Rqv)
  • Reģistrētie dati (pirmajam ir nedrukātas rakstzīmes pirms pH un DO datiem). Es filtrēju pēc koda, atļaujot tikai drukājamas rakstzīmes.

8. darbība: importējiet datus un izveidojiet diagrammu

Importējiet datus un izveidojiet diagrammu
Importējiet datus un izveidojiet diagrammu
Importējiet datus un izveidojiet diagrammu
Importējiet datus un izveidojiet diagrammu
Importējiet datus un izveidojiet diagrammu
Importējiet datus un izveidojiet diagrammu
  1. Datu importēšana no cilnes DATA esošā teksta (Excel 2013)
  2. Atdaliet datus ar komatu (tāpēc ir noderīgi komati pēc katras datu ievades)
  3. Uzzīmējiet datus. Katram zemāk esošajam datam ir aptuveni 1700 punktu. Mērījumu intervāls ir 5 minūtes (regulējams). DO un pH ķēžu minimums datu nolasīšanai ir 1,8 sekundes.

9. solis: kalibrēšana

Kalibrēšana
Kalibrēšana
  1. Ciparu temperatūras sensoru (18B20) var kalibrēt, noregulējot starpību tieši uz. Pretējā gadījumā, ja kompensācijai un slīpumam bija nepieciešama kalibrēšana, to var izdarīt, mainot vērtības #453. rindā DallasTemperature.cpp mapē / libraries / DallasTemperature.
  2. PH un DO zondēm varat kalibrēt zondes ar pievienotajiem šķīdumiem. Jums ir jāizmanto Atlas Scientific koda paraugs un jāievēro šī faila norādījumi.
  3. Lūdzu, ievērojiet 26. un 50. lappusi, lai uzzinātu pH zondi (https://goo.gl/d62Rqv), lai iegūtu kalibrēšanu un temperatūras kompensāciju, kā arī 7., 8. un 50. lpp., Lai uzzinātu par DO zondi (https://goo.gl/mA32mp). Vispirms, lūdzu, atkārtoti augšupielādējiet Atlas sniegto vispārīgo kodu, atveriet sērijas monitoru un ievadiet pareizu komandu.

10. solis: pārāk daudz vadu?

  1. Jūs varat noņemt SD karti un reālā laika pulksteņa moduli, izmantojot Dragino Yun Shield Arduino dēļiem (https://goo.gl/J9PBTH). Kods bija jāmaina, lai tas darbotos ar Yun Shield. Šeit ir laba vieta, kur sākt (https://goo.gl/c1x8Dm)
  2. Joprojām ir pārāk daudz vadu: Atlas Scientific izveidoja rokasgrāmatu savām EZO shēmām (https://goo.gl/dGyb12) un bezlodēšanas plāksnei (https://goo.gl/uWF51n). Šeit ir integrēta digitālā 18B20 temperatūra (https://goo.gl/ATcnGd). Jums jāzina komandas Raspbian (Debian Linux versija), kas darbojas Raspberry Pi (https://goo.gl/549xvk)

11. solis: apstiprinājums:

Šis ir mans blakus projekts pēcdoktorantūras pētījuma laikā, kurā es strādāju pie iepriekšēja fotobioreaktora, lai audzētu mikroaļģes. Tāpēc es uzskatu, ka ir nepieciešams kreditēt puses, kuras ir nodrošinājušas nosacījumus, lai tas notiktu. Pirmkārt, dotācija, DE-EE0007093: “Atmosfēras CO2 bagātināšana un piegāde (ACED)”, no ASV Enerģētikas departamenta Energoefektivitātes un atjaunojamās enerģijas biroja mērķa aļģu biodegvielas un bioloģisko produktu. Es pateicos Dr Bruce E. Rittmann no Biodesign Swette Vides biotehnoloģijas centra Arizonas štata universitātē par iespēju nodrošināties ar elektroniku un Arduino. Es biju apmācīts vides inženierijā, galvenokārt ķīmijā, mazliet mikrobioloģijā.

Ieteicams: