Cómo leer el contenido de un archivo a un String en un Sketch de Arduino

Un código muy sencillo que es realmente útil a la hora de almacenar valores en un archivo y leerlos luego.

A very simple piece of code that is really useful to read values stored in a file.

String readFileValue(){
  FILE *filePointer;
  filePointer = fopen("/myStoredData.txt","r");
  char fileContent[100];
  fgets (fileContent , 100, filePointer);
  Serial.println(fileContent);
  
  return fileContent;
}

#Howto read contents of a file into a String variable in an ARDUINO sketch

El peligro de la cultura Maker

Más allá del Prototipo

Todos hemos visto de una u otra forma los beneficios de esa cultura que está permeando en nuestra sociedad; esa de hágalo usted mismo; esa de aprender algo, mejorar la técnica y compartir el conocimiento.

Resulta difícil imaginar que una cultura tal pueda tener algún peligro inherente para la sociedad. En realidad expongo aquí un peligro que la cultura Maker enfrenta en su naturaleza y que requiere de un cuidado importante ya que limita sus alcances de manera significativa.

En la cultura Maker las personas se explotan su curiosidad, analizan, prueban, aprenden, mejoran lo que existe, y comparten lo que aprendieron; es una cultura que acelera de manera vertiginosa la capacidad de prototipado de nuevas ideas; de nuevos productos. Sin embargo el gran peligro que enfrenta es el de quedarse allí precisamente; en el prototipo funcional, de conformarse una y otra vez con el nivel “instructable básico” y de no profundizar en ese gran paso que enriquece a la sociedad, el de crear nuevos productos, nuevas soluciones dirigidas a las personas que no son maker, que necesitan una solución completa que puedan consumir y utilizar tal cual.

Dentro de las destrezas clave para un maker podemos enumerar varias: autodidacta, curiosidad, documentación, solución de problemas, integración de tecnologías; pero una que normalmente pasa desapercibida es la que yo llamo “productivización”; es decir la capacidad de diseñar un producto repetible que se desempeñe de manera estable y satisfactoria en el campo; que se pueda consumir con un mínimo de instrucciones de uso.

Siendo la cultura maker empírica por su naturaleza, la profesionalización progresiva del maker es algo que requiere medular atención.

Destrezas y conocimientos en áreas como Administración de Proyectos, Ciclo de vida de Productos, Mercadeo, Emprendimiento e incluso Propiedad Intelectual se vuelven vitales para una cultura Maker que vaya más allá en la generación de riqueza de un país.

Sensor de Humedad DHT11 en un Intel Galileo

IMG_20150309_183311~2

Conectar un sensor de humedad y temperatura a un Intel Galileo o Edison no es tan sencillo como uno quisiera; pero luego de preguntar en los foros adecuados, tampoco es difícil.

Aquí les comparto lo que aprendimos en el proceso (hasta hora)

  1. El DHT11 es un sensor sumamente barato y fácil de conseguir. Tiene una excelente precisión y es fácil de utilizar.
  2. Pudimos comprobar las instrucciones de DinoT_Intel en el foro, que funcionan en un Intel Galileo GEN 1
  3. Básicamente uno puede bajar los tres archivos (como lo tenemos en nuestro experimento más reciente en GITHUB) en una misma carpeta donde está el Sketch que y funciona correctamente. Tambien se puede crear una carpeta “DHT” en “~/Arduino_version/libraries/” y poner los dos archivos DHT.h y DHT.cpp ahi (pero necesitarás reiniciar ARDUINO IDE)
  4. Nuestras pruebas funcionaron en un Galileo GEN 1 a la perfección usando ARDUINO IDE versión [arduino-1.5.3-Intel.1.0.4] que se puede descargar aquí.
  5. IMPORTANTE: Utilizar 7ZIP para desempacar el achivo en c: … puede conseguirlo aquí.

Esta vez no logramos echarlo a andar en Intel Edison. Ya les contaremos si llegamos a ese punto.

Un agradecimiento especial a @spider_kenny por su contribución de conocimiento sobre tiempos determinísticos e interfases. Creo que será la base que usaremos para echarlo a andar en un Intel Edison.

Llamadas dinámicas a LINUX desde ARDUINO IDE en un Intel Edison – Aprendizaje de 10 minutos

IMG_20150307_170030

Uno de los súper poderes de las plataformas Edison y Galileo de Intel es la disponibilidad de LINUX y la posibilidad de ejecutar comandos de LINUX desde un “sketch” de ARDUINO.

En esta receta les comparto cómo hacer llamadas dinámicas al sistema de LINUX desde un sketch ARDUINO, concatenando valores en un objeto String y luego convirtiendo dicho objeto a un arreglo de caracteres necesario para la llamada de sistema.

La idea es poder concatenar comandos de sistema, con valores leidos de los sensores, y hacer llamdas a Linux para que haga algo a partir de estos valores.

En resumen:

  1. La llamada de sistema recibe un parámetro que es un arreglo de caracteres (no un String)
  2. La concatenación se puede hacer de manera muy sencilla usando un String
  3. La conversión se realiza creando un arreglo de caracters del tamaño del String mas un caracter terminador.
  4. El sketch abajo es una modificacion del ejemplo BLINK, que además de hacer parpadear un led, tiene un contador que lleva la cuenta de la cantidad de veces que se ejecuta el comando loop().
  5. La función “dynamicCommand(c)” recibe el valor del contador y genera un comando de sistema para realizar un listado del contenido de una carpeta y poner el resultado en un archivo. Este archivo es nombrado con un sufijo que indica la cuenta que lleva el contador.
// Pin 13 has an LED connected on most Arduino boards.
// give it a name:
int led = 13;
int c = 0; //just a counter

// the setup routine runs once when you press reset:
void setup() {                
    // initialize the digital pin as an output.
    pinMode(led, OUTPUT);    
    Serial.begin(9600);
    Serial.println("TEST FOR STRING CONCATENATION"); 
}

// the loop routine runs over and over again forever:
void loop() {
    c++; //un simple contador
  
    Serial.println("Count: ");  
    Serial.println(c);

//  Serial.println("Count: " + c); //This behaves weird...  
    
    if( c < 10){ 
         dynamicCommand(c);
    }
    Serial.println("Blinking...");
    digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
    delay(1000); // wait for a second
    digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
    delay(1000);               // wait for a second
    Serial.println("Loop Complete!"); } 

dynamicCommand(int counter){
     Serial.println("dynamicCommand function..."); 
     String command = "ls > resultFile";
     command += counter;
     command += ".log";
     Serial.println("Concatenated command looks like this:");
     Serial.println(command);

//UPDATE: THIS COULD BE ACHIEVED USING THE buffer propery of the String object
//     Serial.println("Converting to char array...");
//     int commandLength = command.length() + 1;
//     char commandCharArray [commandLength];
     
//     command.toCharArray(commandCharArray, commandLength);
     
//     Serial.println("Command array looks like this:");
//     Serial.println(commandCharArray);
//     Serial.println("Making system call...");
//     system(commandCharArray);


system(command.buffer);

Serial.println("Done!"); }