Skocz do zawartości

Błąd pomiaru temperatury po podłączeniu wyświetlacza LCD z wykorzystaniem I2C


DeryKwiat

Pomocna odpowiedź

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(); 
}

  

Link do komentarza
Share on other sites

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.

 

  • Pomogłeś! 2
Link do komentarza
Share on other sites

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...

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

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

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 przez EMMB
Link do komentarza
Share on other sites

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.

 

 

 

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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

 

  • Pomogłeś! 1
Link do komentarza
Share on other sites

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👍

Link do komentarza
Share on other sites

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.

 

IMG_20210602_074634.jpg

IMG_20210602_075840.jpg

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.