• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Kilka niezależnych termometrów + lcd
#1
Witam. 
Jak zrobić niezależny odczyt sond ds18b20 na lcd 2004? 
Jeżeli podpinam 2,3 szt w jeden pin wszystko działa. 
Jeżeli sondy lutuje w złączki, i wypne jedna to i tak gasnie mi ostatnia z wyświetlacza a pomiar temp wskakuje wyżej. Jeżeli podepnę znów to sonda wskakuje na samym dole.
Czy jest opcja by podpiąć sondy, każda osobno w niezależny pin, który będzie odpowiadał tylko jej? 

Z góry dziękuję za pomoc
 
Odpowiedź
#2
Prawdopodobnie masz żle napisany program. Każdy czujnik ma swój adres i każdy osobno się odczytuje wiec wiadomo który do jakiej zmiennej.

Tak możesz osobno w zasadzie każdy pin cyfrowy obsłuży 1Wire.
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#3
(29-03-2022, 20:02)Jarewa0606 napisał(a): Prawdopodobnie masz żle napisany program. Każdy czujnik ma swój adres  i każdy osobno się odczytuje wiec wiadomo który do jakiej zmiennej.

Tak możesz osobno w zasadzie każdy pin cyfrowy obsłuży 1Wire.

Pewnie chodzi o to :


Kod:
void loop() {

sensors.requestTemperatures();
float TEMP1 = sensors.getTempCByIndex(0);
float TEMP2 = sensors.getTempCByIndex(1);

lcd.setCursor(0, 0);
lcd.print("Pokoj 1");
lcd.setCursor (10, 0);
lcd.print(sensors.getTempCByIndex(0));
lcd.print((char)223);
lcd.print("C");

lcd.setCursor(0,1);
lcd.print("Lazienka");
lcd.setCursor (10, 1);
lcd.print(sensors.getTempCByIndex(1));
lcd.print((char)223);
lcd.print("C");

Jak to przypisać osobno?
 
Odpowiedź
#4
Nie o to, musisz poszukać przykładów  np. https://lastminuteengineers.com/multiple...-tutorial/

Pierw musisz zobaczyć jakie mają czujniki adresy.

void printAddress(DeviceAddress deviceAddress)
{
  for (uint8_t i = 0; i < 8; i++)
  {
    Serial.print("0x");
    if (deviceAddress[i] < 0x10) Serial.print("0");
    Serial.print(deviceAddress[i], HEX);
    if (i < 7) Serial.print(", ");
  }
  Serial.println("");
}

Znajac adrsy czujników

Sensor 1= { 0x28, 0xEE, 0xD5, 0x64, 0x1A, 0x16, 0x02, 0xEC };
Sensor 2 = { 0x28, 0x61, 0x64, 0x12, 0x3C, 0x7C, 0x2F, 0x27 };
Sensor 3 = { 0x28, 0x61, 0x64, 0x12, 0x3F, 0xFD, 0x80, 0xC6 };

I potem odczytywać po adresie.

Kod:
#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

// Addresses of 3 DS18B20s
uint8_t sensor1[8] = { 0x28, 0xEE, 0xD5, 0x64, 0x1A, 0x16, 0x02, 0xEC };
uint8_t sensor2[8] = { 0x28, 0x61, 0x64, 0x12, 0x3C, 0x7C, 0x2F, 0x27 };
uint8_t sensor3[8] = { 0x28, 0x61, 0x64, 0x12, 0x3F, 0xFD, 0x80, 0xC6 };

void setup(void)
{
  Serial.begin(9600);
  sensors.begin();
}

void loop(void)
{
  sensors.requestTemperatures();
 
  Serial.print("Sensor 1: ");
  printTemperature(sensor1);
 
  Serial.print("Sensor 2: ");
  printTemperature(sensor2);
 
  Serial.print("Sensor 3: ");
  printTemperature(sensor3);
 
  Serial.println();
  delay(1000);
}

void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  Serial.print(tempC);
  Serial.print((char)176);
  Serial.print("C  |  ");
  Serial.print(DallasTemperature::toFahrenheit(tempC));
  Serial.print((char)176);
  Serial.println("F");
}
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#5
(29-03-2022, 21:57)Jarewa0606 napisał(a): Nie o to, musisz poszukać przykładów  np. https://lastminuteengineers.com/multiple...-tutorial/

Pierw musisz zobaczyć jakie mają czujniki adresy.

void printAddress(DeviceAddress deviceAddress)
{
  for (uint8_t i = 0; i < 8; i++)
  {
    Serial.print("0x");
    if (deviceAddress[i] < 0x10) Serial.print("0");
    Serial.print(deviceAddress[i], HEX);
    if (i < 7) Serial.print(", ");
  }
  Serial.println("");
}

Znajac adrsy czujników

