10 x DS18b20 do Dom...
 
Powiadomienia
Wyczyść wszystko

10 x DS18b20 do Domoticza - jaki sposób najlepszy?

20 Wpisów
7 Użytkownicy
1 Reactions
4,911 Wyświetleń
(@michal_m)
Wpisów: 52
Kontrybutor
Autor tematu
 

Witam,

Zdaję sobie sprawę, że rożnych opcji i dyskusji jest sporo, ale ufam że forumowicze nie zawiodą 🙂

Pytanie jak w temacie - 10 sztuk DS18b20, które metodą kablową (tylko i wyłącznie) chciałbym podłączyć do R-3B+ i oczywiście Domoticza.

Opcje jakie są dostępne to:

1) bezpośrednio kablem do R-3B+ po GPIO, wykorzystując w Domoticzu hardware "1Wire";

2) Arduino Uno + sketch MySensors ( https://www.mysensors.org/build/temp ) po kablu USB do R-3B+ i w Domoticzu hardware "MySensors Gateway USB"

3) Arduino Uno + sketch do multi-DSów (np. https://lastminuteengineers.com/multiple-ds18b20-arduino-tutorial/ )  po kablu USB do R-3B+ i w Domoticzu 2 skrypty: do zapisu danych i do odczytu danych przez Domoticza (np. https://github.com/SamR1/domoticz-arduino-temperature )

 

Poproszę o ewentualne wskazówki praktyczne, które z rozwiązań jest zarówno pod kątem obciążenia R-3B+ jak i praktyki (np. zawieszanie się odczytu itp) są polecane przez forumowiczów. Wiem, że nie ma niezawodnych rozwiązań/połączeń ale statystyka w końcu do czegoś służy...

 

 
Dodane : 24/10/2020 1:15 pm
isom
 isom
(@isom)
Wpisów: 5170
Szef wszystkich szefów Moderator Zasłużony dla Forum, Donator 2K19, Donator 2K20
 

@michal_m fakt temat rzeka . Moim skromnym zdaniem wersja 2 ale w sketchu dodane adresy czujników a nie tak jak jest w tym przykładzie.

Wstawiam sprawdzony wariant , co prawda obsługuje również przekaźniki , ale łatwo to zmodyfikujesz . 

 
Dodane : 24/10/2020 2:36 pm
(@michal_m)
Wpisów: 52
Kontrybutor
Autor tematu
 

@isom jak zwykle bardzo dziękuję! zabieram się do kodowania 🙂

 
Dodane : 24/10/2020 4:48 pm
(@michal_m)
Wpisów: 52
Kontrybutor
Autor tematu
 

chyba utknąłem... sketch wgrany ale  w monitorze portu szeregowego pokazuje same "krzaki", nie jest to problem tego pliku tylko chyba MySensors (o ile dobrze rozpoznaję problem) bo inny plik tego typu (też z MySensors) daje podobny efekt. Albo tak ma być (monitor nie jest w stanie wyświetlić info z MySensors) albo coś nie tak...

Zakładając, że jednak monitor nie może wyświetlić prawidłowo info z MySensors dodaję "MySesnsors Gateway USB" w Domoticzu (na początek port serial1) i podłączam Arduino do Raspberry przez USB. I właściwie tyle mogę zrobic: mając teraz do  wyboru 4 porty - 2 dają error - "Port closed"; 2 dają się ustawić ale w logach pusto a w "Setapie" bramki też pusto... Generalnie ani nodów ani tym bardziej sensorów...

Gdzieś pewnie robię błąd albo coś nie tak ze sprzętem....

 
Dodane : 24/10/2020 7:07 pm
isom
 isom
(@isom)
Wpisów: 5170
Szef wszystkich szefów Moderator Zasłużony dla Forum, Donator 2K19, Donator 2K20
 

Możesz wrzucić ten przerobiony sketch ? Po wgraniu tego co wstawiłem powinieneś zobaczyć w serial monitor coś takiego 

serial
Po podłączeniu arduino do np smarticza, którego pobrałeś jak dodasz sprzęt Bramka USB Mysensors zobaczysz coś takiego
sprzet
I w urządzeniach do dodania powinny być przekaźniki i termometry jak masz je podłączone . Tak wygląda bez termometrów
 Przekazniki
 
Dodane : 24/10/2020 7:33 pm
(@michal_m)
Wpisów: 52
Kontrybutor
Autor tematu
 

@isom na początek tylko zmieniłem pin na nr. 2 bo u mnie DSy są na 2; czyli generalnie oryginał z tą mała zmianą i moimi 4x adresami DS:

 

 

 
a tak wygląda "monitor"
 
monitor MySensors
 
Na szybko wrzuciłem obraz GUI na Rasperry bo może coś u mnie na Smarticzu CLI ale nie - dokładnie to samo - 2 port niedostępne, na 2 pozostałych nic się nie dziej - w logach też....
Najbardziej zastanawiające że nic nie widzę w monitorze na Arduino IDE...
 
Dodane : 24/10/2020 7:39 pm
isom
 isom
(@isom)
Wpisów: 5170
Szef wszystkich szefów Moderator Zasłużony dla Forum, Donator 2K19, Donator 2K20
 

@michal_m hmm pierwszy błąd to 

1603564898 monitor MySensors
Nie napisałeś, że raczkujesz w Mysensors i wyszło jak wyszło , dostałeś sketch dla noda a nie dla bramki więc nie można tego dodać jako Gateway USB 
Masz tu przerobiony sketch pod Twoje czujniki na pinie 2 ( adresy już są Ok 
 
Dodane : 24/10/2020 7:52 pm
(@michal_m)
Wpisów: 52
Kontrybutor
Autor tematu
 

@isom - teraz to już nie wiem jak podziękować 😀

fakt - Mysensors nigdy nie używałem ale sądziłem że stronę bramki załatwia Domoticz...

abyśmy dotrwali czasów gdzie może jakiś zjazd forumowiczów albo coś tak... raz jeszcze dziękuję!!

 

Aktualizacja: pięknie śmiga

Tak wyglądda konfiguracja

MySensors konf
 
Tak sprzęt
 
MySensors sprzet DS
 
A tak temperatury :-))
 
