313 lines
7.8 KiB
Arduino
313 lines
7.8 KiB
Arduino
|
/*
|
||
|
This sketch is combined demo of: 1) SD(esp_32) -- > SD_Test; 2) WiFi --> ETH_LAN8720
|
||
|
It displays info about the card on the terminal and initializes LAN after that. You can ping the IP address shown on the terminal.
|
||
|
*/
|
||
|
|
||
|
#include <ETH.h>
|
||
|
|
||
|
|
||
|
static bool eth_connected = false;
|
||
|
#include "FS.h"
|
||
|
#include "SD_MMC.h"
|
||
|
|
||
|
void listDir(fs::FS &fs, const char * dirname, uint8_t levels){
|
||
|
Serial.printf("Listing directory: %s\n", dirname);
|
||
|
|
||
|
File root = fs.open(dirname);
|
||
|
if(!root){
|
||
|
Serial.println("Failed to open directory");
|
||
|
return;
|
||
|
}
|
||
|
if(!root.isDirectory()){
|
||
|
Serial.println("Not a directory");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
File file = root.openNextFile();
|
||
|
while(file){
|
||
|
if(file.isDirectory()){
|
||
|
Serial.print(" DIR : ");
|
||
|
Serial.println(file.name());
|
||
|
if(levels){
|
||
|
listDir(fs, file.name(), levels -1);
|
||
|
}
|
||
|
} else {
|
||
|
Serial.print(" FILE: ");
|
||
|
Serial.print(file.name());
|
||
|
Serial.print(" SIZE: ");
|
||
|
Serial.println(file.size());
|
||
|
}
|
||
|
file = root.openNextFile();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void createDir(fs::FS &fs, const char * path){
|
||
|
Serial.printf("Creating Dir: %s\n", path);
|
||
|
if(fs.mkdir(path)){
|
||
|
Serial.println("Dir created");
|
||
|
} else {
|
||
|
Serial.println("mkdir failed");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void removeDir(fs::FS &fs, const char * path){
|
||
|
Serial.printf("Removing Dir: %s\n", path);
|
||
|
if(fs.rmdir(path)){
|
||
|
Serial.println("Dir removed");
|
||
|
} else {
|
||
|
Serial.println("rmdir failed");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void readFile(fs::FS &fs, const char * path){
|
||
|
Serial.printf("Reading file: %s\n", path);
|
||
|
|
||
|
File file = fs.open(path);
|
||
|
if(!file){
|
||
|
Serial.println("Failed to open file for reading");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
Serial.print("Read from file: ");
|
||
|
while(file.available()){
|
||
|
Serial.write(file.read());
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void writeFile(fs::FS &fs, const char * path, const char * message){
|
||
|
Serial.printf("Writing file: %s\n", path);
|
||
|
|
||
|
File file = fs.open(path, FILE_WRITE);
|
||
|
if(!file){
|
||
|
Serial.println("Failed to open file for writing");
|
||
|
return;
|
||
|
}
|
||
|
if(file.print(message)){
|
||
|
Serial.println("File written");
|
||
|
} else {
|
||
|
Serial.println("Write failed");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void appendFile(fs::FS &fs, const char * path, const char * message){
|
||
|
Serial.printf("Appending to file: %s\n", path);
|
||
|
|
||
|
File file = fs.open(path, FILE_APPEND);
|
||
|
if(!file){
|
||
|
Serial.println("Failed to open file for appending");
|
||
|
return;
|
||
|
}
|
||
|
if(file.print(message)){
|
||
|
Serial.println("Message appended");
|
||
|
} else {
|
||
|
Serial.println("Append failed");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void renameFile(fs::FS &fs, const char * path1, const char * path2){
|
||
|
Serial.printf("Renaming file %s to %s\n", path1, path2);
|
||
|
if (fs.rename(path1, path2)) {
|
||
|
Serial.println("File renamed");
|
||
|
} else {
|
||
|
Serial.println("Rename failed");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void deleteFile(fs::FS &fs, const char * path){
|
||
|
Serial.printf("Deleting file: %s\n", path);
|
||
|
if(fs.remove(path)){
|
||
|
Serial.println("File deleted");
|
||
|
} else {
|
||
|
Serial.println("Delete failed");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void testFileIO(fs::FS &fs, const char * path){
|
||
|
File file = fs.open(path);
|
||
|
static uint8_t buf[512];
|
||
|
size_t len = 0;
|
||
|
uint32_t start = millis();
|
||
|
uint32_t end = start;
|
||
|
if(file){
|
||
|
len = file.size();
|
||
|
size_t flen = len;
|
||
|
start = millis();
|
||
|
while(len){
|
||
|
size_t toRead = len;
|
||
|
if(toRead > 512){
|
||
|
toRead = 512;
|
||
|
}
|
||
|
file.read(buf, toRead);
|
||
|
len -= toRead;
|
||
|
}
|
||
|
end = millis() - start;
|
||
|
Serial.printf("%u bytes read for %u ms\n", flen, end);
|
||
|
file.close();
|
||
|
} else {
|
||
|
Serial.println("Failed to open file for reading");
|
||
|
}
|
||
|
|
||
|
|
||
|
file = fs.open(path, FILE_WRITE);
|
||
|
if(!file){
|
||
|
Serial.println("Failed to open file for writing");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
size_t i;
|
||
|
start = millis();
|
||
|
for(i=0; i<2048; i++){
|
||
|
file.write(buf, 512);
|
||
|
}
|
||
|
end = millis() - start;
|
||
|
Serial.printf("%u bytes written for %u ms\n", 2048 * 512, end);
|
||
|
file.close();
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
void WiFiEvent(WiFiEvent_t event)
|
||
|
{
|
||
|
switch (event) {
|
||
|
case ARDUINO_EVENT_ETH_START:
|
||
|
Serial.println("ETH Started");
|
||
|
//set eth hostname here
|
||
|
ETH.setHostname("esp32-ethernet");
|
||
|
break;
|
||
|
case ARDUINO_EVENT_ETH_CONNECTED:
|
||
|
Serial.println("ETH Connected");
|
||
|
break;
|
||
|
case ARDUINO_EVENT_ETH_GOT_IP:
|
||
|
Serial.print("ETH MAC: ");
|
||
|
Serial.print(ETH.macAddress());
|
||
|
Serial.print(", IPv4: ");
|
||
|
Serial.print(ETH.localIP());
|
||
|
if (ETH.fullDuplex()) {
|
||
|
Serial.print(", FULL_DUPLEX");
|
||
|
}
|
||
|
Serial.print(", ");
|
||
|
Serial.print(ETH.linkSpeed());
|
||
|
Serial.println("Mbps");
|
||
|
eth_connected = true;
|
||
|
break;
|
||
|
case ARDUINO_EVENT_ETH_DISCONNECTED:
|
||
|
Serial.println("ETH Disconnected");
|
||
|
eth_connected = false;
|
||
|
break;
|
||
|
case ARDUINO_EVENT_ETH_STOP:
|
||
|
Serial.println("ETH Stopped");
|
||
|
eth_connected = false;
|
||
|
break;
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void testClient(const char * host, uint16_t port)
|
||
|
{
|
||
|
Serial.print("\nconnecting to ");
|
||
|
Serial.println(host);
|
||
|
|
||
|
WiFiClient client;
|
||
|
if (!client.connect(host, port)) {
|
||
|
Serial.println("connection failed");
|
||
|
return;
|
||
|
}
|
||
|
client.printf("GET / HTTP/1.1\r\nHost: %s\r\n\r\n", host);
|
||
|
while (client.connected() && !client.available());
|
||
|
while (client.available()) {
|
||
|
Serial.write(client.read());
|
||
|
}
|
||
|
|
||
|
Serial.println("closing connection\n");
|
||
|
client.stop();
|
||
|
}
|
||
|
|
||
|
// Print SDCard Info, perform son read/write operations and test file I/O
|
||
|
// (This is called when the button is pressed)
|
||
|
void Print_SDCard_Info ()
|
||
|
{
|
||
|
uint8_t cardType = SD_MMC.cardType();
|
||
|
|
||
|
if(cardType == CARD_NONE){
|
||
|
Serial.println("No SD_MMC card attached");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
Serial.print("SD_MMC Card Type: ");
|
||
|
if(cardType == CARD_MMC){
|
||
|
Serial.println("MMC");
|
||
|
} else if(cardType == CARD_SD){
|
||
|
Serial.println("SDSC");
|
||
|
} else if(cardType == CARD_SDHC){
|
||
|
Serial.println("SDHC");
|
||
|
} else {
|
||
|
Serial.println("UNKNOWN");
|
||
|
}
|
||
|
|
||
|
uint64_t cardSize = SD_MMC.cardSize() / (1024 * 1024);
|
||
|
Serial.printf("SD_MMC Card Size: %lluMB\n", cardSize);
|
||
|
|
||
|
listDir(SD_MMC, "/", 0);
|
||
|
createDir(SD_MMC, "/mydir");
|
||
|
listDir(SD_MMC, "/", 0);
|
||
|
removeDir(SD_MMC, "/mydir");
|
||
|
listDir(SD_MMC, "/", 2);
|
||
|
|
||
|
writeFile(SD_MMC, "/hello.txt", "Hello ");
|
||
|
appendFile(SD_MMC, "/hello.txt", "World!\n");
|
||
|
readFile(SD_MMC, "/hello.txt");
|
||
|
|
||
|
deleteFile(SD_MMC, "/foo.txt");
|
||
|
renameFile(SD_MMC, "/hello.txt", "/foo.txt");
|
||
|
readFile(SD_MMC, "/foo.txt");
|
||
|
|
||
|
testFileIO(SD_MMC, "/test.txt");
|
||
|
|
||
|
Serial.printf("Total space: %lluMB\n", SD_MMC.totalBytes() / (1024 * 1024));
|
||
|
Serial.printf("Used space: %lluMB\n", SD_MMC.usedBytes() / (1024 * 1024));
|
||
|
|
||
|
}
|
||
|
|
||
|
// Pressing the button will pull down the input (it has a 10k pullup resistor)
|
||
|
#define BUTTON_PRESSED() (!digitalRead (34))
|
||
|
|
||
|
void setup()
|
||
|
{
|
||
|
// Wait for the hardware to initialize:
|
||
|
delay(500);
|
||
|
|
||
|
Serial.begin(115200);
|
||
|
|
||
|
//if(!SD_MMC.begin()) // if using ESP32 package 2.0.x
|
||
|
if(!SD_MMC.begin("/sdcard", true)) // if using ESP32 package 3.x.x
|
||
|
{
|
||
|
Serial.println("Card Mount Failed");
|
||
|
Serial.println("Note: is it formated as FAT32? (exFAT and other formats at NOT supported)");
|
||
|
return;
|
||
|
}
|
||
|
Serial.println("Card Mounted");
|
||
|
|
||
|
WiFi.onEvent(WiFiEvent);
|
||
|
ETH.begin();
|
||
|
pinMode (34, INPUT); // Button
|
||
|
}
|
||
|
|
||
|
|
||
|
void loop()
|
||
|
{
|
||
|
// Note: you may have to press the button for 2 seconds before it is detected (because of the delay at the end of this loop)
|
||
|
if (BUTTON_PRESSED())
|
||
|
{
|
||
|
Print_SDCard_Info ();
|
||
|
// Wait for the user to release the button
|
||
|
while (BUTTON_PRESSED());
|
||
|
}
|
||
|
|
||
|
if (eth_connected) {
|
||
|
testClient("google.com", 80);
|
||
|
}
|
||
|
|
||
|
delay(2000);
|
||
|
}
|