проблема с записью SD
У меня есть код Arduino для регистрации данных датчика, времени и даты. Затем я сохраняю все данные на SD-карте, а затем отправляю значение датчика на другой узел с помощью Lora. но я не могу записать данные на SD-карту. Пожалуйста, помогите мне решить эту проблему. Код также прилагается.
#include <RHReliableDatagram.h>
#include <RH_RF95.h>
#include "RTClib.h"
#include <SPI.h>
#include <SD.h>
RTC_DS1307 rtc;
File myFile;
#define node_address 12
uint8_t gateway_address = 11;
const int sensor_pin = A1;
float level;
/* Chip selection */
const int CS1 = 8;/*SD Card*/
const int CS2 = 10;/*LoRa*/
/* Configure LoRa driver */
RH_RF95 driver(10,2);
RHReliableDatagram manager(driver,node_address);
void setup () {
pinMode(sensor_pin, INPUT);
pinMode(CS1,OUTPUT);
pinMode(CS2,OUTPUT);
// SPI.begin();`
/*--------Serial port connection setup--------*/
Serial.begin(9600);
/*----------RTC Initialization----------*/
Serial.println(F("Initializing RTC...!"));
if (! rtc.begin()) {
Serial.println(F("Couldn't find RTC"));
}
if (! rtc.isrunning()) {
Serial.println(F("RTC is NOT running!"));
// rtc.adjust(DateTime(2019, 11, 12, 12, 32, 0)); // (Год, Месяц, Дата, Час, Мин, Сек)
}
/*----------SD CARD Initialization----------*/
digitalWrite(CS2,HIGH);
delay(500);
digitalWrite(CS1,LOW);
Serial.println(F("Initializing SD card..."));
if (!SD.begin(CS1)) {
Serial.println(F("initialization of SD Card is failed!"));
return;
}
Serial.println(F("Initialization of SD Card is done."));
/*----------LoRa Initialization----------*/
digitalWrite(CS1,HIGH);
delay(500);
digitalWrite(CS2,LOW);
if (manager.init())
{
Serial.println(F("LoRa Successfully Initialised "));
} else {
Serial.println(F("LoRa initialization failed"));
}
driver.setFrequency(433.0);
driver.setTxPower(14,false);
Serial.println();
}
void loop () {
DateTime now = rtc.now();
/*----------Date----------*/
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(',');
/*----------Time----------*/
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
/*----------SD card----------*/
digitalWrite(CS2,HIGH);
delay(500);
digitalWrite(CS1,LOW);
delay(100);
myFile = SD.open("test.txt", FILE_WRITE);
if (myFile) {
/*----------Saving Date----------*/
myFile.print(now.year(), DEC);
myFile.print('/');
myFile.print(now.month(), DEC);
myFile.print('/');
myFile.print(now.day(), DEC);
myFile.print(',');
/*----------Saving Time----------*/
myFile.print(now.hour(), DEC);
myFile.print(':');
myFile.print(now.minute(), DEC);
myFile.print(':');
myFile.print(now.second(), DEC);
myFile.println(',');
level = analogRead(sensor_pin);
myFile.print(level);
myFile.println();
myFile.close();
} else {
Serial.println("Error opening test.txt");
}
delay(500);
digitalWrite(CS1,HIGH);
delay(500);
digitalWrite(CS2,LOW);
char data[RH_RF95_MAX_MESSAGE_LEN];
sprintf(data,"$%d#%d",node_address,level);
Serial.print("Level transferred is ");
Serial.println(data);
Serial.println(sizeof(data));
if(!manager.sendtoWait((uint8_t*)data,sizeof(data),gateway_address))
{
Serial.println("Gateway offline");
}
delay(500);
}
@user60840, 👍0
Обсуждение1 ответ
Не следует вручную управлять выводом CS SD-карты. Таким образом вы путаете библиотеку и SD-карту.
С SD-картами в режиме "SPI" существует специальная операция, которая не является частью стандарта SPI и является частью процедуры инициализации, при которой мастер (Arduino) должен отправить на карту не менее 72 тактовых импульсов с выводом CS в ВЫСОКОМ положении.
Установив вручную на выводе CS НИЗКИЙ уровень, вы нарушаете его.
От вас не требуется ничего делать для вывода CS, кроме как сообщить библиотеке, что это такое — библиотека сделает все остальное за вас. Поэтому удалите все ссылки на digitalWrite(CS1, ...)
из своего кода.
- Какие контакты можно использовать для выбора микросхемы (CS, CC) на Arduino Nano Every?
- Аппаратный SPI Arduino NANO не работает
- Как увеличить скорость записи на SD-карту в Ардуино
- Сделать CS (chip select) для работаты в SPI (для и SD карты и OLED)
- Использование экрана SD-карты на Arduino Due
- Более 4 MCP23S17 на 1 шине SPI
- Загрузить сайт с SD-карты
- Проблема с NRF24L01
пусть библиотека обрабатывает вывод CS, @Juraj
Примечание из документации библиотеки SD: «Обратите внимание, что даже если вы не используете аппаратный вывод SS, его необходимо оставить в качестве вывода, иначе библиотека SD не будет работать». Штифт SS для nano, насколько я знаю, равен 10. Затем вы используете контакт в качестве чипа, выбранного для LoRa. Вероятно, библиотека RoRa что-то с ним делает, поэтому у SD-библиотеки возникли проблемы с ним. Возможно, вы пытаетесь заменить контакты CS. Я не обнаружил никаких проблем с изменением контакта SS для LoRa Lib. И: Как сказал Юрай: зачем вы пишете в CS1 и CS2, если библиотеки SD и LoRa контролируют это?, @Peter Paul Kiefer
@PeterPaulKiefer, вывод CS. это наиболее распространенное использование вывода SS в ведущем режиме. В качестве контакта CS для первого устройства SPI, @Juraj
OP использует два контакта CS: один для LoRa (10) и один для SD (8). Оба настроены на вывод, это верно. Но в документе SD lib есть примечание о том, что даже если изменить вывод CS/SS, необходимо установить вывод 10 для вывода. Для меня это намек на то, что пин 10 все равно влияет на SD lib, даже если он не используется. Я не знаю, какое влияние это оказывает (подумайте о том, что Lora устанавливает контакт 10 CS на вход до тех пор, пока он ему не понадобится; по какой причине вообще). Так что **может** быть влияние библиотеки LoRa на SD Lib. Это просто идея., @Peter Paul Kiefer
@PeterPaulKiefer «Влияние» заключается в оборудовании. Регистр направления для контакта 10 определяет, работает ли периферийное устройство SPI в режиме Master или Slave (INPUT = slave, OUTPUT = master). Если вы измените контакт 10 на INPUT, SPI просто не будет работать., @Majenko
@Majenko Извините, но я никогда не говорил, что хочу изменить его на INPUT. Я сказал, что контакт 10 по-прежнему влияет на библиотеку SD. Поскольку вы дали подсказку, которую я упускаю, я все еще мог представить ситуации, когда библиотека LoRa оказывает влияние, которое приводит к сбою библиотеки SD. Например, библиотека LoRa действует как ведомое устройство и поэтому устанавливает контакт 10 в качестве входа. Поскольку я не знаю, действует ли LoRa lib таким образом. это просто предположение. Но это также может быть неуместный кабель или что-то еще. user60840: Если вы добавите изображение своей установки и предоставите ссылки на библиотеки, которые вы использовали, мы могли бы проверить и это., @Peter Paul Kiefer