Многострадальный SPI (nrf24l01+tft)
- Войдите на сайт для отправки комментариев
Добрый вечер, коллеги.
Прошу помощи с подключением нескольких уст-в по 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
Заранее благодарю