[SOLVED] NodeMCU-SDCARD conflicts with I2C-RTC

NodeMCU-SDCARD conflicts with I2C-RTC. Separately, I can set and read the DS3231 RTC over I2C, and I can R/W the SDCARD, but I can't do both in the same sketch. When I enable the SDCARD code, it 'breaks' set/read of the RTC. I've stripped the code down to basics so I can post here. Details:

Arduino IDE 2.1.0; NodeMCU 1.0 (ESP-12E Module) selected (I'm using the HiLetGo Node MCU), like this:

I'm using a DS3231S RTC I2C, like this (mine has the DS3231SN chip):

I wired an SDCARD adapter to NodeMCU pins D5,6,7,8 and 3v3/GND as described here (which works on its own). Basically, solder the contacts of a micro-SDCARD/SDCARD adpater to the NodeMCU:

CS (Pin 1) D8 (GPIO15)
DI/MOSI (Pin 2) D7 (GPIO13)
VSS (GND) (Pin 3) GND Pin 3 or Pin6 of SD Card to GND
VDD (Pin 4) 3V3
SCLK (Pin 5) D5 (GPIO14)
VSS/GND (Pin 6) GND Pin 3 or Pin6 of SD Card to GND
DO/MISO (Pin 7) D6 (GPIO12)

I was confused by which libraries to use, but after much reading I settled on:

#include <Adafruit_I2CDevice.h>
#include <RTClib.h>  // Use this in place of <DS3231.h>
// https://github.com/adafruit/RTClib/tree/master/examples
// DS3231S RTC I2C address 0x68, EEPROM 0x57

#include <Adafruit_SPIDevice.h>  // added for SDCARD read
#include <SD.h>

As stated, I can get either to work independently in my code, but enabling the SDCARD /breaks/ the RTC, I just get odd results from the RTC.

I'll include two sketches. The RTC works in sketch “RTC_NO-SD_AFLIB_v002”, but fails in sketch “RTC_SD_AFLIB_v002”.

My stripped down code loads those libraries, declares a “File myFile;“ for the SDCARD, and “RTC_DS3231 rtc;” for the DS3231, a 10 second delay to allow me to start the Serial Monitor. I then do an “SD.begin” and read a file from the SDCARD, then close the file.

Then I read/print the current time from the RTC, then set it to a dummy time of 2001/02/03 04:05:06, read it back, then go into the main loop to read/print the RTC every 10 seconds. The RTC gives good values with the SDCARD code blocked out after the “File myFile;” declaration.

FYI, I only need to read the SDCARD on boot, and never need to write to it (I'm using it for a config file that I'll create/save on a computer).

( I'll include in the next post)
RTC working code “RTC_NO-SD_AFLIB_v002”:
RTC SD conflict code “RTC_SD_AFLIB_v002”:

The Serial Monitor output for the sketch w/o SDCARD code is like this:

TEN SECOND DELAY COMPLETE... 
20:30:20.751 -> RTC_NO-SD_AFLIB_v002
20:30:20.751 -> Current DateTime of RTC at start:
20:30:20.751 -> 2001/02/03  04:08:32
20:30:20.751 -> 
20:30:20.751 -> Now set to 2001/02/03  04:05:06:
20:30:20.751 -> 2001/02/03  04:05:06
20:30:30.756 -> 2001/02/03  04:05:16
20:30:40.753 -> 2001/02/03  04:05:26
20:30:50.758 -> 2001/02/03  04:05:36
20:31:00.751 -> 2001/02/03  04:05:46
20:31:10.748 -> 2001/02/03  04:05:56

Working RTC code, most SDCARD code commented out:

#include <Adafruit_I2CDevice.h>
#include <RTClib.h>  // Use this in place of <DS3231.h>
// https://github.com/adafruit/RTClib/tree/master/examples
// DS3231S RTC I2C address 0x68, EEPROM 0x57

#include <Adafruit_SPIDevice.h>  // added for SDCARD read
#include <SD.h>                  // SD Card uses D5,6,7,8 needed for "File myFile; "code

/* RTC_NO-SD_AFLIB_v002
Based on version  RTC_SD_AFLIB_v002 ('breaks' the RTC)
Now take out enough SDCARD code to make RTC work again
*/

File myFile;  // needs the SD lib or compile error// v002 try place before rtc
RTC_DS3231 rtc;
char const PRG_N[] = "RTC_NO-SD_AFLIB_v002";  // UPDATE @REV
char Text_tmp[120];                        // general temp buffer for text
uint32_t loop_m_sec = millis();            // Temp timer

/*
My TEST_RTC_ONLY_AFLIB_v003.ino worked to read, set and re-read the RTC with only these 2 libs: 
// #include <Adafruit_I2CDevice.h>
// #include <RTClib.h> 

Now try adding SDCARD read, this previously 'broke' my RTC set/read
*/

void setup()  //
{
  delay(10000);  // allow 10 sec to open Serial Monitor
                 //  while (!Serial) { delay(10); } // THIS LINE NO GOOD FOR NodeMCU?, HANGS....
  Serial.begin(115200);

  Serial.print(F("\nTEN SECOND DELAY COMPLETE... \n"));
  Serial.println(PRG_N);

  
  /*  <<< THIS CODE 'BREAKS' RTC
  Serial.print("Initializing SD card...");
  if (!SD.begin(4))  //
  {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
  myFile = SD.open("TEST_ARDUINO/Plain_Text.txt");  // open file in this directory

  if (myFile)  //
  {
    Serial.println("TEST_ARDUINO/Plain_Text.txt: ");

    // read from the file until there's nothing else in it:
    while (myFile.available()) {
      Serial.write(myFile.read());
    }
    // close the file:
    myFile.close();
  }     //
  else  //
  {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }

  */

  rtc.begin();

  // read previous datetime, then SET the rtc here to see if I can write to it
  Serial.println("Current DateTime of RTC at start:");
  RTC_Read();
  Serial.println(Text_tmp);
  Serial.println();

  // now set to a dummy time 2001/02/03  04:05:06
  Serial.println("Now set to 2001/02/03  04:05:06:");
  rtc.adjust(DateTime(2001, 2, 3, 4, 5, 6));
  RTC_Read();
  Serial.println(Text_tmp);

  loop_m_sec = millis();

}  // end of void setup()^^^^^^


void RTC_Read()  // use function to avoid compile error redeclaration of 'DateTime now'
{
  DateTime now = rtc.now();
  sprintf(Text_tmp, "%04d/%02d/%02d  %02d:%02d:%02d", now.year(), now.month(),
          now.day(), now.hour(), now.minute(), now.second());
}


void loop()  //
{

  if ((millis() - loop_m_sec) >= (10 * 1000))  // every 10 seconds
  {
    RTC_Read();
    loop_m_sec = millis();
    Serial.println(Text_tmp);
  }
  delay(500);  // slow down loop
}

And Serial Monitor output:

TEN SECOND DELAY COMPLETE...
20:30:20.751 -> RTC_NO-SD_AFLIB_v002
20:30:20.751 -> Current DateTime of RTC at start:
20:30:20.751 -> 2001/02/03 04:08:32
20:30:20.751 ->
20:30:20.751 -> Now set to 2001/02/03 04:05:06:
20:30:20.751 -> 2001/02/03 04:05:06
20:30:30.756 -> 2001/02/03 04:05:16
20:30:40.753 -> 2001/02/03 04:05:26
20:30:50.758 -> 2001/02/03 04:05:36
20:31:00.751 -> 2001/02/03 04:05:46
20:31:10.748 -> 2001/02/03 04:05:56

And here's the code that breaks the RTC:

#include <Adafruit_I2CDevice.h>
#include <RTClib.h>  // Use this in place of <DS3231.h>
// https://github.com/adafruit/RTClib/tree/master/examples
// DS3231S RTC I2C address 0x68, EEPROM 0x57

#include <Adafruit_SPIDevice.h>  // added for SDCARD read
#include <SD.h>                  // SD Card uses D5,6,7,8 needed for "File myFile; "code

File myFile;  // needs the SD lib or compile error// v002 try place before rtc
RTC_DS3231 rtc;
char const PRG_N[] = "RTC_SD_AFLIB_v002";  // UPDATE @REV
char Text_tmp[120];                        // general temp buffer for text
uint32_t loop_m_sec = millis();            // Temp timer

/*
My TEST_RTC_ONLY_AFLIB_v003.ino worked to read, set and re-read the RTC with only these 2 libs: 
// #include <Adafruit_I2CDevice.h>
// #include <RTClib.h> 

Now try adding SDCARD read, this previously 'broke' my RTC set/read
*/

void setup()  //
{
  delay(10000);  // allow 10 sec to open Serial Monitor
                 //  while (!Serial) { delay(10); } // THIS LINE NO GOOD FOR NodeMCU?, HANGS....
  Serial.begin(115200);

  Serial.print(F("TEN SECOND DELAY COMPLETE... \n"));
  Serial.println(PRG_N);

  Serial.print("Initializing SD card...");
  if (!SD.begin(4))  //
  {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
  myFile = SD.open("TEST_ARDUINO/Plain_Text.txt");  // open file in this directory

  if (myFile)  //
  {
    Serial.println("TEST_ARDUINO/Plain_Text.txt: ");

    // read from the file until there's nothing else in it:
    while (myFile.available()) {
      Serial.write(myFile.read());
    }
    // close the file:
    myFile.close();
  }     //
  else  //
  {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }

  rtc.begin();

  // read previous datetime, then SET the rtc here to see if I can write to it
  Serial.println("Current DateTime of RTC at start:");
  RTC_Read();
  Serial.println(Text_tmp);
  Serial.println();

  // now set to a dummy time 2001/02/03  04:05:06
  Serial.println("Now set to 2001/02/03  04:05:06:");
  rtc.adjust(DateTime(2001, 2, 3, 4, 5, 6));
  RTC_Read();
  Serial.println(Text_tmp);

  loop_m_sec = millis();

}  // end of void setup()^^^^^^


void RTC_Read()  // use function to avoid compile error redeclaration of 'DateTime now'
{
  DateTime now = rtc.now();
  sprintf(Text_tmp, "%04d/%02d/%02d  %02d:%02d:%02d", now.year(), now.month(),
          now.day(), now.hour(), now.minute(), now.second());
}


void loop()  //
{

  if ((millis() - loop_m_sec) >= (10 * 1000))  // every 10 seconds
  {
    RTC_Read();
    loop_m_sec = millis();
    Serial.println(Text_tmp);
  }
  delay(500);  // slow down loop
}

And the Serial Monitor output (RTC is garbage):

21:20:57.651 -> TEN SECOND DELAY COMPLETE... 
21:20:57.682 -> RTC_SD_AFLIB_v002
21:20:57.682 -> Initializing SD card...initialization done.
21:20:57.682 -> TEST_ARDUINO/Plain_Text.txt: 
21:20:57.715 -> KRC-TEST Reading an SD Card file on NodeMCU Arduino
21:20:57.715 -> Line 2: Just more stuff
21:20:57.715 -> Line 3: OK, enough, this is the end 
21:20:57.715 -> Current DateTime of RTC at start:
21:20:57.715 -> 2164/09/97  20:61:00
21:20:57.715 -> 
21:20:57.715 -> Now set to 2001/02/03  04:05:06:
21:20:57.715 -> 2000/00/02  164:147:00

The includes got my attention.

#include <Adafruit_I2CDevice.h>
#include <RTClib.h>  // Use this in place of <DS3231.h>

Adafruit has this I2CDevice abstraction layer (which some people like and some don't), but the RTClib from Adafruit does not use that.

The "SD" library had some trouble for the ESP8266 in the past. Do you use the newest Arduino IDE 2.1.0 ? and have you all the boards and libraries updated ?

#include <Adafruit_SPIDevice.h>  // added for SDCARD read
#include <SD.h>

The "SD" library is not from Adafruit and does not use the SPIDevice.

At this point, the verbose output of the compiler is more interesting.

But I have no clue what the problem is. The extra includes should not mess up things so bad.

Thanks. Yes, I recently updated to IDE 2.1.0, and all the work I've done on this is on that version (App Image on Linux). All boards and libraries in use show to be up to date.

Is there a different set of Libraries I should try? I get a bit confused over different libraries (sometimes the same name? I wish they would include the github address in each to know for sure) , and different boards require different libraries, and it looks like some are in the core, or one library loads another? Here's my compiler verbose output for libraries, does this help?

Multiple libraries were found for "SD.h"
  Used: /home/kenc/.arduino15/packages/esp8266/hardware/esp8266/3.0.2/libraries/SD
  Not used: /home/kenc/.arduino15/libraries/SD
Using library Adafruit BusIO at version 1.14.1 in folder: /home/kenc/Arduino/libraries/Adafruit_BusIO 
Using library Wire at version 1.0 in folder: /home/kenc/.arduino15/packages/esp8266/hardware/esp8266/3.0.2/libraries/Wire 
Using library RTClib at version 2.1.1 in folder: /home/kenc/Arduino/libraries/RTClib 
Using library SPI at version 1.0 in folder: /home/kenc/.arduino15/packages/esp8266/hardware/esp8266/3.0.2/libraries/SPI 
Using library SD at version 2.0.0 in folder: /home/kenc/.arduino15/packages/esp8266/hardware/esp8266/3.0.2/libraries/SD 
Using library SDFS at version 0.1.0 in folder: /home/kenc/.arduino15/packages/esp8266/hardware/esp8266/3.0.2/libraries/SDFS 
Using library ESP8266SdFat at version 2.0.2 in folder: /home/kenc/.arduino15/packages/esp8266/hardware/esp8266/3.0.2/libraries/ESP8266SdFat 
/home/kenc/.arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/3.0.4-gcc10.3-1757bed/bin/xtensa-lx106-elf-size -A /tmp/arduino/sketches/F115305C4B2DA147C1D4720B0B7F59A6/RTC_SD_AFLIB_v002.ino.elf
Sketch uses 304409 bytes (29%) of program storage space. Maximum is 1044464 bytes.
Global variables use 29420 bytes (35%) of dynamic memory, leaving 52500 bytes for local variables. Maximum is 81920 bytes.
"/home/kenc/.arduino15/packages/esp8266/tools/python3/3.7.2-post1/python3" -I "/home/kenc/.arduino15/packages/esp8266/hardware/esp8266/3.0.2/tools/upload.py" --chip esp8266 --port "/dev/ttyUSB0" --baud "115200" ""  --before default_reset --after hard_reset write_flash 0x0 "/tmp/arduino/sketches/F115305C4B2DA147C1D4720B0B7F59A6/RTC_SD_AFLIB_v002.ino.bin"
esptool.py v3.0
Serial port /dev/ttyUSB0
Connecting....
Chip is ESP8266EX
Features: WiFi
Crystal is 26MHz

In my previous post, I was trying to say: Remove the Adafruit_I2CDevice and Adafruit_SPIDevice includes.

Yes, I tried that, same hosed up RTC. Compiler says (still loads Adafruit BusIO - I guess some other library loads that as a dependency?) :

Multiple libraries were found for "SD.h"
 Used: /home/kenc/.arduino15/packages/esp8266/hardware/esp8266/3.0.2/libraries/SD
 Not used: /home/kenc/.arduino15/libraries/SD
 Not used: /home/kenc/Arduino/libraries/SD
Using library RTClib at version 2.1.1 in folder: /home/kenc/Arduino/libraries/RTClib 
Using library Adafruit BusIO at version 1.14.1 in folder: /home/kenc/Arduino/libraries/Adafruit_BusIO 
Using library Wire at version 1.0 in folder: /home/kenc/.arduino15/packages/esp8266/hardware/esp8266/3.0.2/libraries/Wire 
Using library SD at version 2.0.0 in folder: /home/kenc/.arduino15/packages/esp8266/hardware/esp8266/3.0.2/libraries/SD 
Using library SDFS at version 0.1.0 in folder: /home/kenc/.arduino15/packages/esp8266/hardware/esp8266/3.0.2/libraries/SDFS 
Using library SPI at version 1.0 in folder: /home/kenc/.arduino15/packages/esp8266/hardware/esp8266/3.0.2/libraries/SPI 
Using library ESP8266SdFat at version 2.0.2 in folder: /home/kenc/.arduino15/packages/esp8266/hardware/esp8266/3.0.2/libraries/ESP8266SdFat 

and SM output:

10:46:15.516 -> TEN SECOND DELAY COMPLETE...
10:46:15.516 -> RTC_SD_AFLIB_v002
10:46:15.516 -> Initializing SD card...initialization done.
10:46:15.561 -> TEST_ARDUINO/Plain_Text.txt:
10:46:15.561 -> KRC-TEST Reading an SD Card file on NodeMCU Arduino
10:46:15.561 -> Line 2: Just more stuff
10:46:15.579 -> Line 3: OK, enough, this is the end
10:46:15.579 -> Current DateTime of RTC at start:
10:46:15.579 -> 2164/09/97 20:61:00
10:46:15.579 ->
10:46:15.579 -> Now set to 2001/02/03 04:05:06:
10:46:15.579 -> 2000/00/02 164:147:00
10:46:25.578 -> 2000/00/00 00:00:00
10:46:35.571 -> 2000/00/00 00:00:00
10:46:45.568 -> 2000/00/00 00:00:00

My mistake, the RTC does indeed use the BusIO: GitHub - adafruit/RTClib: A fork of Jeelab's fantastic RTC Arduino library

It could be software, for example incompatible libraries. It could be hardware, such as a missing GND wire.

I bought a few 8GB Kingston microSD cards for Arduino projects. If you use a 32GB card, then it might not be compatible.
Some pins are special, scroll down for a table of the pins: https://randomnerdtutorials.com/esp8266-pinout-reference-gpios/

Do you really need that SD card ? Everyone else uses the ESP8266 itself to create a filesystem in its Flash memory.

The RTC and SD work on their own, but that does not mean that both are okay. Perhaps one has already a problem, and the problem only pops up in combination with something else.

I seem to have it working now, though not sure why - will investigate more. I looked at the tutorial here,

commented out the code for the sensor I don't have (//#include "DHT.h") and made some minor changes (I have DS2321 vs their RTC_DS1307). That code seemed to work, I made some of those changes to my code and it is working. I'll test these separately, but the only real changes were moving the "File myFile;" statement from the head of the sketch to void setup(), and specifically declaring the D8 pin (const int chipSelect = D8; // used for ESP8266, and then SD.begin(chipSelect))).

my working code sample:

//#include <Adafruit_I2CDevice.h>
#include <RTClib.h>  // Use this in place of <DS3231.h>
// https://github.com/adafruit/RTClib/tree/master/examples
// DS3231S RTC I2C address 0x68, EEPROM 0x57

//#include <Adafruit_SPIDevice.h>  // added for SDCARD read
#include <SD.h>  // SD Card uses D5,6,7,8 needed for "File myFile; "code

// File myFile;  // needs the SD lib or compile error// v002 try place before rtc move to setup?
RTC_DS3231 rtc;
char const PRG_N[] = "RTC_SD_noADF_vB00";  // UPDATE @REV
char Text_tmp[120];                        // general temp buffer for text
uint32_t loop_m_sec = millis();            // Temp timer

const int chipSelect = D8;  // used for ESP8266 //  //  mod per tuitorial

/*
My TEST_RTC_ONLY_AFLIB_v003.ino worked to read, set and re-read the RTC with only these 2 libs: 
// #include <Adafruit_I2CDevice.h>
// #include <RTClib.h> 

Now try adding SDCARD read, this previously 'broke' my RTC set/read
*/

void setup()  //
{
  delay(10000);  // allow 10 sec to open Serial Monitor
                 //  while (!Serial) { delay(10); } // THIS LINE NO GOOD FOR NodeMCU?, HANGS....
  Serial.begin(115200);

  Serial.print(F("TEN SECOND DELAY COMPLETE... \n"));
  Serial.println(PRG_N);

  File myFile;  // moved to setup from head
  Serial.print("Initializing SD card...");
  if (!SD.begin(chipSelect))  //  mod per tuitorial
  {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
  myFile = SD.open("TEST_ARDUINO/Plain_Text.txt");  // open file in this directory

  if (myFile)  //
  {
    Serial.println("TEST_ARDUINO/Plain_Text.txt: ");

    // read from the file until there's nothing else in it:
    while (myFile.available()) {
      Serial.write(myFile.read());
    }
    // close the file:
    myFile.close();
  }     //
  else  //
  {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }

  rtc.begin();

  // read previous datetime, then SET the rtc here to see if I can write to it
  Serial.println("Current DateTime of RTC at start:");
  RTC_Read();
  Serial.println(Text_tmp);
  Serial.println();

  // now set to a dummy time 2001/02/03  04:05:06
  Serial.println("Now set to 2001/02/03  04:05:06:");
  rtc.adjust(DateTime(2001, 2, 3, 4, 5, 6));
  RTC_Read();
  Serial.println(Text_tmp);

  loop_m_sec = millis();

}  // end of void setup()^^^^^^


void RTC_Read()  // use function to avoid compile error redeclaration of 'DateTime now'
{
  DateTime now = rtc.now();
  sprintf(Text_tmp, "%04d/%02d/%02d  %02d:%02d:%02d", now.year(), now.month(),
          now.day(), now.hour(), now.minute(), now.second());
}


void loop()  //
{

  if ((millis() - loop_m_sec) >= (10 * 1000))  // every 10 seconds
  {
    RTC_Read();
    loop_m_sec = millis();
    Serial.println(Text_tmp);
  }
  delay(500);  // slow down loop
}

and SM output....

11:24:36.771 -> TEN SECOND DELAY COMPLETE... 
11:24:36.771 -> RTC_SD_noADF_vB00
11:24:36.771 -> Initializing SD card...initialization done.
11:24:36.815 -> TEST_ARDUINO/Plain_Text.txt: 
11:24:36.815 -> KRC-TEST Reading an SD Card file on NodeMCU Arduino
11:24:36.815 -> Line 2: Just more stuff
11:24:36.835 -> Line 3: OK, enough, this is the end 
11:24:36.835 -> Current DateTime of RTC at start:
11:24:36.835 -> 2001/02/03  04:53:44
11:24:36.835 -> 
11:24:36.835 -> Now set to 2001/02/03  04:05:06:
11:24:36.835 -> 2001/02/03  04:05:06
11:24:46.834 -> 2001/02/03  04:05:16
11:24:56.832 -> 2001/02/03  04:05:26
11:25:06.827 -> 2001/02/03  04:05:36

OK, I found my error. It was that darn "SD.begin(4)".

The tutorial had "SD.begin(chipSelect))", with chipSelect set = D8. I printed the value for that in the tutorial I found, and it was DEC 15. All the examples I found used DEC 4. I didn't question it, but it turns out that value is the pin the board is to use as the Chip Select (clear from that variable name in the tutorial, no clue to that in the examples I saw).

So my 'broken' example was "SD.begin(4)", that's GPIO4, which is (confusing to me) D2, which is.... drum roll.... SDA on the NodeMCU. So the SD Card Chip Select was messing with the SDA.

And in a contributing co-incidence, the SD Card 'worked' for me, because D8 on the NodeMCU has a 12K pull-down, so the SD Card was always selected. Since the SD Card worked, I overlooked these things.

Thanks for the help, it kept me looking, I almost gave up!

I'm glad you found the problem.

They didn't make that mistake with the pin numbers for the ESP32 board: GPIO21 has label "D21" and is pin 21 in the sketch.

My plan is to create a plain text config file on a computer, store it on that SD Card, and have the NodeMCU read that for config information. I need the NodeMCU to get on my WiFi , and I don't want that hard-coded, or need to use the IDE to change it.

I'm working on some hobby projects that I might want to share with non-programmers, but I could easily instruct them to edit a plain text file (and I'd have a read-only back-up in case of 'ooops'). I think it's easier as well, no IDE needed, no compiling, no worrying about library updates messing with things. I guess the IDE can write to flash w/o re-writing the program, but again, a plain text editor should be simpler.

I played for a while with using the WiFi AP mode, to set up a temporary web server, but that was (IMO) getting complicated to set up, as I plan to have 20 or so entries on the config file, not just SSID/PW. Parsing a text file should be easy (I think).

Today, everything seems to be JSON, but there are probably libraries for text parsers.

If you buy a cheap SD socket from Ebay/Amazon/AliExpress, then its contacts will not last very long in a humid environment.

The ESP8266 is getting old, and the ESP32 is being replaced by the ESP32-S2, ESP32-S3, ESP32-C3, ESP32-C6, ESP32-H2.
You will still be able to buy outdated boards, but they will get more expensive.

Have you tried uploading a sketch with OTA (Over The Air) ?

So you need a webserver that can edit a text file :wink:
I can not find that at: https://randomnerdtutorials.com/projects-esp32/

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.