DeryKwiat Napisano Maj 11, 2020 Udostępnij Napisano Maj 11, 2020 Postanowiłem odzwierciedlić wskazanie temperatury ( Funkcja termometrRGB() - II części kursu )na wyświetlaczu LCD zaopatrzonego w adapter I2C. niestety pomiar przestaje działać. Próbowałem eliminować ewentualne zakłócenia ale nic to nie dało. W programie wystarczy pominąć linie dotyczące lcd i wszystko działa . Ma ktoś pomysł w czym problem ? #include <Adafruit_NeoPixel.h> //Dołączenie biblioteki #include <OneWire.h> #include <DallasTemperature.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27,16,2); // ustawia adres LCD na 0x27 16 znaków 2 linie //Konfiguracja linijki Adafruit_NeoPixel linijka = Adafruit_NeoPixel(8, A0, NEO_GRB + NEO_KHZ800); OneWire oneWire(A5); //Podłączenie do A5 DallasTemperature sensors(&oneWire); //Przekazania informacji do biblioteki DeviceAddress termometrZewnetrzny = {0x28,0xFF,0xEB,0x31,0x50,0x19,0x01,0x5E}; void setup(void) { Serial.begin(9600); sensors.begin(); //Inicjalizacja czujnikow linijka.begin(); //Inicjalizacja lcd.init(); // inicjalizacja LCD lcd.clear(); } void loop(void) { lcd.clear(); sensors.requestTemperatures(); //Pobranie temperatury czujnika Serial.print("Aktualna temp : "); Serial.println(sensors.getTempC(termometrZewnetrzny)); //Wyswietlenie informacji lcd.setCursor(0,0); //Ustawienie kursora lcd.print("Aktualna temp. : "); lcd.setCursor(0,1); //Ustawienie kursora lcd.print(sensors.getTempC(termometrZewnetrzny)); int tempLinijka = sensors.getTempC(termometrZewnetrzny); termometrRGB(tempLinijka); delay(500); } void termometrRGB(int temperatura) { //Sprawdzamy, czy temperatura jest w odpowiednim zakresie if (temperatura > 40) { temperatura = 40; } else if (temperatura < -40) { temperatura = -40; } linijka.clear(); //Wyczysc linijkę if (temperatura >= 0) { //Dla wartosci dodatnich temperatura = map(temperatura, 0, 40, 1, 8); int i = 0; for (i = 0; i < temperatura; i++) { linijka.setPixelColor(i, linijka.Color(55, 0, 0)); //Dioda nr i świeci na czerwono } } else { //Dla wartosci ujemnych temperatura = map(temperatura, -40, 0, 1, 8); int i = 0; for (i = 8; i > temperatura; i--) { linijka.setPixelColor(i, linijka.Color(0, 0, 155)); //Dioda nr i świeci na niebiesko } } linijka.show(); } Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Maj 11, 2020 Udostępnij Maj 11, 2020 Masz podłączony termometr do tego samego pinu (A5) co LCD - więc nie ma prawa działać. Pamiętaj, że piny I2C to w rzeczywistości A4 i A5 i jeśli tego używasz - nie możesz tam podłączać nic innego. 2 Cytuj Link do komentarza Share on other sites More sharing options...
DeryKwiat Maj 11, 2020 Autor tematu Udostępnij Maj 11, 2020 Dzięki za pomoc tego nie wiedziałem. Cytuj Link do komentarza Share on other sites More sharing options...
EMMB Maj 31, 2021 Udostępnij Maj 31, 2021 Witam... Posiadam Arduino Uno i właśnie próbuję rozwiązać ten sam problem. Jest możliwość podłączenia I2C adaptera LCD i cyfrowego czujnika temperatury DS18B20 jednocześnie do Arduino Uno? Pozdrawiam... Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Produkcja i montaż PCB - wybierz sprawdzone PCBWay! • Darmowe płytki dla studentów i projektów non-profit • Tylko 5$ za 10 prototypów PCB w 24 godziny • Usługa projektowania PCB na zlecenie • Montaż PCB od 30$ + bezpłatna dostawa i szablony • Darmowe narzędzie do podglądu plików Gerber Zobacz również » Film z fabryki PCBWay
EMMB Czerwiec 1, 2021 Udostępnij Czerwiec 1, 2021 (edytowany) Witam ponownie... Widziałem filmik na YT, gdzie było pokazane, że można połączyć adapter I2C i DS18B20. Na filmiku wszystko działało, a u mnie nie😦, choć nie jestem pewien czy było to Uno. Wydaje się, że się da, wiec postanowiłem uporządkować myśli i podrążyć temat. Po podłączeniu czujnika pod pin A5 i skopiowaniu kodu z "Kurs Arduino II – #7 – termometry analogowe i cyfrowe", w monitorze portu wyświetla się temperatura. Jednak gdy do kodu dołączę uruchomienie wyświetlacza (z I2C), pomiar znika. Szukając przyczyny, natrafiłem na powyższy post: Dnia 11.05.2020 o 17:49, ethanak napisał: Masz podłączony termometr do tego samego pinu (A5) co LCD - więc nie ma prawa działać. Pamiętaj, że piny I2C to w rzeczywistości A4 i A5 i jeśli tego używasz - nie możesz tam podłączać nic innego. Więc skoro pomiar działa mi tylko na pinie do którego jest podpięty wyświetlacz, to pomyślałem, że po prostu nie można podłączyć tych dwóch urządzeń jednocześnie do Uno i napisałem powyższy post z założeniem, że ktoś, kto się na tym zna potwierdzi moje przypuszczenia i napisze, że nie można jednocześnie podłączyć tego razem pod Uno. Nikt jednak nie potwierdził moich przypuszczeń, więc szukałem dalej i trafiłem na wspomniany wcześniej filmik na którym to działało. Niestety sam chyba sobie nie poradzę, więc proszę o małe wsparcie🥺. Czujnik wykrywa mi tylko na A5 i A4, pomyślałem więc (przypuszczam, że błędnie), że czujnik należy podłączyć pod wejście analogowe. Tu rodzi się moje pierwsze pytanie: Pod jakie piny podpinać czujnik? Analogowe, cyfrowe, czy nie ma to znaczenia? Mi wykrywa go tylko chyba na tych dwóch pinach i nie wiem czy to normalne, czy coś nie tak z połączeniami. Kolejną rzeczą jaką znalazłem szukając rozwiązania, a co nie było omawiane w kursie (było wspomniane, ale nie drążone, przynajmniej tam gdzie ja dotarłem), to adres czujnika. Kolejnym moim przypuszczeniem jest to, że potrzebny jest adres czujnika, żeby to działało. Tu rodzi się moje drugie pytanie: Czy ten adres jest rzeczywiście potrzebny(albo przynajmniej łatwiej by było gdybym go znał, żeby można było podpiąć czujnik po inny pin) i czy dobrze ten adres interpretuję? Dane z czujnika (port szeregowy): ROM = 28 EE 6E 23 5F 20 1 D4 Chip = DS18B20 Data = 1 3F 1 4B 46 7F FF C 10 F3 CRC=F3 Temperature = 19.94 Celsius, 67.89 Fahrenheit Linijka w programie: DeviceAddress termometrZewnetrzny = {0x28,0xEE,0x6E,0x23,0x5F,0x20,0x01,0xD4}; Pozdrawiam. Edytowano Czerwiec 1, 2021 przez EMMB Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Czerwiec 1, 2021 Udostępnij Czerwiec 1, 2021 Pytanie zasadnicze: czy jak podepniesz czujnik np. do A0 to nie działa? W programie w inicjacji OneWire zmienione? A na D4 na przykład jak podepniesz? Jak się to "niedziałanie" objawia? Czujnik jest cyfrowy i może by podłączony do dowolnego pinu. Nie chce mi się szukać kodu w przepastnych czeluściach Forbota (wiesz, gdybyś w poście podał link do kodu który Ci "nie działa" to pewnie bym zajrzał)[1], ale nie każdy program musi znać adres czujnika, szczególnie w przypadku jednego czujnika na linii. --- [1] Tak, wiem, podałeś tytuł kursu i mogę sobie znaleźć. Ja mogę podać "u mnie działa" i trzeba znaleźć w goglach. Cytuj Link do komentarza Share on other sites More sharing options...
EMMB Czerwiec 1, 2021 Udostępnij Czerwiec 1, 2021 Dziś zbytnio czasu nie miałem, ale dla pewności sprawdziłem połączenia i zrobiłem test na kodzie z kursu: #include <OneWire.h> #include <DallasTemperature.h> OneWire oneWire(A5); //Podłączenie do A5 DallasTemperature sensors(&oneWire); //Przekazania informacji do biblioteki void setup(void) { Serial.begin(9600); sensors.begin(); //Inicjalizacja czujnikow } void loop(void) { sensors.requestTemperatures(); //Pobranie temperatury czujnika Serial.print("Aktualna temperatura: "); Serial.println(sensors.getTempCByIndex(0)); //Wyswietlenie informacji delay(500); } Ten program, bez problemu odczytuje i przekazuje informację do portu szeregowego. Działa jednak tylko na pinach A5 ( tak jak jest) oraz jak zmienię na A4 w kodzie i przepnę pin. Na pozostałych pokazuje -127.00. Podobnie rzecz wygląda na przykładowym programie z Arduino OneWire=>DS18x20_Temperature: #include <OneWire.h> // OneWire DS18S20, DS18B20, DS1822 Temperature Example // // http://www.pjrc.com/teensy/td_libs_OneWire.html // // The DallasTemperature library can do all this work for you! // https://github.com/milesburton/Arduino-Temperature-Control-Library OneWire ds(A5); // on pin 10 (a 4.7K resistor is necessary) // (DZIAŁA TYLKO TAK, ALBO Z (A4)) void setup(void) { Serial.begin(9600); } void loop(void) { byte i; byte present = 0; byte type_s; byte data[12]; byte addr[8]; float celsius, fahrenheit; if ( !ds.search(addr)) { Serial.println("No more addresses."); Serial.println(); ds.reset_search(); delay(250); return; } Serial.print("ROM ="); for( i = 0; i < 8; i++) { Serial.write(' '); Serial.print(addr[i], HEX); } if (OneWire::crc8(addr, 7) != addr[7]) { Serial.println("CRC is not valid!"); return; } Serial.println(); // the first ROM byte indicates which chip switch (addr[0]) { case 0x10: Serial.println(" Chip = DS18S20"); // or old DS1820 type_s = 1; break; case 0x28: Serial.println(" Chip = DS18B20"); type_s = 0; break; case 0x22: Serial.println(" Chip = DS1822"); type_s = 0; break; default: Serial.println("Device is not a DS18x20 family device."); return; } ds.reset(); ds.select(addr); ds.write(0x44, 1); // start conversion, with parasite power on at the end delay(1000); // maybe 750ms is enough, maybe not // we might do a ds.depower() here, but the reset will take care of it. present = ds.reset(); ds.select(addr); ds.write(0xBE); // Read Scratchpad Serial.print(" Data = "); Serial.print(present, HEX); Serial.print(" "); for ( i = 0; i < 9; i++) { // we need 9 bytes data[i] = ds.read(); Serial.print(data[i], HEX); Serial.print(" "); } Serial.print(" CRC="); Serial.print(OneWire::crc8(data, 8), HEX); Serial.println(); // Convert the data to actual temperature // because the result is a 16 bit signed integer, it should // be stored to an "int16_t" type, which is always 16 bits // even when compiled on a 32 bit processor. int16_t raw = (data[1] << 8) | data[0]; if (type_s) { raw = raw << 3; // 9 bit resolution default if (data[7] == 0x10) { // "count remain" gives full 12 bit resolution raw = (raw & 0xFFF0) + 12 - data[6]; } } else { byte cfg = (data[4] & 0x60); // at lower res, the low bits are undefined, so let's zero them if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms //// default is 12 bit resolution, 750 ms conversion time } celsius = (float)raw / 16.0; fahrenheit = celsius * 1.8 + 32.0; Serial.print(" Temperature = "); Serial.print(celsius); Serial.print(" Celsius, "); Serial.print(fahrenheit); Serial.println(" Fahrenheit"); } Po dodaniu do pierwszego programu wyświetlacza z I2C wyświetlacz działa ale, ale pokazuje temperaturę -127. 11 godzin temu, ethanak napisał: Nie chce mi się szukać kodu w przepastnych czeluściach Forbota Nawet przez myśl mi nie przeszło by wymagać tego od fachowca. Połowa sukcesu, to dobrze zadać pytanie. Ja się jeszcze tego uczę 😉. Jutro od samego rana zamierzam znów się mierzyć z tymi czujnikami, więc za wszelkie sugestie będę bardzo wdzięczny. Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Czerwiec 1, 2021 Udostępnij Czerwiec 1, 2021 1 godzinę temu, EMMB napisał: Dziś zbytnio czasu nie miałem, ale dla pewności sprawdziłem połączenia i zrobiłem test na kodzie z kursu: Też co prawda czasu nie miałem, ale z czystej ciekawości wrzuciłem ten kod. Dallas działa od strzału na pinie A5, A0, D7 (tam akurat mi się wetknęło), pewnie na pozostałych też będzie działać. Arduino Uno, rezystor przy dallasie 4.7k 1 Cytuj Link do komentarza Share on other sites More sharing options...
EMMB Czerwiec 2, 2021 Udostępnij Czerwiec 2, 2021 Spróbuję jeszcze kupić rezystor. Ten którego używam w tej chwili jest wylutowany z jakiegoś starego radia. Kabel do czujnika ma 2m, a zmierzona wartość oporu rezystora wynosi dokładnie 4,57K. Dziś dopiero zauważyłem, że mi tego czujnika arduino nie widzi wcale bez podłączenia I2C z LCD. Na żadnym pinie, a z podłączonym I2C widzi tylko na pinach A5 i A4. Jak wypnę z arduino przewód SCL z I2C, to czujnik znika i nie widać go nawet na A5 i A4. Jedyne co mi przychodzi na myśl, to ten opornik, więc jak go zakupię to dopiero sprawdzę. No chyba, że te znikanie czujnika po wypięciu konwertera z SCL świadczy o czymś innym...🤔 22 godziny temu, EMMB napisał: Pamiętaj, że piny I2C to w rzeczywistości A4 i A5 i jeśli tego używasz - nie możesz tam podłączać nic innego. Było pomocne... Bez tej informacji szukałem problemu w kodzie👍 Cytuj Link do komentarza Share on other sites More sharing options...
EMMB Czerwiec 2, 2021 Udostępnij Czerwiec 2, 2021 Problem rozwiązany! Nie potrafię po prostu czytać ze zrozumieniem! Rezystor wpiąłem szeregowo w przewód danych, a nie do zasilania🤯! Dziękuję za nakierunkowanie... Idę dalej... Nie sprawdzałem wyświetlacza, ale termometr działa na innych pinach więc chyba będzie dobrze. Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Czerwiec 2, 2021 Udostępnij Czerwiec 2, 2021 4 godziny temu, EMMB napisał: Dziś dopiero zauważyłem, że mi tego czujnika arduino nie widzi wcale bez podłączenia I2C z LCD. I to wszystko wyjaśnia. Interfejs I2C wyświetlacza ma wewnątrz rezystory podciągające do +5V, i one najprawdopodobniej posłużyły jako brakujący rezystor przy termometrze. Cytuj Link do komentarza Share on other sites More sharing options...
EMMB Czerwiec 2, 2021 Udostępnij Czerwiec 2, 2021 Dzięki za wsparcie. Mam podpięte trzy termometry i wszystko teraz działa jak założyłem. Mam nadzieję, że jeszcze się spotkamy przy następnej kłodzie na wyboistej drodze ku poznawaniu Arduino... Teraz nacieszę się trochę tym termometrem i ruszam dalej. Pozdrawiam. Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
Dołącz do dyskusji, napisz odpowiedź!
Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!