Ошибка инициализации ESP8266 SDCard
У меня есть 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);
}
@Mereics, 👍1
Обсуждение1 ответ
Лучший ответ:
Вы звоните
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
- Ошибка при загрузке «Произошла фатальная ошибка esptool.py: тайм-аут записи»
- esp_now.h: нет такого файла или каталога
- Ошибка при загрузке кода в esp8266 через arduino (FatalError('Failed to connect to %s: %s' % (self.CHIP_NAME, last_error)))
- Достаточно ли 1 МБ флэш-памяти для загрузки OTA в ESP-01?
- NodeMCU 1.0 автоматически сбрасывается через некоторое время
- ESP8266 Arduino Json object array десериализация в структуру
- Как назначить точке доступа ESP8266 имя хоста, которое может быть разрешено станциями?
- ESP8266 — Как получить многоадресный пакет UDP?
это 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