Esp8266 и SD.h как обработать ошибку отсутствия SD карты в картридере?

SD карта находится в картридере TFT дисплея

#include <SD.h>
if(!SD.begin(3))
{
   Serial.println("Не работаю");
}
else
{
   Serial.println("Работаю");
}

  File FILE; 
  FILE = SD.open("/log.txt", FILE_WRITE);  // создаём файл test.txt для записи значений 
  FILE.println(tempereture);
  FILE.close();

Код работает отлично, ровно до тех пор, пока в картридере находится SD карта, если её нет программа крашится.

Попробовал сделать так:

#include <SD.h>
bool isSD = true;
if(!SD.begin(3))
{
   Serial.println("Не работаю");
   isSD = false;
}
else
{
   Serial.println("Работаю");
}

if (isSD) 
{
  File FILE; 
  FILE = SD.open("/log.txt", FILE_WRITE);  // создаём файл test.txt для записи значений 
  FILE.println(tempereture);
  FILE.close();
}

Не помогает, программа крашится, как обработать ошибку отсутствия SD в картридере?

Не должна. Но, поскольку Вы привели не полный текст программы, а огрызок, то только Х может З, что там у Вас ещё написано и почему всё ломается.

А так, ну напишите Вы что-то вроде:

if(!SD.begin(3))  {
   Serial.println("Не работаю");
   turnOnEmergencyLED();
   while(true);
}

Проблема - зажжёт светодиод и станет на месте.

Это ESP, она не встанет, она перезагрузицца по собаке.

1 лайк

Тоже неплохо :slight_smile:

Для есп.

1 лайк

Последовал вот этому Вашему совету и написал новый скеч, который указал выше. Из него выяснил, что программа не крашится из-за этого:

File FILE; 
FILE = SD.open("/log.txt", FILE_WRITE);  // создаём файл test.txt для записи значений 
FILE.println(tempereture);
FILE.close();

А крашится из-за этой строки:

tft.fillScreen(TFT_BLACK);

Если её закомментировать, то скетч работает без проблем, я конечно могу заменить эту строчку на чёрный квадрат, для очистки экрана, но не понимаю, почему эта строка вызывает краш скетча, когда нет SD карты.

И никто не понимает, ибо, как уже сказано:

@МелкоМягкий , не тупи - выложи весь скетч и, возможно (пока у Евгения Петровича хорошее настроение), все проблемы разрешатся )))

Выкладываю весь скетч.

Работает:

#include "Free_Fonts.h" 
#include <SPI.h>
#include <TFT_eSPI.h>
#include <SD.h> 
TFT_eSPI tft = TFT_eSPI();

void setup(void) {
  Serial.begin(9600);
  tft.begin();
  tft.setRotation(1);                                           
  tft.fillScreen(TFT_BLACK);
  if(!SD.begin(3)){
    Serial.println("Не работаю");
  }
  else
  {
    Serial.println("Работаю");
  }
}

void loop() { 
  //tft.fillScreen(TFT_BLACK);
  tft.setTextColor(TFT_WHITE, TFT_BLACK);
  tft.drawString(F("DATE:"), 0, 0, FONT2); 
}

Этот не работает:

#include "Free_Fonts.h" 
#include <SPI.h>
#include <TFT_eSPI.h>
#include <SD.h> 
TFT_eSPI tft = TFT_eSPI();

void setup(void) {
  Serial.begin(9600);
  tft.begin();
  tft.setRotation(1);                                           
  tft.fillScreen(TFT_BLACK);
  if(!SD.begin(3)){
    Serial.println("Не работаю");
  }
  else
  {
    Serial.println("Работаю");
  }
}

void loop() { 
  tft.fillScreen(TFT_BLACK);
  tft.setTextColor(TFT_WHITE, TFT_BLACK);
  tft.drawString(F("DATE:"), 0, 0, FONT2); 
}

Выдаёт следующую ошибку:

--------------- CUT HERE FOR EXCEPTION DECODER ---------------

Soft WDT reset

Exception (4):
epc1=0x40202329 epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000000 depc=0x00000000

>>>stack>>>

ctx: cont
sp: 3ffffe20 end: 3fffffd0 offset: 0160
3fffff80:  3ffe88ab fffffffc 3ffefa54 3ffeea80  
3fffff90:  3fffdad0 00000000 3ffee880 402010c8  
3fffffa0:  3fffdad0 00000013 3ffeea00 40208b08  
3fffffb0:  feefeffe 00000000 3ffeea54 402093c8  
3fffffc0:  feefeffe feefeffe 3fffdab0 40100ced  
<<<stack<<<

--------------- CUT HERE FOR EXCEPTION DECODER ---------------

тебе садман сказал как надо, ты проигнорировал

@ua6em , ну ты прям удивил!

я к тому, что надо сделать весь код по фэншую, а уж потом разбираться, почему стек крашится, по крайней мере у меня с ESP таким образом получается
PS я с SD на этой библиотеке не работал и подозреваю, что конфликт по SPI, конфигурировать тачскрин приходилось, а вот SD нет, надо лезть и смотреть в библиотеку

3 нога у esp8266 это RX, в коде она:

SD.begin(3)

Думаю дело в этом, когда я вызываю:

tft.fillScreen(TFT_BLACK);

происходит какой-то конфликт и скетч каршится.
Вот только мне знаний не хватает, понять почему так происходит.

При каждом проходе в лупе перекрашивать - бессмысленное действие. Видимо поэтому собака и крашит ))

выложи конфигурационный файл TFT

@ua6em

#define USER_SETUP_INFO "User_Setup"
#define ST7789_DRIVER // Define additional parameters below for this display

#define TFT_WIDTH 240
#define TFT_HEIGHT 320
#define ST7789_BLACKTAB

#define TFT_MISO  PIN_D6
#define TFT_MOSI  PIN_D7
#define TFT_SCLK  PIN_D5
#define TFT_CS    PIN_D8  // Chip select control pin
#define TFT_DC    PIN_D4  // Data Command control pin
#define TFT_RST   PIN_D0  // Reset pin (could connect to RST pin)


#define TOUCH_CLK PIN_D5 // yellow
#define TOUCH_CS PIN_D3// green Chip select pin (T_CS) of touch screen
#define TOUCH_DIN PIN_D7 // purple
#define TOUCH_DO PIN_D6 /// blue

#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH
#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters
#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm
#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-.
#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.
#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts

// Comment out the #define below to stop the SPIFFS filing system and smooth font code being loaded
// this will save ~20kbytes of FLASH
#define SMOOTH_FONT
#define SPI_FREQUENCY 27000000
#define SPI_READ_FREQUENCY 20000000
#define SPI_TOUCH_FREQUENCY 2500000

#define TFT_RGB_ORDER TFT_BGR 
#define TFT_INVERSION_OFF

строка 17 и 34 закомментируй

тут схема потребуется, понять что ты там наворотил

В этом случае получается ошибка:

'class TFT_eSPI' has no member named 'setTouch'

замаркируй с 16 по 19 весь тач