Skocz do zawartości

Czujnik poziomu wody QDY30a z esp


Pomocna odpowiedź

(edytowany)

nebraska Spoko 🙂 My z kolegami przy okazji, wdaliśmy się w luźną wymianę zdań i doświadczeń, w temacie.

Jeżeli twoje rozwiązanie spełnia, twoje oczekiwania, to jest jak najbardziej prawidłowe, absolutnie go nie krytykujemy, po prostu stwierdzamy że można było go zrealizować, na 3 różne sposoby. Bardzo fajnie że zdecydowałeś się na pętle 4-20mA, świat to nie tylko 1 i 0. Pętla prądowa daje ci tę fajna cechę, że możesz sobie przedłużyć przewód pomiarowy od czujnika do konwertera nawet do 30m i nie stracisz na precyzji pomiaru. Łatwo diagnozować usterki, bo jak prąd spadnie do 0mA masz przerwany kabel. Zwarty kabel daje ponad 20mA, najczęściej 21/22. Czujniki też czasami usterkę sygnalizują, np. prądem 3mA, ale to trzeba by potwierdzić w dokumentacji czujnika.

Cytat

jand Wcale bym się nie zdziwił, gdyby się okazało, że i tak taka konwersja się odbywa, tyle że w ramach tej płytki Modbus RTU. Są co prawda układy scalone konwertujące od razu sygnał pętli prądowej na cyfrę, ale trudno mi uwierzyć by Chińczycy je zastosowali.

Chińczycy niczego innego niż prawo Ohma nie stosują. Tam jest po prostu pomiar spadku napięcia na rezystorze pomiarowym i tyle. Jakbyś miał wejście 0-10V, i chciał mierzyć prąd w zakresie 0-20mA, dajesz opornik 500Ω do masy, skalujesz odpowiednio uzyskany wynik i tyle. Podstawy elektroniki, tam nie ma żadnej magii, czy wyspecjalizowanych układów scalonych.

Edytowano przez BlackJack
  • Lubię! 1
13 minut temu, _LM_ napisał:

teraz zauważyłem że chcesz jednak mieć zewnętrzny przetwornik, przy takim układzie myślę że pętla prądowa nie jest tutaj potrzebna, ten czujnik poziomu, sondę możesz podać model?

Dzięki LM za uświadomienie odnośnie pętli.

Czujnik dokładnie z tego linku zamówiłem.

Model 4/20mA i do głębokości 4m i 5m przewód.

https://a.aliexpress.com/_EJz4oob

 

Podaje link Do kalibracji konwertera, żeby ustawić punkt min i max użyłem takiego generatora.

https://a.aliexpress.com/_EJIjMox

Dzisiaj zrobiłem testy na różnych naczyniach od 20 do 100cm odpowiednio pisząc program, żeby mieć wartość w cm i w % i jestem mega zadowolony. Nie potrzebuję tu mega precyzji, ale czujnik wskazuje precyzyjne wyniki. Na pewno wart swej ceny.

 

  • 1 miesiąc później...

Witam ponownie

Pierwszy układ działa bez zarzutów.

Chce jeszcze sobie zrobić na drugi zbiornik i chce tym razem spróbować na RS485. Czujnik zamówiłem już jest w drodze konwerter RS485 również.

Jako, że jeszcze nie miałem okazji bawić się tą komunikacja, a bardzo mnie ciekawi mam do Was kilka pytań.

1 Szukając i czytając różne wątki widziałem, że podłączają go pod 3.3V, a zaleca się 5V. Jak na schemacie niżej, schemat nie jest mojego autorstwa.

2 Pytanie czy jak podłącze na 5V nie uszkodzę wemosa?

3 Piny RE i DE połączone razem i w trybie LOW odbierają dane z czujnika?

4 Mógłby ktoś polecić sprawdzoną biblioteke? Czy użyć software serial?

5 W instrukcji czujnika nie widziałem żadnej ramki odpytywania bajtów. Wychodzi na to że wysyła gotowe dane?

 

Screenshot_2024-06-02-18-32-52-541_com.android.chrome.jpg

(edytowany)

Kolega tutaj nie dodał najważniejszej rzeczy czyli tego pliku z opisem transmisji Modbus RTU. standardowo 9600,N,8,1, adres domyślny czujnika 1.

QDY30A RS485 level pressure Modbus protocol.pdf

Tak na szybko. Rejestr

