• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Przesyłanie float po uart
#10
Jakoś nie mogłem wytrzymać i podaję rybę na wędce Smile

Kod nadajnika
Kod:
//Poniżej dane do UARTa programowego
#include <SoftwareSerial.h>
SoftwareSerial S1(A2, A1);//Serial nazywa się S1 (A1 i A2 to piny UARTa)



//Daklaracja struktur (łatwo się je wysyła i odbiera przez UART przez zamianę w string)

//Struktura danych do wysłania

struct Nadawanie {
  float Temp_Pompy_1;
  float Temp_Pompy_2;
  float Temp_Pompy_3;
} DaneDoWyslania;

char StringDoNadania[sizeof(DaneDoWyslania)]; //Deklaracja stringa do nadania

unsigned long ZapamietanyCzasNadawania;
unsigned long ZapamietanyCazsZmianyTemperatury;
unsigned long ZapamietanyCzasPrintowania;


void setup() {

  S1.begin(9600); // uruchomienie UARTa programowego
  Serial.begin (9600); //uruchamiamy UART aby podglądnąć dane
}

void loop()
{
  odczyt_danych (); // podprogram odczytu danych

  writeserial_S1(); // procedura wysyłania danych w "podprogramie"

  print_dane (); // skok do podprogramu aby podejżeć dane do wysłania
                 // można pominąć (zakomentować) jak wszystko OK

}

void writeserial_S1()  //--------------------------------------------------------------------------------------------
{
  if (millis() - ZapamietanyCzasNadawania > 2000UL) // Dane będą wysyłane co 2 sekundy
  {
    memcpy(StringDoNadania, &DaneDoWyslania, sizeof(DaneDoWyslania));
    S1.write(StringDoNadania, sizeof(DaneDoWyslania));
   
    ZapamietanyCzasNadawania = millis(); // tu zapamiętujemy czas kiedy wysłaliśmy dane
  }
}


void odczyt_danych ()
{
  // tu takie "cóś" abyś widział, że zmieniają się dane co 5 sekund
 
  if ( millis() -  ZapamietanyCazsZmianyTemperatury > 5000UL) // odczyt danych co 5 sekund
  {
    DaneDoWyslania.Temp_Pompy_1 = DaneDoWyslania.Temp_Pompy_1 + 1.25 ;
    DaneDoWyslania.Temp_Pompy_2 = DaneDoWyslania.Temp_Pompy_2 + 1.75 ;
    DaneDoWyslania.Temp_Pompy_3 = DaneDoWyslania.Temp_Pompy_3 + 1.50 ;
   
    ZapamietanyCazsZmianyTemperatury = millis(); //zapamiętujeny czs odczytu danych
  }
}

void print_dane () // tu podglądamy dane do wysłania co 1 sekundę
                   // można cały podprogram usunąc jak jest OK
{
  if (millis() - ZapamietanyCzasPrintowania > 1000UL) //Wyświetl dane co 1 sekundę
  {
    Serial.print ("Temperatura pompy 1  ");
    Serial.print (DaneDoWyslania.Temp_Pompy_1 , 1); //dokładność wyświetlania 1 miejsce po przecinku
    Serial.println (" *C");
    Serial.print ("Temperatura pompy 2  ");
    Serial.print (DaneDoWyslania.Temp_Pompy_2 , 2); //dokładność wyświetlania 2 miejsca po przecinku
    Serial.println (" *C");
    Serial.print ("Temperatura pompy 3  ");
    Serial.print (DaneDoWyslania.Temp_Pompy_3 , 3); //dokładność wyświetlania 3 miejsca po przecinku
    Serial.println (" *C");
    Serial.println (" ");
    ZapamietanyCzasPrintowania = millis();
  }
}

Kod odbiornika
Kod:
//Poniżej dane do UARTa programowego
#include <SoftwareSerial.h>
SoftwareSerial S1(A2, A1);//Serial nazywa się S1 (A1 i A2 to piny UARTa)



