Wstęp
W moim projekcie posłużyłem się takimi modułami jak:
- 1x Arduino Uno;
- 3x Czujnik temperatury DS18B20;
- 1x LCD 2x16 z konwerterem I2C LCM1602;
- 1x Moduł czytnika kart SD, komunikacja przez SPI;
- 1x Karta microSD. W moim przypadku była to karta micro SD 2Gb sformatowana w systemie plików FAT32. Do tego dołączony był adapter na kartę SD.
Podłączenie
Podłączenie zostało wykonane w następujący sposób:
Wyświetlacz LCD:
- VCC - 5V;
- GND - GND;
- SCL - A5;
- SDA - A4;
Moduł kart SD:
- GND - GND;
- MISO - Pin 12;
- SCK - Pin 13;
- MOSI - Pin 11;
- SDCS - Pin 10 SS;
- 5V - 5V;
- 3.3V - NC;
- GND - NC;
Termometry cyfrowe DS18B20:
- VCC - 5V;
- DQ - Pin 2;
- GND - GND;
Na rysunku 1.2. przedstawiono schemat podłączenia całego układu. Na rysunku brakuje jedynie wyświetlacza, jednak jego podłączenie nie powinno sprawić jakichkolwiek problemów.
Rys. 1.2. Podłączenie modułów do Arduino Uno
Program
W na początku zawarto deklarację wszystkich wymaganych bibliotek oraz deklaracje pinów czujników oraz wyświetlacza.
Funkcja setup zawiera inicjalizację wszystkich modułów. Poszczególne zapisania do plików i prezentację wyników na wyświetlaczu zrealizowałem w pętli loop.
#include <SD.h> #include <SPI.h> #include <OneWire.h> #include <Wire.h> #include <DallasTemperature.h> #include <LiquidCrystal_I2C.h> //Linia danych podpięta jest pod pin 2 Ardiuno #define ONE_WIRE_BUS 2 LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); OneWire oneWire(ONE_WIRE_BUS); //Nazwa pliku File myFile; DallasTemperature sensors(&oneWire); void setup() { //Inicjalizacja wyświetlacza, ilość kolumn (16), ilość wierszy (2) lcd.begin(16,2); //Włączenie podświetlania lcd.backlight(); lcd.setCursor(0,0); //Ustawienie kursora w pozycji 0,0 lcd.print("Inicjalizacja karty SD"); //Wyświetlenie stringa na wyswietlaczu pinMode(10, OUTPUT); //Nawet jeśli jest nie używany to pin SS (10 Arduino Uno) //musi być zostawiony jako wyjście delay(200); lcd.clear(); //Wyczyszczenie wyswietlacza //Sprawdzanie czy inicjalizacja została zrobiona, //jeśli nie to wyświetl dane w pętli if (!SD.begin(10)) { lcd.setCursor(0,0); lcd.print("Inic. nieudana"); return; } lcd.print("Inic. poprawna"); delay(1000); lcd.clear(); //Otwórz plik, tylko jedne plik może być otwarty w danym momencie //trzeba zamknąć każdy otwarty przed otwarciem następnego myFile = SD.open("test.txt", FILE_WRITE); //trzeba zamknąć każdy otwarty przed otwarciem następnego if (myFile) //Jeśli plik się otworzył to zapisz do niego następujące dane { myFile.println("Wykaz temperatury czujnikow DS18B20"); //Wpisz stringa do pliku myFile.close(); //Zamknięcie pliku //Serial.println(" Dane wpisane"); } else { lcd.setCursor(0,0); lcd.print("Blad otwarcia pliku"); //Jeśli plik się nie otworzy wyświetl błąd Serial.println("Blad otwarcia pliku test.txt"); } delay(300); lcd.clear(); lcd.setCursor(0,0); lcd.print("Temp wynosi: "); sensors.begin(); delay(1000); lcd.clear(); } void loop() { float T1; float T2; static int a=0; //Wysłanie komendy do pobrania temperatury sensors.requestTemperatures(); T1 = sensors.getTempCByIndex(0); T2 = sensors.getTempCByIndex(1); lcd.setCursor(0,0); lcd.print(a); lcd.setCursor(4,0); lcd.print("T1:"); lcd.setCursor(7,0); lcd.print(T1); lcd.setCursor(13,0); lcd.print("C"); lcd.setCursor(0,1); lcd.print(a); lcd.setCursor(4,1); lcd.print("T2:"); lcd.setCursor(7,1); lcd.print(T2); lcd.setCursor(13,1); lcd.print("C"); a++; delay(300); //Następuje otwarcie pliku o zadanej nazwie, z zainicjalizowaną funckją zapisu myFile = SD.open("test.txt", FILE_WRITE); //Jeśli plik się otworzył to zapisz do niego następujące dane if (myFile) { myFile.print(a); myFile.print(" : Temp 1: "); myFile.print(T1); myFile.println(" st. C"); delay(300); myFile.print(a); myFile.print(" : Temp 2: "); myFile.print(T2); myFile.println(" st. C"); //Zamknięcie pliku myFile.close(); } else { lcd.setCursor(14,1); //Jeśli plik się nie otworzy wyświetl błąd: lcd.print("B"); } delay(800); }
Rys. 1.3. Prezentacja danych
Rys. 1.4. Wygląd zewnętrzny podłączonych modułów
Bibliografia
[1] www.bootland.com.pl