• 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
SPI sterowanie pinem SS
#11
(04-05-2021, 22:44)Jarewa0606 napisał(a): daj przed w loop

  u8g2.clearBuffer(); 

Serial.println("Dalej");

i zobacz czy wypluwa to w serialu.... 

Jak wypluwa to zamień na u8g2.begin ();

Wstawiłem zgodnie z sugestiami. 

Kod:
#include <SPI.h>
#include <LoRa.h>
#include <U8g2lib.h>


String temperatura;
String cisnienie;
String wilgotnosc;
String bateria;

#define ss_lcd 2 //LCD
#define sclk 14 // LCD
#define mosi 13 // LCD

#define ss 15  // LoRa
#define rst 12 //LoRa

U8G2_ST7920_128X64_F_SW_SPI u8g2(U8G2_R2, sclk, mosi ,ss_lcd, U8X8_PIN_NONE);

void setup() {
  u8g2.begin ();
  u8g2.clearBuffer();
  u8g2.setFont (u8g2_font_ncenB14_tr); 
  u8g2.setCursor (15,30);
  u8g2.print("TEST 1 ");
  u8g2.sendBuffer ();
  delay(3000);

  //początek konfiguracji LoRa

  Serial.begin(9600);
  Serial.println("LoRa odbiornik");
  LoRa.setPins(ss,rst);
  if (!LoRa.begin(433E6))
  {
   Serial.println("Starting LoRa failed!");
   delay(100);
    while (1);
  }
   Serial.println("LoRa Started");

} //KONIEC SETUP

void loop()  {
int pos1, pos2, pos3;
int packetSize = LoRa.parsePacket();
if (packetSize)
{
  String LoRaData = LoRa.readString();
  while (LoRa.available())
  {
    ((char)LoRa.read());
  }
  pos1 = LoRaData.indexOf('/');
  pos2 = LoRaData.indexOf('&');
  pos3 = LoRaData.indexOf('!');

  temperatura = LoRaData.substring(0,pos1);
  cisnienie = LoRaData.substring(pos1 + 1, pos2);
  wilgotnosc = LoRaData.substring(pos2 +1, pos3);
  bateria = LoRaData.substring(pos3 +1, LoRaData.length());

  Serial.println(temperatura);
  Serial.println(cisnienie);
  Serial.println(wilgotnosc);
  Serial.println(bateria);
  Serial.println("KONTROLA3");
 
}
  Serial.println("KONTROLA4");
  u8g2.begin ();
  u8g2.clearBuffer();
  u8g2.setFont (u8g2_font_ncenB14_tr);  
  u8g2.setCursor(2,16);
  u8g2.print("EKRAN W LOOP");
  u8g2.sendBuffer ();

} // KONIEC LOOP

Teraz nie mam komunikacji z LoRa. Jeśli usunę fragment z loop odpowiedzialny za ekran, wtedy otrzymuję na serial monitorze dane z LoRa. Zastanawiam się, czy może zdefiniować zmienną true/false, która będzie się zmieniać po otrzymaniu danych z LoRa. Gdy otrzymam true, wyświetlę dane na ekranie i zmienną zmienię na false.
 
Odpowiedź
#12
Biblioteki się gryzą żeby to rozwiązać musiał byś przejrzeć je i o ile da radę ustawić SPI na sztywno, bo w tym przypadku każde urządzenie ma inna konfigurację SPI...

ogólnie to by działało tak na skróty

