Spisu treści:

Jak zrobić rejestrator danych dla temperatury, PH i rozpuszczonego tlenu: 11 kroków (ze zdjęciami)
Jak zrobić rejestrator danych dla temperatury, PH i rozpuszczonego tlenu: 11 kroków (ze zdjęciami)

Wideo: Jak zrobić rejestrator danych dla temperatury, PH i rozpuszczonego tlenu: 11 kroków (ze zdjęciami)

Wideo: Jak zrobić rejestrator danych dla temperatury, PH i rozpuszczonego tlenu: 11 kroków (ze zdjęciami)
Wideo: FASCYNUJĄCA ZIEMIA: Prace prowadzone w Polskiej Stacji Polarnej Hornsund na Spitsbergenie 2024, Listopad
Anonim
Image
Image
Obraz
Obraz

Cele:

  • Zrób rejestrator danych za ≤ 500 USD. Przechowuje dane dotyczące temperatury, pH i DO ze znacznikiem czasu i przy użyciu komunikacji I2C.
  • Dlaczego I2C (obwód zintegrowany)? W jednej linii można umieścić tyle czujników, że każdy z nich ma unikalny adres.

Krok 1:

Krok 2: Kup części poniżej:

Kup części poniżej
Kup części poniżej
  1. Arduino MEGA 2560, 35 USD,
  2. Zasilacz do płytki Arduino, $5.98,
  3. Moduł LCD I2C (wyświetlacz), 8,99 USD,
  4. Przebicie zegara czasu rzeczywistego (RTC), 7,5 USD,
  5. Płytka stykowa karty microSD, 7,5 USD,
  6. Karta SD 4 GB, 6,98 USD,
  7. Wodoodporny czujnik cyfrowy DS18B20, 9,95 USD,
  8. Sonda pH + zestawy + bufory standardowe, 149,15 USD,
  9. Sonda DO + zestawy + bufory standardowe, 247,45 USD,
  10. Płytka do krojenia chleba, kabel połączeniowy, 7,98 USD,
  11. (Opcjonalnie) Izolator napięcia, 24 USD,

Razem: $510,48

* Niektóre części (takie jak tablica ogólna) można było kupić od innych sprzedawców (eBay, chiński sprzedawca) za niższą cenę. Zaleca się, aby sondy pH i DO były dostępne w firmie Atlas Scientific.

