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

Masz pomysł na funkcjonalność lub koncepcję na rozwój projektu. Opisz wszystko tutaj.
Awatar użytkownika
klew
Posty: 8184
Rejestracja: czw cze 27, 2019 12:16 pm
Lokalizacja: Wrocław

Myślę, że jeden Wemos wystarczy.
Masz już jakiś konwerter RS232 do UART?
Widzimy się na Supla Offline Party vol. 2 :!:
Awatar użytkownika
Duch__
Posty: 1779
Rejestracja: śr sie 24, 2016 7:26 pm
Lokalizacja: Opole

O część sprzętową nie trzeba się martwić.
Obrazek
Awatar użytkownika
klew
Posty: 8184
Rejestracja: czw cze 27, 2019 12:16 pm
Lokalizacja: Wrocław

Duch__ pisze: pn sie 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?
Widzimy się na Supla Offline Party vol. 2 :!:
Awatar użytkownika
Duch__
Posty: 1779
Rejestracja: śr sie 24, 2016 7:26 pm
Lokalizacja: Opole

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.
Obrazek
Awatar użytkownika
klew
Posty: 8184
Rejestracja: czw cze 27, 2019 12:16 pm
Lokalizacja: Wrocław

Duch__ pisze: pn sie 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.
Widzimy się na Supla Offline Party vol. 2 :!:
Awatar użytkownika
Duch__
Posty: 1779
Rejestracja: śr sie 24, 2016 7:26 pm
Lokalizacja: Opole

klew pisze: pn sie 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 pisze: pn sie 09, 2021 12:53 pm FE,FE,01,temperatura,FE,F0
Pasuje mi to jak najbardziej.
klew pisze: pn sie 09, 2021 12:53 pm "temperatura * 100" (dla dokładności 0.01), wtedy liczba 250 oznacza 2.5 stopnia.
To również.
Obrazek
Awatar użytkownika
Duch__
Posty: 1779
Rejestracja: śr sie 24, 2016 7:26 pm
Lokalizacja: Opole

Nieśmiało podbiję temat i zapytam czy coś ruszyło w temacie?
Obrazek
krycha88
Posty: 5187
Rejestracja: pt lis 16, 2018 7:25 am
Kontakt:

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
Posty: 12
Rejestracja: czw mar 03, 2022 8:03 am

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:

}
}
Awatar użytkownika
klew
Posty: 8184
Rejestracja: czw cze 27, 2019 12:16 pm
Lokalizacja: Wrocław

LakiLuck pisze: pt 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ą.
Widzimy się na Supla Offline Party vol. 2 :!:
ODPOWIEDZ

Wróć do „Pomysły i koncepcje”