In den Berichten WEMOS D1 mini mit NRF24l01 und WEMOS D1 mini mit 240x320 2,4" TFT Display RGB habe ich die genannten Geräte getrennt an den WEMOS angeschlossen und erfolgreich in Betrieb nehmen können. Für beide Geräte wird der SPI-Bus zur Ansteuerung verwendet. Spannend war nun, ob beide Geräte gemeinsam am SPI-Bus laufen, weil einige WEMOS-Ports gemeinsam und einige Ports getrennt benutzt werden. Ich mußte zudem Anschlüsse des NRF24 auf andere Ports legen.
Die Programmanpassung (Verschmelzung) verlief relativ reibungslos. Lediglich der CSN-Pin vom NRF musste von D2 auf D8 gelegt werden weil der WEMOS-D2 Port vom Display als Chip Select-Anschluß benötigt wird. Unklar war, wie sich die eingebundenen Libraies untereinander vertragen, weil die Module beide den SPI-Bus nutzen, aber nur für das NRF24 die SPI-Lib eingebunden werden musste.
Das Display scheint dann die SPI-Lib nicht zu benötigen, weil das möglicherweise in den anderen Libs nachgebildet wird, ich habe mir aber noch nicht die Mühe gemacht, danach zu suchen.
Nach dem Kompilieren und Übertragen des neuen Programms auf den WEMOS konnten die übermittelten Daten vom Nano eingelesen werden, das konnte ich auf dem seriellen Monitor der Arduino IDE sehen. Allerdings war das Display weiß und regte sich nicht. Weder der Hintergrund wurde, wie definiert, blau eingefärbt, noch wurde ein Text angezeigt. Am naheliegensten war, dass ich beim Anschließen einen Fehler gemacht hatte, weil ich die Leitungen des Displays vom zweiten WEMOS auf den Ersten umgesteckt hatte.
Nach dem Vergleich der Anschlüsse und Ports konnte ich den Fehler schnell finden. Ursache war die Anordnung der WEMOS auf meinem Experimentierboard, beide WEMOS waren spiegelverkehrt auf dem Board und zwar punktsymmetrisch und nicht achsensymmetrisch. Darauf hatte ich in der erwartungsvollen Eile nicht geachtet.
Darum mein Tipp, immer alles in Ruhe und doppelt überprüfen. Der Fehler ist meist der Mensch!
Nachdem das behoben war, klappte es sofort. Das Display zeigte artig die per Funk übermittelte Statusänderungen am digitalen Eingangsport des Nanos an.
Die Belegung ist nun wie folgt:
Damit bliebe der Port D0 und der Analogeingang A0 des WEMOS frei für andere Zwecke.
Das Program für den WEMOS, als Empfänger sieht so aus:
Das Programm für den Nano ist das Gleiche in dem o.g. Thema WEMOS D1 mini mit NRF24l01
Ich füge das der Vollständigkeit halber aber bereinigt ein:
Fotos folgen asap
Die Programmanpassung (Verschmelzung) verlief relativ reibungslos. Lediglich der CSN-Pin vom NRF musste von D2 auf D8 gelegt werden weil der WEMOS-D2 Port vom Display als Chip Select-Anschluß benötigt wird. Unklar war, wie sich die eingebundenen Libraies untereinander vertragen, weil die Module beide den SPI-Bus nutzen, aber nur für das NRF24 die SPI-Lib eingebunden werden musste.
Das Display scheint dann die SPI-Lib nicht zu benötigen, weil das möglicherweise in den anderen Libs nachgebildet wird, ich habe mir aber noch nicht die Mühe gemacht, danach zu suchen.
Nach dem Kompilieren und Übertragen des neuen Programms auf den WEMOS konnten die übermittelten Daten vom Nano eingelesen werden, das konnte ich auf dem seriellen Monitor der Arduino IDE sehen. Allerdings war das Display weiß und regte sich nicht. Weder der Hintergrund wurde, wie definiert, blau eingefärbt, noch wurde ein Text angezeigt. Am naheliegensten war, dass ich beim Anschließen einen Fehler gemacht hatte, weil ich die Leitungen des Displays vom zweiten WEMOS auf den Ersten umgesteckt hatte.
Nach dem Vergleich der Anschlüsse und Ports konnte ich den Fehler schnell finden. Ursache war die Anordnung der WEMOS auf meinem Experimentierboard, beide WEMOS waren spiegelverkehrt auf dem Board und zwar punktsymmetrisch und nicht achsensymmetrisch. Darauf hatte ich in der erwartungsvollen Eile nicht geachtet.
Darum mein Tipp, immer alles in Ruhe und doppelt überprüfen. Der Fehler ist meist der Mensch!
Nachdem das behoben war, klappte es sofort. Das Display zeigte artig die per Funk übermittelte Statusänderungen am digitalen Eingangsport des Nanos an.
Die Belegung ist nun wie folgt:
WEMOS D1 mini | NRF24l01 | TFT RGB Display |
VCC | VCC | VCC und BLK |
G | GND | GND |
D0 | ||
D1 | CE | - |
D2 | - | CS |
D3 | - | RES |
D4 | - | DC |
D5 | SCK | CLK |
D6 | MISO | - |
D7 | MOSI | MOSI |
D8 | CSN | - |
Damit bliebe der Port D0 und der Analogeingang A0 des WEMOS frei für andere Zwecke.
Das Program für den WEMOS, als Empfänger sieht so aus:
C++:
/**********************************************************************
Programm für WEMOS D1 mini, zum Testen des gemeinsamen Betriebes eines
ILI9341 TFT display (240x320 pixel)zusammen mit einem NRF24l01 2,4GHz
Sendemoduls.
Angeschlossen ist:
NRF24 D1 - CE, D5 - SCK, D6 - MISO, D7 - MOSI, D8 - CSN
TFT D2 - CS, D3 - RES, D4 - DC, D5 - CLK, D7 - MOSI
**********************************************************************/
// Vereinbarungsteil NRF24
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
//create an RF24 object
//RF24 radio(D4, D8); // CE, CSN geht
// RF24 radio(D2, D8); // CE, CSN geht
RF24 radio(D1, D8); // CE, CSN geht
// Vereinbarungsteil Display
#include <Adafruit_GFX.h> // include Adafruit graphics library
#include <Adafruit_ILI9341.h> // include Adafruit ILI9341 TFT library
#define TFT_CS D2 // TFT CS pin is connected to NodeMCU pin D2
#define TFT_RST D3 // TFT RST / RES pin is connected to NodeMCU pin D3
#define TFT_DC D4 // TFT DC pin is connected to NodeMCU pin D4
// initialize ILI9341 TFT library with hardware SPI module
//SCK (CLK) ---> NodeMCU pin D5 (GPIO14)
//MOSI(DIN) ---> NodeMCU pin D7 (GPIO13)
//BLK an 3,3V VCC
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);
// NRF24 Variablen für die Datenkanaele
static const uint64_t pipe[6] = {0xF0F0F0F0C1LL, 0xF0F0F0F0D2LL, 0xF0F0F0F0C3LL, 0xF0F0F0F0B4LL, 0xF0F0F0F0A5LL, 0xF0F0F0F096LL};
byte ClientNummer = 1; // Mögliche Werte: 1-6 Erstaz für Messstelle <<<<<<<<<<<<<<<<<<!!!!!!!!!!!!!!!!!!!!!!
// ANPASSEN ^ auf den richtigen Wert der jeweiligen Messstelle
byte pipeNr = 0;
byte button_state = 0; // Überprüfung des eingehenden Schaltsignals
void setup() {
Serial.begin(9600);
Serial.println("ILI9341 - NRF24l01 Test!");
// Setup Display
tft.begin();
tft.setRotation(1); // Anzeige um +90° drehen - Querformat
tft.fillScreen(ILI9341_BLUE); // Bildschirm blau hinterlegen
tft.setTextSize(2); // Schriftgröße einstellen 1 - 40 Zeichen pro Zeile, 2 - 20 Zeichen pro zeile, 3 - 13 zeichen pro Zeile
// Schriftgroße 2 hat Hoehe x Breite = 14 x 10 Pixel
// neue Zeile Texthöhe + 4 , Zeile zwei, Spalte 1 wäre ( 0, 18)
// Zeile 2, 3, 4 ... entspricht 18, 36, 54, 72, 90, 108 ...
// tft.setTextColor(ILI9341_YELLOW); // Farbe nur der Schrift einstellen (Zeichenfarbe)
tft.setTextColor(ILI9341_YELLOW, ILI9341_BLUE); // Farbe der Schrift einstellen (Zeichenfarbe, Hintergrundfarbe Zeichen)
// Setup für NRF24
radio.begin();
radio.setDataRate(RF24_250KBPS);// Übertragungsgeschwindigkeit setzen RF_1MBPS, RF_2MBPS
radio.openReadingPipe(pipeNr, pipe[pipeNr]); // Adresse1, auf dem die Empfangsdaten erwartet werden sollen
radio.startListening(); // NRF24 auf Empfang schalten
Serial.println("Lausche auf Signal");
Serial.println(radio.isChipConnected()); // Prüfen, ob NRF24 angeschlossen ist
}
void loop(void) {
//Einlesen des Schalterzustandes vom Sender
if (radio.available()) // Prüfen ob Datentelegramm empfangen wurde
{
radio.read(&button_state, sizeof(button_state)); //Einlesen des Schalterstatus vom Sender
Serial.print("Schalter: "); Serial.println(button_state); // Ausgabe Schalterzustand auf seriellen Monitor
}
tft.setCursor(0, 0); // Cursor auf oben links setzen Spalte, Zeile in Pixel
tft.print("Schalterstatus: "); tft.print(button_state); // Ausgabe Schalterzustand auf TFT Display
delay(500);
}
Ich füge das der Vollständigkeit halber aber bereinigt ein:
C++:
//Include Libraries
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
//create an RF24 object
RF24 radio(8, 9); // CE, CSN
//address through which two modules communicate.
static const uint64_t pipe[6] = {0xF0F0F0F0C1LL, 0xF0F0F0F0D2LL, 0xF0F0F0F0C3LL, 0xF0F0F0F0B4LL, 0xF0F0F0F0A5LL, 0xF0F0F0F096LL};
byte ClientNummer = 1; // Mögliche Werte: 1-6 Erstaz für Messstelle <<<<<<<<<<<<<<<<<<!!!!!!!!!!!!!!!!!!!!!!
// ANPASSEN ^ auf den richtigen Wert der jeweiligen Messstelle
int button_pin = 7; // Signalpin zum Einlesen des Schaltsignals (Taster, Bewegungsmelder etc.)
byte button_state = 0;
void setup()
{
// Daten senden
Serial.begin(9600);
pinMode(button_pin, INPUT); // Port zum Einlesen des Schalterzustandes konfigurieren
delay(500);
radio.begin();
radio.setDataRate(RF24_250KBPS);// Übertragungsgeschwindigkeit setzen RF_1MBPS, RF_2MBPS
//set the address
radio.openWritingPipe(pipe[ClientNummer-1]); // Setzen der Sendeadresse zur Übermittlung der Daten
//Set module as transmitter
radio.stopListening();
Serial.println("Initialisiere die Datenübertragung");
Serial.println(radio.isChipConnected());
}
void loop()
{
// Daten senden
button_state = digitalRead(button_pin); // Einlesen des Schalterzustandes
Serial.println(button_state); // Kontrollausgabe des Schalterzustandes am PC-Monitor
Serial.println("Start");
radio.write(&button_state, sizeof(button_state)); //Senden des Schalterstatus zum Empfänger
bool ret = radio.write(&button_state, sizeof(button_state)); //Senden des Schalterstatus zum Empfänger
Serial.print("Sendeergebnis: ");
Serial.println(ret);
delay(500);
}
Zuletzt bearbeitet: