Stránka 1 z 1

Displej + nRF24L01

Napsal: 07 úno 2021, 11:45
od Auja
Ahoj všem, mám takový dotaz. Potřeboval bych připojit k desce mini Pro 2,8"displej SPI s řadičem ILI9341 a bezdrátový modul nRF24L01. Jde to vůbec? Děkuji za odpověď.

Re: Displej + nRF24L01

Napsal: 08 úno 2021, 13:42
od ondraN
Tak, SPI port to zvládne v pohodě, ale je otázka, jak jsou napsané knihovny a jestli dovolí sdílení SPI. Po zkušenostech s nimi, bych si spíše tipoval, že to nepůjde, ale vlastní zkušenost s takovouto kombinací nemám.

Re: Displej + nRF24L01

Napsal: 08 úno 2021, 14:31
od pavel1tu
Na SPI můžeš připojit teoreticky kolik chceš zařízení.
Co jsem vyčetl (ale i to využívám), musí se splnit
- jen jeden Master na komunikaci (tedy zatím jsem nezkoušel 2xMASTER)
- u všech SLAVE zařízení vstup SS (Slave Select) - kterým se navolí s kým zrovna komunikuješ
- knihovny napsané tak, aby toto vše výše bylo možné - displeje na SPI jsem měl jen 2 a ani jedna knihovna toto nespňovala.

Ale normálně z ATMega obsluhuji 2 i 3 "komunikační" moduly na SPI a funguje mi to ;)

Re: Displej + nRF24L01

Napsal: 09 úno 2021, 21:45
od Auja
Děkuji za odpovědi. Jsem úplný začátečník, tak v tom docela plavu. Našel jsem toto: https://www.14core.com/nrf24l01-i2ctwi- ... p-guide/ . Už mám objednané, jak modul dorazí, vyzkouším a dám vědět.

Re: Displej + nRF24L01

Napsal: 10 úno 2021, 08:13
od RomanB
RF modul připoj na HW SPI piny a displej na jiné, které si definuješ v nastavení displeje.

Re: Displej + nRF24L01

Napsal: 26 úno 2021, 11:54
od Auja
Zdravím všechny bastlíře a programátory. Komunikační modul I2C / TWI pro NRF24L01 mi dorazil. Hned jsem jej zapojil abych vyzkoušel funkčnost a zda mi bude vyhovovat k mému projektu. Po nahrání ukázkového kódu jak do vysílače, tak do přijímače se mi na seriálu krásně zobrazovalo jak moduly krásně komunikují. Byl jsem nadšený, ale jen do doby kdy jsem v kódu cokoliv změnil. Nedokázal jsem odeslat ani "Hello World". Po několika hodinovém brouzdání po internetu docházím k závěru, že komunikační modul na prd. Je k němu velmi málo informací, více méně žádné. Tak snad časem...
Vrátit jsem se tedy ke klasickému zapojení s použitím arduina Una, nRF24L01 a 1,3" displej ST7789 240 x 240 jako přijímač. Vysílač Uno, NRF24L01 a nějaký senzor, použil jsem BME280.
Displej je zapojen, jak mi poradil RomanB. Chvíli trvalo najít správnou knihovnu pro komunikaci s displejem (Arduino_ST7789.h), ne každá při takovém zapojení funguje. Uvedu příklad použití jiné knihovny: Už sice nevím které, ale na displeji se zobrazila hodnota teplota, tlak apod. Jenže při dalším příjmu se hodnoty nepřepsaly, ale jako by se vrstvily jedna na druhou. Nevím, jak to správně popsat, zkrátka za nějakou dobu se displeji zobrazovaly místo čísel úplné nesmysly.
Teď vše funguje podle mých představ, jen mám jedinou výtku – Písmo (font). Projekt je v podstatě obyčejný teploměr, který bude umístěný ve zdi v elektroinstalační krabici. Na displeji chci mít teplotu zobrazenou velkými čísli – Jdu kolem a mrknu a vím jaká je teplota. Nemusím nikde mžourat na malá čísla. Problém je v tom, při zvětšení základního fontu glcdfont knihovny Adafruit GFX nejsou číslice pěkná. Jsou zubatá, desetinná tečka působí docela rušivě a okolní čísla dost odděluje. V projektu používám setTextSize(10). Existují krásné fonty např. od velice šikovného Poláka: cbm80amiga · GitHub . Bohužel se mi ni nepodařilo zprovoznit. Lámu si s tím hlavu už přes týden, ale vše je marné. Nemá někdo z vás nějaký nápad? Budu rád za jakoukoliv radu. Děkuji.

PS: Přikládám kód, možná se bude někomu hodit.
V přijímači je pro zjednodušení nastavení pro teplotu a napětí.

Vysílač:

Kód: Vybrat vše


/*
 Arduino UNO
 
   nRF24L01
  .............
  :1 3 5 7    :   
  :o o o o    :   
  :o o o o    :   
  :2 3 6 8    :
  :           :
  :           :  
  :           : 
  :           : 
  :...........:  
  
  1 - GND  -  GND
  2 - VCC  -  3V3
  3 - CE   -  9
  4 - CSN  -  10
  5 - SCK  -  13
  6 - MOSI -  11
  7 - MISO -  12
  8 - IRQ  -  NC
*/

  
#include <SPI.h>
#include <Wire.h>
#include "nRF24L01.h"
#include "RF24.h"
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

#define POT 0 // Pin A0 UNO

Adafruit_BME280 bme; // I2C

struct package
{
  float temperature ;
  float pressure;
  float humidity ;
  float pressureicao;
  float voltage;
};
typedef struct package Package;
Package data;

RF24 radio(9, 10); // CE, CSN
const byte address[6] = "00001";

void setup(void)
{
     Serial.begin(9600);
     radio.begin();
     radio.openWritingPipe(address);
   //radio.setDataRate(RF24_250KBPS);
     radio.setPALevel(RF24_PA_MAX);
     radio.stopListening();
     bme.begin(0x76);
}
void loop()
{
     readSensor();
     radio.write(&data, sizeof(data));

  Serial.println("----Test spojení----");
  Serial.print("Temperature = ");
  Serial.print(bme.readTemperature());
  Serial.println(" ºC");
  Serial.print("Pressure = ");
  Serial.print(bme.readPressure() / 100); // 100 Pa = 1 millibar
  Serial.println(" mb");
  Serial.print("Humidity = ");
  Serial.print(bme.readHumidity());
  Serial.println(" %");
  Serial.print("Approx altitude = ");
  Serial.print(bme.readAltitude(1013.25));
  Serial.println(" m");
  Serial.print("Voltage = ");
  Serial.print(data.voltage);
  Serial.println(" V");
  Serial.print("--------------------------------\n\n");
  delay(3000);
}

void readSensor()
{
  data.humidity = bme.readHumidity();
  data.temperature = bme.readTemperature();
  data.pressure = bme.readPressure() / 100.0;      
  data.pressureicao = (((bme.readPressure() / 100.0)-8) / pow(1 - ((0.0065 * 241) / (data.temperature + (0.0065 * 241) + 273.15)), 5.257));
                                  // korekce chyby: -8 hPa
  data.voltage = analogRead(POT);
  data.voltage = data.voltage * 5 / 1024;
}
Přijímač:

Kód: Vybrat vše

/*
 Arduino UNO
 
   nRF24L01
  .............
  :1 3 5 7    :   
  :o o o o    :   
  :o o o o    :   
  :2 3 6 8    :
  :           :
  :           :  
  :           : 
  :           : 
  :...........:  
  
  1 - GND  -  GND
  2 - VCC  -  3V3
  3 - CE   -  9
  4 - CSN  -  10
  5 - SCK  -  13
  6 - MOSI -  11
  7 - MISO -  12
  8 - IRQ  -  NC
 
 
 ST7789 240x240 IPS 

 o 01 GND -> GND
 o 02 VCC -> VCC (jen 3.3V !)
 o 03 SCL -> 3/SCK
 o 04 SDA -> 4/MOSI
 o 05 RES -> 5
 o 06 DC  -> 6
 o 07 BLK -> NC
*/

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Arduino_ST7789.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <RF24_config.h>

#define TFT_DC 6
#define TFT_MOSI 4
#define TFT_SCLK 3
#define TFT_RST 5
#define SCR_WD 240
#define SCR_HT 240

Arduino_ST7789 tft = Arduino_ST7789(TFT_DC, TFT_RST, TFT_MOSI, TFT_SCLK);

struct package
{
  float temperature;
  float humidity;
  float pressure;
  float pressureicao;
  float voltage;
};   

typedef struct package Package;
Package data;

RF24 radio(9, 10); // CE, CSN
const byte address[6] = "00001";

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

  radio.begin();
  radio.setPALevel(RF24_PA_MAX);
//radio.setDataRate( RF24_250KBPS ) ;
  radio.openReadingPipe(0, address);
  radio.startListening();
  tft.init(SCR_WD, SCR_HT);
  tft.fillScreen(BLUE);
  tft.setTextColor(WHITE, BLUE);
  tft.setTextSize(3);
  tft.setCursor(22, 5);
  tft.print("TEMPERATURE");
  tft.setTextSize(2);
  tft.setCursor(35, 220);
  tft.print("Voltage:");
}

void loop()
{
  if (radio.available())
  {
    radio.read(&data, sizeof(data));
    float temperature = data.temperature;
    float voltage = data.voltage;  
    tft.setTextSize(10);
    tft.setCursor(0, 85); 
    tft.print(temperature, 1);
    tft.setTextSize(2);
    tft.setCursor(135, 220);
    tft.print(voltage);
    tft.println(" V");
  } 
  Serial.println("----Test spojení----");
  Serial.print("Temperature = ");
  Serial.print(data.temperature);
  Serial.println(" °C");
  Serial.print("Voltage = ");
  Serial.print(data.voltage);
  Serial.println(" V");
  Serial.print("--------------------------------\n\n");
  delay(1000);
}

Obrázek

Re: Displej + nRF24L01

Napsal: 26 úno 2021, 18:18
od Auja
Přikládám ještě obrázek displeje:
displej.png
displej.png (171.02 KiB) Zobrazeno 2594 x
První pokus s přidáním obrázku se mi nezdařil, spěchal jsem k zubaři.