poniedziałek, 18 stycznia 2016

[|||] Projekt Arduino - Termometr cyfrowy z alarmem

Tym razem chciałbym przedstawić szybki projekt cyfrowego termometru z alarmem opartego na Arduino Uno.

Wstęp


Do wykonani opisanego układu wykorzystałem.

  • Arduino Uno;
  • Buzzer FY248 32mm;
  • Wyświetlacz 2x16 ze sterownikiem HD44780 oraz konwerterem I2C,
  • Cyfrowy termometr DS18B20;
  • Dwa potencjometry


Podłączenie


Schemat podłączenia przedstawiłem na poniższym rysunku. Został on opracowany w programie Fritzig.


Rys. 1.2. Podłączenie

Program


Zasada działania programu jest dosyć prosta. Buzzer zacznie piszczeć, kiedy zostanie przekroczona dolna lub górna granica wartości ustawionej temperatury.

Ustawianie wartości granicznych wykonuje się za pomocą potencjometrów, które zostały podłączone do pinów analogowych, następnie wartości odczytane zostały przetworzone na wartości graniczne temperatur. Tą operacje wykonuje się poprzez wykorzystanie funkcji map(). 

Wygląda ona następująco:

  1. Minimum = map(wartosc, poczatek, koniec, wartoscdolna, wartoscgorna);

W programie przyjmuje ona postać zaprezentowaną poniżej:

  1. Minimum = map(analogRead(0), 0, 1023, -40, 90);
  2. Maximum = map(analogRead(1), 0, 1023, -40, 90);

Poniżej przedstawiam cały plik programu:

  1. #include <OneWire.h>
  2. #include <DallasTemperature.h>
  3. #include <Wire.h>
  4. #include <LiquidCrystal_I2C.h>
  5.  
  6. #define ONE_WIRE_BUS 2          //Linia danych podpięta jest pod pin 2 Ardiuno
  7. #define AlarmPin 10
  8. OneWire oneWire(ONE_WIRE_BUS);
  9.  
  10. LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Ustawienie adresu ukladu na 0x27
  11.  
  12. DallasTemperature sensors(&oneWire);  //Przekazanie danych dotyczących One Wire do DallasTemperature
  13.  
  14. //deklaracja zmiennych
  15. float Temperatura=0;
  16. int Maximum=0;
  17. int Minimum=0;
  18.  
  19. void setup(void)
  20. {
  21.   lcd.begin(16,2);      //Definicja wyswietlacza
  22.   lcd.backlight();      //Zalaczenie podwietlenia
  23.   sensors.begin();      //Włączenie biblioteki
  24.   pinMode(AlarmPin, OUTPUT); //deklaracjapinualarmu
  25. }
  26.  
  27. void loop(void)
  28. {
  29.   //wyslanie komend do czujnika
  30.   sensors.requestTemperatures();
  31.   //wypisanie wartosci temperatury na ekranie
  32.   lcd.setCursor(0,0);
  33.   lcd.print("Temp1:");
  34.   lcd.setCursor(6,0);
  35.   Temperatura = sensors.getTempCByIndex(0);
  36.   lcd.print(Temperatura);
  37.  
  38.   //Odczytanie dolnej wartosci
  39.   Minimum = map(analogRead(0), 0, 1023, -40, 90);
  40.   lcd.setCursor(13,0);
  41.   lcd.print(Minimum);
  42.   lcd.print(" ");
  43.  
  44.   //Odczytanie gornej wartosci
  45.   Maximum = map(analogRead(1), 0, 1023, -40, 90);
  46.   lcd.setCursor(13,1);
  47.   lcd.print(Maximum);
  48.   lcd.print(" ");
  49.  
  50.   if(Minimum >= Maximum)
  51.   {
  52.     Minimum = Maximum - 1;
  53.   }
  54.  
  55.   //Sprawdzenie wartosci czy miesci sie w przedziale
  56.   if(Temperatura < Minimum || Temperatura > Maximum)
  57.   {
  58.       lcd.setCursor(0, 1);
  59.       lcd.print("ALARM!");
  60.       digitalWrite(AlarmPin, HIGH);
  61.   }
  62.   else
  63.   {
  64.       digitalWrite(AlarmPin, LOW);
  65.       lcd.setCursor(0, 1);
  66.       lcd.print("      ");
  67.   }
  68. }