Arduino MEGA + W5100

andrew01
Posty: 82
Rejestracja: pt maja 24, 2019 6:49 am

czw lis 21, 2019 8:38 pm

Panowie,

w swoim projekcie na Arduino Mega + Ethernet Shield W5100 dodałem 8 termometrów, dla których wartości pobieram z lokalnej aplikacji webowej. Samo pobieranie danych, występujące nie częściej niż co 10 sekund, wpiąłem w supla_timer() i w zasadzie to działa, czasem jednak widzę, że Supla rozłącza się i łączy ponownie, w związku z tym chciałbym zapytać czy wykorzystywanie W5100 do własnych celów (obok transmisji związanej z Suplą) jest bardzo kolidujące z Suplą oraz czy poniższy kod (poglądowy, pominąłem w nim zabawę ze stringami i zamianę na wartości) jest w miarę zgodny ze sztuką?

Kod: Zaznacz cały

EthernetClient pumaClient;
unsigned long pumaLastTime = 0;
unsigned long pumaNow;

void supla_timer()
{
   pumaNow = millis(); 
   
   if (pumaNow - pumaLastTime > 10000)
   {
      pumaClient.stop();
   
      if (pumaClient.connect(pumaServer, 80)) 
      {
         //Serial.println("connected");
         // Make a HTTP request:
         pumaClient.println("GET /arduino.aspx HTTP/1.1");
         pumaClient.println("Host: 192.168.2.3");
         pumaClient.println("Connection: close"); 
         pumaClient.println();
      }
  
      delay(10);

      while (pumaClient.connected()) 
      {
         while(pumaClient.available()) 
         {
            char c = pumaClient.read();
            Serial.print(c);
         }
      }
      pumaLastTime = millis();
   }
}
Pozdrawiam
Andrzej
Awatar użytkownika
klew
Posty: 659
Rejestracja: czw cze 27, 2019 12:16 pm

czw lis 21, 2019 10:26 pm

Gubienie połączenia z serwerem pojawia się na bibliotece na Arduino, gdy jest więcej niż kilka kanałów, które są aktualizowane w tym samym momencie. Już chyba przy 3-4 termometrach połączenie zaczyna się często gubić.
Nie jest to raczej związane z W5100, bo mam obok Wemos D1 mini i na nim zachowanie jest identyczne, a połączenie idzie przez Wifi na ESP8266.

Chętnie bym zobaczył trochę logów z konsoli z komunikacji, to sprawdzę czy widzisz ten sam problem co ja mam u siebie. Jeśli możesz, to wrzuć bibliotekę z tego repo:
https://github.com/klew/arduino/tree/develop

i odkomentuj tą linię:
https://github.com/klew/arduino/blob/0b ... nfig.h#L10

Wtedy na Serial będzie wrzucana komunikacja z serwerem w stylu: [12 32 63 0 ....]
Podeślij proszę taki log na priv (tylko wytnij pierwszą linijkę po "register in progress", bo tam leci guid, lokalizacja, hasło ... ;) )


Prosty workaround, który powoduje, że problem znika to rozrzucenie odczytów termoemtrów w czasie. Wystarczy, że zamienisz "0" na aktualnie zakomentowany kod w tej linijce:
https://github.com/klew/arduino/blob/0b ... e.cpp#L407
andrew01
Posty: 82
Rejestracja: pt maja 24, 2019 6:49 am

czw lis 21, 2019 10:53 pm

Dzięki bardzo za odzew, z Twojego repo już obecnie korzystam :) zaraz zapuszczę układ z debugowaniem i jutro podeślę co wyszło.

Pozdrawiam
Andrzej
andrew01
Posty: 82
Rejestracja: pt maja 24, 2019 6:49 am

sob lis 23, 2019 11:10 pm

Zauważyłem jeden mały problem, mianowicie jeśli nastąpi rozłączenie z Suplą, w przypadku np. braku internetu lub gdy na Cloud'zie coś zmienimy np. nazwę kanału, to po ponownym połączeniu temperatury kanałów (dodanych jako SuplaDevice.addDS18B20Thermometer();) pozostają zerowe do czasu, aż ulegną zmianie. Temperatury, które nie zmieniają wartości (u mnie to np. nastawa temperatury CO w kotle na ekogroszek) pozostają zerowe, jedynym rozwiązaniem jest restart Arduino. W jaki sposób to najprościej obejść?

Pozdrawiam
Andrzej
Awatar użytkownika
klew
Posty: 659
Rejestracja: czw cze 27, 2019 12:16 pm

sob lis 23, 2019 11:50 pm

andrew01 pisze:
sob lis 23, 2019 11:10 pm
Zauważyłem jeden mały problem, mianowicie jeśli nastąpi rozłączenie z Suplą, w przypadku np. braku internetu lub gdy na Cloud'zie coś zmienimy np. nazwę kanału, to po ponownym połączeniu temperatury kanałów (dodanych jako SuplaDevice.addDS18B20Thermometer();) pozostają zerowe do czasu, aż ulegną zmianie. Temperatury, które nie zmieniają wartości (u mnie to np. nastawa temperatury CO w kotle na ekogroszek) pozostają zerowe, jedynym rozwiązaniem jest restart Arduino. W jaki sposób to najprościej obejść?

Pozdrawiam
Andrzej
Trzeba by to zachowanie poprawić w bibliotece. Jeśli Ci się spieszy z tym, to daj znać to jakiegoś quick fixa zrobimy
andrew01
Posty: 82
Rejestracja: pt maja 24, 2019 6:49 am

ndz lis 24, 2019 9:15 am

Nie, to nie jest bardzo pilne.

Pozdrawiam
Andrzej
andrew01
Posty: 82
Rejestracja: pt maja 24, 2019 6:49 am

śr gru 04, 2019 6:53 pm

W pliku SuplaDevice.cpp, w funcji onRegisterResult, w CASE'ie dla SUPLA_RESULTCODE_TRUE dodałem:

Kod: Zaznacz cały

      for (int a = 0; a < Params.reg_dev.channel_count; a++) { 
         if (Params.reg_dev.channels[a].Type == SUPLA_CHANNELTYPE_THERMOMETERDS18B20) {
            channel_pin[a].last_val_dbl1 = -275;
         }
      }
i śmiga aż miło :)

Pozdrawiam
Andrzej
Awatar użytkownika
klew
Posty: 659
Rejestracja: czw cze 27, 2019 12:16 pm

śr gru 04, 2019 9:48 pm

andrew01 pisze:
śr gru 04, 2019 6:53 pm
W pliku SuplaDevice.cpp, w funcji onRegisterResult, w CASE'ie dla SUPLA_RESULTCODE_TRUE dodałem:

Kod: Zaznacz cały

      for (int a = 0; a < Params.reg_dev.channel_count; a++) { 
         if (Params.reg_dev.channels[a].Type == SUPLA_CHANNELTYPE_THERMOMETERDS18B20) {
            channel_pin[a].last_val_dbl1 = -275;
         }
      }
i śmiga aż miło :)
Taka zmiana też poprawia sytuację. Ten błąd już jest od kilku dni poprawiony na https://github.com/klew/arduino/tree/develop
Tylko ja zmieniłem wartość, która jest wysyłana podczas rejestracji urządzenia na serwerze - jest od razu wysyłana odpowiednia wartość.
ODPOWIEDZ