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.
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:
- Minimum = map(wartosc, poczatek, koniec, wartoscdolna, wartoscgorna);
W programie przyjmuje ona postać zaprezentowaną poniżej:
- Minimum = map(analogRead(0), 0, 1023, -40, 90);
- Maximum = map(analogRead(1), 0, 1023, -40, 90);
- #include <OneWire.h>
- #include <DallasTemperature.h>
- #include <Wire.h>
- #include <LiquidCrystal_I2C.h>
- #define ONE_WIRE_BUS 2 //Linia danych podpięta jest pod pin 2 Ardiuno
- #define AlarmPin 10
- OneWire oneWire(ONE_WIRE_BUS);
- LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Ustawienie adresu ukladu na 0x27
- DallasTemperature sensors(&oneWire); //Przekazanie danych dotyczących One Wire do DallasTemperature
- //deklaracja zmiennych
- float Temperatura=0;
- int Maximum=0;
- int Minimum=0;
- void setup(void)
- {
- lcd.begin(16,2); //Definicja wyswietlacza
- lcd.backlight(); //Zalaczenie podwietlenia
- sensors.begin(); //Włączenie biblioteki
- pinMode(AlarmPin, OUTPUT); //deklaracjapinualarmu
- }
- void loop(void)
- {
- //wyslanie komend do czujnika
- sensors.requestTemperatures();
- //wypisanie wartosci temperatury na ekranie
- lcd.setCursor(0,0);
- lcd.print("Temp1:");
- lcd.setCursor(6,0);
- Temperatura = sensors.getTempCByIndex(0);
- lcd.print(Temperatura);
- //Odczytanie dolnej wartosci
- Minimum = map(analogRead(0), 0, 1023, -40, 90);
- lcd.setCursor(13,0);
- lcd.print(Minimum);
- lcd.print(" ");
- //Odczytanie gornej wartosci
- Maximum = map(analogRead(1), 0, 1023, -40, 90);
- lcd.setCursor(13,1);
- lcd.print(Maximum);
- lcd.print(" ");
- if(Minimum >= Maximum)
- {
- Minimum = Maximum - 1;
- }
- //Sprawdzenie wartosci czy miesci sie w przedziale
- if(Temperatura < Minimum || Temperatura > Maximum)
- {
- lcd.setCursor(0, 1);
- lcd.print("ALARM!");
- digitalWrite(AlarmPin, HIGH);
- }
- else
- {
- digitalWrite(AlarmPin, LOW);
- lcd.setCursor(0, 1);
- lcd.print(" ");
- }
- }