SD-карта и модуль Lora arduino uno

Общие сведения. При работе над двумя модулями по отдельности они работали отлично.

Проблема: в прилагаемом коде мы пытались их интегрировать, но Лора не получала никаких данных, если мы не закомментировали части функции SDC. Есть ли решение?

Вот где возникает проблема:

Serial.print("Data received: ");
 Serial.print(received); 

 if(received=="ANEMO"){

Сколько бы мы ни кормили его ИСТИННЫМИ данными от другой Лоры с этими кодами, он просто показывает пустое и ложное.

Пожалуйста, помогите этому бедному ягненку. Это для нашего школьного проекта. Надеюсь, вы сможете уделить мне немного своего времени. Заранее большое спасибо.

для контактов CS: Лора: контакт 10, SD: контакт 5

другие контакты SPI соответствуют стандартным контактам.

PS: в коде мы закомментировали некоторые строки в функции SDC, основываясь на наших наблюдениях:

myFile = SD.open("HG.txt", FILE_WRITE);
   myFile.close();

Эти 2 строки заставляют нашу Лору не отображать данные, которые она получает в (переменной получения строки).

Спасибо, добрый сэр/мэм, еще раз надеюсь, что вы можете мне помочь.

Вот полный код:

#include <SPI.h>
#include <SD.h>
#include <RH_RF95.h>
#define RFM95_CS 10
#define RFM95_RST 9
#define RFM95_INT 2
#define RF95_FREQ 868.0
RH_RF95 rf95(RFM95_CS, RFM95_INT);
unsigned long millisecs;
int cnt;
float valu;
String jh;
int code=1;
String received;


File myFile;

void setup(){
 Serial.begin(115200);
 if (!SD.begin(5)) {
    Serial.println("Card failed, or not present");
    while (1);
  }
  else{
  Serial.println("card initialized.");
  }

  delay(100);

 pinMode(RFM95_RST, OUTPUT);
 digitalWrite(RFM95_RST, HIGH);
 while (!Serial);
 Serial.println("Arduino LoRa RX Test!");
 digitalWrite(RFM95_RST, LOW);
 delay(10);
 digitalWrite(RFM95_RST, HIGH);
 delay(10);
 while (!rf95.init()) {
 Serial.println("LoRa radio init failed");
 while (1);
 }
 Serial.println("LoRa radio init OK!");
 if (!rf95.setFrequency(RF95_FREQ)) {
 Serial.println("setFrequency failed");
 while (1);
 }
 Serial.print("Set Freq to: "); Serial.println(RF95_FREQ);
 rf95.setTxPower(23, false);
}

void lorA(){
  while(code==1){
if (rf95.waitAvailableTimeout(1000)){
 Serial.println("dayun ");
 uint8_t buf[RH_RF95_MAX_MESSAGE_LEN];
 uint8_t len = sizeof(buf);
 if (rf95.recv(buf, &len)){
 cnt++;
 Serial.print("Data number: ");
 Serial.println(cnt);
 received=(char*)buf;
 Serial.print("Data received: ");
 Serial.print(received); 

 if(received=="ANEMO"){
 uint8_t data[] = "And hello back to you";
 rf95.send(data, sizeof(data));
 rf95.waitPacketSent();
 Serial.println("Sent a reply");
 code=0;
 }
 }
 else{
 Serial.println("Receive failed");
 }
 }
 }
 }


void SDC(){
  while(code==0){
  Serial.println("SDC");
// Файл dataFile = SD.open("HG.txt", FILE_WRITE);
// Строка dataString="Ганс";
// если (файл данных) {
// dataFile.println(dataString);
// файл данных.close();
// Serial.println("закрыто");
// Serial.println(dataString);
    code=1;
// }
// еще {
// Serial.println("ошибка открытия datalog.txt");
// }

  }
  }

void loop(){
  Serial.println("loop");
  lorA();
  Serial.println("mid");
  SDC();
}

, 👍1

Обсуждение

что означает "ИСТИННЫЕ данные"? .... в вашем коде много операторов печати, но я не вижу упоминания о печатных данных в вашем сообщении., @jsotola

Сэр, извините. Позвольте мне уточнить, под TRUE я имел в виду условие «if(received==" ANEMO")». Если вы заметили в полном коде, если условие выполнено, код должен напечатать «Отправлен ответ», но в нашем случае этого не произошло, и мы подозреваем, что на это влияет код SD-карты. Мы пришли к этой идее, когда пытались закомментировать некоторую строку функции SDC (функции для SD-карты), в частности, «myFile = SD.open("HG.txt", FILE_WRITE)». После того, как мы прокомментировали это, Lora снова начала работать правильно, так что, когда она получает ANEMO в сериале, она отображает Sent., @Hans Gonzaga

большинство модулей SD нарушают работу шины SPI, и другие устройства SPI не работают с ними., @Juraj

Черт, сэр/мэм... Это будет огромной проблемой. Неужели нет обходных путей решения проблемы? В любом случае спасибо, сэр/мэм., @Hans Gonzaga


1 ответ


1

Всю вашу проблему можно решить с помощью простого трюка... Просто следуйте ему...

  1. Использовать библиотеку Sdfat вместо SD.
  2. просто следуйте таблице данных SPI.

следуйте приведенному ниже коду... он работает как с LORA, так и с SD

...

#include <SdFat.h>
#include <SPI.h>
#include <RHReliableDatagram.h>
#include <RH_RF95.h>

СДФат сд;
SD-файл мой файл;

# определить чипселект 4

# определить RFM95_CS 10 //
# определить RFM95_RST 9
# определить RFM95_INT 2

// Одиночный экземпляр радиодрайвера
RH_RF95 rf95(RFM95_CS,RFM95_INT);
//драйвер RH_RF95(5, 2); // Rocket Scream Mini Ultra Pro с RFM95W

// Класс для управления доставкой и получением сообщений с использованием объявленного выше драйвера
Менеджер RHReliableDatagram (rf95, 2);

недействительная установка () {

Серийный.начать(9600);
while (!Serial) {} // ждем Леонардо

delay(100);

// Инициализируем SdFat или выводим подробное сообщение об ошибке и останавливаемся
// Использовать половинную скорость, как в родной библиотеке.
// изменить на SPI_FULL_SPEED для большей производительности.
pinMode (RFM95_CS, ВЫХОД);
цифровая запись (RFM95_CS, ВЫСОКИЙ);
цифровая запись (4, НИЗКИЙ);

если (!sd.begin(chipSelect, SPI_HALF_SPEED)) sd.initErrorHalt();

/*

/*
* //Открываем файл и пишем...
*
// открываем файл для записи в конце, как библиотека Native SD
if (!myFile.open("mrinmoy.txt", O_RDWR | O_CREAT | O_AT_END)) {
sd.errorHalt("Ошибка открытия test.txt для записи");
}


// если файл открылся нормально пишем в него:
Serial.print("Запись в test.txt...");
myFile.println("тестирование 1, 2, 3.");


// закрываем файл:
мойФайл.закрыть();
Serial.println("Готово.");
*/

/*
// открываем файл для чтения....

если (!myFile.open("mrinmoy.txt", O_READ))
{
sd.errorHalt("Ошибка открытия test.txt для чтения");
}

Serial.println("mrinmoy.txt:");


// читаем из файла, пока в нем больше ничего нет:
внутренние данные;

в то время как ((данные = myFile.read()) >= 0) Serial.write(data);
// закрываем файл:
мойФайл.закрыть();
*/

// ручной сброс
цифровая запись (RFM95_RST, НИЗКИЙ);
задержка (10);
цифровая запись (RFM95_RST, ВЫСОКИЙ);
задержка (10);

цифровая запись (RFM95_CS, НИЗКИЙ);
цифровая запись (4, ВЫСОКИЙ);

в то время как (!manager.init()) {
Serial.println("Ошибка инициализации радио LoRa");
пока (1);
}
Serial.println("Инициализация радио LoRa в порядке!");

// цифровая запись (RFM95_CS, LOW);

}

пустой цикл ()
{
uint8_t data[] = "Привет. Это узел 1.";
// unsigned char sd_data[50];
// Не помещайте это в стек:
// uint8_t buf[RH_RF95_MAX_MESSAGE_LEN];
uint8_t buf[50];
// после настройки ничего не происходит

//LoRa.setPins(LoRa_CS, LoRa_RST, DI0);
цифровая запись (4, ВЫСОКИЙ); // удалить SPI SD-карты
цифровая запись (RFM95_CS, НИЗКИЙ); // ВЫБЕРИТЕ (низкий) LoRa SPI
SPI.начать();

// Отправляем сообщение manager_client
если (manager.sendtoWait((uint8_t*)данные,sizeof(данные),1))
{
Serial.print("успешно отправлено: ");
Серийный.println(1);
}
еще
{
Serial.println("Ошибка отправки");
}

// получатель ....

// Теперь ждем ответа от сервера
uint8_t len = размер (buf);
uint8_t из;

если (manager.recvfromAckTimeout(buf, &len, 2000, &from))
{
Serial.print("Получен ответ от: 0x");
Serial.print(от, HEX);
Серийный.print(": ");
Serial.println((char*)buf);
}
еще
{

}
// digitalWrite(4, LOW);
SPI.конец();

цифровая запись (4, НИЗКИЙ); // удалить SPI SD-карты
цифровая запись (RFM95_CS, ВЫСОКИЙ); // ВЫБЕРИТЕ (низкий) LoRa SPI
SPI.начать();


если (!myFile.open("mrinmoy.txt", O_READ))
{
sd.errorHalt("Ошибка открытия test.txt для чтения");
}

Serial.println("mrinmoy.txt:");
чар ч;
строка ул;
интервал я=0;
uint8_t sd_data[50];

в то время как (myFile.available()>0)
{
ch= мой файл.read();
стр+=ч;
}

Строка ул2=строка;
Серийный.println(строка2);
Serial.println(str2.length());


мойФайл.закрыть();
SPI.конец();


delay(500);
}

используйте этот прием... ваша система будет работать идеально...

,