Essayer de coder Heltec ESP32 LoRa avec OLED intégré et avec carte SD attachée.
J'ai fait fonctionner la carte SD (CS 21) et la LoRa (CS 18) individuellement, mais lorsque j'essaie de faire fonctionner les deux dans le même programme, je ne peux pas.
// // Heltec 32 LoRa OLED (with SD Card) // ______________ // Gnd | | USB| | Gnd // 5v | | port| | 5v // 3v3 | |_____| | 3v3 // Gnd | ALL | 36<- <- : Input Only! // Rx | GPIO | 37<- // Tx | 3.3v | 38<- // RST | ________ | 39<- // 0 | | | | 34<- // (SCL) 22 | | | | 35<- // SPI MISO 19 | | | | 32<- // 23 | | | | 33<- //LoRa CS(HI)18 | | | | 25 (LED) // SPI SCK 5 | | OLED | | 26 LoRa IRQ //OLED SCL 15 | | | | 27 SPI MOSI // 2 | | | | 14 LoRa Rst //OLED SCA 4 | | | | 12 // 17 | |________| | 13 //OLED RST 16 |______________| 21 (SD_CS) // #include <mySD.h> // SD Card (VMA304) #include "SSD1306.h" // OLED #include <LoRa.h> // LoRa File root; // OLED Pin #define SDA 4 // Serial Data #define SCL 15 // Serial Clock #define oRST 16 // Reset #define OLED_ADDR 0x3C // OLED display TWI address SSD1306 display(OLED_ADDR, SDA, SCL); // OLED screen text rows: #define row1 0 // y=0 is top row of size 1 text #define row2 10 #define row3 20 #define row4 30 #define row5 40 #define row6 50 // row7 at 70 is too low // SPI port #2: SD Card Adapter #define SD_CLK 5 #define SD_MISO 19 #define SD_MOSI 27 #define SD_CS 21 // SPI port: LoRa (SX1278) // LoRa Pin #define LoRa_SCK 5 #define LoRa_MISO 19 #define LoRa_MOSI 27 #define LoRa_CS 18 #define LoRa_RST 14 // LoRa_Reset #define DI0 26 // LoRa_IRQ #define BAND 915E6 // other freq: 433E6 // or ? LoRa f(MHz) #define Select LOW // Low CS means that SPI device Selected #define DeSelect HIGH // High CS means that SPI device Deselected File sessionFile; // SD card filenames are restricted to 8 characters + extension int counter = 0; // count sent LoRa messages /***********************************************************/ void setup(){ // set output pins pinMode(oRST,OUTPUT); pinMode(SD_CS,OUTPUT); pinMode(LoRa_CS,OUTPUT); digitalWrite(LoRa_CS, DeSelect); // set GPIO16 Low then High to Reset OLED digitalWrite(oRST, LOW); delay(50); digitalWrite(oRST, HIGH); Serial.begin(115200); while(!Serial); // wait to connect to computer display.init(); display.flipScreenVertically(); display.setFont(ArialMT_Plain_10); display.setTextAlignment(TEXT_ALIGN_LEFT); display.clear(); display.display(); Serial.print("Initializing SD card..."); digitalWrite(SD_CS, Select); // SELECT (Low) SD Card SPI if (!SD.begin( SD_CS, SD_MOSI, SD_MISO, SD_CLK )) { Serial.println("initialization failed!"); // now what? } else { Serial.println("initialization done."); display.drawString( 5,row1,"SD Card OK!" ); display.display(); delay(1000); } /* open "test.txt" for writing */ root = SD.open("test.txt", FILE_WRITE); if (root) { root.println("Hello world!"); root.flush(); root.close(); } else { // file open error Serial.println("error opening test.txt"); } display.drawString( 5,row2,"Wrote in test.txt" ); display.display(); delay(100); /* after writing, then reopen the file and read it */ root = SD.open("test.txt"); if (root) { /* read from the file to the end of it */ while (root.available()) { // read the file Serial.write(root.read()); } root.close(); } else { Serial.println("error opening test.txt"); } display.drawString( 5,row3,"Read from test.txt" ); display.display(); delay(100); // done testing the SD Card digitalWrite(SD_CS, DeSelect); // DESELECT (high) SD Card SPI SD.end(); delay( 100 ); // now test the LoRa SPI.begin( LoRa_SCK, LoRa_MISO, LoRa_MOSI, LoRa_CS ); LoRa.setPins( LoRa_CS, LoRa_RST, DI0 ); digitalWrite(LoRa_CS, Select); // SELECT (low) LoRa SPI Serial.println("LoRa Sender"); if (!LoRa.begin(BAND)) { Serial.println("Starting LoRa failed!"); display.drawString( 5, row4, "LoRa Init Failed!"); display.display(); // now what? } else { Serial.println("LoRa Initial OK!"); display.drawString( 5, row4, "LoRa Initialized OK!"); display.display(); delay(1000); } Serial.println("Setup done!"); } void loop() { Serial.print("Sending packet: "); Serial.println(counter); display.clear(); display.setFont(ArialMT_Plain_16); display.drawString(3, 5, "Sending packet "); display.drawString(50, 30, String(counter)); display.display(); // send packets LoRa.beginPacket(); LoRa.print("Hi. Sent packet #"); LoRa.print(counter); LoRa.endPacket(); counter++; delay(500); }
J'ai un récepteur LoRa qui travaille pour lire les messages. Avec le code affiché ci-dessus, la carte SD fonctionne. Et le LoRa dit qu'il transmet des messages, mais le récepteur ne les voit pas, et il s'arrête après 4 messages.
3 Réponses :
J'ai fait fonctionner la LoRa et la carte SD - alternativement - en ajoutant les bonnes résistances. La carte SD CS a besoin d'un 1k ohm à 3,3v. La broche MISO 19 a besoin d'un 1k ohm à 3,3 v, et d'un 1 k ohm à GND, et un 100 ohms à la broche MISO de la carte SD.
// done using the SD Card digitalWrite(SD_CS, DeSelect); // DESELECT (high) SD Card SPI SD.end();
Après avoir configuré les choses, dans la boucle ():
SPI.end(); } if (!SD.begin( SD_CS, SD_MOSI, SD_MISO, SD_CLK )) {
Activité LoRa. Ensuite ...
void loop() { // use the LoRa SPI.begin( LoRa_SCK, LoRa_MISO, LoRa_MOSI, LoRa_CS ); LoRa.setPins( LoRa_CS, LoRa_RST, DI0 ); digitalWrite(SD_CS, DeSelect); // deselet SD Card SPI digitalWrite(LoRa_CS, Select); // SELECT (low) LoRa SPI if( LoRa.begin(BAND)) {
Activité de la carte SD, terminer la boucle () avec ...
//OLED RST 16 |______________| 21 (SD_CS), w/1k ohm to 3.3v // RESISTORS ARE IMPORTANT // SPI MISO needs 1k ohm to 3.3v, 1k ohm to GND, 100 ohm to SD MISO.
Ce n'est probablement pas optimisé, mais cela fonctionne! Yay!
si vous utilisez Heltec WIFI LoRa 32 (v2), il serait préférable de mettre la carte SD SCK sur 36,, 39 broches. Le 21 est utilisé par Vext Control.
Il vous suffit de contrôler la broche de sélection de puce pour chaque appareil, HIGH pour non actif et LOW pour actif, et ne pas être actif en même temps.
laissez les bibliothèques gérer les broches CS
@Juraj - J'aime ça. Mais comment?
vous définissez les broches sur les deux, ils savent quoi faire
Je me demande si cela a à voir avec la ligne MISO partagée. Si je le retire de la carte SD, le LoRa fonctionne, mais bien sûr, la carte SD s'arrête. pjrc.com/better-spi-bus-design-in-3-steps J'ai essayé le diviseur de volt MISO avec 1k, mais cela n'a pas fonctionné.
quel adaptateur SD utilisez-vous?
ebay.com/itm/...
l'alimentez-vous à partir d'une broche 5 V?
Je fournis 5v de l'ESP32 à l'adaptateur de carte SD, oui.