viernes, 7 de junio de 2013

El dust bowl. Erosión.

El dust bowl. Erosión.

Categoría: 2. Ciencia y tecnología.

En los años 1931 a 1939 los sistemas de labranza mecanizados habían alcanzado  altos niveles de tecnificación. En los estados de Oklahoma, Kansas, Nuevo México y Colorado, se dio un proceso de erosión pronunciada debido a una sequía que se prolongó por casi ocho años. El suelo comenzó a ser arrastrado por el viento alcanzando regiones tan lejanas como el sur de Canadá, la ciudad de Nueva York y el norte de México. Miles de agricultores se vieron obligados a emigrar, debido a que los suelos se volvieron improductivos.
La agricultura de la región había prosperado a grandes pasos desde el inicio del siglo gracias a la creciente mecanización de las labores de roturación del suelo, el desarrollo de sembradoras y cosechadoras especializadas, el incremento de la velocidad del transporte de mercancías en vehículos con motor de combustión interna, la introducción de líneas de ferrocarril a regiones cada vez más lejanas, entre otras mejoras tecnológicas.
La primera guerra mundial en Europa generó una demanda de alimentos que eran importados en su mayoría, debido a la destrucción de los sistemas productivos locales. Los productores de trigo disfrutaron de una gran demanda por su producción, con precios ventajosos. Este fue el caso de las grandes planicies del oeste de Estados Unidos, lo que disparó el desarrollo económico de la región. Sin embargo, la sequía de 1931 a 1939 ocasionó grandes pérdidas económicas y por si fuera poco, la calidad del aire empeoró tanto que hizo casi imposible la vida de la gente. Esto llevó a una migración forzada, pero la depresión económica se resentía en todas partes. Los más afortunados encontraron empleo como jornaleros agrícolas en el Valle Imperial, en California, que recientemente había sido dotado con abundante agua de riego por la construcción de la presa Hoover en el río Colorado (1930). Esta fue una de las acciones que ayudaron a ese país a salir de aquella gran depresión.
Entonces se hizo evidente que los sistemas de labranza introducidos recientemente, no eran lo más adecuado para esa región en particular, ya que su precipitación promedio (unos 500 mm anuales) es apenas superior a la de un desierto. Esta alteración del suelo y sus consecuencias para la sociedad y la economía de la región puso en alerta a los técnicos del Departamento de Agricultura de Estados Unidos (USDA), quienes rápidamente introdujeron mejoras en los sistemas de labranza y de siembra para esas regiones semi-áridas. Se introdujeron entonces lo que hoy se llama sistemas de labranza reducida y cero labranza, así como prácticas culturales como el acolchado con residuos de cosecha y acolchados plásticos. Estas tecnologías aumentan la captación de agua en el suelo, minimizan la escorrentía superficial, disminuyen la exposición del suelo a agentes erosivos, como el viento, y conservan inalterada la estructura natural del suelo (las partículas de suelo se agregan en cubos o pequeñas columnas por medio de sustancias aglutinantes de origen orgánico y/o mineral). Todo esto minimiza la exposición del suelo a la erosión y hace más eficiente el uso del agua en los sistemas agrícolas y ganaderos.
Por último, a manera de reflexión, puedo recomendar la lectura de la entrada "El hubiera no existe" de este mismo Blog: http://maordbus.blogspot.mx/2012/04/el-hubiera-no-existe-por-que.html. A veces no es posible anticipar todos los efectos (positivos o negativos) que la introducción de una nueva tecnología puede tener. Sin embargo, como también se ve claramente en este ejemplo, los efectos benéficos pueden ser sumamente importantes en un momento dado. La dotación de alimentos a las naciones europeas en guerra habría sido más difícil sin la abundante producción generada en esta región del planeta. Afortunadamente, las soluciones al problema se desarrollaron rápidamente y en la actualidad los beneficios de esos nuevos sistemas de labranza se traducen en mayor eficiencia energética y menor gasto de agua en algunas de las actividades agrícolas. Se anticiparon al concepto de desarrollo sustentable ¿No?






viernes, 31 de mayo de 2013

Sensor analógico y señal luminosa con Arduino UNO

Sensor analógico y señal luminosa con Arduino UNO.

Categoría: 1. Programación y electrónica.

Este es un programa sencillo para Arduino UNO, que envía pulsos a un LED cuya duración se ajusta instantáneamente a la intensidad de la iluminación detectada con un sensor (fotorresistencia de 10kOhm) colocado en la entrada analógica A0.
Tres LEDs (puede ser uno o dos si se prefiere) se conectan a los pines digitales I/O 9, 10 y 11 por el ánodo. El cátodo de cada LED se conecta a una resistencia de 220Ohm, conectada a tierra (GND). La fotorresistencia se conecta entre los pines A0 y +5V. En una de las terminales de la fotorresistencia se conecta una resistencia de 10kOhm que se conecta a tierra (GND).
El código es el siguiente:
/*
LedRBG_AnalogRead
*/

#define Blue 9
#define Green 10
#define Red  11

int sensorValue;
unsigned long tiempoTotal, ultimoRegistro, ultimoReporte;
int intervalo;
int reporte = 1500;
byte ultimoEstado = LOW;
byte estadoActual = LOW;

void setup()  {
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  Serial.begin(9600);
}

void loop()  {
  sensorValue = analogRead(A0);
  intervalo = sensorValue / 2;
  tiempoTotal = millis();

  if (tiempoTotal - ultimoRegistro > intervalo)  {
    // digitalWrite(Blue, estadoActual);
    // digitalWrite(Red, estadoActual);
    digitalWrite(Green, estadoActual);
    ultimoRegistro = millis();
    if (estadoActual == LOW)
      estadoActual = HIGH;
    else
      estadoActual = LOW;
  }

  double iluminacion = sensorValue;
  iluminacion = iluminacion * 100 / 1023;

  if (tiempoTotal - ultimoReporte > reporte)  {
    Serial.print("La iluminacion actual es: ");
    Serial.print(iluminacion);
    Serial.println(" %");
    ultimoReporte = millis();  }
}




Figura 1. Aspecto del circuito ya montado.


En el código se utilizó el método de contar el tiempo mediante la función millis(). De esta manera, se pueden controlar muchos procesos independientes unos de otros sin que haya interferencias como sucede con la instrucción delay(ms).
Si se disminuye la iluminación que recibe la fotorresistencia el pulso enviado al LED disminuye su duración y también el tiempo que dura la pausa (LOW), que es de la misma duración.

Bibliografía
Sitio Arduino Homepage: http://www.arduino.cc/







sábado, 15 de diciembre de 2012

Hugo Cabret

Hugo Cabret.

Categoría: 4. Cine y literatura.

El imagianrio de Hugo Cabret, la película de Martin Scorsese en la que ese cuenta la historia del pequeño Hugo en los intrincados laberintos de la estación de tren de París, dando cuerda al reloj. Alrededor de su historia están las de Josh Méliés, iniciador de los efectos visuales en el cine, y la historia de un autómata que había sido propiedad del padre de Hugo y que necesitaba unas reparaciones para dibujar de nuevo y revelar un secreto importante para la vida de Hugo. La crítica que hace Fernanda Solórzano la pueden ver en http://www.letraslibres.com/revista/artes-y-medios/hugo-de-martin-scorsese, y contiene información bastante interesante al respecto.

Por lo pronto es todo, saludos.





viernes, 30 de noviembre de 2012

Algo sobre la poinsettia

Do you know poinsettia?

Categoría: 2. Ciencia y tecnología.

