Paso 8: Interfaz de usuario de LCD I2C y menú
Hay muchas formas de código de la interfaz de usuario y menú con un escudo Arduino y pantalla LCD. Nuestro escudo tiene 2 filas de display de 16 caracteres cada una, cuatro botones direccionales, un botón destinado a una función de "seleccionar" y un botón de reset. Para simplificar el proceso de codificación, sólo utiliza los cuatro botones direccionales, había hecho una estructura de bucle if bastante crudo y utiliza las variables de instancia para un montón de cosas. Para los más cómodos con C++, le sugerimos que utilice una estructura de datos (como aquí) o algo más elegante que demasiado-muchos-if-lazos. Queríamos que el usuario a las estadísticas de acceso guardado como el tiempo superior pedalearon en una van, total "distanciado" pedaleando en esta moto y lo vatios-hora total generado desde el primer día. Mientras que el usuario pedalea, queremos la pantalla para mostrar estadísticas como el tiempo desde que usuario inició de pedaleo, velocidad en kilómetros por hora (porque es km una debajo del aparato apreciado en los Estados Unidos), energía generada, vatios-hora generados durante el ciclo. Para los lectores que no han usado una pantalla de LCD I2C antes, aquí es un buen lugar para empezar.
Los cálculos de estas estadísticas no fueron difíciles; para RPM y km/s, dividimos el número de ciclos pedaleó por el tiempo tomó para que el usuario pedalea muchos ciclos y convertir las unidades. Mide el radio de la rueda trasera de nuestra moto y encuentra el radio para que se de 28 cm. Por lo tanto la circunferencia es 175,929 cm, 0.00109317 millas o 0.00175929 kilómetros. Se calculó la distancia bicicleta usando distancia = velocidad * tiempo. Para la energía generada, energía = corriente * voltaje (P = IV). Para obtener un vatios-hora generados, se realizó una suma de Riemann-suma-como al multiplicar la potencia instantánea por el tiempo transcurrido (0,5 segundos) y agregando que cada medio segundo el usuario ha pedaleando.
En cuanto al menú, indexadas de cada pantalla y utiliza un maniquí cuenta variable para navegar a través de las pantallas. Hacia arriba y hacia abajo sería restar o agregar a la variable dummy, mientras la izquierda nos devuelve al menú de información en niveles superior y derecho nos lleva a los submenús.
Aquí es un esquema de nuestro menú
Menú de raíz
> tiempo superior
>> valor
> total distancia recorrida
>> valor
> total de energía generada
>> valor
> Acerca de
>> cualquier información sobre la moto.
el código completo se puede encontrar al final de este Instructable
el código en negrita es lo que añadimos en el código de arriba
incluir el código de biblioteca:
#include < Wire.h >
#include < Adafruit_MCP23017.h >
#include < Adafruit_RGBLCDShield.h >
#include < EEPROM.h > //for almacenamiento de información a largo plazo de Arduinos
Esta porción es tomar palabra por palabra de tutorial de Adafruit, que estamos por encima de
El escudo usa las patillas I2C SCL y SDA. En clásico Arduinos
Esto es análogo de 4 y 5 por lo que no se pueden utilizar para analogRead() ya
Sin embargo, usted puede conectar otros sensores I2C bus I2C y compartir
el bus I2C. Lcd de Adafruit_RGBLCDShield = Adafruit_RGBLCDShield();
Estos #defines hacerlo fácil establecer el color de luz de fondo
#define rojo 0 x 1
#define amarillo 0x3
#define verde 0 x 2
#define verde azulado 0x6
#define azul 0x4
#define violeta 0x5
#define blanco 0x7
Aquí comienza la parte que cifra
int ptr = 0; indicador de menú
int minutos, segundos, kmh;
variables de almacenamiento a largo plazo
int timeAddress = 0;
int distanceAddress = 1;
int powerAddress = 2;
timeValue byte, distanceValue, powerValue;
isHome booleano = true;
void setup() {}
LCD.Begin (16, 2);
LCD.Print ("Hola, mundo!");
lcd.setBacklight(WHITE);
timeValue = EEPROM.read(timeAddress);
distanceValue = EEPROM.read(distanceAddress);
powerValue = EEPROM.read(powerAddress);
root(); exhibición al menú raíz
}
uint8_t i = 0; ponemos esto por el tutorial incluido (no sabe exactamente lo que es para)
void loop() {}
menuFunction(); ver si se presiona el botón
Si (motorV > 1.0 & &! hasBeenOn) {}
LCD.Clear();
lcd.setCursor(0,0);
LCD.Print ("calentamiento....");
lcd.setCursor(0,1);
LCD.Print ("seguir pedaleando.");
lcd.setBacklight(GREEN);
digitalWrite (cc, HIGH); Presione start en el controlador de carga
lcd.setBacklight(YELLOW);
Delay(3500); Pulsa start durante 3,5 segundos
ciclo = 0;
T0 = millis();
digitalWrite (cc, LOW); deje de pulsar start
ahora se debe cargar la batería
LCD.Clear();
lcd.setCursor(0,0);
hasBeenOn = true;
LCD.Print ("Cargando batería");
lcd.setBacklight(RED);
lcd.setCursor (3, 1);
timeOn = millis();
tiempo de persona cuánto tiempo ha sido pedalear
LCD.Print((Millis()-timeOn)/1000);
Delay(Wait);
isHome = false;
}
else if (motorV > 1.0 & & hasBeenOn) {}
segundos = int((millis()-timeOn)/1000);
minutos = int(secs/60);
segundos = int(secs%60); Esto también se podría escribir como una función separada
LCD.Clear();
lcd.setCursor (0, 0);
LCD.Print(mins);
lcd.setCursor (2, 0);
imprimir el número de segundos desde el inicio ciclismo
LCD.Print(":");
lcd.setCursor (3, 0);
LCD.Print(secs);
lcd.setCursor (9, 1);
LCD.Print(RPM);
lcd.setCursor(13,1);
LCD.Print("RPM");
isHome = false;
getCurrent(); Este impresiones W, Wh
getkmh(); Esto imprime km/h
}
Else {}
Si (timeValue > ({millis()-timeOn/1000/60))}
timeValue = int(millis()-timeOn/1000/60);
EEPROM.write (timeAddress, timeValue);
}
{if(!isHome)}
root();
}
}
}
void getkmh() {}
km/h = rpm * 60.0 * revolución;
lcd.setCursor (0, 1);
LCD.Print(kmh);
lcd.setCursor(2,1);
LCD.Print ("km/h");
}
{} void getCurrent()
actual = (float(analogRead(hall))-514.5) / 26.5;
lcd.setCursor (6, 0);
LCD.Print (int (corriente * 13));
lcd.setCursor(8,0);
LCD.Print("W");
WH = Wh + flotador /3600.0*current*13.0 (espera);
lcd.setCursor(10,0);
LCD.Print(WH);
lcd.setCursor(13,0);
LCD.Print("WH");
}
void menuFunction() {}
Delay(200);
botones de uint8_t = lcd.readButtons();
Si {} (botones)
Si (botones & BUTTON_UP) {}
scrollUp(ptr);
}
Si (botones & BUTTON_DOWN) {}
if(PTR >0) {}
scrollDown(ptr);
}
}
Si (botones & BUTTON_LEFT) {}
Si (ptr > = 1 & & ptr < = 4) {}
root();
}
else if (ptr > = 5) {}
Menu();
}
}
Si (botones & BUTTON_RIGHT) {}
scrollRight();
}
}
}
void menu() {}
LCD.Clear();
lcd.setCursor (0, 0);
LCD.Print ("menú (desplazamiento V)");
lcd.setCursor (0, 1);
LCD.Print ("veces superior");
PTR = 1;
}
{} void root()
LCD.Clear();
lcd.setCursor (0, 0);
LCD.Print ("Bike a cargo!");
lcd.setCursor (0, 1);
LCD.Print ("menú (derecho >)");
PTR = 0;
isHome = true;
}
void scrollRight() {}
Serial.println(PTR);
if(PTR == 0) {}
Menu();
}
otra cosa if(ptr == 1) {}
LCD.Clear();
lcd.setCursor (0, 0);
LCD.Print "(tiempo superior del);
lcd.setCursor (0, 1);
LCD.Print(timeValue); RECORDAR EL NÚMERO!!!!!! TIEMPO SUPERIOR
lcd.setCursor(13,1);
LCD.Print("min");
PTR = 5;
}
otra cosa if(ptr == 2) {}
LCD.Clear();
lcd.setCursor (0, 0);
LCD.Print ("distancia Total");
lcd.setCursor (0, 1);
LCD.Print(distanceValue); RECORDAR EL NÚMERO!!!!!! DISTANCIA TOTAL
lcd.setCursor(14,1);
LCD.Print("mi");
PTR = 6;
}
otra cosa if(ptr == 3) {}
LCD.Clear();
lcd.setCursor (0, 0);
LCD.Print ("energía Total");
lcd.setCursor (0, 1);
LCD.Print(powerValue); RECORDAR EL NÚMERO!!!!!! WATTHOURS TOTAL
lcd.setCursor(15,1);
LCD.Print("J");
PTR = 7;
}
otra cosa if(ptr == 4) {}
LCD.Clear();
lcd.setCursor (0, 0);
LCD.Print ("Scroll hacia abajo para");
lcd.setCursor (0, 1);
LCD.Print ("leer más! (V)"); RECORDAR EL NÚMERO!!!!!! WATTHOURS TOTAL
PTR = 8;
}
}
void scrollDown(int i) {}
Serial.println(i);
Si (i == 1) {}
lcd.setCursor (0, 1);
LCD.Print ("distancia Total");
PTR = 2;
}
else if (i == 2) {}
lcd.setCursor (0, 1);
LCD.Print ("energía Total");
PTR = 3;
}
else if (i == 3) {}
lcd.setCursor (0, 1);
LCD.Print ("About!");
PTR = 4;
}
else if (i == 8) {}
LCD.Clear();
lcd.setCursor (0, 0);
LCD.Print "(bicicleta de la electrónica del);
lcd.setCursor (0, 1);
LCD.Print ("trabajado en por:");
PTR = 9;
}
else if (i == 9) {}
LCD.Clear();
lcd.setCursor (0, 0);
LCD.Print («a. McKay 13");
lcd.setCursor (0, 1);
LCD.Print ("J. Wong 15");
PTR = 10;
}
else if (i == 10) {}
LCD.Clear();
lcd.setCursor (0, 0);
LCD.Print("A.Karapetrova'15");
lcd.setCursor (0, 1);
LCD.Print ("S. Walecka 15");
PTR = 11;
}
else if (i == 11) {}
LCD.Clear();
lcd.setCursor (0, 0);
LCD.Print ("S. Li 17");
lcd.setCursor (0, 1);
LCD.Print ("N. Sandford 17");
PTR = 12;
}
else if (i == 12) {}
LCD.Clear();
lcd.setCursor (0, 0);
LCD.Print ("de su Majestad");
lcd.setCursor (0, 1);
LCD.Print ("Dwight Whitaker");
PTR = 13;
}
else if (i == 13) {}
LCD.Clear();
lcd.setCursor (0, 0);
LCD.Print ("Phys 128");
lcd.setCursor (0, 1);
LCD.Print ("Pomona College");
PTR = 14;
}
else if (i == 14) {}
LCD.Clear();
lcd.setCursor (0, 0);
LCD.Print ("pagado por el");
lcd.setCursor (0, 1);
LCD.Print (SIO y Departamento de");
PTR = 15;
}
else if (i == 15) {}
LCD.Clear();
lcd.setCursor (0, 0);
LCD.Print ("física y");
lcd.setCursor (0, 1);
LCD.Print ("Astronomía.");
PTR = 16;
}
}
void scrollUp(int i) {}
Si (i == 2) {}
Menu();
}
Si (i > 2) {}
scrollDown(i-2);
}
}