Skocz do zawartości

ESP32 problem komunikacji klient serwer


krzyszo

Pomocna odpowiedź

Hej, na wstępie piszę że poniższe programy są zlepkiem innych, a problem polega ma odczycie danych miedzy klientem a serwerem.

Problem występuje w momencie dekodowania wysłanych danych do serwera. Program w 70% realizuje się dobrze  lecz pewna linijka programu jest mi nie znana i to może tutaj coś jest pokrzaczone, dlatego proszę o pomoc i wytłumaczenie.

to tak klient:

#include <WiFi.h>
#include <WiFiUdp.h>

//kumunikacja po SPI//

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// If using software SPI (the default case):
#define OLED_MOSI  13 //D7
#define OLED_CLK   14 //D5
#define OLED_DC    4 //D2
#define OLED_CS    15 //D8
#define OLED_RESET 5 //D1
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

WiFiUDP Udp;
unsigned int localUdpPort = 4210;  // local port to listen on
IPAddress ip(192, 168, 4, 1);

int wil;
float Ubat;

void setup()
{
  Serial.begin(115200);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
  pinMode(34,INPUT);
  pinMode(35,INPUT);
  pinMode(37,OUTPUT);
  Serial.begin(115200);
  Serial.println();

  WiFi.begin("borowka", "123456789");

  Serial.print("Connecting");
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println();

  Serial.print("Connected, IP address: ");
  Serial.println(WiFi.localIP());
}

void loop() {

while (WiFi.status() != WL_CONNECTED)
{
  WiFi.reconnect();
  delay(10000);
 Serial.print(".Reconnected");
  Serial.println(WiFi.localIP());
}

//zbieram dane///

int wilg = analogRead(34);
wil = map(wilg,260,740, 100, 0);
Serial.println(wil);

int adc_val = analogRead(35);
Ubat = adc_val * 0.0163233370083;
Serial.print(adc_val);
Serial.print(" - ");
Serial.print(Ubat);
Serial.println("V");

//wyśietlam dane//

  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 1);
  display.println("Wilgotnosc:");
  
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(70, 0);
  display.println(wil);

  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(110, 0);
  display.println("%");

  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 15);
  display.println("Vcc Bateri:");

  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(70, 16);
  display.println(Ubat);

  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 25);
  display.println("PUMP OFF");
  
  delay (1000);
  display.display();

//wysyłam dane//

Udp.beginPacket(ip, localUdpPort);
Udp.write(wil); // wysyłany jeden bajt
Udp.write(Ubat); //wysyłany jeden bajt
Udp.endPacket();
Serial.print("Wysłano\n");
delay(5000);
}

i serwer;

 

#include <WiFi.h>
#include <WiFiClient.h>
#include <WiFiAP.h>
#include <WiFiUdp.h>
#include <stdlib.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
 
LiquidCrystal_I2C lcd(0x3F,16,2);

WiFiServer server(80);                // Set a object server as a WiFiServer class
IPAddress IP(192,168,4,1);           // Select ip and mask
IPAddress mask = (255, 255, 255, 0);
WiFiUDP Udp;

unsigned int localUdpPort = 4210;  // local port to listen on
char incomingPacket[255]; // buffer for incoming packets
char incomingPacket1[255];// wyciecie litery z ramki UDP aby przekonwertowac String na float

float wil;
float Ubat;

// The devices that want to connect to our Access Point will need to use the next credentials.
char ssid[] = "borowka";           // SSID for the Access Point 
char pass[] = "123456789";         // password for the Access Point

void setup() {

  //Tworzenie serwera//
  
  Serial.begin(115200);
  Serial.print("Setting soft-AP ... ");
  Serial.println(WiFi.softAP("borowka", "123456789") ? "Ready" : "Failed!");
  IPAddress myIP = WiFi.softAPIP();
  Serial.print("AP IP address: ");
  Serial.println(myIP);
  server.begin();     // Begin the server
  Udp.begin(localUdpPort);
  
  //Serial.printf("Now listening at IP %d, UDP port %d\n", WiFi.softAPIP(), localUdpPort);
  Serial.print("Now listening at IP: ");
  Serial.print(WiFi.softAPIP());
  Serial.print(" UDP PORT: ");
  Serial.print(localUdpPort);
  Serial.println(" TCP PORT: 80 ");

  //tworzenie obiektu LCD//
  lcd.init(); // initialize the lcd
  lcd.backlight();
}

void loop() {
WiFiUDP Udp;
  //UDP:
  int packetSize = Udp.parsePacket();
  if (packetSize)
  {
    // receive incoming UDP packets
    Serial.printf("Dostalem po UDP: Received %d bytes from %s, port %d\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort());
    int len = Udp.read(incomingPacket, 255);
    Serial.printf("UDP packet contents: %s\n", incomingPacket);
    
    if (incomingPacket[0]=='t'){ //sprawdzanie jaka wartosc przyszla ()
    for (int i=1; i<7; i++){      // wyciecie litery z ramki UDP aby przekonwertowac String na float
      incomingPacket1[i-1]=incomingPacket[i];
    }
    String msg = String(incomingPacket1);   //konwersja string na float
    float jakasliczba = msg.toFloat();      //konwersja string na float
    Serial.print("Wilgotnosc wynosi :");   
    Serial.println(jakasliczba);
    wil=jakasliczba;
    }
    
    if (incomingPacket[0]=='h'){
    for (int i=1; i<7; i++){
      incomingPacket1[i-1]=incomingPacket[i];
    }
    String msg = String(incomingPacket1);
    float jakasliczba = msg.toFloat();
    Serial.print("Bateria wynosi :");
    Serial.println(jakasliczba);
    Ubat=jakasliczba;
    }
    if (len > 0)
    {
      incomingPacket[len] = 0;
    }}

delay(100);

    //wyświetlanie pobranej zawartości


lcd.setCursor(0,0);
lcd.print(wil);
Serial.println(wil);
lcd.setCursor(1,0);
lcd.print(Ubat);
Serial.println(Ubat);

delay(1000);
    }
    

 

   

I tak klient komunikacja po SPI do wyświetlacza. Analogi ESP32 34 i 35 IO pokazują dane. (z dzielnika i sondy) do tego poprawnie połączył z serwerem. wszystko śledze po komunikacji monitora szeregowego.

I serwer, komunikacja z LCD po I2C ale wyświetla same krzaki, mimo że dane w monitorze szeregowym to 0,00 i 0,00 więc dlaczego je nie wyświetli a same krzaki?

podpięto pod sda i scl czyli IO SCL->22 i SDA ->21, czy to dobrze? (ale raczej nie). ESP32 to wroover, ale wersja z pcb anteną czyli ESP32-S. I dlaczego odbiera same wartości zerowe?

Za wszelkie porady sugestie doprowadzające mnie do rozwiązania problemu będę wdzięczny. Prosiłbym aby nie podać odrazu rozwiązania na tacy, chcialbym się coś nauczyć.

Edytowano przez krzyszo
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.