0x0002 - jednostka w jakiej zwracany jest wynik

0x0003 - pozycja przecinka w wyniku

0x0004 - wynik pomiaru. szkoda że nie pisze co jaki czas aktualizowany, ale można przyjąć że min 100-200ms.

0x0005 - wartość tzw. zera czujnika 

0x0006 - koniec zakresu pomiarowego.

Na początek proponuję tylko odczytywać dane, zapis do rejestrów zera i zakresu pomiarowego może rozkalibrować czujnik. Najlepiej sobie najpierw go rozgryźć w programie MoodBusPool czy jakimś podobnym terminalu do Modbusa, na PC. Trzeba przelotki USB<>RS485 np. takiej na CH340.

https://allegro.pl/oferta/konwerter-usb-do-rs485-modbus-profibus-terminal-15364222700?reco_id=925c6920-22fb-11ef-8d45-f664bc1ba58f&sid=1147bbb04b955b96a226cab2e664258d9124ef0862320b2d7366fdd6604cf017

Edytowano przez BlackJack
  • Lubię! 1

A po co software serial? Przecież to coś ma trzy UART-y, użyj Serial1 albo Serial2 i podłącz do jakichś nieużywanych pinów. Software serial na ESP32 raczej niespecjalnie dobrze działa (podobno, nie miałem jeszcze konieczności używać więcej niż trzech seriali).

(edytowany)

To prawda mogę wykorzystać sprzętowy serial. W przypadku wemosa D1 mini musiałbym użyć Software.

Zastanawia mnie czy konwerter rs485, który jest na zdj wyżej mogę podłączyć na 5V jak na schemacie. Czy nie uszkodzę logiki ESP? 

Czy ktoś mi wyjaśni jak do tego kodu podstawić te rejestry z instrukcji, żeby odczytać dane z czujnika?

 #include <ModbusMaster.h>
#include <SoftwareSerial.h>

#define MAX485_RE_NEG  2
#define MAX485_DE      3
#define SSERIAL_RX_PIN 10
#define SSERIAL_TX_PIN 11

SoftwareSerial RS485Serial(SSERIAL_RX_PIN, SSERIAL_TX_PIN);
ModbusMaster node;

void preTransmission() {
  digitalWrite(MAX485_RE_NEG, 1);
  digitalWrite(MAX485_DE, 1);
}

void postTransmission() {
  digitalWrite(MAX485_RE_NEG, 0);
  digitalWrite(MAX485_DE, 0);
}

void setup() {
  // Initialize control pins
  pinMode(MAX485_RE_NEG, OUTPUT);
  pinMode(MAX485_DE, OUTPUT);
  digitalWrite(MAX485_RE_NEG, 0);
  digitalWrite(MAX485_DE, 0);

  // Modbus communication runs at 9600 baud
  Serial.begin(9600);
  RS485Serial.begin(9600);

  // Modbus slave ID 1
  node.begin(1, RS485Serial);

  // Callbacks allow us to configure the RS485 transceiver correctly
  node.preTransmission(preTransmission);
  node.postTransmission(postTransmission);
}

void loop() {
  // Request 2 registers starting at 0x0001
  uint8_t result = node.readInputRegisters(0x0001, 2);
  Serial.println("Data Requested");

  if (result == node.ku8MBSuccess) {
    // Get response data from sensor
    Serial.print("Temperature: ");
    Serial.print(float(node.getResponseBuffer(0) / 10.00F));
    Serial.print("   Humidity: ");
    Serial.println(float(node.getResponseBuffer(1) / 10.00F));
  }
  delay(1000);
}

 

QDY30A RS485 level pressure Modbus protocol.pdf

Edytowano przez nebraska
  • Lubię! 1
(edytowany)

Moim zdaniem wystarczy zmienić tą linijkę

uint8_t result = node.readInputRegisters(0x0001, 2);

na

uint8_t result = node.readInputRegisters(0x0004, 1);

no i odpowiednio sformatować potem wynik, bo nie będzie on float, tylko całkowity ze znakiem. to gdzie ma być przecinek, da się domyśleć po wartości.

Jedyna niewiadoma, to czy rejestry są adresowane od 0 czy 1? Ale to będzie najwyżej 0x0003 zamiast 0x0004.

Edytowano przez BlackJack
  • Lubię! 1

Witam 

Przyszedł czujnik. Siedziałem nad tym cały dzień i nic nie mogę odczytać.

