A veces si en nuestro ESP32 o ESP866 vamos almacenando medidas varias en archivos diferentes en una SD conectada a nuestro ESPXX, necesitamos alguna vía de descargar o visualizar esos archivos sin tener desconectar la tarjeta SD , punto donde entra el servicio ftp, el cual nos va a facilitar esta tarea de un modo muy sencillo, como vamos a ver en este post.
El protocolo de transferencia de archivos (en inglés File Transfer Protocol o FTP) es un protocolo de red para la transferencia de archivos entre sistemas conectados a una red TCP (Transmission Control Protocol), basado en la arquitectura cliente-servidor. Desde un equipo cliente se puede conectar a un servidor para descargar archivos desde él o para enviarle archivos, independientemente del sistema operativo utilizado en cada equipo.
El servicio FTP es ofrecido por la capa de aplicación del modelo de capas de red TCP/IP al usuario, utilizando normalmente el puerto de red 20 y el 21. Un problema básico de FTP es que está pensado para ofrecer la máxima velocidad en la conexión, pero no la máxima seguridad, ya que todo el intercambio de información, desde el login y password del usuario en el servidor hasta la transferencia de cualquier archivo, se realiza en texto plano sin ningún tipo de cifrado, con lo que un posible atacante puede capturar este tráfico, acceder al servidor y/o apropiarse de los archivos transferidos.
Para solucionar este problema son de gran utilidad aplicaciones como SCP y SFTP, incluidas en el paquete SSH, que permiten transferir archivos pero cifrando todo el tráfico.
Biblioteca
La biblioteca está disponible directamente desde el Administrador de bibliotecas de Arduino IDE.
SimpleFTPServer en el administrador de bibliotecas de Arduino
O el código fuente de GitHub.
Puede encontrar una biblioteca aquí .Haga clic en el botón DESCARGAS en la esquina superior derecha y cambie el nombre de la carpeta sin comprimir SimpleFTPServer.
Verifique que SimpleFTPServer contenga FtpServer.cpp, FtpServer.h, FtpServerKey.he SimpleFTPServer.h .
Coloque la carpeta de la biblioteca SimpleFTPServer en su carpeta /libraries/.
Es posible que deba crear la subcarpeta de bibliotecas si es su primera biblioteca.
Reinicie el IDE.
Seleccione FS en esp8266
También puede habilitar LittleFS para esp8266 editando la línea en el archivo FtpServerKey.h
/*
* ESP32 Dev Kit (esp32)
* Start FTP server to upload data on SPIFFS
* by Mischianti Renzo <https://www.mischianti.org>
*
* https://www.mischianti.org/2019/05/11/wemos-d1-mini-esp8266-integrated-spiffs-filesistem-part-2/
*
*/
#include <WiFi.h>
#include "SPIFFS.h"
#include <SimpleFtpServer.h>
const char* ssid = "YOUR_SSID";
const char* password = "YOUR_PASS";
FtpServer ftpSrv; //set #define FTP_DEBUG in ESP8266FtpServer.h to see ftp verbose on serial
void setup(void){
Serial.begin(115200);
WiFi.begin(ssid, password);
Serial.println("");
// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
/////FTP Setup, ensure SPIFFS is started before ftp; /////////
if (SPIFFS.begin(true)) {
Serial.println("SPIFFS opened!");
ftpSrv.begin("esp8266","esp8266"); //username, password for ftp. set ports in ESP8266FtpServer.h (default 21, 50009 for PASV)
}
}
void loop(void){
ftpSrv.handleFTP(); //make sure in loop you call handleFTP()!!
}
Es importante destacar en el código anterior que debemos anotar el nombre de nuestra red wifi así como nuestra clave de acceso ( en el ejemplo esta en negrita) . Igualmente deberemos elegir un login y pwd para acceder al servicio ftp ( en el ejemplo es ESP8266/ESP866).
Esta biblioteca admite solo el modo pasivo y debe forzar solo una conexión a la vez.
Uso FileZilla como cliente, que puede descargarlo aquí ; Es bastante simple de usar y configurar.
Configuración de Filezilla para acceder a esp8266, seleccione FTP simple en Administrar sitio
Primero, debe continuar Manage site --> New sitey ahora configure este parámetro:
Seleccionar FTP como protocolo;
Seleccione Use plain FTP (insecure);
Establezca su nombre de usuario y contraseña (usted elige eso en el boceto);
Que en Trasfer settingsseleccionar Maximun number of connectionigual 1;
Ahora conéctese a su dispositivo.
Configuración de Filezilla para acceso esp8266, seleccione max num conexiones
Ahora puede administrar sus SPIFFS con arrastrar y soltar.
Recuerde que SPIFFS no administra carpetas, por lo que todos los archivos deben ser planos.
Prueba
Para verificar la carga, puede usar el boceto simple utilizado en el artículo de SPIFFS vinculado:
/*
* WeMos D1 mini (esp8266)
* SPIFFS get info, read dir and show all file uploaded
* add a data folder to use with esp8266 data uploader
* by Mischianti Renzo <https://www.mischianti.org>
*
* https://www.mischianti.org/2019/05/11/wemos-d1-mini-esp8266-integrated-spiffs-filesistem-part-2/
*
*/
#include "Arduino.h"
#include "FS.h"
void setup()
{
Serial.begin(112500);
delay(500);
Serial.println(F("Inizializing FS..."));
if (SPIFFS.begin()){
Serial.println(F("done."));
}else{
Serial.println(F("fail."));
}
// To format all space in SPIFFS
// SPIFFS.format()
// Get all information of your SPIFFS
FSInfo fs_info;
SPIFFS.info(fs_info);
Serial.println("File sistem info.");
Serial.print("Total space: ");
Serial.print(fs_info.totalBytes);
Serial.println("byte");
Serial.print("Total space used: ");
Serial.print(fs_info.usedBytes);
Serial.println("byte");
Serial.print("Block size: ");
Serial.print(fs_info.blockSize);
Serial.println("byte");
Serial.print("Page size: ");
Serial.print(fs_info.totalBytes);
Serial.println("byte");
Serial.print("Max open files: ");
Serial.println(fs_info.maxOpenFiles);
Serial.print("Max path length: ");
Serial.println(fs_info.maxPathLength);
Serial.println();
// Open dir folder
Dir dir = SPIFFS.openDir("/");
// Cycle all the content
while (dir.next()) {
// get filename
Serial.print(dir.fileName());
Serial.print(" - ");
// If element have a size display It else write 0
if(dir.fileSize()) {
File f = dir.openFile("r");
Serial.println(f.size());
f.close();
}else{
Serial.println("0");
}
}
}
void loop()
{
}
Prueba con devolución de llamada
Una característica interesante que agregué recientemente fue la devolución de llamada en alguna acción
/*
* FtpServer esp8266 and esp32 with SPIFFS
*
* AUTHOR: Renzo Mischianti
*
* https://www.mischianti.org/2020/02/08/ftp-server-on-esp8266-and-esp32
*
*/
#ifdef ESP8266
#include <ESP8266WiFi.h>
#elif defined ESP32
#include <WiFi.h>
#include "SPIFFS.h"
#endif
#include <SimpleFTPServer.h>
const char* ssid = "YOUR_SSID";
const char* password = "YOUR_PASS";
FtpServer ftpSrv; //set #define FTP_DEBUG in ESP8266FtpServer.h to see ftp verbose on serial
void _callback(FtpOperation ftpOperation, unsigned int freeSpace, unsigned int totalSpace){
switch (ftpOperation) {
case FTP_CONNECT:
Serial.println(F("FTP: Connected!"));
break;
case FTP_DISCONNECT:
Serial.println(F("FTP: Disconnected!"));
break;
case FTP_FREE_SPACE_CHANGE:
Serial.printf("FTP: Free space change, free %u of %u!\n", freeSpace, totalSpace);
break;
default:
break;
}
};
void _transferCallback(FtpTransferOperation ftpOperation, const char* name, unsigned int transferredSize){
switch (ftpOperation) {
case FTP_UPLOAD_START:
Serial.println(F("FTP: Upload start!"));
break;
case FTP_UPLOAD:
Serial.printf("FTP: Upload of file %s byte %u\n", name, transferredSize);
break;
case FTP_TRANSFER_STOP:
Serial.println(F("FTP: Finish transfer!"));
break;
case FTP_TRANSFER_ERROR:
Serial.println(F("FTP: Transfer error!"));
break;
default:
break;
}
/* FTP_UPLOAD_START = 0,
* FTP_UPLOAD = 1,
*
* FTP_DOWNLOAD_START = 2,
* FTP_DOWNLOAD = 3,
*
* FTP_TRANSFER_STOP = 4,
* FTP_DOWNLOAD_STOP = 4,
* FTP_UPLOAD_STOP = 4,
*
* FTP_TRANSFER_ERROR = 5,
* FTP_DOWNLOAD_ERROR = 5,
* FTP_UPLOAD_ERROR = 5
*/
};
void setup(void){
Serial.begin(115200);
WiFi.begin(ssid, password);
Serial.println("");
// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
/////FTP Setup, ensure SPIFFS is started before ftp; /////////
/////FTP Setup, ensure SPIFFS is started before ftp; /////////
#ifdef ESP32 //esp32 we send true to format spiffs if cannot mount
if (SPIFFS.begin(true)) {
#elif defined ESP8266
if (SPIFFS.begin()) {
#endif
ftpSrv.setCallback(_callback);
ftpSrv.setTransferCallback(_transferCallback);
Serial.println("SPIFFS opened!");
ftpSrv.begin("esp8266","esp8266"); //username, password for ftp. (default 21, 50009 for PASV)
}
}
void loop(void){
ftpSrv.handleFTP(); //make sure in loop you call handleFTP()!!
// server.handleClient(); //example if running a webserver you still need to call .handleClient();
}
Es importante destacar en el código anterior que debemos anotar el nombre de nuestra red wifi así como nuestra clave de acceso ( en el ejemplo esta en negrita) . Igualmente deberemos elegir un login y pwd para acceder al servicio ftp ( en el ejemplo es ESP8266/ESP866).
Aquí hay una carga simple de un archivo README.md.
.......
Connected to reef-casa-sopra
IP address: 192.168.1.127
LittleFS opened!
FTP: Connected!
FTP: Upload start!
FTP: Upload of file README.md byte 1072
FTP: Upload of file README.md byte 3120
FTP: Upload of file README.md byte 3559
FTP: Finish transfer!
FTP: Free space change, free 1019904 of 1036288!
Fuente https://www.mischianti.org/2020/02/08/ftp-server-on-esp8266-and-esp32/
Existen diferentes módulos de tarjetas microSD compatibles con el ESP32. En este post vamos a ver una aplicación de estos económicos módulos que nos pueden servir para un sinfín de aplicaciones.
Este módulo de lector de tarjetas SD facilita las aplicaciones que implican el uso de una tarjeta SD proporcionando una interfaz sencilla con un microcontrolador y que se puede utilizar como unidades periféricas normales.
Programando el microcontrolador en consecuencia, es posible leer y escribir en una tarjeta SD. Las señales procedentes de la tarjeta SD (MOSI, SCK, MISO y CS) son reportadas en el modulo y luego conectadas al conector de 2×8 pines pre-soldados. Esto facilita la integración del lector de tarjetas SD en diferentes tipos de proyectos.
La programación permite leer y escribir en la tarjeta SD usando su microcontrolador, y el modulo es adecuado para varios tipos de proyectos y requisitos, como reproductores MP3, sistemas de control MCU/ARM, etc.
En este post vamos a utilizar por tanto el módulo de tarjeta microSD que se muestra en la imagen superior (es un módulo de tarjeta microSD también es compatible con otros microcontroladores como Arduino y las placas ESP8266 NodeMCU así como el ESp32 y compatibles ), el cual se comunicará mediante el protocolo de comunicación SPI (aunque se puede usar cualquier otro módulo de tarjeta microSD con una interfaz SPI).
Asignación de pines del módulo de la tarjeta MicroSD – SPI
El módulo de la tarjeta microSD se comunica mediante el protocolo de comunicación SPI. Puede conectarlo al ESP32 usando los pines SPI predeterminados.
Módulo de tarjeta microSD
ESP32
VCC
Vin (5v)
CS
GPIO5
MOSI
GPIO23
CLK
GPIO18
MISO
GPIO19
TIERRA
TIERRA
Piezas necesarias
Para este post, necesitamos las siguientes partes:
Placa de desarrollo ESP32 o Arduino
Módulo de tarjeta MicroSD
Tarjeta micro SD
Cables de puente
Tablero de circuitos
Para conectar el módulo de la tarjeta microSD a la placa ESP32, puede seguir el siguiente diagrama esquemático (para los pines SPI ESP32 predeterminados):
Preparación de la tarjeta microSD
Antes de continuar con el tutorial, asegúrese de formatear su tarjeta microSD como FAT32 . Siga las siguientes instrucciones para formatear su tarjeta microSD o use una herramienta de software como SD Card Formater (compatible con Windows y Mac OS).
1. Inserte la tarjeta microSD en su computadora. Vaya a Mi PC y haga clic derecho en la tarjeta SD. Seleccione Formato como se muestra en la siguiente figura.
2. Aparece una nueva ventana. Seleccione FAT32 , presione Iniciar para iniciar el proceso de formateo y siga las instrucciones en pantalla.
ESP32 Manejo de archivos con un módulo de tarjeta MicroSD
Hay dos bibliotecas diferentes para ESP32 (incluidas en el núcleo de Arduino para ESP32): la biblioteca SD y la biblioteca SDD_MMC.h .
Si usa la biblioteca SD, está usando el controlador SPI. Si usa la biblioteca SDD_MMC, está usando el controlador ESP32 SD/SDIO/MMC. Puede obtener más información sobre el controlador ESP32 SD/SDIO/MMC .
Hay varios ejemplos en Arduino IDE que muestran cómo manejar archivos en la tarjeta microSD usando el ESP32. En el IDE de Arduino, vaya a Archivo > Ejemplos > SD(esp32) > SD_Test , o copie el siguiente código.
Este ejemplo muestra cómo realizar casi cualquier tarea que pueda necesitar con la tarjeta microSD:
Listar un directorio
Crear un directorio
Eliminar un directorio
Leer el contenido de un archivo
Escribir contenido en un archivo
Agregar contenido al archivo
Cambiar el nombre de un archivo
Eliminar un archivo
Inicializar tarjeta microSD
Obtenga el tipo de tarjeta microSD
Obtenga el tamaño de la tarjeta microSD
Alternativamente, puede usar los ejemplos de SD_MMC ; estos son similares a los ejemplos de SD, pero usan el controlador SDMMC. Para el controlador SDMMC, necesita un módulo de tarjeta microSD compatible. El módulo que estamos usando en este post no es compatible con SDMMC.
Cómo funciona el código
Primero, debe incluir las siguientes bibliotecas:FS.hpara manejar archivos,SD.hpara interactuar con la tarjeta microSD ySPI.hpara utilizar el protocolo de comunicación SPI.
#include "FS.h"
#include "SD.h"
#include "SPI.h"
El ejemplo proporciona varias funciones para manejar archivos en la tarjeta microSD.
Listar un directorio
loslistDir()función enumera los directorios en la tarjeta SD. Esta función acepta como argumentos el sistema de archivos (Dakota del Sur), el nombre del directorio principal y los niveles para entrar en el directorio.
Por ejemplo, el siguiente comando crea un nuevo directorio en la raíz llamadomidir.
createDir(SD, "/mydir");
Eliminar un directorio
Para eliminar un directorio de la tarjeta microSD, use eleliminarDir()y pase como argumento el sistema de archivos SD y la ruta del nombre del directorio.
losleerArchivo()La función lee el contenido de un archivo e imprime el contenido en el monitor serie. Al igual que con las funciones anteriores, pase como argumento elDakota del Sursistema de archivos y la ruta del archivo.
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());
}
file.close();
}
Por ejemplo, la siguiente línea lee el contenido delhola.txtexpediente.
readFile(SD, "/hello.txt")
Escribir contenido en un archivo
Para escribir contenido en un archivo, puede utilizar elescribirArchivo()función. Pasar como argumento, elDakota del Sursistema de archivos, la ruta del archivo y el mensaje
La siguiente línea agrega el mensaje¡Mundo!\nen elhola.txtexpediente. los\nortesignifica que la próxima vez que escriba algo en el archivo, se escribirá en una nueva línea.
appendFile(SD, "/hello.txt", "World!\n");
Cambiar el nombre de un archivo
Puede cambiar el nombre de un archivo usando elrenombrar archivo()función. Pase como argumentos el sistema de archivos SD, el nombre de archivo original y el nuevo nombre de archivo.
La siguiente línea cambia el nombre delhola.txtarchivo afoo.txt.
renameFile(SD, "/hello.txt", "/foo.txt");
Eliminar un archivo
Utilizar elborrar archivo()Función para eliminar un archivo. Pasar como argumento elDakota del Sursistema de archivos y la ruta del archivo que desea eliminar.
Si no pasa ningún argumento a laempezar()función, intentará inicializar la comunicación SPI con la tarjeta microSD en el pin predeterminado de selección de chip (CS). Si desea utilizar otro pin CS, puede pasarlo como argumento alempezar()función. Por ejemplo, si desea usar GPIO 17 como un pin CS, debe usar las siguientes líneas de código:
Sube el boceto anterior a tu placa ESP32. Después de eso, abra el monitor en serie y presione el botón RST integrado ESP32. Si la inicialización tiene éxito, obtendrá mensajes similares en el monitor serie.
Use pines SPI personalizados con la tarjeta MicroSD
losSD.h y SD_MMC.h son bibliotecas que utilizan los pines VSPI SPI (23, 19, 18, 5) de forma predeterminada. Puede configurar otros pines como pines SPI. El ESP32 presenta dos interfaces SPI: HSPI y VSPI en los siguientes pines:
SPI
MOSI
MISO
CLK
CS
VSPI
GPIO23
GPIO19
GPIO18
GPIO5
HSPI
GPIO13
GPIO12
GPIO14
GPIO15
Para usar otros pines SPI, puede proceder de la siguiente manera:
Al comienzo de su código, declare los pines que desea usar, por ejemplo:
En elconfiguración(), cree una nueva clase SPI en HSPI o VSPI. Estamos usando VSPI. Ambos funcionarán bien.
SPIClass spi = SPIClass(VSPI);
Inicialice el protocolo de comunicación SPI en los pines definidos anteriormente:
spi.begin(SCK, MISO, MOSI, CS);
Finalmente, inicialice la tarjeta microSD con elempezar()método. Pase como argumento el pin CS, la instancia SPI que desea usar y la frecuencia del bus.
if (!SD.begin(CS,spi,80000000)) {
Serial.println("Card Mount Failed");
return;
}
Aquí está el código de muestra modificado para usar pines SPI personalizados:
Ejemplo: Registro de datos ESP32 en tarjeta microSD
El uso de una tarjeta microSD es especialmente útil para proyectos de registro de datos. Como ejemplo, le mostraremos cómo guardar las lecturas del sensor de un sensor BME280 con marcas de tiempo ( tiempo de época ).
requisitos previos
Para este ejemplo, asegúrese de tener instaladas las siguientes bibliotecas:
Puede instalar estas bibliotecas utilizando el administrador de bibliotecas de Arduino. En tu IDE de Arduino, ve a Sketch > Incluir biblioteca > Administrar bibliotecas… Luego, busca los nombres de las bibliotecas e instálalos.
Diagrama esquemático
Para este ejemplo, debe conectar el módulo de la tarjeta microSD y el sensor BME280 al ESP32. Aquí hay una lista de las piezas necesarias:
Placa de desarrollo ESP32 (lea: Las mejores placas de desarrollo ESP32 )
sonda BME280
Módulo de tarjeta MicroSD
Tarjeta micro SD
Cables de puente
Tablero de circuitos
Conecte el circuito siguiendo el siguiente diagrama esquemático.
También puedes echar un vistazo a las siguientes tablas:
Copie el siguiente código en su IDE de Arduino. Este boceto obtiene lecturas del sensor BME280 (temperatura, humedad y presión) y las registra en un archivo en la tarjeta microSD cada 30 segundos. También registra la marca de tiempo (tiempo de época solicitado a un servidor NTP).
/*
Rui Santos
Complete project details at https://RandomNerdTutorials.com/esp32-microsd-card-arduino/
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
*/
// Libraries for SD card
#include "FS.h"
#include "SD.h"
#include <SPI.h>
//Libraries for BME280 sensor
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
// Libraries to get time from NTP Server
#include <WiFi.h>
#include "time.h"
// Replace with your network credentials
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
// Timer variables
unsigned long lastTime = 0;
unsigned long timerDelay = 30000;
// BME280 I2C
Adafruit_BME280 bme;
// Variables to hold sensor readings
float temp;
float hum;
float pres;
String dataMessage;
// NTP server to request epoch time
const char* ntpServer = "pool.ntp.org";
// Variable to save current epoch time
unsigned long epochTime;
// Function that gets current epoch time
unsigned long getTime() {
time_t now;
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
//Serial.println("Failed to obtain time");
return(0);
}
time(&now);
return now;
}
// Initialize WiFi
void initWiFi() {
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.print("Connecting to WiFi ..");
while (WiFi.status() != WL_CONNECTED) {
Serial.print('.');
delay(1000);
}
Serial.println(WiFi.localIP());
}
// Init BME280
void initBME(){
if (!bme.begin(0x76)) {
Serial.println("Could not find a valid BME280 sensor, check wiring!");
while (1);
}
}
// Initialize SD card
void initSDCard(){
if (!SD.begin()) {
Serial.println("Card Mount Failed");
return;
}
uint8_t cardType = SD.cardType();
if(cardType == CARD_NONE){
Serial.println("No SD card attached");
return;
}
Serial.print("SD 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.cardSize() / (1024 * 1024);
Serial.printf("SD Card Size: %lluMB\n", cardSize);
}
// Write to the SD card
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");
}
file.close();
}
// Append data to the SD card
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");
}
file.close();
}
void setup() {
Serial.begin(115200);
initWiFi();
initBME();
initSDCard();
configTime(0, 0, ntpServer);
// If the data.txt file doesn't exist
// Create a file on the SD card and write the data labels
File file = SD.open("/data.txt");
if(!file) {
Serial.println("File doesn't exist");
Serial.println("Creating file...");
writeFile(SD, "/data.txt", "Epoch Time, Temperature, Humidity, Pressure \r\n");
}
else {
Serial.println("File already exists");
}
file.close();
}
void loop() {
if ((millis() - lastTime) > timerDelay) {
//Get epoch time
epochTime = getTime();
//Get sensor readings
temp = bme.readTemperature();
//temp = 1.8*bme.readTemperature() + 32;
hum = bme.readHumidity();
pres = bme.readPressure()/100.0F;
//Concatenate all info separated by commas
dataMessage = String(epochTime) + "," + String(temp) + "," + String(hum) + "," + String(pres)+ "\r\n";
Serial.print("Saving data: ");
Serial.println(dataMessage);
//Append the data to file
appendFile(SD, "/data.txt", dataMessage.c_str());
lastTime = millis();
}
}
Este ejemplo utiliza las funciones que hemos visto anteriormente para escribir y agregar datos a la tarjeta microSD (escribirArchivo()yagregar archivo ()funciones).
Demostración
Sube el código a tu tablero. Puede comprobar en el monitor serie si todo funciona como se esperaba.
Deje que el proyecto funcione durante un tiempo para recopilar algunas lecturas. Luego, inserte la tarjeta microSD en su computadora, y debería tener un archivo llamado datos.txt con las lecturas del sensor.
Debe estar conectado para enviar un comentario.