Spisu treści:
- Krok 1:
- Krok 2: Kup części poniżej:
- Krok 3: Okablowanie
- Krok 4: Przygotuj obwody PH, DO, kartę SD
- Krok 5: Przygotuj oprogramowanie
- Krok 6: Rozpocznij kodowanie
- Krok 7: Wyniki dotyczące okablowania (można poprawić) i wyświetlacza LCD
- Krok 8: Importuj dane i stwórz wykres
- Krok 9: Kalibracja
- Krok 10: Za dużo okablowania?
- Krok 11: Potwierdzenie:
Wideo: Jak zrobić rejestrator danych dla temperatury, PH i rozpuszczonego tlenu: 11 kroków (ze zdjęciami)
2024 Autor: John Day | [email protected]. Ostatnio zmodyfikowany: 2024-01-30 11:31
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:
- Arduino MEGA 2560, 35 USD,
- Zasilacz do płytki Arduino, $5.98,
- Moduł LCD I2C (wyświetlacz), 8,99 USD,
- Przebicie zegara czasu rzeczywistego (RTC), 7,5 USD,
- Płytka stykowa karty microSD, 7,5 USD,
- Karta SD 4 GB, 6,98 USD,
- Wodoodporny czujnik cyfrowy DS18B20, 9,95 USD,
- Sonda pH + zestawy + bufory standardowe, 149,15 USD,
- Sonda DO + zestawy + bufory standardowe, 247,45 USD,
- Płytka do krojenia chleba, kabel połączeniowy, 7,98 USD,
- (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
- 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
- Przełącz na I2C dla obwodów pH i DO
- 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,
- Zrób ten sam krok z obwodem DO
- (jeśli wiesz, jak wgrać przykładowy kod na płytkę, możesz to zrobić przez monitor szeregowy)
- Sformatuj kartę SD do formatu FAT
Krok 5: Przygotuj oprogramowanie
- Pobierz zintegrowane środowisko programistyczne Arduino (IDE),
- Zainstaluj bibliotekę w Arduino IDE:
- Większość z nich jest dostarczana z oprogramowaniem Arduino. LiquidCrystal_I2C.h jest dostępny na GitHub
- Zainstaluj sterownik USB. W przypadku oryginalnego Arduino może nie być konieczne jego instalowanie. Aby uzyskać ogólny, musisz zainstalować sterownik CH340 (GitHub:
- Sprawdź, czy prawidłowo podłączasz płytkę, uruchamiając test migającej diody LED
- 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
- 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
- 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 z tekstu pod zakładką DANE (Excel 2013)
- Oddziel dane przecinkiem (dlatego pomocne jest stosowanie przecinków po każdym wprowadzeniu danych)
- 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
- 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.
- 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.
- 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?
- 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)
- 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:
KALIBRACJA CZUJNIKA TLENU ROZPUSZCZONEGO ARDUINO: 4 kroki
KALIBRACJA CZUJNIKA ROZPUSZCZONEGO TLENU ARDUINO: W tym samouczku kalibrujemy czujnik EZO rozpuszczonego tlenu (D.O) firmy Atlas Scientific za pomocą Arduino Uno. TEORIA KALIBRACJI Najważniejszą częścią kalibracji jest obserwowanie odczytów podczas procesu kalibracji. Najłatwiej jest skalibrować
Rejestrator danych GPS Cap: 7 kroków (ze zdjęciami)
Rejestrator danych GPS Cap: Oto świetny projekt weekendowy, jeśli lubisz trekking lub długie przejażdżki rowerowe i potrzebujesz rejestratora danych GPS, aby śledzić wszystkie odbyte wędrówki / przejażdżki … Po zakończeniu budowy i pobrali dane z modułu GPS tr
Jak zrobić rejestrator danych wilgotności i temperatury w czasie rzeczywistym za pomocą Arduino UNO i karty SD - Symulacja rejestratora danych DHT11 w Proteus: 5 kroków
Jak zrobić rejestrator danych wilgotności i temperatury w czasie rzeczywistym za pomocą Arduino UNO i karty SD | Symulacja rejestratora danych DHT11 w Proteus: Wstęp: cześć, tu Liono Maker, tutaj link do YouTube. Tworzymy kreatywne projekty z Arduino i pracujemy na systemach wbudowanych.Data-Logger: Rejestrator danych (również rejestrator danych lub rejestrator danych) to urządzenie elektroniczne, które rejestruje dane w czasie w
Zrób to sam rejestrator danych GPS dla ciebie Następna jazda / szlak pieszy: 11 kroków (ze zdjęciami)
DIY GPS Data Logger for You Next Drive/Hike Trail: Jest to rejestrator danych GPS, którego można używać do wielu celów, na przykład, jeśli chcesz zarejestrować długą jazdę, którą przejechałeś w weekend, aby sprawdzić kolory jesieni. lub masz ulubiony szlak, który odwiedzasz jesienią każdego roku i
Bezprzewodowy rejestrator danych GPS dla dzikiej przyrody: 9 kroków (ze zdjęciami)
Bezprzewodowy rejestrator danych GPS dla dzikiej przyrody: W tej instrukcji pokażemy, jak zrobić mały i niedrogi rejestrator danych GPS oparty na Arduino, z możliwością łączności bezprzewodowej! Wykorzystanie telemetrii do badania ruchu dzikich zwierząt może być bardzo ważnym narzędziem dla biologów. Może powiedzieć, gdzie