Había enfocado una vez el tema de los aportes tecnológicos de mesoamérica al resto del mundo en el momento de la conquista europea de estos territorios (http://maordbus.blogspot.mx/2012/11/algo-sobre-la-poinsettia.html). Así se puede hablar de varias especies de plantas que fueron domesticadas como el maíz, jitomate y tabaco. Algunos animales como el pavo o guajolote. Algunos procesos tecnológicos que fueron aprovechados durante la época colonial y aún en nuestros días, como el beneficio de los minerales utilizando sal en lugar de mercurio, lo que permitió la explotación temprana de oro y plata; la nixtamalización del maíz, que permite procesar este alimento a nivel industrial; la fermentación del aguamiel, que permitió el desarrollo de la industria de destilación de alcohol; la fabricación de chicle a partir de la savia del árbol Hevea brasilensis, que es una gran industria en la actualidad; la vulcanización también parece haber sido un proceso conocido en la fabricación de bolas de caucho para el juego de pelota y que en la actualidad se utiliza para la fabricación de neumáticos, una industria de grandes dimensiones hoy en día; el tabaco se utilizaba con fines ceremoniales y medicinales, y en la actualidad se ha fundado una gran industria alrededor de esta especie, además de que se han desarrollado variedades con propiedades sumamente sofisticadas por su aroma, uniformidad de combustión, serosidad, coloración del humo, entre otras, y alrededor de su uso hay todo un lenguaje de comunicación, de gran significación social.




Bueno, pues por estas fechas decembrinas no puede faltar una planta de nochebuena adornando las mesas y otros motivos navideños, no sólo en México sino en muchas partes del mundo. Su nombre científico, Euphorbia pulcherrima, proviene, en el caso del género, como referencia a la familia botánica a la que pertenece, que son las Euphorbiáceas, plantas caracterizadas por sus secreciones de savia lechosa y sus frutos ciatios característicos de las plantas de esta familia botánica, como los higos, los amates y los ficus. Y el nombre de su especie, pulcherrima, que es de origen náhuatl y hace referencia precisamente al aspecto lechoso de su savia, parecido al pulque.
En la página web teleflora (http://www.teleflora.com/poinsettia/flowers-plants/poinsettia-detail.asp) menciona en un pequeño texto varios datos de interés. Por ejemplo, su nombre en inglés, Poinsettia, proviene del primer embajador de Estados Unidos en México Joel Roberts Poinsett, quien era aficionado a la botánica y llevó esta planta a su país en el año 1825. En inglés se le conoce como 'christmas star' y 'christmas flower', esto por la particularidad de la forma de estrella de las hojas, llamadas bracteas, que rodean sus flores y de que florece precisamente en la época navideña en el hemisferio norte. Otros nombres que recibe esta planta son 'mexican flame leaf', 'winter rose', 'noche buena' y en Turquía 'Ataturk's flower', debido a que era planta favorita del fundador de la nación turca moderna Ataturk (Mustafa Kemal Atatürk, 1881-1938). La planta estaba asociada con buenos sentimientos y con la pureza por los aztecas en México, y en la actualidad también se le asocia con pensamientos nobles como el éxito, los buenos deseos y la celebración.




Sus flores se agrupan en inflorescencias cimosas y sus frutos son cápsulas. Su ovario o gineceo es súpero, lo que se aprecia claramente en la imagen que se muestra arriba de estas líneas. Las bracteas que rodean la inflorescencia cambian su coloración en respuesta al fotoperiodo, es decir, a la duración del día de menos de 12 horas. Su fruto es una cápsula o ciatio.

En la página web de CONABIO (http://www.conabio.gob.mx/malezasdemexico/euphorbiaceae/euphorbia-pulcherrima/fichas/ficha.htm) se puede encontrar una serie de nombres que recibe esta planta en distintas lenguas nativas de México, como Cuetlaxóchutl en náhuatl, que significa flor que se marchita. En la actualidad es una de las plantas ornamentales más importantes del mundo. En la página web de la Universidad de Purdue en Indiana, EU (http://www.extension.purdue.edu/extmedia/HO/HO-235-W.pdf) se puede encontrar un pequeño manual para la propagación industrial de la noche buena bajo condiciones de invernadero.


Me había quedado un poco pensativo con lo que comentamos sobre la propiedad intelectual en la producción de nochebuenas. Estaba pensando que una parte importante de la tecnología en la producción actual radica en la obtención de nuevas variedades, con colores novedosos. Eso se obtiene mediante la generación de líneas puras, es decir, poblaciones de plantas obtenidas por autopolinización por tres o más generaciones. De este modo, los pares de genes se hacen homocigóticos (NN para un gene dominante; nn para un gene recesivo); de esta manera se logra obtener poblaciones en las que los genes recesivos, normalmente ocultos, se expresen. Por eso ahora se tiene variedades con las brácteas color amarillo, rosado, rojo intenso, rojo claro, bracteas anchas, bracteas cortas, bracteas enchinadas y más. Después se hacen cruzamientos entre líneas obtenidas de variedades diferentes para obtener las combinaciones más vistosas entre color y forma de las brácteas, por ejemplo.



Bueno, digamos que todo esto es tecnología aplicada y podría considerarse, hasta cierto punto, secreto profesional. Pero existen en realidad pocos empresarios que cultiven nochebuenas que tengan la capacidad financiera, organizativa y cuenten con el personal calificado para hacer estas tareas de modo sistemático y cuidadoso, como se requiere. En todos esos procedimientos financieros, organizativos y prácticos radica la mayoría de los secretos profesionales de esta actividad. Por eso, la propiedad de los derechos de una variedad vegetal es una propiedad intelectual y quien se dedica a propagar comercialmente estas variedades debe pagar una regalía al creador de la misma.

Pero espero no abrumarte con estas ideas. De cualquier manera, existe una cantidad de normatividad al respecto. Y de hecho, el conocer de manera más o menos detallada toda esa normatividad (internacional y nacional) es en sí mismo una parte importante del capital humano de una empresa de mejoramiento genético. Es parte del secreto profesional de una empresa.

Saludos y hasta la próxima.






lunes, 22 de octubre de 2012

Diseño de un pulsador con C++

Diseño de un pulsador utilizando el circuito integrado NE555.

Categoría: 1. Programación y electrónica.

Se desarrolló un programa en C++ que calcula la frecuencia, el tiempo del ciclo o periodo (T, en s), el tiempo en HIGH (t1, en s) y el tiempo en LOW (t2, en s). Genera una tabla que se despliega en la consola de Visual C++ y al mismo tiempo genera un archivo, pulsda06.txt, con un formato separado por tabuladores. Este archivo de texto puede abrirse con el programa Excel, de manera que se pueden manejar sus valores para elaborar diferentes tipos de gráficos.
El diagrama del circuito es el siguiente:



Las ecuaciones de diseño según la hoja de datos para este circuito integrado son las siguientes:
t1 = 0.693*(RA+RB)*C
t2 = 0.693*(RB)*C
T = t1+t2 = 0.693*(RA+2RB)*C
f = 1.44 / (RA+2RB)*C
Output driver duty cycle = t1 / (t2+t1) = RB / (RA+2RB)

El programa se corre con un valor inicial de 2200ohm para Ra y termina con 10Mohm con incrementos de 50000ohm en cada ciclo. Para Rb se toma un valor inicial de 2200ohm y se incrementa en 1000ohm en cada ciclo. Se utilizó un capacitor de 2.2uF.
En el archivo de salida la primera columna corresponde al número de ciclo de cálculo, la segunda columna es el valor de Ra (ohm), la tercera columna es el valor de Rb (ohm), la cuarta columna es el valor de t1 (s), la quinta columna es el valor de t2 (s), la sexta columna es el valor de T (s), la séptima columna es el valor de f (s-1) y la octava columna es el valor del ciclo de trabajo (número fraccionario).
El código del programa es el siguiente:



// PulsadorNE555_04.cpp: define el punto de entrada de la aplicación de consola.
//
// PulsadorNE555_03.cpp: archivo de proyecto principal.
// despliega los valores de #corrida, Ra, Rb, t1, t2, T, freq y dutyCycle separados por punto y coma
// se trata que el archivo de texto pueda ser leido por el programa Excel con columnas
// separadas por tabulador

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>
using namespace std;

int main() {
 float t1;
 float t2;
 float Time;
 float freq;
 float dutyCycle;
 float Ra = 2200;
 float Rb = 2200;
 float c = 0.0000022;
 int caso = 1;
 ofstream out("D:\\pulsda06.txt");
 while (Ra < 10000000)  {
 t1 = 0.693*(Ra + Rb)*c;
 t2 = 0.693*Rb*c;
 Time = t1+t2;
 freq = 1/Time;
 dutyCycle = (Ra + Rb) / (Ra + 2*Rb);

 cout << caso;
 cout << ";\t";
 cout << Ra;
 cout << ";\t";
 cout << Rb;
 cout << ";\t";
 cout << t1;
 cout << ";\t";
 cout << t2;
 cout << ";\t";
 cout << Time;
 cout << ";\t";
 cout << freq;
 cout << ";\t";
 cout << dutyCycle;
 cout << ";\n";
 // escribeArchivo:
 if (!out)  {
  cout << "cannot open file...\n";
  return 1; }
 out << caso;
 out << "\t";
 out << Ra;
 out << "\t";
 out << Rb;
 out << "\t";
 out << t1;
 out << "\t";
 out << t2;
 out << "\t";
 out << Time;
 out << "\t";
 out << freq;
 out << "\t";
 out << dutyCycle;
 out << "\n";
 Ra = Ra + 50000;
 Rb = Rb + 1000;
 caso++;  }
 out.close();
 system("pause");
 return 0; }

Para este ejemplo se registran 200 ciclos de cálculo que quedan guardados en el archivo pulsda06.txt. Este archivo se abrió desde Excel donde se generaron tres gráficos que se muestran a continuación:


 Gráfico 1. Valores de t1 y t2 en función del valor de Ra
 Gráfico 2. Valor de la frecuencia en función de Ra
Gráfico 3. Valor del ciclo de trabajo en función de Ra

Con los datos generados se puede obtener para un ciclo de 1.04s, un ciclo de trabajo de 0.978, con duración de t1 de 1.018s y t2 de 0.022s. Para ello se requiere valores de Ra= 652200ohm y para Rb= 15200ohm. El valor de f será de 0.96 s^-1.

Por lo pronto es todo. Saludos y hasta la próxima.

Referencias bibliográficas:
2010. Texas Instruments. NA555, NE555, SA555, SE555. Data Sheet. USA.
1998. STMicroelectronics NE555, SA555, SE555. Data Sheet. USA.
2004. Applied digital circuits: 555 timer, analog to digital (ADC) and digital to analog (DAC) conversion (DAC). University of California at Berkeley. Physics 111 Laboratory. Basic semiconductor circuits. Lab 11 & 12. USA.
http://www.bgsu.edu/departments/compsci/docs/write.html








jueves, 6 de septiembre de 2012

Manejo de la micro SD del Shield Ethernet

Manejo de la micro SD del Shield Ethernet.

Categoría: 1. Programación y electrónica.

Se desarrolló un programa (C/C++) para tener juntas algunas instrucciones útiles en el manejo de los archivos contenidos en la tarjeta micro SD del Shield Ethernet de Arduino. Con base en algunos programas de ejemplo como dumpFile, cardInfo y readWrite se desarrolló un menú y las acciones leerArchivo, leerMicroSD y borrarArchivo se programaron como funciones. El monitor serial despliega el menú de opciones y el usuario introduce a través del mismo monitor serial la opción que desea que el programa ejecute. Se verificó cada una de las tres opciones del menú por separado, una vez que crrieron correctamente al cargarlas en la tarjeta Arduino se procedió a colocarlas en un programa único una a una, y teniendo cuidado de no sobrepasar el límite de almacenamiento de la tarjeta (32256 bytes). Para terminar, se verificó el programa completo (16598 bytes) y se cargó en la tarjeta electrónica.

El código es el siguiente:

#include <SD.h>
Sd2Card card;
SdVolume volume;
SdFile root;
const int chipSelect = 4;
void setup ()  {
  Serial.begin(9600);
  pinMode(10, OUTPUT);
  Serial.println("enter:\n 1. cardInfo\n 2. leerArchivo\n 3. borrarArchivo\n 0. Salir ");  }
 
void loop()  {
  if (Serial.available() > 0)  {
    char ch = Serial.read();
    if (ch == '1')  {
       cardInfo(); }
    else if (ch == '2')  {
       leerArchivo(); }
    else if (ch == '3')  {
       borrarArchivo();  }
    else if (ch == '4')  {  }
    else if (ch == '0')  {  }  }  }

void cardInfo ()  {
  Serial.print("\ninitializing SD card... ");
  if (!card.init(SPI_HALF_SPEED, chipSelect)) {
    Serial.println("initialization failed. Things to check:");
    Serial.println("* is a card is inserted?");
    Serial.println("* Is your wiring correct?");
    Serial.println("* did you change the chipSelect pin to match your shield or module?");
    return;  }
    else {
   Serial.println("Wiring is correct and a card is present.");  }
  Serial.print("\nCard type: ");
  switch(card.type()) {
    case SD_CARD_TYPE_SD1:
      Serial.println("SD1");
      break;
    case SD_CARD_TYPE_SD2:
      Serial.println("SD2");
      break;
    case SD_CARD_TYPE_SDHC:
      Serial.println("SDHC");
      break;
    default:
      Serial.println("Unknown");  }
  if (!volume.init(card)) {
    Serial.println("Could not find FAT16/FAT32 partition.\nMake sure you've formatted the card");
    return;  }
  uint32_t volumesize;
  Serial.print("\nVolume type is FAT");
  Serial.println(volume.fatType(), DEC);
  Serial.println();
 
  volumesize = volume.blocksPerCluster();   
  volumesize *= volume.clusterCount();      
  volumesize *= 512;                        
  Serial.print("Volume size (bytes): ");
  Serial.println(volumesize);
  Serial.print("Volume size (Kbytes): ");
  volumesize /= 1024;
  Serial.println(volumesize);
  Serial.print("Volume size (Mbytes): ");
  volumesize /= 1024;
  Serial.println(volumesize);
 
  Serial.println("\nFiles found on the card (name, date and size in bytes): ");
  root.openRoot(volume);
 
  root.ls(LS_R | LS_DATE | LS_SIZE);  }


void borrarArchivo ()  {
  Serial.print("Initializing SD card...");
  if (!SD.begin(chipSelect))  {
    Serial.println("initialization failed!...");
    return;  }
  Serial.println("initialization done!...");
 
  if (SD.exists("pulsedat.txt"))  {
    Serial.println("pulsedat.txt exists...");  }
  else  {
    Serial.println("pulsedat.txt doesn't exist...");  }
  Serial.println("removing pulsedat.txt...");
  SD.remove("pulsedat.txt");
 
  if (SD.exists("pulsedat.txt"))  {
    Serial.println("pulsedat.txt exists...");  }
  else  {
    Serial.println("pulsedat.txt doesn't exist..");  }  }


void leerArchivo ()  {
  Serial.print("Initializing SD card...");
    if (!SD.begin(chipSelect))  {
      Serial.println("initialization failed!...");
      return;  }
  Serial.println("initialization done!...");
 
  File dataFile = SD.open("pulsedat.txt", FILE_READ);
  if (dataFile)  {
    Serial.println("pulsedat.txt exists...");
    while (dataFile.available())  {
      Serial.write(dataFile.read());  }
      dataFile.close();  }
  else  {
    Serial.println("error opening pulsedat.txt...");  }  }
     
De esta manera, se puede trabajar de manera más amigable con el programa presentado anteriormente como EjercicioPulseDat04 para el registro de pulsaciones generadas por un multivibrador astable construido con un circuito integrado NE555 (o NE556).

Es todo por ahora. Saludos.

La bibliografía contenida en la entrada 'registro de datos a una micro SD' también aplica para esta entrada, y es la siguiente:
Bibliografía.

Stengel, Lester. 2006. El ABC de la electrónica. Steren Electrónica SA de CV. México.
Arduino. Sitio web: http://www.arduino.cc/. Consulta el 31 de julio de 2012.







sábado, 1 de septiembre de 2012

Registro de datos a una micro SD

Registro de un generador de pulsos a un archivo de texto (pulsedat.txt).

Categoría: 1. Programación y electrónica.

El programa generador de pulsos funciona registrando los momentos en que un generador de pulsos, un botón pulsador conectado a una resistencia de 10K o, como en este ejercicio, un circuito electrónico generador de pulsos. Este circuito está basado en un circuito integrado NE555 o NE556.

El circuito astable es como sigue:



El programa EjercicioPulseDat04 lee la salida digital del vibrador astable (pin 3 en el NE555 o pines 5 o 9 del NE556), registra en el monitor serial los tiempos de encendido (HIGH) y de apagado (LOW) utilizando la instrucción millis(); y también registra el número de pulsos acumulado. De esta manera es posible medir el tiempo de duración en HIGH y el tiempo de duración en LOW.
Estos mismos datos se registran en un archivo llamado pulsedat.txt, almacenado en la tarjeta de datos micro SD contenida en el Shield Ethernet de Arduino. Como se sabe, esta tarjeta va acoplada con la tarjeta electrónica Arduino UNO.

Las siguientes imágenes muestran la salida en el monitor serial y la ventana del ambiente Arduino con parte del programa a la vista.





El programa se desarrolló tomando como base el ejemplo 'state change detection' (edge detection) que proorciona el ambiente Arduino para la tarjeta electrónica Arduino UNO. También se utilizó parte del código del ejemplo 'datalogger' para la tarjeta Ethernet Shield.

/*
EjercicioPulseDat04
*/
/*
  State change detection (edge detection)

 Often, you don't need to know the state of a digital input all the time,
 but you just need to know when the input changes from one state to another.
 For example, you want to know when a button goes from OFF to ON.  This is called
 state change detection, or edge detection.

 This example shows how to detect when a button or button changes from off to on
 and on to off.

 The circuit:
 * pushbutton attached to pin 2 from +5V
 * 10K resistor attached to pin 2 from ground
 * LED attached from pin 13 to ground (or use the built-in LED on
   most Arduino boards)

 created  27 Sep 2005
 modified 30 Aug 2011
 by Tom Igoe
This example code is in the public domain.

 http://arduino.cc/en/Tutorial/ButtonStateChange

 */
#include <SD.h>
const int  buttonPin = 2;   
const int ledPin = 13;      
int buttonPushCounter = 0; 
int buttonState = 0;       
int lastButtonState = 0; 
File dataFile;
void setup() {
  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
  pinMode(10, OUTPUT);
 
    if (!SD.begin(4))  {
    Serial.println("card failed, or not present...");
    return;  }
  Serial.println("card initialized...");
 
  Serial.println("removing pulsedat.txt...");
  SD.remove("pulsedat.txt");
  if (SD.exists("pulsedat.txt"))  {
    Serial.println("pulsedat.txt exists...");  }
  else  {
    Serial.println("pulsedat.txt doesn't exist...");  }  }

void loop()
{
  buttonState = digitalRead(buttonPin);
  if (buttonState != lastButtonState)
  {
    if (buttonState == HIGH)
    {
      buttonPushCounter++;
      Serial.print("number of button pushes:  ");
      Serial.println(buttonPushCounter);
      Serial.print("time on= ");
      Serial.println(millis());
 
  dataFile = SD.open("pulsedat.txt", FILE_WRITE);
  if (dataFile) 
      {
    Serial.println("writing to pulsedat.txt...");
    dataFile.print("number of button pushes:  ");
    dataFile.println(buttonPushCounter);
    dataFile.print("time on= ");
    dataFile.println(millis());   
    dataFile.close();
    Serial.println("action done..."); 
      }
  else 
      {
    Serial.println("error opening pulsedat.txt"); 
      }   
    }
 
   
    else
      {
      Serial.print("time off= ");
      Serial.println(millis());
     
  dataFile = SD.open("pulsedat.txt", FILE_WRITE);
  if (dataFile) 
        {
    Serial.println("writing to pulsedat.txt...");
    dataFile.print("time off= ");
    dataFile.println(millis());
   
    dataFile.close();
    Serial.println("action done..."); 
        }
  else 
        {
    Serial.println("error opening pulsedat.txt"); 
        }
      }
 
  lastButtonState = buttonState;
  if (buttonPushCounter % 4 == 0)
      {
    digitalWrite(ledPin, HIGH);
      }
  else
      {
   digitalWrite(ledPin, LOW);
      }
  }
}
Este programa con algunas modificaciones puede adaptarse para medir variables de uno o más sensores (temperatura, humedad, presión atmosférica, intensidad lumínica, voltaje, etc) conectados a las entradas analógicas de la tarjeta electrónica.

Por lo pronto es todo. Saludos.

Bibliografía.

Stengel, Lester. 2006. El ABC de la electrónica. Steren Electrónica SA de CV. México.
Arduino. Sitio web: http://www.arduino.cc/. Consulta el 31 de julio de 2012.