{"id":1181,"date":"2025-07-13T21:20:41","date_gmt":"2025-07-13T19:20:41","guid":{"rendered":"https:\/\/www.pinguytaz.net\/?p=1181"},"modified":"2025-07-13T21:20:41","modified_gmt":"2025-07-13T19:20:41","slug":"graba-datos-en-la-eeprom-de-arduino-desde-tu-pc","status":"publish","type":"post","link":"https:\/\/www.pinguytaz.net\/index.php\/2025\/07\/13\/graba-datos-en-la-eeprom-de-arduino-desde-tu-pc\/","title":{"rendered":"Graba datos en la EEPROM de Arduino desde tu PC"},"content":{"rendered":"\n<p>\u00bfAlguna vez has querido guardar configuraciones o secuencias personalizadas en tu Arduino y que persistan aunque apagues el dispositivo? En este art\u00edculo te mostramos c\u00f3mo hacerlo de forma sencilla, usando la memoria EEPROM interna y la comunicaci\u00f3n serie. Adem\u00e1s, te proporcionamos el c\u00f3digo tanto para Arduino como para el programa de escritorio en C, multiplataforma Windows y Linux.<\/p>\n\n\n\n<p>El c\u00f3digo, al tratarse de nuevos ejemplos de el libro \u00ab<a href=\"https:\/\/amzn.eu\/d\/32OJJdF\" target=\"_blank\" rel=\"noreferrer noopener\">De 0 a 100 con Arduino y ESP32<\/a>\u00bb y se pueden encontrar en <a href=\"https:\/\/github.com\/pinguytaz\/Arduino-ESP32\/tree\/master\/CuadernoTecnico\/Almacenamiento\/Config_Serial\">https:\/\/github.com\/pinguytaz\/Arduino-ESP32\/tree\/master\/CuadernoTecnico\/Almacenamiento\/Config_Serial<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>EEPROM (Electrically Erasable Programmable Read-Only Memory)<\/strong><\/h2>\n\n\n\n<p>Es una memoria no vol\u00e1til integrada en muchas placas Arduino que permite guardar datos que persisten tras reinicios o apagados.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Esquema del montaje<\/strong><\/h2>\n\n\n\n<p>El siguiente esquema muestra la conexi\u00f3n de un bot\u00f3n y un LED RGB al Arduino UNO. El bot\u00f3n permite seleccionar entre el modo de configuraci\u00f3n (grabaci\u00f3n por serie) y el modo de ejecuci\u00f3n normal (lectura desde EEPROM):<\/p>\n\n\n\n<figure class=\"wp-block-image alignleft size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"451\" height=\"524\" src=\"https:\/\/www.pinguytaz.net\/wp-content\/uploads\/2025\/07\/Esquema-1.png\" alt=\"\" class=\"wp-image-1183\" srcset=\"https:\/\/www.pinguytaz.net\/wp-content\/uploads\/2025\/07\/Esquema-1.png 451w, https:\/\/www.pinguytaz.net\/wp-content\/uploads\/2025\/07\/Esquema-1-258x300.png 258w\" sizes=\"auto, (max-width: 451px) 100vw, 451px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Bot\u00f3n<\/strong>: Selecciona el modo de funcionamiento.<\/li>\n\n\n\n<li><strong>LED RGB<\/strong>: Visualiza los valores almacenados en la EEPROM.<\/li>\n\n\n\n<li><strong>Arduino UNO<\/strong>: Controla el proceso y gestiona la memoria.<\/li>\n<\/ul>\n\n\n\n<p>Funcionamiento general:<\/p>\n\n\n\n<p><strong>Modo configuraci\u00f3n<\/strong>:<br>Si el bot\u00f3n est\u00e1 pulsado al encender el Arduino, entra en modo de programaci\u00f3n. Espera datos por el puerto serie y los graba en la EEPROM.<br><br><strong>Modo normal<\/strong>:<br>Si el bot\u00f3n no est\u00e1 pulsado, lee la configuraci\u00f3n almacenada en la EEPROM y ejecuta la secuencia de colores en el LED RGB. Cada vez que pulses el bot\u00f3n, avanza al siguiente estado.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>Si el bot\u00f3n est\u00e1 pulsado al arrancar, llama a <em>programarEEPROM()<\/em>, que espera datos por serie y los graba en la EEPROM, una vez que termina se queda en un bucle infinito y tendremos que reiniciar nuestro Arduino, sin pulsar el bot\u00f3n para entrar en el modo normal de funcionamiento. El modo normal es muy sencillo va avanzando estados, los grabados en el modo configuraci\u00f3n, cambiando los colores del LED-RGB.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>El programa en C, se ha realizado para que pueda compilarse para <em>Linux<\/em> y <em>Windows<\/em>, el <em>Makefile<\/em> que se encuentra en el repositorio <a href=\"https:\/\/github.com\/pinguytaz\/Arduino-ESP32\/tree\/master\/CuadernoTecnico\/Almacenamiento\/Config_Serial\" target=\"_blank\" rel=\"noreferrer noopener\">Github<\/a> nos muestra dos objetivos seg\u00fan para el sistema que deseemos crearlo, es por ese motivo por el que el fuente tiene varias instrucciones de preprocesador. El c\u00f3digo Windows esta pensado para compilarse desde Linux con una compilaci\u00f3n cruzada gracias a MinGW.<\/p>\n\n\n\n<p>El programa de escritorio (compatible con <em>Linux<\/em> y <em>Windows<\/em>) lee un archivo de configuraci\u00f3n y env\u00eda los datos al Arduino por el puerto serie. As\u00ed puedes definir f\u00e1cilmente la secuencia de colores en un fichero de texto.<\/p>\n\n\n\n<p>Ejemplo de archivo en el que se configuramos los tres colores b\u00e1sicos.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>255 0 0 Este es el color rojo\n0 255 0 Este es el color verde\n0 0 255 Este es el color azul\n\n&lt;R> &lt;G> &lt;B> &lt;Comentario que no se enviara pero nos sirve de aclaraci\u00f3n de color><\/code><\/pre>\n\n\n\n<p>La estructura del programa es muy sencilla, lo primero es comprobar que nos pasan por par\u00e1metro el puerto serie por el que nos comunicaremos (<em><strong>\/dev\/ttyXXX<\/strong><\/em> en Linux y <em><strong>COMX<\/strong><\/em> en Windows) y el fichero de configuraci\u00f3n, despu\u00e9s leeremos el fichero y almacenaremos los datos en un array con estructura <em>t_led<\/em>, con los datos en memoria solo nos queda enviarlos por el puerto serie.<\/p>\n\n\n\n<p>El protocolo es muy sencillo y facil de ampliar a nuestras necesidades, ya que consta de lineas terminadas en \\n<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;N\u00famero de lineas a enviar>\\n      \/\/ Le indicamos el numero de lineas a enviar\n&lt;R> &lt;V> &lt;A>\\n                      \/\/ Datos de las lineas.\n....\n&lt;R> &lt;V> &lt;A>\\n<\/code><\/pre>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>Consejos y consideraciones<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Cuidado con la vida \u00fatil de la EEPROM, tienen un n\u00famero limitado de ciclos de escritura (normalmente 100,000). No la uses para almacenar datos que cambian constantemente.<\/li>\n\n\n\n<li><strong>Sincronizaci\u00f3n<\/strong>: A\u00f1ade peque\u00f1os retardos entre escrituras para evitar errores.<\/li>\n\n\n\n<li>Una mejora puede ser el a\u00f1adir una suma de comprobaci\u00f3n (checksum) para verificar la integridad.<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>Conclusi\u00f3n<\/strong><\/p>\n\n\n\n<p>Este m\u00e9todo es ideal para actualizar configuraciones o guardar registros desde tu PC a un Arduino de forma sencilla y robusta, sin necesidad de hardware adicional. Puedes adaptar el ejemplo para guardar cualquier tipo de dato, desde par\u00e1metros de sensores hasta mensajes de usuario.<\/p>\n\n\n\n<p><br>D\u00e9janos un comentario o revisa el repositorio vinculado en el libro De 0 a 100 con Arduino y ESP32, donde encontraras muchos otros ejemplos.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u00bfAlguna vez has querido guardar configuraciones o secuencias personalizadas en tu Arduino y que persistan aunque apagues el dispositivo? En este art\u00edculo te mostramos c\u00f3mo hacerlo de forma sencilla, usando la memoria EEPROM interna y la comunicaci\u00f3n serie. Adem\u00e1s, te proporcionamos el c\u00f3digo tanto para Arduino como para el programa de escritorio en C, multiplataforma [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1182,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"site-container-style":"default","site-container-layout":"default","site-sidebar-layout":"default","disable-article-header":"default","disable-site-header":"default","disable-site-footer":"default","disable-content-area-spacing":"default","footnotes":""},"categories":[3,7],"tags":[23,208,206,207],"class_list":["post-1181","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-arduino","category-linux","tag-arduino","tag-eeprom","tag-led-rgb","tag-puerto-serie"],"_links":{"self":[{"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/posts\/1181","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/comments?post=1181"}],"version-history":[{"count":1,"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/posts\/1181\/revisions"}],"predecessor-version":[{"id":1184,"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/posts\/1181\/revisions\/1184"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/media\/1182"}],"wp:attachment":[{"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/media?parent=1181"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/categories?post=1181"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/tags?post=1181"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}