MySensors Temp DS
 
 
Teraz trochę czyszczenia skryptu i do R-3!!
 
Dodane : 24/10/2020 8:04 pm
isom reacted
(@michzur320)
Wpisów: 4
Świeżak
 

@isom

Witam... Przepraszam że wtrącam się tyle czasu od zamknięcia tej dyskusji, lecz podobnie jak kolega zaczynam z mysensors i nie rozumiem jaki powód może stać za tym, że z tym kodem, domoticz nie widzi temperatur, jedynie same przekaźniki?

Pozdrawiam!

 
Dodane : 15/12/2020 3:01 pm
isom
 isom
(@isom)
Wpisów: 5170
Szef wszystkich szefów Moderator Zasłużony dla Forum, Donator 2K19, Donator 2K20
 

@michzur320 powodów może być kilka , pin do którego podłączyłeś czujniki , adresy czujników muszą odpowiadać tym dodanym przez Ciebie i wreszcie złe podłączenie samych czujników.

W kodzie który pewnie skopiowałeś , czujniki muszą być podłączone do pinu 2 w arduino , wszystkie adresy w tej części kodu 

byte D[5][8] = {
{ 0x28, 0x4, 0x8A, 0x3B, 0x32, 0x19, 0x1, 0xF9 },
{ 0x28, 0xFC, 0x94, 0x38, 0x32, 0x19, 0x1, 0x7C },
{ 0x28, 0x7E, 0xEF, 0x39, 0x32, 0x19, 0x1, 0x6A },
{ 0x28, 0x9F, 0x74, 0x37, 0x32, 0x19, 0x1, 0xA6 }

};

Muszą być zgodne z adresami Twoich czujników
 
Dodane : 15/12/2020 3:35 pm
(@michzur320)
Wpisów: 4
Świeżak
 

Jak można sprawdzić adresy czujników?

 

 
Dodane : 15/12/2020 3:48 pm
(@michzur320)
Wpisów: 4
Świeżak
 

Yyy zmieniam treść pytania🤣

Pobrałem jakiś kod do sprawdzania adresów,

Jeden wyszedł: 28 C0 AE 79 A2 0 3 70

Czy teraz mam to do tej zmiennej przepisać w ten sposób?: 0x28 0xC0 0xAE 0x79 0xA2 0x0 0x3 0x70?

 
Dodane : 15/12/2020 4:18 pm
isom
 isom
(@isom)
Wpisów: 5170
Szef wszystkich szefów Moderator Zasłużony dla Forum, Donator 2K19, Donator 2K20
 

Tak , adres każdego czujnika musisz zapisać w takiej postaci 

 
Dodane : 15/12/2020 4:23 pm
(@michzur320)
Wpisów: 4
Świeżak
 

Zrobiłem w ten sposób, ale mi nie działało ( odświeżanie strony nic nie pomogło) w końcu zrestartowałem całą malinkę i temperatury się ukazały 😄

Dziękuję bardzo za pomoc😃👊👊👊

 
Dodane : 15/12/2020 4:36 pm
(@edass)
Wpisów: 213
Weteran
 