* Do sprawdzania przewodności i napięcia zalecany jest multimetr. Kosztuje około 10-15 USD (https://goo.gl/iAMDJo)

Krok 3: Okablowanie

Okablowanie
Okablowanie
  • Użyj kabli połączeniowych/DuPont, aby połączyć części, jak pokazano na poniższym szkicu.
  • Użyj multimetru do sprawdzenia przewodzenia.
  • Sprawdź dodatnie napięcie zasilania (VCC) i uziemienie (GND) (łatwo pomylić, jeśli nie znasz obwodu)
  • Podłącz zasilacz i sprawdź wskaźnik zasilania w każdej części. W razie wątpliwości użyj multimetru, aby sprawdzić, czy napięcie między VCC a GND wynosi (5 V)

Krok 4: Przygotuj obwody PH, DO, kartę SD

Przygotuj obwody PH, DO, kartę SD
Przygotuj obwody PH, DO, kartę SD
  1. Przełącz na I2C dla obwodów pH i DO
  2. Przebicia pH i DO są dostarczane z komunikacją szeregową jako domyślnym trybem transmisji/odbioru (TX/RX). Aby użyć linii zegara trybu I2C (SCL) i linii danych (SDA), przełącz tryb za pomocą (1): odłącz kable VCC, TX, RX, (2): przeskocz TX do uziemienia sondy, PGND (nie GND), (3) podłącz VCC do obwodu, (4): poczekaj, aż dioda zmieni kolor z zielonego na niebieski. Więcej szczegółów na stronie 39 (Karta katalogowa obwodu pH,
  3. Zrób ten sam krok z obwodem DO
  4. (jeśli wiesz, jak wgrać przykładowy kod na płytkę, możesz to zrobić przez monitor szeregowy)
  5. Sformatuj kartę SD do formatu FAT

Krok 5: Przygotuj oprogramowanie

Przygotuj oprogramowanie
Przygotuj oprogramowanie
Przygotuj oprogramowanie
Przygotuj oprogramowanie
Przygotuj oprogramowanie
Przygotuj oprogramowanie
Przygotuj oprogramowanie
Przygotuj oprogramowanie
  1. Pobierz zintegrowane środowisko programistyczne Arduino (IDE),
  2. Zainstaluj bibliotekę w Arduino IDE:
  3. Większość z nich jest dostarczana z oprogramowaniem Arduino. LiquidCrystal_I2C.h jest dostępny na GitHub
  4. Zainstaluj sterownik USB. W przypadku oryginalnego Arduino może nie być konieczne jego instalowanie. Aby uzyskać ogólny, musisz zainstalować sterownik CH340 (GitHub:
  5. Sprawdź, czy prawidłowo podłączasz płytkę, uruchamiając test migającej diody LED
  6. Jak znaleźć adres MAC temperatury cyfrowej 18B20. Korzystanie z szablonu skanera I2C w Arduino IDE z podłączoną sondą. Każde urządzenie ma unikalny adres MAC, dzięki czemu można używać tylu sond temperatury na jednej wspólnej linii (#9). 18B20 używa jednoprzewodowego I2C, więc jest to szczególny przypadek metody komunikacji I2C. Poniżej znajduje się jedna metoda znalezienia MAC – Medical Access Control („ROM” po uruchomieniu poniższej procedury).

Krok 6: Rozpocznij kodowanie

Rozpocznij kodowanie
Rozpocznij kodowanie
  • Skopiuj i wklej poniższy kod do Arduino IDE:
  • Lub pobierz kod (.ino), a w Arduino IDE powinno pojawić się nowe okno.

/*

Samouczki referencyjne:

1. Rejestrator temperatury, ORP, pH:

2. Secured Digital (SD) Shield:

Ten kod wyśle dane do monitora szeregowego Arduino. Wpisz polecenia do monitora szeregowego Arduino, aby sterować obwodem pH EZO w trybie I2C.

Zmodyfikowano na podstawie wspomnianych samouczków powyżej, głównie z kodu I2C autorstwa Atlas-Scientific

Ostatnia aktualizacja: 26 lipca 2017 r. przez Binh Nguyen

*/

#include //włącz I2C.

#define pH_address 99 //domyślny numer identyfikacyjny I2C dla obwodu pH EZO.

#define DO_address 97 //domyślny numer identyfikacyjny I2C dla obwodu EZO DO.

#include "RTClib.h" // Funkcje daty i czasu za pomocą DS1307 RTC połączonego przez I2C i Wire lib

RTC_DS1307 RTC;

#include // Dla biblioteki SD

#dołącz // kartę SD do przechowywania danych

const int chipSelect = 53; // trzeba znaleźć rozwiązanie Adafruit SD breakout//https://learn.adafruit.com/adafruit-micro-sd-breakout-board-card-tutorial/wiring

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

char logFileName = "dataLT.txt"; // zmodyfikuj logFileName, aby zidentyfikować eksperyment, na przykład PBR_01_02, datalog1

długi identyfikator = 1; //numer identyfikacyjny, aby wprowadzić kolejność logów

#włączać

LiquidCrystal_I2C lcd (0x27, 20, 4);

#włączać

#włączać

#define ONE_WIRE_BUS 9 //zdefiniuj pin # dla sondy temperatury

OneWire oneWire(ONE_WIRE_BUS);

DallasCzujniki temperatury(&oneWire);

Sonda P adresu urządzenia = { 0x28, 0xC2, 0xE8, 0x37, 0x07, 0x00, 0x00, 0xBF }; //Adres MAC, unikalny dla każdej sondy

Ciąg danychString; // główny wariant do przechowywania wszystkich danych

Ciąg danychString2; // tymczasowy wariant do przechowywania temperatury/pH/DO do wydruku

dane komputerowe o znakach[20]; //instrukcja od Atlas Scientific: tworzymy 20-bajtową tablicę znaków do przechowywania danych przychodzących z komputera PC/mac/other.

bajt odebrany_z_komputera=0; //musimy wiedzieć ile znaków otrzymaliśmy.

byte serial_event=0;//a flaga sygnalizująca odebranie danych z komputera PC/mac/other.

kod bajtowy=0; //używany do przechowywania kodu odpowiedzi I2C.

char pH_data[20]; //tworzymy 20-bajtową tablicę znaków do przechowywania danych przychodzących z obwodu pH.

bajt in_char=0; //używany jako bufor 1-bajtowy do przechowywania powiązanych bajtów z obwodu pH.

bajt i=0; //licznik używany do tablicy ph_data.

czas int_=1800; //służy do zmiany wymaganego opóźnienia w zależności od polecenia wysłanego do obwodu pH klasy EZO.

pływak pH_pływak; //zmienna zmiennoprzecinkowa używana do przechowywania wartości zmiennoprzecinkowej pH.

char DO_data[20];

//zmienna temp_C;

void setup() //inicjalizacja sprzętu.

{

Serial.początek(9600); //włącz port szeregowy.

Wire.begin(adres_pH); //włącz port I2C dla sondy pH

Wire.begin(DO_adres);

lcd.init();

lcd.początek(20, 4);

podświetlenie LCD();

lcd.home();

lcd.print("Witaj PBR!");

lcd.setCursor(0, 1);

lcd.print("Inicjowanie…");

Serial.print("RTC to…");

jeśli (! rtc.begin())

{

Serial.println("RTC: Zegar czasu rzeczywistego… NIE ZNALEZIONO");

while (1);// (Serial.println("RTC: Zegar czasu rzeczywistego…ZNALEZIONO"));

}

Serial.println("URUCHOM");

Serial.print("Zegar czasu rzeczywistego…");

jeśli (! rtc.isrunning())

{rtc.adjust(DataCzas(F(_DATA_), F(_CZAS_)));

}

Serial.println("PRACA");

lcd.setCursor(0, 0);

lcd.println("RTC: OK");

Serial.print("Karta SD…"); // zobacz, czy karta jest obecna i można ją zainicjować:

if (!SD.begin(chipSelect))

{ Serial.println("Niepowodzenie"); // nie rób nic więcej:

powrót;

}

Serial.println("OK");

lcd.setCursor(0, 1);

lcd.println("Karta SD: OK");

Serial.print("Plik dziennika: ");

Serial.print(NazwaPlikuDziennika);

Serial.print("…");

Plik logFile = SD.open(logFileName, FILE_WRITE); // otwórz plik. "datalog" i wydrukuj nagłówek

jeśli (plik dziennika)

{

logFile.println(",,, "); //wskaż, że w poprzednim przebiegu były dane

Nagłówek ciągu = "Data - godzina, temperatura (C), pH, DO";

logFile.println(nagłówek);

logFile.close();

Serial.println("GOTOWE");

//Serial.println(ciąg danych); // drukuj też do portu szeregowego:

}

else { Serial.println("błąd podczas otwierania dziennika danych"); } // jeśli plik nie jest otwarty, wyskakuje błąd:

lcd.setCursor(0, 2);

lcd.print("Plik dziennika:");

lcd.println(NazwaPlikuDziennika);

opóźnienie (1000);

czujniki.początek();

sensor.setResolution(ProbeP, 10); //10 to rozdzielczość (10bit)

lcd.clear();

identyfikator = 0;

}

pusta pętla()

{ //główna pętla.

ciąg danych = ciąg(id);

dataString = String(', ');

DataCzas teraz = rtc.now();

DataString = String(teraz.rok(), DEC);

Ciąg danych += Ciąg('/');

DataString += String(teraz.miesiąc(), DEC);

Ciąg danych += Ciąg('/');

DataString += String(teraz.day(), DEC);

DataString += String(' ');

dataString += String(now.hour(), DEC);

dataString += String(':');

dataString += String(now.minute(), DEC);

dataString += String(':');

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

lcd.home();

lcd.print(ciąg danych);

sensory.żądanieTemperatury();

wyświetlanie temperatury (sonda P);

Wire.beginTransmission(adres_pH); //zadzwoń do obwodu według jego numeru identyfikacyjnego

Wire.write('r'); //twardy kod r do ciągłego czytania

Wire.endTransmission(); //zakończ transmisję danych I2C.

Czas zwłoki_); //odczekaj odpowiednią ilość czasu, aż obwód zakończy swoją instrukcję.

Wire.requestFrom(adres_pH, 20, 1); //wywołaj obwód i zażądaj 20 bajtów (może to być więcej niż potrzebujemy)

while(Wire.available()) //czy są bajty do odebrania?

{

in_char = Wire.read(); //odbierz bajt.

if ((in_char > 31) && (in_char <127)) //sprawdź, czy znak jest użyteczny (drukowalny)

{

pH_dane= in_char; //załaduj ten bajt do naszej tablicy.

i+=1;

}

if(in_char==0) //jeśli widzimy, że wysłano nam polecenie null.

{

i=0; //zresetuj licznik i do 0.

Wire.endTransmission(); //zakończ transmisję danych I2C.

przerwa; //wyjdź z pętli while.

}

}

serial_event=0; //zresetuj flagę zdarzenia seryjnego.

CiągDanych2 += ", ";

ciąg danych2 += ciąg(pH_dane);

Wire.beginTransmission(DO_adres); //zadzwoń do obwodu według jego numeru identyfikacyjnego

Wire.write('r');

Wire.endTransmission(); //zakończ transmisję danych I2C

Czas zwłoki_); //odczekaj odpowiednią ilość czasu, aż obwód wykona swoją instrukcję

Wire.requestFrom(DO_adres, 20, 1); //wywołaj obwód i zażądaj 20 bajtów

while(Wire.available()) //czy są bajty do odebrania.

{

in_char = Wire.read(); //odbierz bajt.

if ((in_char > 31) && (in_char <127)) //sprawdź, czy znak jest użyteczny (drukowalny), w przeciwnym razie in_char zawiera symbol na początku w pliku.txt

{ DO_dane= in_char; //załaduj ten bajt do naszej tablicy

i+=1; //policz licznik dla elementu tablicy

}

if(in_char==0)

{ //jeśli widzimy, że wysłano nam polecenie null

i=0; //zresetuj licznik i do 0.

Wire.endTransmission(); //zakończ transmisję danych I2C.

przerwa; //wyjdź z pętli while.

}

}

serial_event=0; //zresetuj flagę zdarzenia seryjnego

pH_float = atof (pH_dane);

CiągDanych2 += ", ";

Ciąg danych2 += Ciąg(DO_dane);

lcd.setCursor(0, 1);

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

lcd.setCursor(0, 2);

lcd.print(ciąg danych2);

Ciąg danych += ', ';

Ciąg_danych += Ciąg_danych2;

Plik dataFile = SD.open(logFileName, FILE_WRITE); // otwórz plik. zauważ, że tylko jeden plik może być otwarty na raz, więc musisz zamknąć ten przed otwarciem kolejnego.

if (dataFile) // jeśli plik jest dostępny, napisz do niego:

{

plik danych.println(ciąg danych);

plik_danych.zamknij();

Serial.println(ciąg danych); // drukuj też do portu szeregowego:

}

else { Serial.println("błąd podczas otwierania pliku dziennika danych"); } // jeśli plik nie jest otwarty, wyskakuje błąd:

lcd.setCursor(0, 3);

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

lcd.setCursor(15, 3);

lcd.print(id);

identyfikator ++; // zwiększ o jeden identyfikator w następnej iteracji

ciąg danych = "";

opóźnienie (300000); //opóźnienie 5 minut = 5*60*1000 ms

lcd.clear();

} //zakończ główną pętlę

void displayTemperature (Adres urządzenia deviceAddress)

{

float tempC = sensors.getTempC(adres urządzenia);

if (tempC == -127.00) lcd.print("Błąd temperatury");

w przeciwnym razie Ciąg danych2 = Ciąg(tempC);

}//kod kończy się tutaj

  • Wybierz odpowiedni port COM przez Arduino IDE w menu Narzędzia/Port
  • Wybierz odpowiednią płytkę Arduino. Użyłem Mega 2560, ponieważ ma więcej pamięci wewnętrznej. Arduino Nano lub Uno działa dobrze z tą konfiguracją.
  • Sprawdź i zakoduj i prześlij kod

Krok 7: Wyniki dotyczące okablowania (można poprawić) i wyświetlacza LCD

Wyniki dotyczące okablowania (można poprawić) i wyświetlacza LCD
Wyniki dotyczące okablowania (można poprawić) i wyświetlacza LCD
Wyniki dotyczące okablowania (można poprawić) i wyświetlacza LCD
Wyniki dotyczące okablowania (można poprawić) i wyświetlacza LCD
Wyniki dotyczące okablowania (można poprawić) i wyświetlacza LCD
Wyniki dotyczące okablowania (można poprawić) i wyświetlacza LCD
Wyniki dotyczące okablowania (można poprawić) i wyświetlacza LCD
Wyniki dotyczące okablowania (można poprawić) i wyświetlacza LCD
  • Uwaga: Z szumem od sondy DO do sondy pH spotkałem się po 2-3 miesiącach ciągłej pracy. Według Atlas Scientific, wbudowany izolator napięcia jest zalecany, gdy sondy pH i przewodności pracują razem. Więcej szczegółów na stronie 9 (https://goo.gl/d62Rqv)
  • Zarejestrowane dane (pierwszy ma niezadrukowane znaki przed danymi pH i DO). Przefiltrowałem do kodu, zezwalając tylko na znaki drukowane.

Krok 8: Importuj dane i stwórz wykres

Importuj dane i stwórz wykres
Importuj dane i stwórz wykres
Importuj dane i stwórz wykres
Importuj dane i stwórz wykres
Importuj dane i stwórz wykres
Importuj dane i stwórz wykres
  1. Importuj dane z tekstu pod zakładką DANE (Excel 2013)
  2. Oddziel dane przecinkiem (dlatego pomocne jest stosowanie przecinków po każdym wprowadzeniu danych)
  3. Wykreśl dane. Każda z poniższych danych ma około 1700 punktów. Interwał pomiaru wynosi 5 minut (regulowany). Minimalny czas odczytu danych dla obwodów DO i pH wynosi 1,8 s.

Krok 9: Kalibracja

Kalibrowanie
Kalibrowanie
  1. Cyfrowy czujnik temperatury (18B20) można skalibrować, dostosowując różnicę bezpośrednio do. W przeciwnym razie, jeśli kompensacja i nachylenie wymagają kalibracji, można to zrobić, zmieniając wartości w wierszu #453, DallasTemperature.cpp w folderze \libraries\DallasTemperature.
  2. W przypadku sond pH i DO można kalibrować sondy za pomocą dołączonych roztworów. Musisz skorzystać z przykładowego kodu firmy Atlas Scientific i postępować zgodnie z instrukcjami zawartymi w tym pliku.
  3. Proszę postępować zgodnie ze stronami 26 i 50 dla sondy pH (https://goo.gl/d62Rqv) dla kalibracji i kompensacji temperatury, a także ze stron 7-8 i 50 dla sondy DO (https://goo.gl/mA32mp). Najpierw prześlij ponownie ogólny kod dostarczony przez Atlas, otwórz Serial Monitor i wprowadź odpowiednie polecenie.

Krok 10: Za dużo okablowania?

  1. Możesz wyeliminować kartę SD i moduł zegara czasu rzeczywistego za pomocą Dragino Yun Shield dla płyt Arduino (https://goo.gl/J9PBTH). Kod musiał zostać zmodyfikowany, aby działał z Yun Shield. Oto dobre miejsce do rozpoczęcia (https://goo.gl/c1x8Dm)
  2. Wciąż za dużo okablowania: Atlas Scientific stworzył przewodnik dla swoich obwodów EZO (https://goo.gl/dGyb12) i płytki bez lutowania (https://goo.gl/uWF51n). Integracja cyfrowej temperatury 18B20 jest tutaj (https://goo.gl/ATcnGd). Musisz znać polecenia Raspbian (wersja systemu Debian Linux) działające na Raspberry Pi (https://goo.gl/549xvk)

Krok 11: Potwierdzenie:

Jest to mój projekt poboczny w trakcie moich badań podoktorskich, nad którym pracowałem nad zaawansowanym fotobioreaktorem do hodowli mikroalg. Pomyślałem więc, że konieczne jest uznanie, że strony zapewniły warunki, aby tak się stało. Po pierwsze, grant, DE-EE0007093: „Atmospheric CO2 Enrichment and Delivery (ACED)” od Departamentu Energii Stanów Zjednoczonych, Biura ds. Efektywności Energetycznej i Energii Odnawialnej Ukierunkowane na Algalowe Biopaliwa i Bioprodukty. Dziękuję dr Bruce'owi E. Rittmannowi z Biodesign Swette Center for Environmental Biotechnology, Arizona State University za umożliwienie mi majstrowania przy elektronice i Arduino. Szkoliłem się w inżynierii środowiska, głównie chemii, trochę mikrobiologii.

Zalecana: