|     Inicio    |   |         |  |   FOROS      |  |      |      
   Elastix - VoIP B4A (Basic4Android) App inventor 2 PHP - MySQL
  Estación meteorológica B4J (Basic4Java) ADB Shell - Android Arduino
  AutoIt (Programación) Visual Basic Script (VBS) FireBase (BD autoactualizable) NodeMCU como Arduino
  Teleco - Emisora de A.M. Visual Basic Cosas de Windows Webs interesantes
T Búsqueda en este sitio:


.

NodeMCU en español
NodeMCU - Juan Antonio Villalpando

-- Tutorial de NodeMCU en español --

Volver al índice del tutorial NodeMCU

____________________________

99.- Leer y escribir en tarjetas micro SdCard.

- Esto ya lo vimos en el tutorial 51.- Lector SdCard con Arduino, lo vuelvo a copiar en esta página.

- En nuestro caso utilizamos NodeMcu, observamos en la parte derecha HMOSI, HCS, HMISO, HSCLK correspondiente a los terminales D7, D8, D6 y D5.

- Esos son los terminales que necesitará nuestro módulo SdCard.

- Hay varios módulos para utilizar tarjetas micro SdCard, este que voy a utilizar tiene buen rendimiento:

- Este módulo trabaja tanto con 3,3V como con 5V, por lo cual se puede utilizar directemente tanto por tarjetas cuyos terminales funcionen con 3,3V como NodeMcu, Wemos, Arduino Mega,... como con los clásicos Arduino UNO que funciona con 5V.
- Sobre la placa se observa el chip "level shiffer", LVC125A que permite el funcionamiento con ambas tensiones.

- Y esta tarjeta micro SdCard de 32 GB

_______________________________________________________
- Libería.

- Utilizaremos la libreria SD.h, que ya suele venir instalada en el IDE de Arduino.

- https://www.arduino.cc/en/Reference/SD

_______________________________________________________

- Conexiones NodeMcu.

- En el código debes poner la línea correspondiente al NodeMcu:

const int CS = D8; // Para el NodeMcu
// const int CS = 4; // Para el Arduino y Wemos

- Fíjate que el terminal correspondiente al CS es el D8 en NodeMcu.

- !SD.begin(CS)

 

- Conexiones Arduino.

- Los terminales 11, 12 y 13 se han elegido porque esos terminales, además de ser digitales, son de MOSI, MISO y SCK.

- En el código debes poner la línea correspondiente al NodeMcu:

// const int CS = D8; // Para el NodeMcu
const int CS = 4; // Para el Arduino y Wemos

- Fíjate que el terminal correspondiente al CS es el 4 en Arduino y Wemos.

- !SD.begin(CS)

_______________________________________________________

1.- Leer un archivo.

- Introducimos nuestra tarjeta micro SdCard en nuestro ordenador (si tiene lector de SdCard), con un Editor de texto creamos un archivo, por ejemplo "leer.txt"

- Escribimos un mensaje que tenga eñe y acento, por ejemplo: El Ñandú corrió por Cádiz.

- Lo guardamos, pero atención, es conveniente crearlo con un Editor de texto como el Notepad++ y ponerle codificación: Codificar en UTF-8 sin BOM, de esta manera respetará las eñes y los acentos.

- Una vez que tenemos el archivo "leer.txt", insertamos la SdCard en el lector SdCard de Arduino.

- Cargamos este código:

Leer_SdCard.ino

// Juan A. Villalpando
// Lee en el Monitor Serie el contenido de un archivo.
#include <SD.h>
const int CS = D8; // Para el NodeMcu
// const int CS = 4; // Para el Arduino y Wemos
 
void setup()
{
  Serial.begin(9600);
  Serial.println("");
  Serial.println("Iniciando SdCard...");
  if (!SD.begin(CS)) {
    Serial.println("Error al iniciar.");
    return;
  }
    Serial.println("SdCard iniciada.");

  File miarchivo = SD.open("leer.txt");
  if (miarchivo) {
    while (miarchivo.available()) {
      Serial.write(miarchivo.read());
      delay(200);
    }
    miarchivo.close();
  }
  else {
    Serial.println("Error al abrir el archivo.");
  }
}

void loop() {
}

- Abrimos el Monitor Serie.

_______________________________________________________

2.- Escribir en un archivo.

- Cargamos este código en el Arduino:

Escribir_SdCard.ino

// Juan A. Villalpando
// Escribe en el Monitor Serie y se guarda
// en una archivo de la SdCard.

#include <SD.h>
const int CS = D8; // Para el NodeMcu
// const int CS = 4; // Para el Arduino y Wemos
File miarchivo;

void setup() {
Serial.begin(9600);

  Serial.println("Iniciando SdCard...");
  if (!SD.begin(CS)) {
    Serial.println("Error al iniciar.");
    return;
  }
    Serial.println("SdCard iniciada.");
}

char rx_byte = 0;
String rx_str = "";

void loop() {
miarchivo = SD.open("escribir.txt", FILE_WRITE); // Abre el archivo.

if (Serial.available() > 0) { // ¿Hay algún caracter en el Monitor Serie?
    rx_byte = Serial.read(); // Toma el caracter.
    rx_str += rx_byte; // Va uniendo los caracteres escritos.
    
    if (rx_byte == '\n') {
          if (miarchivo) { 
            Serial.print("Escribe en la SdCard: ");
            Serial.print(rx_str);
            miarchivo.print(rx_str);
                      }
    rx_str = ""; 
}
}
miarchivo.close(); // Cierra el archivo.
}

- Vamos al Monitor Serie, escribimos una frase, pulsamos "Enviar", se escribirá en el archivo "escribir.txt"

- Quitamos la tarjeta SdCard del módulo y la insertamos en un lector SdCard de nuestro ordenador, podremos leer el contenido de ese archivo.

- Observa la manera de ir tomando los caracteres uno a uno y enviarlos cuando pulsemos el Botón,

- Esto ya lo vimos en... 5C.- Introducir datos desde el Monitor Serie.

_______________________________________________________

3.- Información sobre la tarjeta SdCard.

- Código: https://www.arduino.cc/en/Tutorial/CardInfo

- Recuerda:

const int CS = D8; // Para el NodeMcu
// const int CS = 4; // Para el Arduino y Wemos

- !SD.begin(CS)

_______________________________________________________

4.- Listado de directorios y archivos en la tarjeta SdCard.

- Código: https://www.arduino.cc/en/Tutorial/Listfiles

________________________________________________________________
______________________________________________
_______________________________________________________

5.- Almacenamiento interno. Archivos con la librería FS. Sin SdCard externa.

- El NodeMcu tiene una memoria interna de 1 M para los datos, podemos utilizar esa memoria para guardar archivos.

https://circuits4you.com/tag/nodemcu/

https://circuits4you.com/2018/01/31/example-of-esp8266-flash-file-system-spiffs/

http://esp8266.github.io/Arduino/versions/2.0.0/doc/filesystem.html#file-system-object-spiffs

Almacenamiento_interno.ino

#include <ESP8266WiFi.h>
#include <FS.h>   // Libreria para el Sistema de Archivos.
 
const char* nombre_archivo = "/ejemplo.txt";
 
  
void setup() {
  delay(1000);
  Serial.begin(115200);
  Serial.println();
 
  // Inicia el Sistema de Archivos.
  if(SPIFFS.begin())
  {
    Serial.println("SPIFFS Inicializado.");
  }
  else
  {
    Serial.println("SPIFFS Error de Iniciacion.");
  }
 
  //////////// Formatear el Sistema de Archivos.
  if(SPIFFS.format())
  {
    Serial.println("El Sistema de Archivos ha sido formateado.");
  }
  else
  {
    Serial.println("Error al formatear el Sistema de Archivos.");
  }
  //////////////// Fin de Formatear.
 
  // Crea un nuevo archivo y escribe datos en el.
  // w = Abrir para escribir.
  File f = SPIFFS.open(nombre_archivo, "w");
  
  if (!f) {
    Serial.println("Error al abrir el archivo.");
  }
  else
  {
      // Escritura de datos en el archivo.
      Serial.println("Escribiendo datos...");
      f.print("Esta frase ha sido escrita en el archivo.");
      f.close();  // Cerrar archivo.
  }
 
}
 
void loop() {
  int i;
  
  // Lectura de datos.
  // r = Abrir para leer.
  File f = SPIFFS.open(nombre_archivo, "r");
  
  if (!f) {
    Serial.println("Error al abrir el archivo.");
  }
  else
  {
      Serial.println("Leyendo datos del archivo... ");
      for(i=0;i<f.size();i++) // Lee caracter a caracter.
      {
        Serial.print((char)f.read());
      }
      f.close();  // Cierra el archivo.
      Serial.println("Archivo cerrado.");
  }
  delay(3000);
}

- En el código anterior, elimina la parte siguente para que no formatee cada vez realice la lectura.

// Formatear el Sistema de Archivos.
if(SPIFFS.format())
{
Serial.println("El Sistema de Archivos ha sido formateado.");
} else {
Serial.println("Error al formatear el Sistema de Archivos.");
}

- Listado de archivos existentes en la memoria interna:

Listado_de_archivos.ino

#include <ESP8266WiFi.h>
#include <FS.h>   // Libreria para el Sistema de Archivos.
  
void setup() {
  Serial.begin(115200);
  Serial.println();
 
  // Inicia el Sistema de Archivos.
  if(SPIFFS.begin())
  {
    Serial.println("SPIFFS Inicializado.");
  }
  else
  {
    Serial.println("SPIFFS Error de Iniciacion.");
  }
}
 
void loop() {
String str = "";
Dir dir = SPIFFS.openDir("/");
while (dir.next()) {
    str += dir.fileName();
    str += " / ";
    str += dir.fileSize();
    str += "\r\n";
}
Serial.print(str);
}

_________________________________________________
- Tomar archivo de la SdCard y pasarlo al Nodemcu.

- Coexistir SD y SPIFFS.

- Debemos crea un NameSpace con SPIFFS, esto se consigue escribiendo file::File f = ...........

- Tenemos en la SdCard un archivo llamado index.htm, queremos pasar ese archivo al NodeMcu, también se llamará index.htm en el NodeMcu.

- Y luego mostrar su contenido en el Monitor Serie cada segundo.

Tomar archivo de la SdCard y pasarlo al Nodemcu.

#include <ESP8266WiFi.h>
#include <SD.h> 
#define FS_NO_GLOBALS // Permite que funcione el SPIFFS del NodeMcu y una SdCard. Poner antes del FS.h
#include <FS.h>   // Libreria para el Sistema de Archivos.

const int CS = D8; // Para el NodeMcu
// const int CS = 4; // Para el Arduino y Wemos
String texto_sdcard = ""; // Texto de la SdCard.
 
const char* nombre_archivo = "/index.htm";
  
void setup() {
 ////////////// Lectura de la SdCard //////
  Serial.begin(9600);
  Serial.println("");
  Serial.println("Iniciando SdCard...");
  if (!SD.begin(CS)) {
    Serial.println("Error al iniciar.");
    return;
  }
  Serial.println("SdCard iniciada.");
  File miarchivo = SD.open("index.htm");
  if (miarchivo) {
    while (miarchivo.available()) {
      Serial.write(miarchivo.read());
      texto_sdcard = texto_sdcard + miarchivo.readString();
      delay(100);
    }
    miarchivo.close();
    Serial.println("Leido el archivo de la SdCard.");
  }
  else {
    Serial.println("Error al abrir el archivo.");
  }
  ////////////////////////////////////////////////////

  /////////////// Memoria del NodeMcu ///////////////
// Inicia el Sistema de Archivos.
  if(SPIFFS.begin())
  {
    Serial.println("SPIFFS Inicializado.");
  }
  else
  {
    Serial.println("SPIFFS Error de Iniciacion.");
  }

  // 
  // Crea un nuevo archivo para ser escrito.
  // w = Abrir para escribir.
  fs::File f = SPIFFS.open(nombre_archivo, "w");
  
  if (!f) {
    Serial.println("Error al abrir el archivo.");
  }
  else
  {
      // Escritura de datos en el archivo.
      Serial.println("Escribiendo datos...");
      f.print(texto_sdcard);
      f.close();  // Cerrar el archivo.
  }
 
}
 
