Podría sernos útil en alguna ocasión disponer de varios programas/sketchs distintos cargados al mismo tiempo en nuestra placa Arduino, por ejemplo porque tenemos un robot que es capaz de seguir lineas, y también de seguir luz, y de recorrer una habitación… pero no todo al mismo tiempo porque son tareas muy concretas.
Para casos como esos podemos hacer uso de la memoria EEPROM para guardar una variable que aumente su valor cada vez que se encienda/resetee el Arduino, de ese modo y con ayuda de un poco mas de código podemos cargar una parte del sketch distinta en cada ejecución, cada una de esas partes serán programas independientes al resto.
En el siguiente código de ejemplo cada vez que se enciende el Arduino hace una cosa distinta, entre ellas puede: Hacer parpadear un led, imprimir por el puerto serial, o imprimir por una pantalla LCD.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
/** * Name: Arduino - Run multiple Sketchs * Autor: Alberto Gil Tesa * Web: http://giltesa.com * License: CC BY-NC-SA 3.0 * Date: 2016/10/26 */ #include <EEPROM.h> #define numSKETCH 3 void setup() { delay(500); byte sketch = EEPROM.read(0); sketch = (sketch >= 1 && sketch < numSKETCH ? sketch+1 : 1); EEPROM.write(0, sketch); switch(sketch) { case 1: sketch1(); break; case 2: sketch2(); break; case 3: sketch3(); break; } } void loop(); /** * SKETCH 1 * Led Blink */ void sketch1() { //Setup: #define pLED 13 pinMode(pLED, HIGH); //Main loop: while(true) { digitalWrite(pLED, !digitalRead(pLED)); delay(500); } } /** * SKETCH 2 * Serial Hello world */ void sketch2() { //Setup: Serial.begin(9600); //Main loop: while(true) { Serial.print("Hello world "); Serial.println(millis()/1000); delay(1000); } } /** * SKETCH 3 * Shield LCD Time */ #include <LiquidCrystal.h> void sketch3() { //Setup: LiquidCrystal lcd(8, 9, 4, 5, 6, 7); lcd.begin(16, 2); //Main loop: while(true) { if( millis() % 1000 == 0 ) { lcd.clear(); lcd.setCursor(0, (millis()/1000%2==0 ? 0 : 1)); lcd.print("Time: "); lcd.print(millis()/1000); } } } |
Hola primero quiero agradecerte de ofrecer este código que es genial!!. Al principio no funcionaba pero descubrí que la pagina html modifica el código original lo mejor seria que lo adjuntaras en formato zip y si hay librerias incluirlas yo se que es mucho lo que te pido pero esta claro que muchos de nosotros somos meros aprendices. Tengo problemas con algunos sketch al incluirlos me dan error en la compilación :
Arduino: 1.5.8 (Windows XP), Placa:»Arduino Uno»
CocinaLab01.ino: In function ‘void sketch4()’:
CocinaLab01.ino:256:6: error: redefinition of ‘void sketch4()’
CocinaLab01.ino:238:6: error: ‘void sketch4()’ previously defined here
CocinaLab01.ino:259:14: error: ‘loadConfig’ was not declared in this scope
CocinaLab01.ino:284:21: error: ‘clearLeds’ was not declared in this scope
CocinaLab01.ino:296:49: error: ‘displaySignature’ was not declared in this scope
CocinaLab01.ino:306:20: error: ‘saveConfig’ was not declared in this scope
CocinaLab01.ino:327:49: error: ‘displaySignature’ was not declared in this scope
CocinaLab01.ino:337:20: error: ‘saveConfig’ was not declared in this scope
CocinaLab01.ino:403:15: error: ‘clearLeds’ was not declared in this scope
CocinaLab01.ino:411:1: error: a function-definition is not allowed here before ‘{‘ token
CocinaLab01.ino:459:1: error: expected ‘}’ at end of input
Error de compilación
This report would have more information with
«Show verbose output during compilation»
enabled in File > Preferences.
Gracias! atte LM
Hola,
La página no modifica el código porque no lo carga de la base de datos si no desde un fichero inalterable salvo que lo modifique yo por FTP.
La librería que se usa la incluye el IDE de Arduino.
Los sketch que tengas no se insertan en este código tal cual, si usas librerías tienes que ponerlas junto a la de eeprom, si tienes variable globales también van junto a las librerías.
Saludos.
ok gracias por tu respuesta!. voy a ver lo de las librerías,ya tengo varios sketch que se ejecuten pero algunos mas complejos no, cualquier cosa te paso el código que falla y lo vez!. En cuanto al código si se altera y modifica no es la primera vez que me pasa sucede a menudo cuando haces copias directas de paginas yo use el crome, este a veces trata de hacer correcciones ortográficas etc. No quiero ofenderte y ni quiero discutir con vos, soy todo agradecimiento solo quería colaborar para que otros pudieran tener el código limpio nada mas. Atte. LM
Hola Lmikonos,
No me ofendo, me viene bien tu critica para mejorar la página. Sin embargo he probado en varios navegadores y en todos se copia el código y compila correctamente.
Se me ocurre que por usar Windows XP no tengas una versión reciente de tu navegador de internet y por eso se copie mal.
Por cierto, para copiar el codigo se usa este boton:
Saludos.
Hola logre meter el código pero hace cualquier cosa como te lo paso para que lo veas gracias!
Hola Luis,
El código de ejemplo ya incluye varios ejemplos para ejecutar cada vez que inicias el Arduino, tienes que sustituirlo por el tuyo y con cuidado para que no te de errores al grabarlo.
Saludos.
Si los ejemplos andan fenómeno el tema lo tengo con algunos códigos mas complejos por ejemplo un metrónomo, un temporizador y un reloj. gracias por tu interes!..
Hola muchas gracias! sólo me surge una duda, si uso Matlab, no se le especifica nada mas que abrir el puerto, cómo especifico que sketch tiene que ejecutar :S ?
Hola Suri, lo hace la propia placa, al reiniciarla ejecuta un código y «se apunta» en la memoria interna el número de código que debe ejecutar la próxima vez que se reinicia la placa, así va intercambiando la ejecución con cada encendido.
Saludos.
Que buen aporte, me has salvado de reprobar mi materia XD, tengo una duda el setup y el loop de los sketch, se comentan?
Hola Luis,
El loop no se usa pero el stup si, fíjate en el código ya que te tiene que quedar igual o no funcionara.
Saludos.
Hola como estas.
Tengo que decirte que he logrado compilar 8 programas con este método, de diferente grado de complejidad. En algunos casos he debido reubicar dentro del codigo alguna variable, pero una vez hecho esto, el programa compilo perfectamente.
El lunes armare el prototipo y vere si todos los programas son funcionales con el HW.
Muchas gracias por este invaluable aporte.
Saludos.
como hago para colocarle una llave donde yo pueda elegir entre 2 sketch ?
Hola Claudio,
No estoy en disposición de probar el código, pero esto debería de servirte:
Saludos.