void loop() {
int pos1, pos2, pos3;

LoRa.begin (); // myślę ze chyba, albo przepisać ze setupa...
int packetSize = LoRa.parsePacket();
if (packetSize)
{
String LoRaData = LoRa.readString();
while (LoRa.available())
{
((char)LoRa.read());
}
pos1 = LoRaData.indexOf('/');
pos2 = LoRaData.indexOf('&');
pos3 = LoRaData.indexOf('!');

temperatura = LoRaData.substring(0,pos1);
cisnienie = LoRaData.substring(pos1 + 1, pos2);
wilgotnosc = LoRaData.substring(pos2 +1, pos3);
bateria = LoRaData.substring(pos3 +1, LoRaData.length());

Serial.println(temperatura);
Serial.println(cisnienie);
Serial.println(wilgotnosc);
Serial.println(bateria);
Serial.println("KONTROLA3");

}
Serial.println("KONTROLA4");
u8g2.begin ();
u8g2.clearBuffer();
u8g2.setFont (u8g2_font_ncenB14_tr);
u8g2.setCursor(2,16);
u8g2.print("EKRAN W LOOP");
u8g2.sendBuffer ();

} // KONIEC LOOP


Czyli za każdym razem jak zmieniasz urządzenie to inicjalizacja urządzenia wykonać....
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#13
Inicjalizacja urządzenia nie działa poprawnie dla obu urządzeń na raz w loop, tak jak dopisałeś. Jak zainicjalizuję pierwsze to drugie nie działa i odwrotnie. Jedyne co mi przychodzi do głowy to "rozdzielenie" ich programowo, i inicjalizowanie drugiego jeśli pierwsze spełni określony warunek.


Kod:
#include <SPI.h>
#include <LoRa.h>
#include <U8g2lib.h>


String temperatura;
String cisnienie;
String wilgotnosc;
String bateria;

boolean stan=0;

#define ss_lcd 2 //LCD
#define sclk 14 // LCD
#define mosi 13 // LCD

#define ss 15  // LoRa
#define rst 12 //LoRa

U8G2_ST7920_128X64_F_SW_SPI u8g2(U8G2_R2, sclk, mosi ,ss_lcd, U8X8_PIN_NONE);

void setup() {
  u8g2.begin ();
  u8g2.clearBuffer();
  u8g2.setFont (u8g2_font_ncenB14_tr); 
  u8g2.setCursor (15,30);
  u8g2.print("TEST 1 ");
  u8g2.sendBuffer ();
  delay(3000);

  //początek konfiguracji LoRa

  Serial.begin(9600);
  Serial.println("LoRa odbiornik");
  LoRa.setPins(ss,rst);
  if (!LoRa.begin(433E6))
  {
   Serial.println("Starting LoRa failed!");
   delay(100);
    while (1);
  }
   Serial.println("LoRa Started");

} //KONIEC SETUP

void loop(){

int pos1, pos2, pos3;
int packetSize = LoRa.parsePacket();
if (packetSize)
{
  String LoRaData = LoRa.readString();
  while (LoRa.available())
  {
    ((char)LoRa.read());
  }
  pos1 = LoRaData.indexOf('/');
  pos2 = LoRaData.indexOf('&');
  pos3 = LoRaData.indexOf('!');

  temperatura = LoRaData.substring(0,pos1);
  cisnienie = LoRaData.substring(pos1 + 1, pos2);
  wilgotnosc = LoRaData.substring(pos2 +1, pos3);
  bateria = LoRaData.substring(pos3 +1, LoRaData.length());

  Serial.println(temperatura);
  Serial.println(cisnienie);
  Serial.println(wilgotnosc);
  Serial.println(bateria);
  stan=1;
  Serial.println(stan);
  }

while(stan==1)
   {
  Serial.println("KONTROLA4");
  stan=0;
  Serial.println(stan);
  u8g2.begin ();
  u8g2.clearBuffer();
  u8g2.setFont (u8g2_font_ncenB10_tr);
  u8g2.setCursor(2,16);
  u8g2.print("EKRAN W LOOP");
  u8g2.sendBuffer ();
   }
 
}// KONIEC LOOP

Problem w tym, że pętla wykonuje się tylko raz.
 
Odpowiedź
#14
Żeby to było czytelne i miało sens rodziel tak

void LCD (){
// program wykonawczy dla lcd

u8g2.begin ();
u8g2.clearBuffer();
u8g2.setFont (u8g2_font_ncenB10_tr);
u8g2.setCursor(2,16);
u8g2.print("EKRAN W LOOP");
u8g2.sendBuffer ();
}

void Lora(){
//program wykonawczy dla komunikacji

int pos1, pos2, pos3;
LoRa.begin ();
int packetSize = LoRa.parsePacket();
if (packetSize)
{
String LoRaData = LoRa.readString();
while (LoRa.available())
{
((char)LoRa.read());
}
pos1 = LoRaData.indexOf('/');
pos2 = LoRaData.indexOf('&');
pos3 = LoRaData.indexOf('!');

temperatura = LoRaData.substring(0,pos1);
cisnienie = LoRaData.substring(pos1 + 1, pos2);
wilgotnosc = LoRaData.substring(pos2 +1, pos3);
bateria = LoRaData.substring(pos3 +1, LoRaData.length());

Serial.println(temperatura);
Serial.println(cisnienie);
Serial.println(wilgotnosc);
Serial.println(bateria);
}

void setup(){

}

void loop(){

LCD();
Lora();

}


A pożniej właśnie dajesz jakes flagi żeby coś się wykonało jak coś zostanie spełnione i robisz naprzykład

void loop(){

if(stan){
LCD();
}else{
Lora();

}
}


Staraj się unikać funkcji blokujących unikaj "while" jak ognia...
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#15
Nic z tego. Jedno urządzenie wyklucza drugie. A w obecnej wersji programu na serial monitorze otrzymuje "krzaki" i pewnie dlatego dalsza część programu z moją flagą dla LCD się nie wykonuje. 

Kod:
#include <SPI.h>
#include <LoRa.h>
#include <U8g2lib.h>


String temperatura;
String cisnienie;
String wilgotnosc;
String bateria;

float flaga = 0;

#define ss_lcd 2 //LCD
#define sclk 14 // LCD
#define mosi 13 // LCD

#define ss 15  // LoRa
#define rst 12 //LoRa

U8G2_ST7920_128X64_F_SW_SPI u8g2(U8G2_R2, sclk, mosi ,ss_lcd, U8X8_PIN_NONE);

void LCD (){
// program wykonawczy dla lcd
u8g2.begin ();
u8g2.clearBuffer();
u8g2.setFont (u8g2_font_ncenB10_tr);
u8g2.setCursor(2,16);
u8g2.print("EKRAN W LOOP");
u8g2.sendBuffer ();
}

void Lora(){
//program wykonawczy dla komunikacji
int pos1, pos2, pos3;
LoRa.begin(433E6);
int packetSize = LoRa.parsePacket();
flaga=packetSize;
if (packetSize)
{
String LoRaData = LoRa.readString();
while (LoRa.available())
{
((char)LoRa.read());
}
pos1 = LoRaData.indexOf('/');
pos2 = LoRaData.indexOf('&');
pos3 = LoRaData.indexOf('!');

temperatura = LoRaData.substring(0,pos1);
cisnienie = LoRaData.substring(pos1 + 1, pos2);
wilgotnosc = LoRaData.substring(pos2 +1, pos3);
bateria = LoRaData.substring(pos3 +1, LoRaData.length());


Serial.println(temperatura);
Serial.println(cisnienie);
Serial.println(wilgotnosc);
Serial.println(bateria);

if (packetSize > 0)
  {
  flaga = 1;
  }
else
  {
  flaga = 0;
  }

Serial.println(flaga);
}
}

void setup(){
  Serial.begin(9600);
  }
 
void loop(){

if (flaga == 1 )
  {
  LCD();
  }
else
  {
  Lora();
  }
}

Zacząłem szukać pinów SPI w bibliotekach ale nigdy nie modyfikowałem bibliotek więc nie za bardzo wiem co zmienić aby piny SPI były ustawione na sztywno. 

Od LCD
Kod:
class U8G2_ST7920_128X64_F_SW_SPI : public U8G2 {
  public: U8G2_ST7920_128X64_F_SW_SPI(const u8g2_cb_t *rotation, uint8_t clock, uint8_t data, uint8_t cs, uint8_t reset = U8X8_PIN_NONE) : U8G2() {
    u8g2_Setup_st7920_s_128x64_f(&u8g2, rotation, u8x8_byte_arduino_4wire_sw_spi, u8x8_gpio_and_delay_arduino);
    u8x8_SetPin_3Wire_SW_SPI(getU8x8(), clock, data, cs, reset);
  }

Od LoRa

Kod:
#if defined(ARDUINO_SAMD_MKRWAN1300)
#define LORA_DEFAULT_SPI           SPI1
#define LORA_DEFAULT_SPI_FREQUENCY 200000
#define LORA_DEFAULT_SS_PIN        LORA_IRQ_DUMB
#define LORA_DEFAULT_RESET_PIN     -1
#define LORA_DEFAULT_DIO0_PIN      -1
#elif defined(ARDUINO_SAMD_MKRWAN1310)
#define LORA_DEFAULT_SPI           SPI1
#define LORA_DEFAULT_SPI_FREQUENCY 200000
#define LORA_DEFAULT_SS_PIN        LORA_IRQ_DUMB
#define LORA_DEFAULT_RESET_PIN     -1
#define LORA_DEFAULT_DIO0_PIN      LORA_IRQ
#else
#define LORA_DEFAULT_SPI           SPI
#define LORA_DEFAULT_SPI_FREQUENCY 8E6
#define LORA_DEFAULT_SS_PIN        10
#define LORA_DEFAULT_RESET_PIN     9
#define LORA_DEFAULT_DIO0_PIN      2
#endif

#define PA_OUTPUT_RFO_PIN          0
#define PA_OUTPUT_PA_BOOST_PIN     1

Mówiąc krótko utknąłem  Dodgy .
 
Odpowiedź
#16
bo źle resetujesz flagę a najlepsze jeszcze ze to float Big Grin a float to cieżko trafić by był równy "1" i "0".  Flagi to najlepiej BOOLa  jest albo nie ma... Nawet jak u ciebie działało to się zatrzymało na LCD bo tam nie resetowałeś flagi.


Spróbuj bez zmian

Kod:
[code]#include <SPI.h>
#include <LoRa.h>
#include <U8g2lib.h>


String temperatura;
String cisnienie;
String wilgotnosc;
String bateria;

bool flaga = false;

#define ss_lcd 2 //LCD
#define sclk 14 // LCD
#define mosi 13 // LCD

#define ss 15  // LoRa
#define rst 12 //LoRa

U8G2_ST7920_128X64_F_SW_SPI u8g2(U8G2_R2, sclk, mosi ,ss_lcd, U8X8_PIN_NONE);

void LCD (){
// program wykonawczy dla lcd

flaga = false;

u8g2.begin ();
u8g2.clearBuffer();
u8g2.setFont (u8g2_font_ncenB10_tr);
u8g2.setCursor(2,16);
u8g2.print("EKRAN W LOOP");
u8g2.sendBuffer ();
}

void Lora(){
//program wykonawczy dla komunikacji
int pos1, pos2, pos3;
LoRa.begin(433E6);
int packetSize = LoRa.parsePacket();

if (packetSize)
{

flaga =true;

String LoRaData = LoRa.readString();
while (LoRa.available())
{
((char)LoRa.read());
}
pos1 = LoRaData.indexOf('/');
pos2 = LoRaData.indexOf('&');
pos3 = LoRaData.indexOf('!');

temperatura = LoRaData.substring(0,pos1);
cisnienie = LoRaData.substring(pos1 + 1, pos2);
wilgotnosc = LoRaData.substring(pos2 +1, pos3);
bateria = LoRaData.substring(pos3 +1, LoRaData.length());


Serial.println(temperatura);
Serial.println(cisnienie);
Serial.println(wilgotnosc);
Serial.println(bateria);


Serial.println(flaga);
}
}

void setup(){
  Serial.begin(9600);
  }

void loop(){

if (flaga)
  {
  LCD();
  }
else
  {
  Lora();
  }
}
[/code]
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości