Przesyłanie po UDP/RS232 wartości liczbowych.

Masz pomysł na funkcjonalność lub koncepcję na rozwój projektu. Opisz wszystko tutaj.
User avatar
klew
Posts: 9704
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

Myślę, że jeden Wemos wystarczy.
Masz już jakiś konwerter RS232 do UART?
Kiedy będzie Supla Offline Party / SOP#2025 ?
User avatar
Duch__
Posts: 1934
Joined: Wed Aug 24, 2016 7:26 pm
Location: Opole

Post

O część sprzętową nie trzeba się martwić.
Image
User avatar
klew
Posts: 9704
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

Duch__ wrote: Mon Aug 09, 2021 11:25 am O część sprzętową nie trzeba się martwić.
Nie robiłem jeszcze nic na RS232, ale robiłem na RS435 i tam inaczej wygląda implementacja w zależności od rodzaju użytego konwertera.
Także założyłem, że będziemy to tworzyć pod konkretny sprzęt :)

Urządzenia trzeba odpytywać o dane, czy wysyłają je cyklicznie bez pytania? Ile urządzeń mamy na magistralę? Jedno czy więcej? Jeśli więcej, to jak wygląda adresacja?
Kiedy będzie Supla Offline Party / SOP#2025 ?
User avatar
Duch__
Posts: 1934
Joined: Wed Aug 24, 2016 7:26 pm
Location: Opole

Post

A nie lepiej bez kombinacji zrobić jaką daną odbierze ze wskazanym prefiksem to ma ją wyświetlić i tyle. Wysyłanie może być cykliczne co 1 sekundę. Danych nie więcej niż 16.
Image
User avatar
klew
Posts: 9704
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

Duch__ wrote: Mon Aug 09, 2021 12:28 pm A nie lepiej bez kombinacji zrobić jaką daną odbierze ze wskazanym prefiksem to ma ją wyświetlić i tyle. Wysyłanie może być cykliczne co 1 sekundę. Danych nie więcej niż 16.
Można to zrobić najprościej jak się da, ale najpierw trzeba to jakoś określić :).

Z powyższego opisu wnioskuję, że na RS232 będzie podłączone jedno urządzenie do Wemosa. To urządzenie będzie np. co 1 s wysyłać paczkę danych, w ktorej będzie przesyłane kilkanaście parametrów, tak?

Co do samych wartości przesyłanych w parametrach - najłatwiej jest przesyłać liczby całkowite jako int16, lub int32 (zależnie jaki zakres danych tam może się pojawić). W zależności od tego jaką chcesz mieć precyzję, można np wysyłać "temperatura * 100" (dla dokładności 0.01), wtedy liczba 250 oznacza 2.5 stopnia. Int w formacie u2 complement (domyślny na większości platform/procesorów), wtedy ramka miałaby postać:
FE,FE,01,temperatura ,FE,F0
gdzie temperatura to 4 bajty (dla int32) kodowana j/w.
Kiedy będzie Supla Offline Party / SOP#2025 ?
User avatar
Duch__
Posts: 1934
Joined: Wed Aug 24, 2016 7:26 pm
Location: Opole

Post

klew wrote: Mon Aug 09, 2021 12:53 pm Z powyższego opisu wnioskuję, że na RS232 będzie podłączone jedno urządzenie do Wemosa. To urządzenie będzie np. co 1 s wysyłać paczkę danych, w ktorej będzie przesyłane kilkanaście parametrów, tak?
Kilkanaście pojedynczych parametrów. Czyli transmisja wszystkich 16 parametrów zajmie mniej niż 16 sekund.
klew wrote: Mon Aug 09, 2021 12:53 pm FE,FE,01,temperatura,FE,F0
Pasuje mi to jak najbardziej.
klew wrote: Mon Aug 09, 2021 12:53 pm "temperatura * 100" (dla dokładności 0.01), wtedy liczba 250 oznacza 2.5 stopnia.
To również.
Image
User avatar
Duch__
Posts: 1934
Joined: Wed Aug 24, 2016 7:26 pm
Location: Opole