void loop() {
  int i;
  
  // Lee archivo del NodeMcu
  // Accediendo al SPIFFS, observa el 'fs::' antes del File.
     fs::File f = SPIFFS.open(nombre_archivo, "r");
 
  if (!f) {
    Serial.println("Error al abrir el archivo.");
  }
  else
  {
      Serial.println("Leyendo datos del archivo... ");
      for(i=0;i<f.size();i++) // Lee caracter a caracter.
      {
        Serial.print((char)f.read());
      }
      f.close();  // Cerrar archivo.
      Serial.println("Archivo cerrado.");
  }
  delay(1000);

}

_________________________________________________
- Tomar archivo del NodeMcu y pasarlo a la SdCard.

- Tenemos en el NodeMcu un archivo llamado index.htm, queremos pasar ese archivo a la SdCard y que se llame index4.htm.

Tomar archivo de la SdCard y pasarlo al Nodemcu.

#include <ESP8266WiFi.h>
#include <SD.h> 
#define FS_NO_GLOBALS // Permite que funcione el SPIFFS del NodeMcu y una SdCard. Poner antes del FS.h
#include <FS.h>   // Libreria para el Sistema de Archivos.

const int CS = D8; // Para el NodeMcu
// const int CS = 4; // Para el Arduino y Wemos
String texto_nodemcu = ""; // Texto del NodeMcu.
 
const char* nombre_archivo = "/index.htm";
  
void setup() {
Serial.begin(9600);
// Lectura del archivo en el NodeMcu
/////////////// Memoria del NodeMcu ///////////////
// Inicia el Sistema de Archivos.
  if(SPIFFS.begin())
  {
    Serial.println("SPIFFS Inicializado.");
  }
  else
  {
    Serial.println("SPIFFS Error de Iniciacion.");
  }
int i;
  
  // Lee archivo del NodeMcu
  // Accediendo al SPIFFS, observa el 'fs::' antes del File.
   fs::File f = SPIFFS.open(nombre_archivo, "r");
 
  if (!f) {
    Serial.println("Error al abrir el archivo.");
  }
  else
  {
      Serial.println("Leyendo datos del archivo... ");
      for(i=0;i<f.size();i++) // Lee caracter a caracter.
      {
       // Serial.print((char)f.read());
        texto_nodemcu = texto_nodemcu + (char)f.read();
      }
      f.close();  // Cerrar archivo.
      Serial.println("Archivo cerrado.");
  }


 ////////////// Lectura de la SdCard //////

  Serial.println("");
  Serial.println("Iniciando SdCard...");
  if (!SD.begin(CS)) {
    Serial.println("Error al iniciar.");
    return;
  }
  Serial.println("SdCard iniciada.");


File miarchivo = SD.open("index4.htm", FILE_WRITE); // Abre el archivo index4.htm
miarchivo.print(texto_nodemcu);
miarchivo.close(); // Cierra el archivo.
Serial.print("Escrito en la SdCard.");
}
 
void loop() {
}

________________________________

 

- Mi correo:
juana1991@yahoo.com
- KIO4.COM - Política de cookies. Textos e imágenes propiedad del autor:
© Juan A. Villalpando
No se permite la copia de información ni imágenes.
Usamos cookies propias y de terceros que entre otras cosas recogen datos sobre sus hábitos de navegación y realizan análisis de uso de nuestro sitio.
Si continúa navegando consideramos que acepta su uso. Acepto    Más información