Podlączyłem pod Arduino schmeat poniżej i kod. Proszę naprowadźcie co jest nie tak mam tylko w loop i żadnyc odczytów.

Data Requested

 

#include <ModbusMaster.h>
#include <SoftwareSerial.h>

#define MAX485_RE_NEG  5
#define MAX485_DE      6
#define SSERIAL_RX_PIN 10
#define SSERIAL_TX_PIN 11

SoftwareSerial RS485Serial(SSERIAL_RX_PIN, SSERIAL_TX_PIN);
ModbusMaster node;

void preTransmission() {
  digitalWrite(MAX485_RE_NEG, 1);
  digitalWrite(MAX485_DE, 1);
}

void postTransmission() {
  digitalWrite(MAX485_RE_NEG, 0);
  digitalWrite(MAX485_DE, 0);
}

void setup() {
  // Initialize control pins
  pinMode(MAX485_RE_NEG, OUTPUT);
  pinMode(MAX485_DE, OUTPUT);
  digitalWrite(MAX485_RE_NEG, 0);
  digitalWrite(MAX485_DE, 0);

  // Modbus communication runs at 9600 baud
  Serial.begin(9600);
  RS485Serial.begin(9600);

  // Modbus slave ID 1
  node.begin(1, RS485Serial);

  // Callbacks allow us to configure the RS485 transceiver correctly
  node.preTransmission(preTransmission);
  node.postTransmission(postTransmission);
}

void loop() {
  
  // Request 2 registers starting at 0x0001
  uint8_t result = node.readInputRegisters(0x0004, 1);
  Serial.println("Data Requested");

  if (result == node.ku8MBSuccess) {
    // Get response data from sensor
    Serial.print("Temperature: ");
    Serial.print(uint16_t(node.getResponseBuffer(0) / 10.00F));
    
    //Serial.print("   Humidity: ");
   // Serial.println(float(node.getResponseBuffer(1) / 10.00F));
  }
  delay(1000);
}

 

Bez_tytułu_2.png

(edytowany)

Masz może przejściówkę modbus - uart? Sprawdziłbym adresy tego czujnika jakimś programem bezpośrednio na PC np: https://www.modbus.pl/modbus-master/

A przykładowa ramka odczytu ma wyglądać:

chrome_J5bKcnEHlF.thumb.png.a4ec511b7db5a2a6bb0262b6f5aa9f98.png

Nie wiem jak dokładnie działa funkcja readInputRgister czy nie powinno być:

uint8_t result = node.readInputRegisters(0x0000, 2); // dwa rejestry od adresu 0x00

CRC jest wyliczane automatycznie? Spróbuj też odczytać więcej niż jeden bajt z funkcji read input reg

EDIT ewentualnie przetestuj jeszcze komendę readHoldingReg... z tymi samymi parametrami

Edytowano przez _LM_
  • Lubię! 1
(edytowany)

TX-->DI

RX-->DO 

Piny sterowania przepływem.. Cholewka teraz nie pamiętam zostaw narazie nie podłączone bo program potrafi sterować zp TX

Daj mi chwilę, sprawdzę coś 

Edytowano przez _LM_
(edytowany)

_LM_ ozłoćić Ciebie to mało. Królu złoty coś ruszyło.

Nie wiem dokładnie co oznaczają te rejestry tzn wiem, że rejestr 0x0004 podaje 16 bitowową liczbę a rejestr 0x0003 odczyt. 

Tak jak pisałeś zmieniłem na readHolding i tak wstawiłem rejestry

Mam wlane 4cm wody pokazuje 3.70cm chyba jest ok?

  // Request 2 registers starting at 0x0001
   // uint8_t result = node.readInputRegisters(0x0001, 2);
   uint8_t result = node.readHoldingRegisters(0x0004, 1);
  Serial.println("Data Requested");

  if (result == node.ku8MBSuccess) {
    // Get response data from sensor

    Serial.println(float(node.getResponseBuffer(0) / 10.00F));

  }
  delay(1000);

 

Edytowano przez nebraska
  • Lubię! 1
(edytowany)

ok da się użyć tej przejściówki, sprawdziłem na liczniku co go studiuję od pewnego czasu. Ustaw tak jak na screenie z tym że z pędkością 9600 i swój COM ofc

ModbusMaster64bit_7ZKnnq4lZC.thumb.png.a4ea37a6f3d1fc87129fd18e258d10f6.png

 

Edytowano przez _LM_

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...