Sorry, że się wtrącam ale czy nie dało by się o rady zrobić na nodemcu/esp8266 i tasmocie ? Aktualnie mam tak podłączone 6x ds18b20+ 2xDHT22+sr04 + przekaźnik . Tasmotą bez problemu to ogarnia a całość leci po mqtt do OpenHab. 

 
Dodane : 22/12/2020 11:16 pm
isom
 isom
(@isom)
Wpisów: 5170
Szef wszystkich szefów Moderator Zasłużony dla Forum, Donator 2K19, Donator 2K20
 

@edass owszem dało  by radę , ale mysensors pozwala na komunikację przewodową np RS 485 i jak ktoś ma nowy dom albo stary ale okablowany to taka technologia jest pewniejsza i stabilniejsza niż WIFI

 
Dodane : 23/12/2020 12:55 pm
(@edass)
Wpisów: 213
Weteran
 

@isiom

Racja. Nawet o tym nie myślę bo mam stary dom i niestety nieokablowany tak jak bym chciał. 

Uważam jednak, że moja informacja powinna tu pozostać bo może ułatwić robotę wielu ludziom. Koszt nodemcu jest znikomy, rozmiar niewielki a czujniki kosztują tyle samo . 

 

Pozdrawiam

 

 
Dodane : 25/12/2020 9:11 pm
(@marcin81233)
Wpisów: 4
Bywalec
 

@isom Mógłbyś dołączyć pod ten sketch obsługę czujników na kolejnym pinie?

Będę potrzebował około 30 czujników i potrzebuję  je rozłożyć na kilka pinów.

 

 
Dodane : 30/11/2021 9:20 pm
(@pawel1)
Wpisów: 18
Praktykant
 

Dopytam, jak zmienić kod tak aby podpinać po jednym czujniku pod jedno wejście, żeby były widoczne w HA?

Sztuk 20

 

 

 

 
Dodane : 23/04/2022 9:51 pm
(@kuerten)
Wpisów: 8
Bywalec
 

Sketch do płytki Arduino na 10 termometrów DS. Każdy termometr podłączany do innego pinu. Nie maja tu znaczenia adresy czujników. Jedyny problem, że może być mało miejsca na płytce na dane. Kiedyś wchodził mi koda na 18 termometrów potem chyba aktualizacje bibliotek spowodowały, że brakuje miejsca. Ja używam dwóch płytek nano.

// Program napisany dla 10 termometrów DS18B20 z przypisanymi pinami dla płytki arduino UNO wyłączając PIN-y 1 i 2, wykorzystujac maksymalna liczbę dostępnych pinów jest za malo dostpenej pamieci
// Program z biblioteką MySensors do sterowania przy pomocy Domoticz-a 

#define MY_GATEWAY_SERIAL
#include <SPI.h>
#include <MySensors.h>  
#include <DallasTemperature.h>
#include <OneWire.h>

#define COMPARE_TEMP 1 // 

#define DS_NR_1 A0  //Piny dla poszczególnych czujników
#define DS_NR_2 A1
#define DS_NR_3 A2
#define DS_NR_4 A3
#define DS_NR_5 A4
#define DS_NR_6 A5
#define DS_NR_7 2
#define DS_NR_8 3
#define DS_NR_9 4


#define ds18B20 16

unsigned long SLEEP_TIME = 5000;    //Czas pomiędzy kolejnymi odczytami 5sec

OneWire AWire(DS_NR_1);             //Określamy nazwę kolejnego czujnika OneWire np AWire, BWire, CWire itd.
DallasTemperature sensor1(&AWire);  // Odczyt temperatury dla wcześniej zdefiniowanego AWire ustawiamy kolejno sensor1, sensors 2, sensor 3 itd. 
int lastTemperature1[ds18B20];    //ostatnia temperatura - ta zmienna pozostaje bez zmian

OneWire BWire(DS_NR_2); 
DallasTemperature sensor2(&BWire); 
int lastTemperature2[ds18B20];

OneWire CWire(DS_NR_3); 
DallasTemperature sensor3(&CWire);  
int lastTemperature3[ds18B20];

OneWire DWire(DS_NR_4); 
DallasTemperature sensor4(&DWire);  
int lastTemperature4[ds18B20];

OneWire EWire(DS_NR_5); 
DallasTemperature sensor5(&EWire);  
int lastTemperature5[ds18B20];

OneWire FWire(DS_NR_6); 
DallasTemperature sensor6(&FWire);  
int lastTemperature6[ds18B20];