//Daklaracja struktur (łatwo się je wysyła i odbiera przez UART przez zamianę w string)

//Struktura danych odebranych

struct Odbior {
  float Temp_Pompy_1;
  float Temp_Pompy_2;
  float Temp_Pompy_3;
} DaneOdebrane;

char StringOdebrany[sizeof(DaneOdebrane)]; //Deklaracja stringa odebranego

unsigned long ZapamietanyCzasPrintowania;


void setup() {

  S1.begin(9600); // uruchomienie UARTa programowego
  Serial.begin (9600); //uruchamiamy UART aby podglądnąć dane
}

void loop()
{
  readserial_S1 ();
  print_dane ();

}

void readserial_S1 ()
{
  if (S1.available() > 0) // jak coś pojawi się w buforze odbiorczym
  {
    delay (100); // Czekamy aby wszystkie dane dotarły (czas czekania trochę przesadzony)
    if (S1.available() == sizeof(DaneOdebrane)) // gdy rozmiar danych się zgadza z przewidywanymi to
    {
      S1.readBytes(StringOdebrany, sizeof(DaneOdebrane)); //czytamy je
      memcpy(&DaneOdebrane, StringOdebrany, sizeof(DaneOdebrane)); // i pakujemy do struktury odbiorczej
    }
    else  // jak pójdzie coś nie tak to czyścimy bufor
    {
      while (S1.available() > 0)
      {
        int czyszczenie = S1.read();
      }
    }
  }
}

void print_dane () // wyświetlamy dane otrzymane
{
  if (millis() - ZapamietanyCzasPrintowania > 1000UL) //Wyświetl dane co 1 sekundę
  {
    Serial.print ("Temperatura pompy 1  ");
    Serial.print (DaneOdebrane.Temp_Pompy_1 , 1); //dokładność wyświetlania 1 miejsce po przecinku
    Serial.println (" *C");
    Serial.print ("Temperatura pompy 2  ");
    Serial.print (DaneOdebrane.Temp_Pompy_2 , 2); //dokładność wyświetlania 2 miejsca po przecinku
    Serial.println (" *C");
    Serial.print ("Temperatura pompy 3  ");
    Serial.print (DaneOdebrane.Temp_Pompy_3 , 3); //dokładność wyświetlania 3 miejsca po przecinku
    Serial.println (" *C");
    Serial.println (" ");
    ZapamietanyCzasPrintowania = millis();
  }
}

Myślę, że na podstawie tych przykładów coś się nauczysz.
Ja też uczyłem się na przykładach to nie są moje wymysły od "0"

Wyświetlanie wyników na wyświetlaczu sobie dopisz. Masz przykład jak "wyprintować" dane ze struktury, więc powinieneś sobie poradzić.
Jak zauważysz w przykładzie jest UART programowy, aby mieć wolny UART sprzętowy do podglądu. 
To jest jeden ze sposobów realizacji przesyłania danych po UART.
 
Odpowiedź
  


Wiadomości w tym wątku
Przesyłanie float po uart - przez omnixcrs - 08-10-2019, 20:16
RE: Przesyłanie float po uart - przez Jarewa0606 - 08-10-2019, 21:36
RE: Przesyłanie float po uart - przez omnixcrs - 09-10-2019, 22:04
RE: Przesyłanie float po uart - przez kaczakat - 10-10-2019, 01:09
RE: Przesyłanie float po uart - przez Jarewa0606 - 10-10-2019, 15:36
RE: Przesyłanie float po uart - przez kaczakat - 10-10-2019, 18:56
RE: Przesyłanie float po uart - przez Jarewa0606 - 10-10-2019, 20:03
RE: Przesyłanie float po uart - przez omnixcrs - 11-10-2019, 21:40
RE: Przesyłanie float po uart - przez kaczakat - 12-10-2019, 03:51
RE: Przesyłanie float po uart - przez Agregacik - 12-10-2019, 12:29

Skocz do:


Przeglądający: 1 gości