Witam,
Nazywam się Rafał i chciałbym przedstawić projekt termometru z wyświetlaczem LCD z użyciem konwertera I2C. Przygodę z Arduino zacząłem niedawno a to jest mój pierwszy artykuł, więc proszę o wyrozumiałość.
Co nam będzie potrzebne:
– Arduino, w moim przypadku Uno
Od czego zacząć?
Ściągamy i instalujemy wszystkie potrzebne biblioteki:
- OneWire
- DS18B20
- LiquidCrystal_I2C
Teraz czas złożyć nasz układ:
Następnie musimy sprawdzić adres konwertera I2C pod jakim widnieje nasze urządzenie->kopiujemy kod wgrywamy do naszego Arduino, w serial monitorze powinien ukazać się nasz numer(np. 0x27). Kopiujemy odczytany adres gdyż będzie potrzebny w dalszym sketchu.
Kolejnym krokiem będzie odczyt numeru seryjnego naszego czujnika, skorzystamy z gotowego sketcha który jest dostępny po wgraniu bibliotek. Dostępny jest on w Plik->Przykłady->DS18B20->search_ds18b20_addresses , jeżeli wszystko jest poprawnie podłączone, po wgraniu szkicu i uruchomieniu serial monitora powinniśmy zobacz nasz unikalny adres. Kopiujemy odczytany adres gdyż będzie potrzebny w dalszym sketchu.
Wgrywanie sketcha
Aby na wyświetlaczu zobaczyć aktualną temperaturę wgrywamy następujący szkic, pamiętając o podmianie adresu czujnika oraz adresu konwertera.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
#include <OneWire.h> #include <DS18B20.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> #define BACKLIGHT_PIN 3 #define ONEWIRE_PIN 2// Numer pinu do którego podłaczasz czujnik w Arduino float temperature = 0; byte address[8] = {0x28, 0x8F, 0x59, 0xBF, 0x6, 0x0, 0x0, 0x6C};// Numer seryjny czujnika LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7);// Adres konwertera OneWire onewire(ONEWIRE_PIN); DS18B20 sensors(&onewire); void setup(void) { Serial.begin(9600); sensors.begin(); sensors.request(address); lcd.begin(16,2); lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE); lcd.setBacklight(HIGH); lcd.setCursor(0,0); // Ustawienie kursora w pozycji 0,0 (pierwszy wiersz, pierwsza kolumna) lcd.print("temp: "); } void loop(void) { temperature = sensors.readTemperature(address); sensors.request(address); lcd.clear(); lcd.setCursor(0,0); // Ustawienie kursora w pozycji 0,0 (pierwszy wiersz, pierwsza kolumna) lcd.print("Temp: "); lcd.setCursor(6, 0); lcd.print(temperature); lcd.setCursor(12,0); lcd.print("*C"); delay(1000); } |
Gotowe!
Myślę, że poradnik się przyda :D
Poradnik Extra !!!
Dzięki ;)
na LM na rysunku który nie jest DS18 – to nie zadziałało – po co wprowadzać w błąd ?
Plik->Przykłady->DS18B20->search_ds18b20_addresses takiego czegoś w IDE 1.8 nie ma
zatem adresu ds1820 nie będzie i całość tego nielogicznego konstruktu nie działa. strata czasu.
Wszystko wytłumaczone i czytelne, tylko na baterii 9v długo nie podziała, a ds18b20 był x razy na majsterkowie już :)
Super!!. Poleciała 5-teczka…. :-)
Dzięki :-)
Dodałbym jeszcze wyświetlanie minimalnej i maksymalnej temperatury :)
Można, ale nie posiadam większego wyświetlacza :)
Na 16×2 na dolnej linijce bez problemu też da się to zmieścić, tylko nie tak szczegołowo opisane i bez *C :)
Jak się popieści, to się wszystko zmieści :)
może kiedyś dodam ;)
Jakiś poradnik jak zrobic temp min i max?
może kiedyś
co może być nie tak ?
Może dodatkowe znaczki przy definicji BACKLIGHT_PIN i ONEWIRE_PIN. Albo brak spacji w tych liniach
znaczki zlikwidowałem ale dalej mam problem… ;-(
jak ew. jeszcze zmodyfikować kod aby podłączyć cztery czujniki ?
Witam! mozecie mi pomoc na czym moze polegac ten blad?
sketch_may11b:13: error: no matching function for call to ‘LiquidCrystal_I2C::LiquidCrystal_I2C(int, int, int, int, int, int, int, int)’
LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7);// Adres konwertera
^
C:\Users\pc\Documents\Arduino\sketch_may11b\sketch_may11b.ino:13:41: note: candidates are:
In file included from C:\Users\pc\Documents\Arduino\sketch_may11b\sketch_may11b.ino:3:0:
C:\Program Files (x86)\Arduino\libraries\LiquidCrystal_I2C/LiquidCrystal_I2C.h:57:3: note: LiquidCrystal_I2C::LiquidCrystal_I2C(uint8_t, uint8_t, uint8_t)
LiquidCrystal_I2C(uint8_t lcd_Addr,uint8_t lcd_cols,uint8_t lcd_rows);
^
C:\Program Files (x86)\Arduino\libraries\LiquidCrystal_I2C/LiquidCrystal_I2C.h:57:3: note: candidate expects 3 arguments, 8 provided
C:\Program Files (x86)\Arduino\libraries\LiquidCrystal_I2C/LiquidCrystal_I2C.h:55:7: note: constexpr LiquidCrystal_I2C::LiquidCrystal_I2C(const LiquidCrystal_I2C&)
class LiquidCrystal_I2C : public Print {
^
C:\Program Files (x86)\Arduino\libraries\LiquidCrystal_I2C/LiquidCrystal_I2C.h:55:7: note: candidate expects 1 argument, 8 provided
C:\Program Files (x86)\Arduino\libraries\LiquidCrystal_I2C/LiquidCrystal_I2C.h:55:7: note: constexpr LiquidCrystal_I2C::LiquidCrystal_I2C(LiquidCrystal_I2C&&)
C:\Program Files (x86)\Arduino\libraries\LiquidCrystal_I2C/LiquidCrystal_I2C.h:55:7: note: candidate expects 1 argument, 8 provided
sketch_may11b:15: error: ‘ONEWIRE_PIN’ was not declared in this scope
OneWire onewire(ONEWIRE_PIN);
^
C:\Users\pc\Documents\Arduino\sketch_may11b\sketch_may11b.ino: In function ‘void setup()’:
sketch_may11b:25: error: ‘class LiquidCrystal_I2C’ has no member named ‘setBacklightPin’
lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
^
sketch_may11b:25: error: ‘BACKLIGHT_PIN’ was not declared in this scope
lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
^
sketch_may11b:25: error: ‘POSITIVE’ was not declared in this scope
lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
^
exit status 1
no matching function for call to ‘LiquidCrystal_I2C::LiquidCrystal_I2C(int, int, int, int, int, int, int, int)’
Ten program jest tak napisany, że co druga linia jest niepoprawna.
Mam takie błędy:
sketch_may28a:12: error: expected ‘,’ or ‘;’ before ‘byte’
byte adress[8] = {0x28, 0xFF, 0x17, 0x4C, 0xA3, 0x15, 0x4, 0xF7};
^
sketch_may28a:14: error: no matching function for call to ‘LiquidCrystal_I2C::LiquidCrystal_I2C(int, int, int, int, int, int, int, int)’
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7);
^
C:\Users\Kamil\AppData\Local\Temp\arduino_modified_sketch_635086\sketch_may28a.ino:14:48: note: candidates are:
In file included from C:\Users\Kamil\AppData\Local\Temp\arduino_modified_sketch_635086\sketch_may28a.ino:4:0:
C:\Program Files (x86)\Arduino\libraries\LiquidCrystal_I2C/LiquidCrystal_I2C.h:59:3: note: LiquidCrystal_I2C::LiquidCrystal_I2C(uint8_t, uint8_t, uint8_t)
LiquidCrystal_I2C(uint8_t lcd_Addr,uint8_t lcd_cols,uint8_t lcd_rows);
^
C:\Program Files (x86)\Arduino\libraries\LiquidCrystal_I2C/LiquidCrystal_I2C.h:59:3: note: candidate expects 3 arguments, 8 provided
C:\Program Files (x86)\Arduino\libraries\LiquidCrystal_I2C/LiquidCrystal_I2C.h:57:7: note: constexpr LiquidCrystal_I2C::LiquidCrystal_I2C(const LiquidCrystal_I2C&)
class LiquidCrystal_I2C : public Print {
^
C:\Program Files (x86)\Arduino\libraries\LiquidCrystal_I2C/LiquidCrystal_I2C.h:57:7: note: candidate expects 1 argument, 8 provided
C:\Program Files (x86)\Arduino\libraries\LiquidCrystal_I2C/LiquidCrystal_I2C.h:57:7: note: constexpr LiquidCrystal_I2C::LiquidCrystal_I2C(LiquidCrystal_I2C&&)
C:\Program Files (x86)\Arduino\libraries\LiquidCrystal_I2C/LiquidCrystal_I2C.h:57:7: note: candidate expects 1 argument, 8 provided
C:\Users\Kamil\AppData\Local\Temp\arduino_modified_sketch_635086\sketch_may28a.ino: In function ‘void setup()’:
sketch_may28a:23: error: ‘adress’ was not declared in this scope
sensors.request(adress);
^
sketch_may28a:26: error: ‘class LiquidCrystal_I2C’ has no member named ‘setBacklightPin’
lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
^
sketch_may28a:26: error: ‘POSITIVE’ was not declared in this scope
lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
^
C:\Users\Kamil\AppData\Local\Temp\arduino_modified_sketch_635086\sketch_may28a.ino: In function ‘void loop()’:
sketch_may28a:34: error: ‘adress’ was not declared in this scope
temperature = sensors.readTemperature(adress);
^
C:\Users\Kamil\AppData\Local\Temp\arduino_modified_sketch_635086\sketch_may28a.ino: At global scope:
sketch_may28a:46: error: expected declaration before ‘}’ token
}
^
exit status 1
expected ‘,’ or ‘;’ before ‘byte’
Dlaczego musi być taki rezystor?
4,7 kOma?
To wynika z właściwości transmisji 1Wire. Normalnie na linii danych jest stan beznapięciowy, który jest zwierany do GND. Bez tego rezystora nie da się określić, czy na linii danych jest stan niski czy wysoki.
Mam nadzieję, że nie namieszałem.
Marhef mówi dobrze :)
Druga sprawa to, że wartość tegoż rezystora wynika wprost z dokumentacji DS.
Oczywiście można dać większy rezystor ale wtedy na linii źle rozpoznawane może być zero logiczne,
a przy większej ilości DS-ów zaczną się dziać różnego rodzaju “krzaki”.
Ogólnie zasada jest taka, że na krótkie odległości zalecane jest stosowanie rezystora podciągającego o wartości
to interesuje to polecam zajrzeć do jakieś literatury i rozwiać wszelkie wątpliwości :)
4,7K Ohm