OneWire GWire(DS_NR_7); 
DallasTemperature sensor7(&GWire);  
int lastTemperature7[ds18B20];

OneWire HWire(DS_NR_8); 
DallasTemperature sensor8(&HWire);  
int lastTemperature8[ds18B20];

OneWire IWire(DS_NR_9); 
DallasTemperature sensor9(&IWire);  
int lastTemperature9[ds18B20];

bool receivedConfig = false;
bool metric = true;

MyMessage msg1(1,V_TEMP);
MyMessage msg2(2,V_TEMP);
MyMessage msg3(3,V_TEMP);
MyMessage msg4(4,V_TEMP);
MyMessage msg5(5,V_TEMP);
MyMessage msg6(6,V_TEMP);
MyMessage msg7(7,V_TEMP);
MyMessage msg8(8,V_TEMP);
MyMessage msg9(9,V_TEMP);

void before()
{
  // Startup up the OneWire library
  sensor1.begin();
  sensor2.begin();
  sensor3.begin();
  sensor4.begin();
  sensor5.begin();
  sensor6.begin();
  sensor7.begin();
  sensor8.begin();
  sensor9.begin();

}

void setup()  
{ 
  
  sensor1.setWaitForConversion(false);
  sensor2.setWaitForConversion(false);
  sensor3.setWaitForConversion(false);
  sensor4.setWaitForConversion(false);
  sensor5.setWaitForConversion(false);
  sensor6.setWaitForConversion(false);
  sensor7.setWaitForConversion(false);
  sensor8.setWaitForConversion(false);
  sensor9.setWaitForConversion(false);
}

void presentation() {
 
  sendSketchInfo("Czujniki temperatury DS18B20", "1.1");

     present(1, S_TEMP);
     present(2, S_TEMP);
     present(3, S_TEMP);
     present(4, S_TEMP);
     present(5, S_TEMP);
     present(6, S_TEMP);
     present(7, S_TEMP);
     present(8, S_TEMP);
     present(9, S_TEMP);
   
  }