Post

Nieśmiało podbiję temat i zapytam czy coś ruszyło w temacie?
Image
krycha88
Posts: 5417
Joined: Fri Nov 16, 2018 7:25 am

Post

Jeżeli umiesz wyciągnąć te wartości to przesłanie ich za pomocą SuplaDevice jest już proste ;)
https://gui-generic-builder.supla.io/
LakiLuck
Posts: 12
Joined: Thu Mar 03, 2022 8:03 am

Post

WItam
Trafiłem na podobny problem i nie umiem sobie poradzić :(
Po kolei...chyba rzuciłem się z motyką na słońce, bo w ogóle z Suplą i jakimkolwiek programowaniem zacząłem 2 mies temu, a wszystko dlatego, że chciałbym mieć podgląd parametrów instalacji solarnej Rotex w Supla.
Kupiłem moduł ESP2866 NodeMCU v3.0, po wielu przebojach udało mi się dojść do momentu, że dzięki GUI Generic wgrałem obsługę czujnika temperatury, licznika impulsów itp i dzięki temu po naprawdę wielu morderczych godzinach w końcu w aplikacji działa wszystko jak powinno dla takich urządzeń. Z drugiej strony że nie mam słów podziwu dla tych którzy stworzyli GUI....mistrzostwo świata!!!
Niestety tego co mnie naprawdę interesuje nie znalazłem więc doszedłem do wniosku, że muszę sam coś stworzyć, ale jestem zupełnie zielony jak aplikacja Supla. Doczytuję i szukam więc doprowadziło mnie to do tego, że zainstalowałem Arduino IDE i zaczynam coś pisać Udało mi się umęczyć program który o dziwo łączy się z suplą i poprzez proste wł/wył steruję niebieską diodą na NodeMCU i na to byłby koniec moich możliwości (dane wrażliwe zaznaczyłem jako ********


#include <SuplaDevice.h>
#include <supla/control/relay.h>
#include <supla/network/esp_wifi.h>
#include <supla/control/button.h>

Supla::ESPWifi wifi("******", "******");

const char* srv_addr = "***********";
const char* srv_email = "*************";
char znak;

Supla::Control::Relay relay(LED_BUILTIN); // zapalanie diody z supli
Supla::Control::Button button(D5, false);

void setup() {
Serial.begin(9600);
pinMode(LED_BUILTIN, OUTPUT); // Initialize the LED_BUILTIN pin as an output
uint8_t mac[6];
WiFi.macAddress(mac);
char GUID[SUPLA_GUID_SIZE] = {******************************************************};
char AUTHKEY[SUPLA_AUTHKEY_SIZE] = {**********************************************};


SuplaDevice.begin(GUID,srv_addr,srv_email,AUTHKEY);
}
void loop() {
SuplaDevice.iterate();
if (Serial.available ()>0){
znak = Serial.read ();
//Serial.print ("Otrzymano: ");
Serial.print (znak);
}
}



Do rzeczy: Sterownik instalacji solarnej rotex Solaris R3 jest wyjście RS232, poziom napięć 5 V więc dostosowałem go do poziomu NodeMCU 3,3V. W rotex ustawiam pr transmisji 9600, okres wysyłania np co 10s. Przykładowe dane które teoretycznie jestem w stanie dostać znalazłem gdzieś na francuskim forum mają postać (czyli wartości liczbowe oddzielone średnikiem):
0 ; 0 ; 0 ; 0 ; 38 ; 17 ; 22 ; 12 ; 0,0
0 ; 0 ; 100 ; 1 ; 39 ; 17 ; 22 ; 12 ; 0,0
0 ; 1 ; 100 ; 1 ; 36 ; 18 ; 22 ; 25 ; 7, 7
0 ; 1 ; 88 ; 0 ; 31 ; 18 ; 22 ; 22 ; 5,3
0 ; 0 ; 75 ; 0 ; 28 ; 18 ; 23 ; 21 ; 3,8
0 ; 0 ; 63 ; 0 ; 28 ; 18 ; 23 ; 22 ; 3,1
0 ; 0 ; 50 ; 0 ; 28 ; 18 ; 23 ; 24 ; 2,5
itd ........

Dokładnie są to:
0;0; P1; P2; Tk; Tr; Ts,Tv; V

P1: prędkość obrotowa pompy P1 w % (63%, 75%, 83% , 100% itd)
P2: pompa P2 włączona/wyłączona, 0 lub 1
Tk: Temperatura kolektorów
Tr: Temperatura w dolnej części zbiornika (tak naprawdę ta woda idzie do paneli
Ts: Temperatura górnej części zbiornika
Tv: Temperatury wody która wraca do zbiornika
V: przepływ wody powracającej do zbiornika (l / min)

O ile mam nadzieję, że taką ramkę danych uda mi się uzyskać to nie wiem co dalej. Jak to w ogóle ugyżć żeby dostać te wartości w SUPLA. Czy trzeba to rozbić na pojedyncze zmienne czy też jako całość Supla jest w stanie to jakoś rozróżnić? Powiem szczerze, że dalej stoję przy ścianie.
Pomożecie ruszyć dalej?

jeszcze sam program odnośnie odbioru danych z Rotex bez elementów SUPLA:

char array[] = "0;0;P1;P2;Tk;Tr;Ts;Tv;V";
char *strings[10];
char *ptr = NULL;
String odebraneDane="";

void setup()
{
Serial.begin(9600);
//Serial.print(array);
byte index = 0;
ptr = strtok(array, ":;"); // takes a list of delimiters
while(ptr != NULL)
{
strings[index] = ptr;
index++;
ptr = strtok(NULL, ":;"); // takes a list of delimiters
}
//Serial.println(index);
// print the tokens
for(int n = 0; n < index; n++)
{
Serial.println(strings[n]);
}
}

void loop()
{
if (Serial.available()>0)//czy arduino odebrało dane?
//Serial.available(). Funkcja ta zwraca ilość bajtów,
//które zostały odebrane i czekają na obsługę przez Arduino.
{
odebraneDane = Serial.readStringUntil('\n');
Serial.println("\nRotex "+odebraneDane);
// put your main code here, to run repeatedly:

}
}
User avatar
klew
Posts: 9704
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

LakiLuck wrote: Fri Mar 04, 2022 7:38 am Dokładnie są to:
0;0; P1; P2; Tk; Tr; Ts,Tv; V

P1: prędkość obrotowa pompy P1 w % (63%, 75%, 83% , 100% itd)
P2: pompa P2 włączona/wyłączona, 0 lub 1
Tk: Temperatura kolektorów
Tr: Temperatura w dolnej części zbiornika (tak naprawdę ta woda idzie do paneli
Ts: Temperatura górnej części zbiornika
Tv: Temperatury wody która wraca do zbiornika
V: przepływ wody powracającej do zbiornika (l / min)
Czy udało Ci się zrobić odczyt tych danych w programie?
Jeśli tak, to mogę pomóc dalej (o ile jeszcze tego nie ogarnąłeś). Tylko daj znać na jakich kanałach chciałbyś to mieć widoczne. Ja bym proponował:
P1 - kanał wilgotności (daje nam wartość w %)
P2 - sensor binarny? Widziałbyś stan on/off
Tx - termometry (4 osobne kanały)
V - na to chyba nie ma kanału z jednostką (l/min) - także albo czekamy na "kanał pomiarowy ogólnego przeznaczenia", albo można dane wrzucić do kanału termometru.

Wklej tutaj lub wyślij do mnie kod, który poprawnie odczytuje dane, a pomogę z resztą.
Kiedy będzie Supla Offline Party / SOP#2025 ?

Return to “Pomysły i koncepcje”