wtorek, 15 września 2015

[I] Arduino - Projekt - Dwukanałowy czujnik temperatury z zapisem danych

W tym poście zamierzam opisać projekt trój kanałowego czujnika temperatury z zapisem danych na kartę SD oraz prezentacją danych na wyświetlaczu.

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.
Rys. 1.1. Potrzebne elementy [1]

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