Sensor 1= { 0x28, 0xEE, 0xD5, 0x64, 0x1A, 0x16, 0x02, 0xEC };
Sensor 2 = { 0x28, 0x61, 0x64, 0x12, 0x3C, 0x7C, 0x2F, 0x27 };
Sensor 3 = { 0x28, 0x61, 0x64, 0x12, 0x3F, 0xFD, 0x80, 0xC6 };

I potem odczytywać po adresie.

Kod:
#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

// Addresses of 3 DS18B20s
uint8_t sensor1[8] = { 0x28, 0xEE, 0xD5, 0x64, 0x1A, 0x16, 0x02, 0xEC };
uint8_t sensor2[8] = { 0x28, 0x61, 0x64, 0x12, 0x3C, 0x7C, 0x2F, 0x27 };
uint8_t sensor3[8] = { 0x28, 0x61, 0x64, 0x12, 0x3F, 0xFD, 0x80, 0xC6 };

void setup(void)
{
  Serial.begin(9600);
  sensors.begin();
}

void loop(void)
{
  sensors.requestTemperatures();
 
  Serial.print("Sensor 1: ");
  printTemperature(sensor1);
 
  Serial.print("Sensor 2: ");
  printTemperature(sensor2);
 
  Serial.print("Sensor 3: ");
  printTemperature(sensor3);
 
  Serial.println();
  delay(1000);
}

void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  Serial.print(tempC);
  Serial.print((char)176);
  Serial.print("C  |  ");
  Serial.print(DallasTemperature::toFahrenheit(tempC));
  Serial.print((char)176);
  Serial.println("F");
}
Dziękuję, już bliżej ale.. jak zmienię czujnik na inny ?
 
Odpowiedź
#6
Zawsze możesz napisać tak program by programować adresy....
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#7
(29-03-2022, 22:47)Jarewa0606 napisał(a): Zawsze możesz napisać tak program by programować adresy....

próbuje, ale może to być za trudne :/
 
Odpowiedź
#8
Najprościej od strony programowej jest wgranie nowego programu za każdym razem, gdy chcesz zmienić czujnik. Jest to dodatkowo bardzo proste z Arduino, wystarczy do Atmegi podłączyć odpowiednio moduł BT HC05, podejść z laptopem na parę metrów do układu, wybrać port i wysłać nowy kod. Albo używać ESP8266, program można wgrywać zdalnie przez WIFI OTA. Kiedyś to opisywałem na tym forum, kondensator między RST a pin STATE HC, HC musi mieć komendami AT odwróconą logikę pinu, tak by zresetować Atmega przy nawiązywaniu połączenia BT. OTA jest opisana wiele razy, do znalezienia w GOOGLE. Wykrywasz na innym Arduino serial nowego czujnika, wpisujesz do programu gdzie ma to działać i wgranie.
Opcja druga w kolejności wg łatwości to wysłanie kodu czujnika przez UART, tak samo można przez BT HC05 do Atmega i przez WIFI (serwer UDP) na ESP. Odpowiednia funkcja obsługująca komendy wysłane przez uart (UDP w ESP działa analogicznie) musi rozpoznać nową definicję czujnika, zapisać do EEPROM.
ESP z odpowiednim firmware może działać również jako most WIFI-UART, analogicznie jak HC-05 z BT robi most BT-UART.
W PC musi być dodany programik do portów wirtualnych COM po WIFI, UDP/TCP, np. darmowy Tibbo Virtual Serial.
Najtrudniejsza opcja to z poziomu programu, uruchomienie funkcji która umożliwi dodanie czujnika. Można to zrobić przez MENU, przez podmianę jednego czujnika, przez wstukanie wszystkim numerów kursorami, przez zrobienie nowej konfiguracji od początku, czyli odpalona funkcja zeruje wszystko, wykrywa pierwszy czujnik, nadajesz mu numer porządkowy, drugi, trzeci, itd.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#9
Zależy co to za wyświetlacz, czy będą przyciski. Bo jak będą to łatwiejsze będzie przypisać po MENU, z tym ze najprościej jak będzie jeden czujnik zawsze podłączony w celu wkodowania by się nie pogubić z z resztą.

Wiec widział bym to tak w przypadku awarii/uszkodzenia, wywołujemy przyciskiem prosty programik do szukania adresów w tym przykładzie był, jak znajdzie adres to przypiszesz do danej pozycji i to wszystko. Przy wykrywaniu kilku czujników można się pogubić z numerami lepiej osobno...
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#10
A może by zrobić odczyt termometru każdy na innym pinie?
Tak w zupełności wystarczy.

PS. Głównie chodzi o to by po wyciągnięciu czujnika reszta odczytów pozostała na lcd na swoim miejscu.
Bo jak wyciągnę czujnik pokój 1 to odczyt z łazienki pojawia się na lcd tam gdzie pokój
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości