Ошибка инициализации ESP8266 SDCard

esp8266 esp

У меня есть ESP8266, который подключен к модулю SDCard, датчику SHT21 и BMP280. Идея состоит в том, что я хочу записывать данные с датчиков на SD-карту, но если я инициализирую SD-карту с помощью SD.begin(chipSelect), все данные с датчиков становятся NaN или случайными значениями. Если я его инициализирую, он регистрирует только NaN на SD-карте, поэтому карта работает, и если я ее не инициализирую, я получаю хорошие и нормальные значения в серийный монитор. Модуль карты подключен к D5, D6, D7, D8, а два датчика подключены к D1 и D2, и все питаются от 3 В. Есть идеи? Это код:

#include <Wire.h>
#include <SPI.h>
#include <Sodaq_SHT2x.h>
#include <Adafruit_BMP280.h>
Adafruit_BMP280 bmp; 
#include <SD.h>
File myFile;
float pressure;    
float temperature;  
float altimeter;
float humidity;
float dewPoint;
float temperature2;  
float humidity2;
float dewPoint2;
int chipSelect = 5;
float QNH = 1015; 
const int BMP_address = 0x76;

int ledB = D4;
int ledG = D3;
int ledR = D0;


void setup()
{

  Serial.println("initialization done.");
  Wire.begin();
  Serial.begin(9600);  
  bmp.begin(BMP_address); 
  Serial.println("PTHBox Logger");
    //Проверяем, жива ли SDCard
    if (SD.begin(5)){
    Serial.println("SD card is alive");
  }else{
    Serial.println("SD card is ded");
    while(1); // остановить программу
  }

//Проверка лог-файлов с SDCard и их удаление
  if (SD.exists("/csv.txt")) 
  {
    Serial.println("Removing csv.txt");
    SD.remove("/csv.txt");
    Serial.println("csv.txt is fresh and ready to log");
  }


 
// Запись заголовков в csv.txt
   myFile = SD.open("/csv.txt", FILE_WRITE);  
   if (myFile) // он открылся нормально
    {
    Serial.println("Writing headers to csv.txt");
    myFile.println("Altitude,Pressure,Temperature,Humidity,DewPoint");
    myFile.close(); 
    Serial.println("Headers written");
    }else {
    Serial.println("Error opening csv.txt");  
  }
// Установка pinModes для светодиода
  pinMode(D0, OUTPUT);
  pinMode(D3, OUTPUT);
  pinMode(D4, OUTPUT);
  // Установите частоту ШИМ 500, по умолчанию 1000
  //Установить диапазон 0~100, по умолчанию 0~1023
  analogWriteFreq(500);
  analogWriteRange(100);

  
}

void loop()
{
  // Проверка светодиода
  analogWrite(ledR, 100);
  analogWrite(ledG, 0);
  analogWrite(ledB, 60);

  
  Serial.print("Humidity(%RH): ");
  Serial.print(SHT2x.GetHumidity());
  Serial.print("     Temperature(C): ");
  Serial.print(SHT2x.GetTemperature());
  Serial.print("     Dewpoint(C): ");
  Serial.print(SHT2x.GetDewPoint());
  pressure = bmp.readPressure()/100;  //и конвертировать Па в гПа
  Serial.print("     BMP PRESSURE");
  Serial.print(pressure);
  Serial.print("     BMP ALT");
  Serial.println(bmp.readAltitude (QNH));
  Serial.print("     BMP TEMP");
  Serial.print(bmp.readTemperature());

// Присвоение значений переменным

 pressure = bmp.readPressure()/100;  //и конвертировать Па в гПа
 temperature = (bmp.readTemperature()); //температура из bmp
 altimeter = bmp.readAltitude (QNH); //QNH - местное давление на уровне моря
 humidity = (SHT2x.GetHumidity());
 dewPoint = (SHT2x.GetDewPoint());
 temperature2 = (SHT2x.GetTemperature());
  
// Запись значений в SDCARD
myFile = SD.open("/csv.txt", FILE_WRITE);     
    // если файл открылся нормально пишем в него:
    if (myFile) 
    {
      Serial.println("Writing to csv.txt");
      myFile.print(altimeter);
      myFile.print(pressure);
      myFile.print(temperature); 
      myFile.print(humidity);
      myFile.println(dewPoint);
      myFile.close();
    } 
    else 
    {
      Serial.println("error opening csv.txt");
    }
  delay(1000);
}

, 👍1

Обсуждение

это Wenos D1 mini или NodeMcu? не смешивайте номера и метки D для выводов в одном скетче. https://arduinoprosto.ru/q/75704/what-are-the-best-gpio-pins-to-use-for-my-project/75706#75706, @Juraj

Это NodeMcu, @Mereics

io 5 это D1. это хороший выбор для контакта CS, но тогда вы должны подключить контакт CS SD-карты туда, а не куда-либо еще. но D1 и D2 являются контактами по умолчанию для I2C (Wire), поэтому я предполагаю, что у вас есть датчик, подключенный к D1/D2., @Juraj


1 ответ


Лучший ответ:

0

Вы звоните

if (SD.begin(5)){

GPIO5 не обязательно является D5. Используйте константу D5; он будет оцениваться как фактический номер GPIO D5. Итак,

if (SD.begin(D5)){

Хотя вы, похоже, не используете эту переменную, у вас также есть:

int chipSelect = 5;

что должно быть

int chipSelect = D5;

Разница между номерами GPIO и метками контактов у многих людей вызывает проблемы. GPIOx специфичен для ESP8266 — он соответствует номеру контакта и функции на реальном чипе; Dx относится к конкретной коммутационной плате и не всегда имеет один и тот же номер GPIO (или один и тот же между коммутационными платами).

,

Он делает то же самое. Как я уже сказал, файл записывается на SD-карту, но если SD-карта инициализируется, датчики перестают работать., @Mereics

Вы уверены, что выбрали правильную плату?, @romkey

GPIO5 — это SCL на ESP8266, поэтому использование GPIO5 для выбора чипа определенно нарушит связь I2C. Попробуйте добавить Serial.print("D5 is"); Serial.println(D5);, чтобы узнать, как определяется ‘D5’., @romkey

если это Wenos D1 или NodeMcu, нет смысла использовать D5 в качестве CS, потому что D5 — это вывод SPI CLK., @Juraj

Я сделал это, он говорит, что dhat D5 равен 14. (Кстати, это NodeMcu), @Mereics

Ничего себе, я разобрался. Я использовал D8 вместо 5, и теперь он работает. Меня обманули, потому что SD-карта работала и D5 тоже, и я думал, что проблема не в этом. Спасибо вам, ребята! Ваше здоровье!, @Mereics

Рад, что у вас все заработало!, @romkey

@Mereics, io 15 (D8) должен быть НИЗКИМ при загрузке. использование в качестве контактов CS может мешать, @Juraj