Explicamos en este tutorial cómo conectar una pantalla LCD a Arduino UNO. Mostramos varios ejemplos de código para interactuar con los botones del shield LCD (keypad) de la pantalla LCD para movernos por los menús. Explicamos también cómo cambiar la luminosidad de la pantalla LCD (intensidad de la retroiluminación) desde el menú (con los keypad) y cómo conectar un sensor de temperatura y mostrarla en la pantalla LCD.
- Cómo conectar display LCD Keypad Shield a Arduino UNO.
- Programa Arduino para mostrar texto en display LCD y contador que se va incrementando.
- Programa Arduino para mostrar texto en scroll en display LCD.
- Programa Arduino para introducir texto en el LDC con las teclas de desplazamiento.
- Programa Arduino para mostrar menús y submenús en display LCD.
- Programa Arduino para mostrar temperatura, opciones modificables, luminosidad en display LCD.
Cómo conectar display LCD Keypad Shield a Arduino UNO
En este tutorial explicaremos y mostraremos ejemplos para trabajar con una pantalla LCD (display LCD Keypad Shield) conectada a Arduino. Para ello necesitaremos una pantalla LCD (Display LCD Keypad Shield), en concreto usaremos un Arduino LCD Keypad Shield 16×2 HD44780 con un coste aproximado de 18 euros:
Por supuesto necesitaremos un Arduino UNO, en el siguiente tutorial explicamos cómo adquirirlo y cómo conectarlo al PC para transferir el programa:
Conectaremos el LCD a Arduino como mostramos en la imagen:
En el siguiente tutorial explicamos cómo descargar el software para realizar programas y enviarlos a Arduino, también explicamos cómo conectar Arduino a un PC para el envío de programas:
En el siguiente vídeo puede verse cómo queda conectada la pantalla LCD:
Programa Arduino para mostrar texto en display LCD y contador que se va incrementando
Una vez conectado el display LCD a Arduino y conectado Arduino al PC por el puerto USB, desde el IDE de desarrollo de Arduino pegaremos el siguiente programa:
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 |
/* Ejemplo de uso de display LCD 16x2. Usando la librería LiquidCrystal library compatible con el driver de Hitachi HD44780 driver */ // incluimos la libreria LiquidCrystal #include // inicializamos la librería con los numeros pins del interfaz // cada LCD puede llevar sus propios numeros LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7); void setup() { // establecemos el numero de columnas y filas del display lcd.begin(16, 2); // enviamos el mensaje a mostrar en el display lcd.print("www.ajpdsoft.com"); } void loop() { // enviamos la posicion del cursor al display // (nota: la linea 1 es la segunda fila, empieza a contar en 0 lcd.setCursor(0, 1); // mostramos el numero de segundos desde el inicio del programa lcd.print(millis()/1000); } |
Comprobaremos la sintaxis pulsando en «Verificar»:
Si todo es correcto pulsaremos en el botón «Cargar» para enviar el programa a Arduino:
Si todo es correcto el programa quedará transferido a la memoria de Arduino y se iniciará, mostrando el texto indicando en el display LCD (en nuestro caso «www.ajpdsoft.com») y un contador de segundos en la segunda línea:
En el siguiente vídeo puede verse en funcionamiento:
Programa Arduino para mostrar texto en scroll en display LCD
Un ejemplo de programa Arduino para mostrar un texto en movimiento en un display 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 |
// include the library code: #include // initialize the library with the numbers of the interface pins LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7); void setup() { // set up the LCD's number of columns and rows: lcd.begin(16, 2); // Print a message to the LCD. lcd.print("www.ajpdsoft.com"); delay(1000); } void loop() { // scroll 13 positions (string length) to the left // to move it offscreen left: for (int positionCounter = 0; positionCounter < 13; positionCounter++) { // scroll one position left: lcd.scrollDisplayLeft(); // wait a bit: delay(150); } // scroll 29 positions (string length + display length) to the right // to move it offscreen right: for (int positionCounter = 0; positionCounter < 29; positionCounter++) { // scroll one position right: lcd.scrollDisplayRight(); // wait a bit: delay(150); } // scroll 16 positions (display length + string length) to the left // to move it back to center: for (int positionCounter = 0; positionCounter < 16; positionCounter++) { // scroll one position left: lcd.scrollDisplayLeft(); // wait a bit: delay(150); } // delay at the end of the full loop: delay(1000); } |
En el siguiente vídeo pueder verse un ejemplo de scroll en funcionamiento en Arduino y el LCD:
Programa Arduino para introducir texto en el LDC con las teclas de desplazamiento
Un ejemplo de programa Arduino para mostrar un texto en la primera línea de una pantalla LCD y en la segunda permite que el usuario introduzca un texto usando las teclas de desplazamiento del display 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 97 98 99 100 101 102 103 104 105 |
#include LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7); int adc_key_val[5] = {50, 200, 400, 600, 800 }; int NUM_KEYS = 5; int adc_key_in; int key=-1; int oldkey=-1; boolean luzEncendida=true; boolean cursorActivo=false; unsigned long time; int x=0; char caracterActual = 'A'; void setup() { lcd.clear(); lcd.begin(16, 2); lcd.setCursor(0,0); lcd.print("www.ajpdsoft.com"); time = millis(); // pinMode(10, OUTPUT); } void loop() { if (millis()-time > 10000) { // Si han pasado mas de 10 segundos apagamos la luz pinMode(10, OUTPUT); digitalWrite(10, LOW); luzEncendida=false; } if (millis()-time > 5000) { // Si han pasado mas de 5 segundos apagamos el cursor lcd.noBlink(); cursorActivo=false; } adc_key_in = analogRead(0); // Leemos el valor de la pulsacion key = get_key(adc_key_in); // Obtenemos el boton pulsado if (key != oldkey) // if keypress is detected { delay(50); // Espera para evitar los rebotes de las pulsaciones adc_key_in = analogRead(0); // Leemos el valor de la pulsacion key = get_key(adc_key_in); // Obtenemos el boton pulsado if (key != oldkey) { time = millis(); // TODO: falta la comprobacion de si se ha desbordado el tiempo if (!luzEncendida) { // Al pulsar cualquier tecla encendemos la pantalla pinMode(10, INPUT); luzEncendida=true; } else { // si la pantalla esta encendida seguimos funcionando normalmente lcd.setCursor(x, 1); oldkey = key; if (key >=0){ // Si se ha pulsado cualquier tecla lcd.blink(); // Mostramos el cursor parpadeando cursorActivo=true; } if (key == 0){ // Se ha pulsado la tecla derecha x++; if (x>15) x=15; caracterActual='A'; } if (key == 1) { // Se ha pulsado la tecla arriba caracterActual++; if (caracterActual > 'Z') caracterActual='Z'; lcd.write(caracterActual); } if (key == 2) { // Se ha pulsado la tecla abajo caracterActual--; if (caracterActual < 'A') caracterActual='A'; lcd.write(caracterActual); } if (key == 3) { // Se ha pulsado la tecla izquierda x--; if (x<0) x=0; caracterActual='A'; } if (key == 4){ // Se ha pulsado la tecla de seleccion } lcd.setCursor(x, 1); } } } delay(100); } // Convertimos el valor leido en analogico en un numero de boton pulsado int get_key(unsigned int input) { int k; for (k = 0; k < NUM_KEYS; k++) { if (input < adc_key_val[k]) { return k; } } if (k >= NUM_KEYS)k = -1; // Error en la lectura return k; } |
En el siguiente vídeo puede verse el programa en funcionamiento:
Programa Arduino para mostrar menús y submenús en display LCD
Un ejemplo de programa Arduino para mostrar un menú y sus submenús correspondientes en 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 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 |
#include LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7); const int numeroDeMenus=5; const int numeroMaximoDeSubmenus=4; char tituloMenu[numeroDeMenus][16] = { "1 Menu 1 ", "2 Menu 2 ", "3 Menu 3 ", "4 Menu 4 ", "5 Menu 5 " }; byte numeroDeSubmenus[numeroDeMenus] = {4,3,2,1,4}; char tituloSubmenu[numeroDeMenus][numeroMaximoDeSubmenus][16] = { "1.1 Submenu 1","1.2 Submenu 2","1.3 Submenu 3","1.4 Submenu 4", "2.1 Submenu 1","2.2 Submenu 2","2.3 Submenu 3","", "3.1 Submenu 1","3.2 Submenu 2","","", "4.1 Submenu 1","","","", "5.1 Submenu 1","5.2 Submenu 2","5.3 Submenu 3","5.4 Submenu 4"}; int adc_key_val[5] ={ 50, 200, 400, 600, 800 }; int NUM_KEYS = 5; int adc_key_in; int key=-1; int oldkey=-1; boolean luzEncendida=true; boolean cursorActivo=false; unsigned long time; int x=0; int y=0; void setup() { lcd.clear(); lcd.begin(16, 2); lcd.setCursor(0,0); lcd.print("www.ajpdsoft.com"); lcd.setCursor(0,1); lcd.print("Menu version 0.1"); delay(5000); lcd.setCursor(0,0); lcd.print("Muevase con las "); lcd.setCursor(0,1); lcd.print("teclas direccion"); delay(4000); lcd.clear(); lcd.setCursor(0,0); lcd.print("Menu principal"); lcd.setCursor(0,1); lcd.print(tituloMenu[x]); time = millis(); // pinMode(10, OUTPUT); } void loop() { // Si han pasado mas de 10 segundos apagamos la luz if (millis()-time > 10000) { pinMode(10, OUTPUT); digitalWrite(10, LOW); luzEncendida=false; } // Si han pasado mas de 5 segundos apagamos el cursor if (millis()-time > 5000) { lcd.noBlink(); cursorActivo=false; } adc_key_in = analogRead(0); // Leemos el valor de la pulsacion key = get_key(adc_key_in); // Obtenemos el boton pulsado if (key != oldkey) // if keypress is detected delay(50); // Espera para evitar los rebotes de las pulsaciones adc_key_in = analogRead(0); // Leemos el valor de la pulsacion key = get_key(adc_key_in); // Obtenemos el boton pulsado if (key != oldkey) { // TODO: falta la comprobacion de si se ha desbordado el tiempo time = millis(); if (!luzEncendida) { // Al pulsar cualquier tecla encendemos la pantalla pinMode(10, INPUT); luzEncendida=true; } else { // si la pantalla esta encendida seguimos funcionando normalmente oldkey = key; if (key >=0){ // Si se ha pulsado cualquier tecla lcd.blink(); // Mostramos el cursor parpadeando cursorActivo=true; } if (key == 0){ // Se ha pulsado la tecla derecha x++; if (x>numeroDeMenus-1) x=numeroDeMenus-1; y=0; } if (key == 1) { // Se ha pulsado la tecla arriba y++; if (y > numeroDeSubmenus[x]-1) y=numeroDeSubmenus[x]-1; } if (key == 2) { // Se ha pulsado la tecla abajo y--; if (y < 0) y=0; } if (key == 3) { // Se ha pulsado la tecla izquierda x--; if (x<0) x=0; y=0; } if (key == 4){ // Se ha pulsado la tecla de seleccion } lcd.clear(); lcd.setCursor(0,0); lcd.print(tituloMenu[x]); lcd.setCursor(0,1); lcd.print(tituloSubmenu[x][y]); } } } delay(50); } // Convertimos el valor leido en analogico en un numero de boton pulsado int get_key(unsigned int input) { int k; for (k = 0; k < NUM_KEYS; k++) { if (input < adc_key_val[k]) { return k; } } if (k >= NUM_KEYS)k = -1; // Error en la lectura return k; } |
Programa Arduino para mostrar temperatura, opciones modificables, luminosidad en display LCD
Un ejemplo de programa Arduino para mostrar la temperatura de un habitáculo usando un sensor de temperatura (NTC o resistencia variable con la temperatura de coeficiente negativo) en una pantalla LCD Keypad Shield. El programa también permite modificar la luminosidad (intensidad de la retroiluminación) del display LCD, cambiar parámetros, guardar valores en memoria EEPROM, etc.
Para conectar el sensor de temperatura (NTC o resistencia variable con la temperatura de coeficiente negativo) se pueden seguir las intrucciones del siguiente tutorial:
Con la diferencia de que hemos conectado el sensor de temperatura a la entrada analógica 1 porque la 0 la usa el LCD.
A continuación os mostramos un vídeo donde puede comprobarse el funcionamiento en el LCD con teclado:
El código del programa completo Arduino:
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 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 |
#include #include #define ThermistorPIN 1 // Analog Pin 1 #define NUM_KEYS 5 /* Circuito del dispaly LCD: * LCD RS pin to digital pin 8 * LCD Enable pin to digital pin 9 * LCD D4 pin to digital pin 4 * LCD D5 pin to digital pin 5 * LCD D6 pin to digital pin 6 * LCD D7 pin to digital pin 7 * LCD BL pin to digital pin 10 * KEY pin to analogl pin 0 * * Esquema del sensor de temperatura: * [Ground] -- [10k-pad-resistor] -- | -- [10k thermistor] --[Vcc (5v)] * | * Analog Pin 1 */ LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7); const int numeroDeMenus=6; char tituloMenu[numeroDeMenus][16] = { "Fijar Temp.: ", "Fijar Tiempo:", "Kp: ", "Kd: ", "Ki: ", "Intensidad: " }; int adc_key_val[5] ={ 50, 200, 400, 600, 800 }; int adc_key_in; int key=-1; int oldkey=-1; boolean luzEncendida=true; boolean cursorActivo=false; boolean enMenu=false; unsigned long time; unsigned long tiempoPID; byte numeroLecturas=0; int x=0; int signo=0; char temp[10]; int lecturas[100]; byte numeroLectura=0; //int lectura=0; int maximo, minimo, diferencia, t1, t2, t3; byte consigna=25; byte tiempo=1; byte kp=1; byte kd=1; byte ki=1; byte intensidad=10; void setup() { cargarConfig(); pinMode(10, OUTPUT); analogWrite(10,intensidad*25); Serial.begin(9600); lcd.clear(); lcd.begin(16, 2); lcd.setCursor(0,0); lcd.print("www.ajpdsoft.com"); lcd.setCursor(0,1); lcd.print("C.Ventanas v1.0 "); delay(2000); // lcd.setCursor(0,0); // lcd.print("Muevase con las "); // lcd.setCursor(0,1); // lcd.print("teclas direccion"); // delay(4000); lcd.clear(); lcd.setCursor(0,0); lcd.print("Temperatura: "); lcd.setCursor(0,1); int lectura=getTemp(1); sprintf(temp, "%3d%c%1d%cC", lectura/100, '.', lectura/10%10,223); lcd.print(temp); time = millis(); tiempoPID = millis(); } void loop() { int lectura = getTemp(ThermistorPIN); lecturas[numeroLectura++] = lectura; if (millis()-time > 20000) { // Si han pasado mas de 20 segundos apagamos la luz digitalWrite(10, LOW); luzEncendida=false; } if (millis()-time > 7000) { // Si han pasado mas de 7 segundos salimos del menu if (enMenu) guardarConfig(); enMenu = false; x=0; time = millis(); // } // if (!enMenu) { lcd.clear(); lcd.setCursor(0,0); lcd.print("Temperatura: "); lcd.setCursor(0,1); sprintf(temp, "%3d%c%1d%cC", lectura/100, '.', lectura/10%10,223); lcd.print(temp); // Serial.print("Temperatura["); // Serial.print(numeroLectura); // Serial.print("]: "); // Serial.println(temp); } if (millis()-time > 5000) { // Si han pasado mas de 5 segundos apagamos el cursor lcd.noBlink(); cursorActivo=false; } adc_key_in = analogRead(0); // Leemos el valor de la pulsacion key = get_key(adc_key_in); // Obtenemos el boton pulsado if (key != oldkey) // if keypress is detected { delay(50); // Espera para evitar los rebotes de las pulsaciones adc_key_in = analogRead(0); // Leemos el valor de la pulsacion key = get_key(adc_key_in); // Obtenemos el boton pulsado if (key != oldkey) { time = millis(); // TODO: falta la comprobacion de si se ha desbordado el tiempo if (!luzEncendida) { // Al pulsar cualquier tecla encendemos la pantalla analogWrite(10,intensidad*25); luzEncendida=true; } else { // si la pantalla esta encendida seguimos funcionando normalmente oldkey = key; char accion = 0; if (key >=0){ // Si se ha pulsado cualquier tecla lcd.blink(); // Mostramos el cursor parpadeando cursorActivo=true; } if ((key == 0) && (enMenu)){ // Se ha pulsado la tecla derecha x++; if (x>numeroDeMenus-1) x=numeroDeMenus-1; } if ((key == 1) && (enMenu)) { // Se ha pulsado la tecla arriba accion++; } if ((key == 2) && (enMenu)) { // Se ha pulsado la tecla abajo accion = accion-1; } if ((key == 3) && (enMenu)) { // Se ha pulsado la tecla izquierda x--; if (x<0) x = 0; } if (key == 4){ // Se ha pulsado la tecla de seleccion } enMenu = true; lcd.clear(); lcd.setCursor(0,0); lcd.print(tituloMenu[x]); lcd.setCursor(0,1); switch (x) { case 0: // Estamos en fijar temperatura consigna += accion; lcd.print(consigna); lcd.print((char)223); lcd.print("C"); break; case 1: // Estamos en fijar tiempo tiempo += accion; lcd.print(tiempo); lcd.print("0 seg."); break; case 2: // Estamos en Kp. kp += accion; lcd.print(kp); break; case 3: // Estamos en Kd. kd += accion; lcd.print(kd); break; case 4: // Estamos en Ki. ki += accion; lcd.print(ki); break; case 5: // Estamos en Ki. intensidad += accion; if (intensidad > 254) intensidad = 0; if (intensidad > 10) intensidad = 10; lcd.print(intensidad); lcd.print("0%"); analogWrite(10,intensidad*25); break; } } } } if ((numeroLectura > 99) && (numeroLecturas < 2)) { long suma = 0; maximo = -10000; minimo = 10000; for (int i=0; i < 100; i++){ suma = suma + lecturas[i]; if (lecturas[i] > maximo) { maximo = lecturas[i]; } if (lecturas[i] < minimo) { minimo = lecturas[i]; } // Serial.print("Temperatura["); // Serial.print(i); // Serial.print("]: "); // Serial.println(lecturas[i]); } diferencia = maximo - minimo; suma = suma / 100; // Si la diferencia es superior a un grado //es que ha habido un error en la lectura if (diferencia > 100) { Serial.println("Lectura no valida"); // TODO: Descartar lectura y repetir la medida } else { numeroLecturas++; t3=t2; t2=t1; t1=suma; } Serial.print("Suma: "); Serial.println(suma); /* Serial.print("Media: "); Serial.print(suma/100); Serial.print(","); Serial.println(suma/10%10); Serial.print("Maximo: "); Serial.print(maximo/100); Serial.print(","); Serial.print(maximo/10%10); Serial.print(" - Minimo: "); Serial.print(minimo/100); Serial.print(","); Serial.print(minimo/10%10); Serial.print(" - Diferencia: "); Serial.print(diferencia/100); Serial.print(","); Serial.println(diferencia/10%10); */ } if (numeroLectura > 99) { // Cuando se termina de tomar las 100 //lecturas empezamos de nuevo por la primera numeroLectura = 0; } PID(); delay(10); // Si se desborda millis() empieza otra //vez por cero, ocurre cada 50 dias if (millis() < time){ time = millis(); } } void PID(){ // Si se desborda millis() empieza otra // vez por cero, ocurre cada 50 dias if (millis() < tiempoPID){ tiempoPID = millis(); } // Si no ha pasado todavía el timepo de ciclo del PID if (millis() < tiempoPID + (tiempo*10*1000)){ // entonces mantenemos la fuerza y esperamos mas tiempo // s = sActualPID; } else if (numeroLecturas >= 2){ numeroLecturas--; Serial.print("Distancia a la consigna: "); Serial.print(t1-consigna*100); Serial.print(" - Velocidad: "); Serial.println(t1-t2); tiempoPID = millis(); } } // Convertimos el valor leido en analogico // en un numero de boton pulsado int get_key(unsigned int input) { int k; for (k = 0; k < NUM_KEYS; k++) { if (input < adc_key_val[k]) { return k; } } if (k >= NUM_KEYS)k = -1; // Error en la lectura. return k; } int temperaturaFicticia = 2450; int ptf= 0; int getTemp(byte input) { int celsius = Thermistor(analogRead(input))*100; return celsius; temperaturaFicticia += (random(7)-3-ptf); if (temperaturaFicticia > 2800) ptf = 1; if (temperaturaFicticia < 2000) ptf = 0; return temperaturaFicticia; } float pad = 10000; // balance/pad resistor value, set this to // the measured resistance of your pad resistor // float thermr = 10000; // thermistor nominal resistance float Thermistor(int RawADC) { long Resistance; float Temp; // Dual-Purpose variable to save space. Resistance=((1024 * pad / RawADC) - pad); // Saving the Log(resistance) so not to calculate it 4 times later Temp = log(Resistance); Temp = 1 / (0.001129148 + (0.000234125 * Temp) + (0.0000000876741 * Temp * Temp * Temp)); Temp = Temp - 273.15; // Convert Kelvin to Celsius return Temp; // Devolver temperatura } boolean cargarConfig(){ if ((EEPROM.read(0) == 27) && (EEPROM.read(1) == 28) && (EEPROM.read(2) == 13) && (EEPROM.read(3) == 18)) { // Comprobamos que la eeprom tenga una // configuracion valida con numeros concretos // solo cargamos el valor de la configuracion si los valores coinciden if (EEPROM.read(4) == EEPROM.read(5)) consigna = EEPROM.read(4); if (EEPROM.read(6) == EEPROM.read(7)) tiempo = EEPROM.read(6); if (EEPROM.read(8) == EEPROM.read(9)) kp = EEPROM.read(8); if (EEPROM.read(10) == EEPROM.read(11)) kd = EEPROM.read(10); if (EEPROM.read(12) == EEPROM.read(13)) ki = EEPROM.read(12); if (EEPROM.read(14) == EEPROM.read(15)) intensidad = EEPROM.read(14); return true; } return false; } void guardarConfig(){ EEPROM.write(0,27); EEPROM.write(1,28); EEPROM.write(2,13); EEPROM.write(3,18); // Ponemos nmeros concretos en el comienzo // de la EEPROM para confirmar que tiene valores correctos. EEPROM.write(4,consigna); EEPROM.write(5,consigna); // almacenamos los valores 2 veces EEPROM.write(6,tiempo); EEPROM.write(7,tiempo); // almacenamos los valores 2 veces EEPROM.write(8,kp); EEPROM.write(9,kp); // almacenamos los valores 2 veces EEPROM.write(10,kd); EEPROM.write(11,kd); // almacenamos los valores 2 veces EEPROM.write(12,ki); EEPROM.write(13,ki); // almacenamos los valores 2 veces EEPROM.write(14,intensidad); EEPROM.write(15,intensidad); // almacenamos los valores 2 veces } |
En el siguiente vídeo puede verse el programa en funcionamiento: