Многострадальный SPI (nrf24l01+tft)

Нет ответов
frenzy
Offline
Зарегистрирован: 14.03.2019

Добрый вечер, коллеги.

Прошу помощи с подключением нескольких уст-в по SPI, а именно: радиомодуль nrf24l01 и tft open smart

Радиомодуль представлять, надеюсь, не надо, а вот дисплей вот такой вот:

3.2″ TFT HX8352B LCD Display Module Touch Screen Shield Onboard Temperature Sensor + Pen for Arduino UNO R3 / Mega 2560 R3 / Leonardo. Описание и фотто доступны тут (Большие фотки)

И так, что в наличии и чего хотел получить.

1. Передатчик. Передает данные по радиоканалу на головное уст-во (сейчас передает данные с датчика dht11)

2. Приемник Mega 2560, tft, hrf24l01. принимает данные и показывает их на экране.

Суть проблемы: передатчик все отлично передает, к нему вопросов нет. А вот мега, исправно принимает данные, но ровно до того момента, пока я в неё не воткну дисплей. На дисплее есть слот для SD карты и как я понимаю они с радиомодулем не могут поделить шину. Почитав про SPI я понял, что модули надо использовать по очереди, первое отключил-второе включил-данные принял-второе отключил и включил первое.

карточка мне там нафиг не нужна, поэтому её можно погасить не трогать, но как это сделать я так и не понял. 

на всякий случай код передатчика

#include <DHT.h>
#include <DHT_U.h>
#include <Adafruit_Sensor.h>
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h> // https://github.com/maniacbug/RF24


#define DHTPIN 2
#define DHTTYPE DHT11
const uint64_t pipe = 0xF0F1F2F3F4LL; // индитификатор передачи, "труба"

DHT dht(DHTPIN, DHTTYPE);
//dht11 sensor;
RF24 radio(9, 10); // CE, CSN
 
void setup(){
  Serial.begin(9600);
  
  radio.begin();
  delay(2);
  radio.setChannel(9); // канал (0-127)
    
    // скорость, RF24_250KBPS, RF24_1MBPS или RF24_2MBPS
    // RF24_250KBPS на nRF24L01 (без +) неработает.
    // меньше скорость, выше чувствительность приемника.
  radio.setDataRate(RF24_1MBPS); 
   
    // мощьность передатчика, RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_MED=-6dBM,
  radio.setPALevel(RF24_PA_HIGH);   

  radio.openWritingPipe(pipe); // открываем трубу на передачу.
  delay(1000);
} 


void loop()   
{
  int data[2];   
  
  dht.read(8);
  
  float h = dht.readHumidity(); //Измеряем влажность
  float t = dht.readTemperature(); //Измеряем температуру
  
  radio.write(&dht, sizeof(data)); // отправляем данные и указываем сколько байт пакет
  
  Serial.print("Humidity (%): ");
  Serial.println(h);

  Serial.print("Temperature (oC): ");
  Serial.println(t);
  delay(1000);
} 

 

и код приемника 

#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

#define DHTPIN 31
DHT dht(DHTPIN, DHT22);

const uint64_t pipe = 0xF0F1F2F3F4LL; // индитификатор передачи, "труба"

RF24 radio(49, 33); // CE, CSN

#include <Wire.h>
#include <LM75.h>


#include <MCUFRIEND_kbv.h>
//----------------------------------------|
// TFT Breakout  -- Arduino UNO / Mega2560 / OPEN-SMART UNO Black
// GND              -- GND
// 3V3               -- 3.3V
// CS                 -- A3
// RS                 -- A2
// WR                -- A1
// RD                 -- A0
// RST                -- RESET
// LED                -- GND
// DB0                -- 8
// DB1                -- 9
// DB2                -- 10
// DB3                -- 11
// DB4                -- 4
// DB5                -- 13
// DB6                -- 6
// DB7                -- 7

MCUFRIEND_kbv tft;
LM75 sensor;  // initialize an LM75 object





// Assign human-readable names to some common 16-bit color values:
#define  BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF

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


   radio.begin();  
  delay(2);
  radio.setChannel(9); // канал (0-127)
  
    // скорость, RF24_250KBPS, RF24_1MBPS или RF24_2MBPS
    // RF24_250KBPS на nRF24L01 (без +) неработает.
    // меньше скорость, выше чувствительность приемника.
  radio.setDataRate(RF24_1MBPS);     
  
    // мощьность передатчика RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_MED=-6dBM,
  radio.setPALevel(RF24_PA_HIGH);   
    
  radio.openReadingPipe(1,pipe); // открываем первую трубу с индитификатором "pipe"
  radio.startListening(); // включаем приемник, начинаем слушать трубу

  
  Wire.begin();
  dht.begin();
  Serial.println(F("TFT LCD test"));

 
#ifdef USE_ADAFRUIT_SHIELD_PINOUT
  Serial.println(F("Using Adafruit 3.2\" TFT Arduino Shield Pinout"));
#else
  Serial.println(F("Using Adafruit 3.2\" TFT Breakout Board Pinout"));
#endif

  Serial.print("TFT size is "); Serial.print(tft.width()); Serial.print("x"); Serial.println(tft.height());

  tft.reset();

  uint16_t identifier = tft.readID();

  if(identifier == 0x9325) {
    Serial.println(F("Found ILI9325 LCD driver"));
  } else if(identifier == 0x9328) {
    Serial.println(F("Found ILI9328 LCD driver"));
  } else if(identifier == 0x7575) {
    Serial.println(F("Found HX8347G LCD driver"));
  } else if(identifier == 0x9341) {
    Serial.println(F("Found ILI9341 LCD driver"));
  } else if(identifier == 0x8357) {
    Serial.println(F("Found HX8357D LCD driver"));
  } else if(identifier == 0x4747) {
    Serial.println(F("Found HX8347A LCD driver"));
  } 
    else if(identifier == 0x9326) {
    Serial.println(F("Found ILI9326 LCD driver"));
  }  else if(identifier == 0x9327) {
    Serial.println(F("Found ILI9327 LCD driver"));
  } 
  else if(identifier == 0x65) {
    Serial.println(F("Found HX8352B LCD driver"));
  } 
    else {
    Serial.print(F("Unknown LCD driver chip: "));
    Serial.println(identifier, HEX);
    Serial.println(F("If using the Adafruit 2.8\" TFT Arduino shield, the line:"));
    Serial.println(F("  #define USE_ADAFRUIT_SHIELD_PINOUT"));
    Serial.println(F("should appear in the library header (Adafruit_TFT.h)."));
    Serial.println(F("If using the breakout board, it should NOT be #defined!"));
    Serial.println(F("Also if using the breakout, double-check that all wiring"));
    Serial.println(F("matches the tutorial."));
    return;
  }

  tft.begin(identifier);
  tft.fillScreen(BLACK);
tft.setRotation(1);

  tft.setCursor(2, 1);
 // tft.fillRect(0,1, 144, 24, BLACK);
  tft.setTextColor(BLUE);  tft.setTextSize(2);
  tft.println("Indoor");
  tft.setCursor(205, 1);
 // tft.fillRect(190,1, 144, 24, BLACK);
  tft.setTextColor(BLUE);  tft.setTextSize(2);
  tft.println("Outdoor");
  tft.setCursor(2, 45);
  //tft.fillRect(0,45, 144, 24, BLACK);
  tft.setTextColor(BLUE);  tft.setTextSize(2);
  tft.println("Home humidity");
  tft.setCursor(205, 45);
  //tft.fillRect(190,45, 144, 24, BLACK);
  tft.setTextColor(BLUE);  tft.setTextSize(2);
  tft.println("Street humidity");

} 




void loop()   
{


  float h = dht.readHumidity(); //Измеряем влажность
  float t = dht.readTemperature(); //Измеряем температуру
  tft.setRotation(1); //ориентация экрана
  //выводим температуру
  tft.setCursor(2, 20);
  tft.fillRect(2,20, 144, 24, BLACK); //прямоугольник нужен для заливки фона, иначе цифры наползут со старых значений
  tft.setTextColor(GREEN);  tft.setTextSize(2);
  tft.print(sensor.temp());
  tft.println(" C");

  tft.setCursor(205, 20);
  tft.fillRect(205,20, 144, 24, BLACK);
  if (t > 26)
  {
  tft.setTextColor(RED);  tft.setTextSize(2);
  }
  else 
  tft.setTextColor(GREEN);  tft.setTextSize(2);
  tft.print(t);
  tft.println(" C");
  
  tft.setCursor(2, 65);
  tft.fillRect(2,65, 144, 24, BLACK);
  tft.setTextColor(GREEN);  tft.setTextSize(2);
  tft.print(h);
  tft.println("%");


  tft.setCursor(205, 65);
  tft.fillRect(205,65, 144, 24, BLACK);
  tft.setTextColor(GREEN);  tft.setTextSize(2);
  tft.print("%");

  tft.setCursor(220, 85);
  tft.fillRect(220,85, 144, 24, WHITE);
  tft.setTextColor(BLACK);  tft.setTextSize(2);
  tft.print("test");


  tft.drawRoundRect (0, 0, 190, 240, 5, GREEN); //рисуем прямоугольники
  tft.drawRoundRect (200, 0, 190, 240, 5, GREEN); 


  int data[2];
  digitalWrite(33,LOW);
  if (radio.available()){ // проверяем не пришло ли чего в буфер.
    radio.read(&data, sizeof(data)); // читаем данные и указываем сколько байт читать
    
      Serial.print("Humidity (%): ");
      Serial.println(data[1]);
      Serial.print("Temperature (oC): ");
      Serial.println(data[0]);
 float h = dht.readHumidity(); //Измеряем влажность
  float t = dht.readTemperature(); //Измеряем температуру
  Serial.print("Hum: ");
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temp: ");
  Serial.print(t);
  Serial.println(" *C ");
  
  delay(1000);
    } 
    
} 

Повторюсь, оба кода полностью рабочие, до тех пор, пока я физически не воткну в мегу дисплей. Я уж подумывал ноги у него по откусывать, но не хочется портить.

Подскажите, как победить эту карту и отдать SPI радиомодулю?  лучше программно т.к. планирую заменить на меге DHT22 на BME280/680

Заранее благодарю