void loop() 
{     
  {
    sensor1.requestTemperatures();

    int16_t conversionTime1 = sensor1.millisToWaitForConversion(sensor1.getResolution());
  
    sleep(conversionTime1);

    int i=0; {

    float temperature = static_cast<float>(static_cast<int>((getControllerConfig().isMetric?sensor1.getTempCByIndex(i):sensor1.getTempFByIndex(i)) * 10.)) / 10.;

    
    #if COMPARE_TEMP == 1
    if (lastTemperature1[i] != temperature && temperature != -127.00 && temperature != 85.00) {
    #else
    if (temperature != -127.00 && temperature != 85.00) {
    #endif

    send(msg1.setSensor(1).set(temperature,1));
    lastTemperature1[i]=temperature;
    }
    }
    }
//--------------------------2-------------------------------
    {
    sensor2.requestTemperatures();

    int16_t conversionTime2 = sensor2.millisToWaitForConversion(sensor2.getResolution());
  
    sleep(conversionTime2);

    int k=0; {

    float temperature = static_cast<float>(static_cast<int>((getControllerConfig().isMetric?sensor2.getTempCByIndex(k):sensor2.getTempFByIndex(k)) * 10.)) / 10.;

    
    #if COMPARE_TEMP == 1
    if (lastTemperature2[k] != temperature && temperature != -127.00 && temperature != 85.00) {
    #else
    if (temperature != -127.00 && temperature != 85.00) {
    #endif

    send(msg2.setSensor(2).set(temperature,1));
    lastTemperature2[k]=temperature;
    }
    }
    }
//---------------------------3---------------------------------------------------------------------------
    {
    sensor3.requestTemperatures();

    int16_t conversionTime3 = sensor3.millisToWaitForConversion(sensor3.getResolution());
  
    sleep(conversionTime3);

    int j=0; {

    float temperature = static_cast<float>(static_cast<int>((getControllerConfig().isMetric?sensor3.getTempCByIndex(j):sensor3.getTempFByIndex(j)) * 10.)) / 10.;

    
    #if COMPARE_TEMP == 1
    if (lastTemperature3[j] != temperature && temperature != -127.00 && temperature != 85.00) {
    #else
    if (temperature != -127.00 && temperature != 85.00) {
    #endif

    send(msg3.setSensor(3).set(temperature,1));
    lastTemperature3[j]=temperature;
    }
    }
    }

//----------------------------4----------------------------------------------------------------
  {
    sensor4.requestTemperatures();

    int16_t conversionTime4 = sensor4.millisToWaitForConversion(sensor4.getResolution());
  
    sleep(conversionTime4);

    int k=0; {

    float temperature = static_cast<float>(static_cast<int>((getControllerConfig().isMetric?sensor4.getTempCByIndex(k):sensor4.getTempFByIndex(k)) * 10.)) / 10.;

    
    #if COMPARE_TEMP == 1
    if (lastTemperature4[k] != temperature && temperature != -127.00 && temperature != 85.00) {
    #else
    if (temperature != -127.00 && temperature != 85.00) {
    #endif

    send(msg4.setSensor(4).set(temperature,1));
    lastTemperature4[k]=temperature;
    }
    }
    }
//-----------------------------5----------------------------
  {
    sensor5.requestTemperatures();

    int16_t conversionTime5 = sensor5.millisToWaitForConversion(sensor5.getResolution());
  
    sleep(conversionTime5);

    int l=0; {

    float temperature = static_cast<float>(static_cast<int>((getControllerConfig().isMetric?sensor5.getTempCByIndex(l):sensor5.getTempFByIndex(l)) * 10.)) / 10.;

    
    #if COMPARE_TEMP == 1
    if (lastTemperature5[l] != temperature && temperature != -127.00 && temperature != 85.00) {
    #else
    if (temperature != -127.00 && temperature != 85.00) {
    #endif

    send(msg5.setSensor(5).set(temperature,1));
    lastTemperature5[l]=temperature;
    }
    }
    }
//------------------------------6---------------------------
  {
    sensor6.requestTemperatures();

    int16_t conversionTime6 = sensor6.millisToWaitForConversion(sensor6.getResolution());
  
    sleep(conversionTime6);

    int m=0; {

    float temperature = static_cast<float>(static_cast<int>((getControllerConfig().isMetric?sensor6.getTempCByIndex(m):sensor6.getTempFByIndex(m)) * 10.)) / 10.;

    
    #if COMPARE_TEMP == 1
    if (lastTemperature6[m] != temperature && temperature != -127.00 && temperature != 85.00) {
    #else
    if (temperature != -127.00 && temperature != 85.00) {
    #endif

    send(msg6.setSensor(6).set(temperature,1));
    lastTemperature6[m]=temperature;
    }
    }
    }
//-------------------------------7--------------------------
  {
    sensor7.requestTemperatures();

    int16_t conversionTime7 = sensor7.millisToWaitForConversion(sensor7.getResolution());
  
    sleep(conversionTime7);

    int n=0; {

    float temperature = static_cast<float>(static_cast<int>((getControllerConfig().isMetric?sensor7.getTempCByIndex(n):sensor7.getTempFByIndex(n)) * 10.)) / 10.;

    
    #if COMPARE_TEMP == 1
    if (lastTemperature7[n] != temperature && temperature != -127.00 && temperature != 85.00) {
    #else
    if (temperature != -127.00 && temperature != 85.00) {
    #endif

    send(msg7.setSensor(7).set(temperature,1));
    lastTemperature7[n]=temperature;
    }
    }
    }
//--------------------------------8-------------------------
  {
    sensor8.requestTemperatures();

    int16_t conversionTime8 = sensor8.millisToWaitForConversion(sensor8.getResolution());
  
    sleep(conversionTime8);

    int o=0; {

    float temperature = static_cast<float>(static_cast<int>((getControllerConfig().isMetric?sensor8.getTempCByIndex(o):sensor8.getTempFByIndex(o)) * 10.)) / 10.;

    
    #if COMPARE_TEMP == 1
    if (lastTemperature8[o] != temperature && temperature != -127.00 && temperature != 85.00) {
    #else
    if (temperature != -127.00 && temperature != 85.00) {
    #endif

    send(msg8.setSensor(8).set(temperature,1));
    lastTemperature8[o]=temperature;
    }
    }
    }
//--------------------------------9-------------------------
  {
    sensor9.requestTemperatures();

    int16_t conversionTime9 = sensor9.millisToWaitForConversion(sensor9.getResolution());
  
    sleep(conversionTime9);

    int p=0; {

    float temperature = static_cast<float>(static_cast<int>((getControllerConfig().isMetric?sensor9.getTempCByIndex(p):sensor9.getTempFByIndex(p)) * 10.)) / 10.;

    
    #if COMPARE_TEMP == 1
    if (lastTemperature9[p] != temperature && temperature != -127.00 && temperature != 85.00) {
    #else
    if (temperature != -127.00 && temperature != 85.00) {
    #endif

    send(msg9.setSensor(9).set(temperature,1));
    lastTemperature9[p]=temperature;
    }
    }
    }
 
//---------------------------------------------------------

  sleep(SLEEP_TIME);
}
 
Dodane : 08/10/2022 6:03 pm
Udostępnij: