RE: SPI sterowanie pinem SS - los.88 - 05-05-2021
(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.
RE: SPI sterowanie pinem SS - Jarewa0606 - 05-05-2021
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ć....
RE: SPI sterowanie pinem SS - los.88 - 05-05-2021
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.
RE: SPI sterowanie pinem SS - Jarewa0606 - 05-05-2021
Ż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...
RE: SPI sterowanie pinem SS - los.88 - 06-05-2021
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 .
RE: SPI sterowanie pinem SS - Jarewa0606 - 07-05-2021
bo źle resetujesz flagę a najlepsze jeszcze ze to float 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]
RE: SPI sterowanie pinem SS - los.88 - 07-05-2021
Po pierwszej pętli program się zatrzymywał, że tak powiem .
Wgrałem Twój kod, jednak na serial monitorze dostaję "krzaki" (⸮⸮fL⸮U⸮`⸮⸮), a pętla LCD się nie wykonuje. Jak dodam w setupie
Kod: LoRa.setPins(ss,rst);
if (!LoRa.begin(433E6))
{
Serial.println("Starting LoRa failed!");
delay(100);
while (1);
}
Serial.println("LoRa Started");
i usunę LoRa.begin(433E6) z void Lora, to otrzymuję dane z Lora na serial monitorze (jednak odbieram dane tylko raz), na LCD pojawia się EKRAN W LOOP ( podobnie jak z Lora tylko raz). Chyba muszę pogrzebać w bibliotekach aby ustawić piny na sztywno o ile się uda.
RE: SPI sterowanie pinem SS - Jarewa0606 - 07-05-2021
A nie teraz zauwazyłem
Gdzie się zapodziało to z wczesniejszych kodów??
LoRa.setPins(ss,rst);
Tego małeś nie wycinać.
Wiec dodaj to i nie zmieniaj kodu co podałem...
Bo widzę że nie wiesz co robi beging(); ?? to jest przekonfigurowanie SPI w locie wiec nie usuwaj go z viod lora i lcd bo program nie będzie działał przed odczytem z lory musisz przekonfigurować spi dla lory tak samo jak przed wyświetleniem musisz przekonfigurować spi dla lcd.. Kiedy usuniesz to jak zrobiłeś to program sie zawiesi bo drugie "kółko" procesora i odczyt z lory zostaje przekonfigurowany SPI dla LCD..
RE: SPI sterowanie pinem SS - los.88 - 07-05-2021
Mam dodane cały czas. Nie jest wycięte. Błędnie wkleiłem wersje nie z tego okne IDE. W tej wersji program nie wyświetla danych w serial monitorze i na LCD również nic się nie pojawia.
Kod: #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.setPins(ss,rst);
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();
}
}
RE: SPI sterowanie pinem SS - Jarewa0606 - 08-05-2021
Tu jeszcze błąd
#define rst 12 //LoRa
Nie możesz wykorzystać to RST bo to pin SPI MISO znajdź inny pin wolny...
Podał byś schemat podłączeń..
|