Добрый вечер, коллеги.
Прошу помощи с подключением нескольких уст-в по 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 я понял, что модули надо использовать по очереди, первое отключил-второе включил-данные принял-второе отключил и включил первое.
карточка мне там нафиг не нужна, поэтому её можно погасить не трогать, но как это сделать я так и не понял.
на всякий случай код передатчика
03 | #include <Adafruit_Sensor.h> |
11 | const uint64_t pipe = 0xF0F1F2F3F4LL; |
13 | DHT dht(DHTPIN, DHTTYPE); |
27 | radio.setDataRate(RF24_1MBPS); |
30 | radio.setPALevel(RF24_PA_HIGH); |
32 | radio.openWritingPipe(pipe); |
43 | float h = dht.readHumidity(); |
44 | float t = dht.readTemperature(); |
46 | radio.write(&dht, sizeof (data)); |
48 | Serial .print( "Humidity (%): " ); |
51 | Serial .print( "Temperature (oC): " ); |
и код приемника
001 | #include <Adafruit_GFX.h> // Core graphics library |
002 | #include <Adafruit_Sensor.h> |
010 | DHT dht(DHTPIN, DHT22); |
012 | const uint64_t pipe = 0xF0F1F2F3F4LL; |
020 | #include <MCUFRIEND_kbv.h> |
053 | #define MAGENTA 0xF81F |
068 | radio.setDataRate(RF24_1MBPS); |
071 | radio.setPALevel(RF24_PA_HIGH); |
073 | radio.openReadingPipe(1,pipe); |
074 | radio.startListening(); |
079 | Serial .println(F( "TFT LCD test" )); |
082 | #ifdef USE_ADAFRUIT_SHIELD_PINOUT |
083 | Serial .println(F( "Using Adafruit 3.2\" TFT Arduino Shield Pinout" )); |
085 | Serial .println(F( "Using Adafruit 3.2\" TFT Breakout Board Pinout" )); |
088 | Serial .print( "TFT size is " ); Serial .print(tft.width()); Serial .print( "x" ); Serial .println(tft.height()); |
092 | uint16_t identifier = tft.readID(); |
094 | if (identifier == 0x9325) { |
095 | Serial .println(F( "Found ILI9325 LCD driver" )); |
096 | } else if (identifier == 0x9328) { |
097 | Serial .println(F( "Found ILI9328 LCD driver" )); |
098 | } else if (identifier == 0x7575) { |
099 | Serial .println(F( "Found HX8347G LCD driver" )); |
100 | } else if (identifier == 0x9341) { |
101 | Serial .println(F( "Found ILI9341 LCD driver" )); |
102 | } else if (identifier == 0x8357) { |
103 | Serial .println(F( "Found HX8357D LCD driver" )); |
104 | } else if (identifier == 0x4747) { |
105 | Serial .println(F( "Found HX8347A LCD driver" )); |
107 | else if (identifier == 0x9326) { |
108 | Serial .println(F( "Found ILI9326 LCD driver" )); |
109 | } else if (identifier == 0x9327) { |
110 | Serial .println(F( "Found ILI9327 LCD driver" )); |
112 | else if (identifier == 0x65) { |
113 | Serial .println(F( "Found HX8352B LCD driver" )); |
116 | Serial .print(F( "Unknown LCD driver chip: " )); |
117 | Serial .println(identifier, HEX); |
118 | Serial .println(F( "If using the Adafruit 2.8\" TFT Arduino shield, the line:" )); |
119 | Serial .println(F( " #define USE_ADAFRUIT_SHIELD_PINOUT" )); |
120 | Serial .println(F( "should appear in the library header (Adafruit_TFT.h)." )); |
121 | Serial .println(F( "If using the breakout board, it should NOT be #defined!" )); |
122 | Serial .println(F( "Also if using the breakout, double-check that all wiring" )); |
123 | Serial .println(F( "matches the tutorial." )); |
127 | tft.begin(identifier); |
128 | tft.fillScreen(BLACK); |
133 | tft.setTextColor(BLUE); tft.setTextSize(2); |
134 | tft.println( "Indoor" ); |
135 | tft.setCursor(205, 1); |
137 | tft.setTextColor(BLUE); tft.setTextSize(2); |
138 | tft.println( "Outdoor" ); |
139 | tft.setCursor(2, 45); |
141 | tft.setTextColor(BLUE); tft.setTextSize(2); |
142 | tft.println( "Home humidity" ); |
143 | tft.setCursor(205, 45); |
145 | tft.setTextColor(BLUE); tft.setTextSize(2); |
146 | tft.println( "Street humidity" ); |
157 | float h = dht.readHumidity(); |
158 | float t = dht.readTemperature(); |
161 | tft.setCursor(2, 20); |
162 | tft.fillRect(2,20, 144, 24, BLACK); |
163 | tft.setTextColor(GREEN); tft.setTextSize(2); |
164 | tft.print(sensor.temp()); |
167 | tft.setCursor(205, 20); |
168 | tft.fillRect(205,20, 144, 24, BLACK); |
171 | tft.setTextColor(RED); tft.setTextSize(2); |
174 | tft.setTextColor(GREEN); tft.setTextSize(2); |
178 | tft.setCursor(2, 65); |
179 | tft.fillRect(2,65, 144, 24, BLACK); |
180 | tft.setTextColor(GREEN); tft.setTextSize(2); |
185 | tft.setCursor(205, 65); |
186 | tft.fillRect(205,65, 144, 24, BLACK); |
187 | tft.setTextColor(GREEN); tft.setTextSize(2); |
190 | tft.setCursor(220, 85); |
191 | tft.fillRect(220,85, 144, 24, WHITE); |
192 | tft.setTextColor(BLACK); tft.setTextSize(2); |
196 | tft.drawRoundRect (0, 0, 190, 240, 5, GREEN); |
197 | tft.drawRoundRect (200, 0, 190, 240, 5, GREEN); |
201 | digitalWrite(33,LOW); |
202 | if (radio.available()){ |
203 | radio.read(&data, sizeof (data)); |
205 | Serial .print( "Humidity (%): " ); |
206 | Serial .println(data[1]); |
207 | Serial .print( "Temperature (oC): " ); |
208 | Serial .println(data[0]); |
209 | float h = dht.readHumidity(); |
210 | float t = dht.readTemperature(); |
211 | Serial .print( "Hum: " ); |
213 | Serial .print( " %\t" ); |
214 | Serial .print( "Temp: " ); |
216 | Serial .println( " *C " ); |
Повторюсь, оба кода полностью рабочие, до тех пор, пока я физически не воткну в мегу дисплей. Я уж подумывал ноги у него по откусывать, но не хочется портить.
Подскажите, как победить эту карту и отдать SPI радиомодулю? лучше программно т.к. планирую заменить на меге DHT22 на BME280/680
Заранее благодарю