Objetivo: Arduino tiene que dar respuesta a nuestras preguntas sobre acontecimientos futuros. Una pantalla LCD nos permitirá ver la respuesta y un sensor de inclinación determinará en qué momento queremos la respuesta.
Comentarios: En este proyecto hemos hecho un par de cambios significativos respecto el proyecto de Arduino libro de proyectos.
Hemos definido algunos caracteres que no están incluidos, como las vocales acentuades:
byte aAcento[8] = { B00010, B00100, B01110, B00001, B01111, B10001, B01111, };
Una vez definida la á, para escribir Quizá utilizamos el siguiente código:
lcd.print("Quiz"); lcd.write(byte(1));
El segundo problema que hemos tenido ha sido visualizar frases largas, de más de 16 caracteres. Una primera solución la encontramos en scrollDisplayLeft(). Pero afectaba a las dos línieas de la patalla y queríamos mantener fija la primera línea.
Lo solucionamos com un par de bucles:
for(int i = 0; i<20;i++){ for (int j = i; j<20;j++){ lcd.setCursor(j-i,1); lcd.print(textoLargo1[j]); } delay(500); }
Finalmente comentar que hemos tenido que soldar la pala de la pantalla LCD y unos pines pues sin soldar no hade buen contacto y en la pantalla no aparecen los caracteres. Lo podéis ver en las imágenes siguientes:
Vídeo:
Componentes: Arduino Uno 3R, 1 sensor de inclinación, 1 potenciometro, 1 pantalla LCD, 1 resistencias de 220Ω , 1 resistencia de 10KΩ
Imagen del circuito:
Código:
#include<LiquidCrystal.h> LiquidCrystal lcd(12,11,5,4,3,2); const int PinSensor = 6; int EstadoSensor =0; int EstadoPrevioSensor = 0; int Contestar = 0; byte interrogante[8] = { B00100, B00000, B00100, B01000, B10000, B10001, B01110, }; byte aAcento[8] = { B00010, B00100, B01110, B00001, B01111, B10001, B01111, }; byte eAcento[8] = { B00010, B00100, B01110, B10001, B11111, B10000, B01110, }; byte iAcento[8] = { B00010, B00100, B00000, B00100, B00100, B00100, B00100, }; byte oAcento[8] = { B00010, B00100, B01110, B10001, B10001, B10001, B01110, }; byte uAcento[8] = { B00010, B00100, B00000, B10001, B10001, B10001, B01110, };
//Es necesario incluir un espacio al final de las frases largas const char textoLargo1[]="Buenas perspectivas "; const char textoLargo2[]="Pregunta de nuevo "; const char textoLargo3[]="Eso no se pregunta "; void setup() { lcd.begin(16,2); lcd.createChar(0, interrogante); lcd.createChar(1, aAcento); lcd.createChar(2, eAcento); lcd.createChar(3, iAcento); lcd.createChar(4, oAcento); lcd.createChar(5, uAcento); pinMode(PinSensor, INPUT); lcd.setCursor(0,0); lcd.print("Bola Predictora"); lcd.setCursor(0,1); lcd.print("Preg"); lcd.write(byte(5)); lcd.print("ntame"); delay(500); } void loop() { EstadoSensor = digitalRead(PinSensor); if(EstadoSensor != EstadoPrevioSensor){ if(EstadoSensor == LOW){ Contestar = random(23); lcd.clear(); lcd.setCursor(0,0); lcd.print("Pensando"); delay(500); lcd.setCursor(8,0); lcd.print("."); delay(350); lcd.setCursor(9,0); lcd.print("."); delay(350); lcd.setCursor(10,0); lcd.print("."); delay(750); lcd.clear(); lcd.setCursor(0,0); lcd.print("Respuesta:"); lcd.setCursor(0,1); switch(Contestar){ case 0: lcd.print("S"); lcd.write(byte(3)); break; case 1: lcd.print("Es probable"); break; case 2: lcd.print("Ciertamente"); break; case 3: for(int i = 0; i<20;i++){ for (int j = i; j<20;j++){ lcd.setCursor(j-i,1); lcd.print(textoLargo1[j]); } delay(500); } break; case 4: lcd.print("No es seguro"); break; case 5: for(int i = 0; i<18;i++){ for (int j = i; j<18;j++){ lcd.setCursor(j-i,1); lcd.print(textoLargo2[j]); } delay(500); } break; case 6: lcd.print("Ni idea"); break; case 7: lcd.print("No"); break; case 8: lcd.print("Quiz"); lcd.write(byte(1)); break; case 9: lcd.print("Ni hablar!"); break; case 10: lcd.print("T"); lcd.write(byte(5)); lcd.print(" mismo"); break; case 11: for(int i = 0; i<19;i++){ for (int j = i; j<19;j++){ lcd.setCursor(j-i,1); lcd.print(textoLargo3[j]); } delay(500); } break; case 12: lcd.write(byte(0)); lcd.print("T"); lcd.write(byte(5)); lcd.print(" crees?"); break; case 13: lcd.print("No soy adivina"); break; case 14: lcd.write(byte(0)); lcd.print("Qu"); lcd.write(byte(2)); lcd.print(" dices?"); break; case 15: lcd.print("S"); lcd.write(byte(3)); lcd.print(", seguro"); break; case 16: lcd.write(byte(0)); lcd.print("Eres tonto?"); break; case 17: lcd.print("Como tu quieras"); break; case 18: lcd.write(byte(0)); lcd.print("C"); lcd.write(byte(4)); lcd.print("mo?"); break; case 19: lcd.print("S"); lcd.write(byte(3)); lcd.print(". Y lo sabes"); break; case 20: lcd.print("No. Y lo sabes"); break; case 21: lcd.print("No me importa"); break; case 22: lcd.print("Conf"); lcd.write(byte(3)); lcd.print("o en ello"); break; } delay(5000); lcd.clear(); lcd.setCursor(0,0); lcd.print("Bola Predictora"); lcd.setCursor(0,1); lcd.print("Preg"); lcd.write(byte(5)); lcd.print("ntame"); } } EstadoPrevioSensor = EstadoSensor; }