12-10-2019, 12:29
Jakoś nie mogłem wytrzymać i podaję rybę na wędce
Kod nadajnika
Kod odbiornika
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.
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.