Bike Generator laddningsstation (8 / 10 steg)
Steg 8: I2C LCD användargränssnitt och meny
Det finns många sätt att kod användargränssnitt och menyn med hjälp av en Arduino och LCD sköld. Vår sköld har 2 rader med display för 16 tecken vardera, fyra riktningsknapparna, en knapp avsedda för en "Välj" funktion, och en återställningsknapp. För att förenkla kodning processen, vi bara utnyttjas de fyra riktningsknapparna, gjort en ganska rå om-loop struktur, och använde förekomstvariabler för en massa saker. För de mer bekväm med C++, föreslår vi att du använder en datastruktur (som föreslås här) eller något mer elegant än för-många-om-loopar. Vi ville att användaren åtkomst sparas statistik som den högsta tiden cyklade på en gång, den totala "avstånd" cyklade på denna cykel och de totala wattimmar genereras sedan dag ett. Medan användaren pedals, vill vi skärmen för att visa statistik som tiden sedan användaren började trampa, hastighet i kilometer per timme (eftersom km är en under uppskattat enhet i USA), power som genereras, wattimmar genereras under cykling. För läsare som inte har använt en I2C LCD sköld innan, här är ett bra ställe att börja.
Beräkningarna för statistiken var inte svår. för RPM och km/s dividerade vi antalet cykler cyklade med den tid det tog för användaren att trampa som många cykler, och omvandlas till enheter. Vi mätta radien på bakhjulet av vår cykel och hittade radien vara 28 cm. Omkretsen är således 175.929 cm, 0.00109317 miles eller 0.00175929km. Vi beräknas avståndet cyklade med avstånd = ränta * tid. För power genererade, makt = ström * spänning (P = IV). För att få en wattimmar genereras, vi utfört en Riemann-summan-liknande tillägg genom att multiplicera Momentan effekt med den tid som gått (0,5 sekunder) och tillade att varje halv sekund användaren har cyklade.
Menyn, vi indexeras varje skärm och använde en dummy räknar variabel för att navigera genom skärmar. Upp och ner skulle dra ifrån eller lägga till den dummy variabeln, medan vänster returnerar oss till högre differentierade menyn och rätt tar oss till undermenyerna.
Här är en schematisk av vår meny
Rotmenyn
> top tid
>> visar värdet
> total sträcka reste
>> visar värdet
> total effekt genereras
>> visar värdet
> om
>> vilken information det finns om cykel.
fullständiga koden finns i slutet av detta Instructable
fetstil koden är vad vi lägga till koden från ovan
inkludera bibliotek-koden:
#include < Wire.h >
#include < Adafruit_MCP23017.h >
#include < Adafruit_RGBLCDShield.h >
#include < EEPROM.h > //for långsiktig lagring av information på Arduinos
Denna del tar ord för ord från Adafruit's tutorial, som vi länkade ovan
Skölden använder I2C SCL och SDA stiften. På klassiska Arduinos
Detta är Analog 4 och 5 så du inte kan använda de för analogRead() längre
Men kan du ansluta andra I2C sensorer till I2C bussen och andel
I2C bussen. Adafruit_RGBLCDShield lcd = Adafruit_RGBLCDShield();
Dessa #defines gör det enkelt att ställa in bakgrundsljus färg
#define röd 0x1
#define gul 0x3
#define grön 0x2
#define kricka 0x6
#define blå 0x4
#define VIOLET 0x5
#define vit 0x7
här börjar den delen vi kodade
int ptr = 0; menyn pekaren
int minuter, sekunder, kmh;
långsiktig lagring variabler
int timeAddress = 0;
int distanceAddress = 1;
int powerAddress = 2;
byte TIDVÄRDE, distanceValue, powerValue;
booleska isHome = sant;
void setup() {
LCD.BEGIN (16, 2);
LCD.Print ("Hello, world!");
lcd.setBacklight(WHITE);
TIDVÄRDE = EEPROM.read(timeAddress);
distanceValue = EEPROM.read(distanceAddress);
powerValue = EEPROM.read(powerAddress);
root(); Ställ in displayen till rotmenyn
}
uint8_t jag = 0; Vi sätter detta i eftersom handledning ingår det (inte riktigt säker vad det är för)
void loop() {
menuFunction(); se om knappen trycks
om (motorV > 1.0 & &! hasBeenOn) {
LCD.Clear();
lcd.setCursor(0,0);
LCD.Print ("värmer upp...");
lcd.setCursor(0,1);
LCD.Print ("Behåll trampa.");
lcd.setBacklight(GREEN);
digitalWrite (cc, hög); Tryck på start på laddningsregulatorn
lcd.setBacklight(YELLOW);
Delay(3500); Tryck på start för 3,5 sekunder
Cycle = 0;
t0 = millis();
digitalWrite (cc, låg); sluta att trycka på start
nu bör batteriladdning
LCD.Clear();
lcd.setCursor(0,0);
hasBeenOn = sant;
LCD.Print ("ladda batteriet");
lcd.setBacklight(RED);
lcd.setCursor (3, 1);
timeOn = millis();
tiden för hur länge personen har trampa
LCD.Print((Millis()-timeOn)/1000);
Delay(Wait);
isHome = false;
}
annars om (motorV > 1.0 & & hasBeenOn) {
SEK = int((millis()-timeOn)/1000);
minuter = int(secs/60);
SEK = int(secs%60); Detta skulle också kunna skrivas som en separat funktion
LCD.Clear();
lcd.setCursor (0, 0);
LCD.Print(mins);
lcd.setCursor (2, 0);
skriva ut antalet sekunder sedan start cykling
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(); Detta tryck W, Wh
getkmh(); Detta alternativ skriver ut km/h
}
annat {
om (tidvärde > (millis()-timeOn/1000/60)) {
TIDVÄRDE = int(millis()-timeOn/1000/60);
EEPROM.write (timeAddress, tidvärde);
}
IF(!isHome) {
root();
}
}
}
void getkmh() {
KMH = rpm * 60,0 * revolution;
lcd.setCursor (0, 1);
LCD.Print(KMH);
lcd.setCursor(2,1);
LCD.Print ("km/h");
}
void getCurrent() {
Nuvarande = (float(analogRead(hall))-514.5) / 26,5;
lcd.setCursor (6, 0);
LCD.Print (int (nuvarande * 13));
lcd.setCursor(8,0);
LCD.Print("W");
WH = Wh + flyta (vänta) /3600.0*current*13.0;
lcd.setCursor(10,0);
LCD.Print(WH);
lcd.setCursor(13,0);
LCD.Print("WH");
}
void menuFunction() {
Delay(200);
uint8_t knappar = lcd.readButtons();
om (knappar) {
om (knappar & BUTTON_UP) {
scrollUp(ptr);
}
om (knappar & BUTTON_DOWN) {
IF(PTR >0) {
scrollDown(ptr);
}
}
om (knappar & BUTTON_LEFT) {
om (ptr > = 1 & & ptr < = 4) {
root();
}
annars om (ptr > = 5) {
Menu();
}
}
om (knappar & BUTTON_RIGHT) {
scrollRight();
}
}
}
void menu() {
LCD.Clear();
lcd.setCursor (0, 0);
LCD.Print ("menyn (bläddra V)");
lcd.setCursor (0, 1);
LCD.Print ("Top gånger");
PTR = 1;
}
void root() {
LCD.Clear();
lcd.setCursor (0, 0);
LCD.Print ("Bike till laddningen!");
lcd.setCursor (0, 1);
LCD.Print ("menyn (höger >)");
PTR = 0;
isHome = sant;
}
void scrollRight() {
Serial.println(PTR);
IF(PTR == 0) {
Menu();
}
annat if(ptr == 1) {
LCD.Clear();
lcd.setCursor (0, 0);
LCD.Print ("övre tid");
lcd.setCursor (0, 1);
LCD.Print(timeValue); MINNS NUMMER!!! BÄSTA TID
lcd.setCursor(13,1);
LCD.Print("min");
PTR = 5;
}
annat if(ptr == 2) {
LCD.Clear();
lcd.setCursor (0, 0);
LCD.Print ("Total distans");
lcd.setCursor (0, 1);
LCD.Print(distanceValue); MINNS NUMMER!!! TOTAL STRÄCKA
lcd.setCursor(14,1);
LCD.Print("mi");
PTR = 6;
}
annat if(ptr == 3) {
LCD.Clear();
lcd.setCursor (0, 0);
LCD.Print ("Total energi");
lcd.setCursor (0, 1);
LCD.Print(powerValue); MINNS NUMMER!!! TOTALA WATTHOURS
lcd.setCursor(15,1);
LCD.Print("J");
PTR = 7.
}
annat if(ptr == 4) {
LCD.Clear();
lcd.setCursor (0, 0);
LCD.Print ("bläddra ner till");
lcd.setCursor (0, 1);
LCD.Print ("Läs mer! (V)"); MINNS NUMMER!!! TOTALA WATTHOURS
PTR = 8.
}
}
void scrollDown(int i) {
Serial.println(i);
om (jag == 1) {
lcd.setCursor (0, 1);
LCD.Print ("Total distans");
PTR = 2;
}
annars om (jag == 2) {
lcd.setCursor (0, 1);
LCD.Print ("Total energi");
PTR = 3;
}
annars om (jag == 3) {
lcd.setCursor (0, 1);
LCD.Print ("om!");
PTR = 4;
}
annars om (jag == 8) {
LCD.Clear();
lcd.setCursor (0, 0);
LCD.Print ("elektronik bike");
lcd.setCursor (0, 1);
LCD.Print ("fungeras på av:");
PTR = 9.
}
annars om (jag == 9) {
LCD.Clear();
lcd.setCursor (0, 0);
LCD.Print ("A. McKay ' 13");
lcd.setCursor (0, 1);
LCD.Print ("J. Wong" 15");
PTR = 10;
}
annars om (jag == 10) {
LCD.Clear();
lcd.setCursor (0, 0);
LCD.Print("A.Karapetrova'15");
lcd.setCursor (0, 1);
LCD.Print ("S. Walecka" 15 ");
PTR = 11;
}
annars om (jag == 11) {
LCD.Clear();
lcd.setCursor (0, 0);
LCD.Print ("S. Li ' 17");
lcd.setCursor (0, 1);
LCD.Print ("N. Sandford ' 17");
PTR = 12.
}
annars om (jag == 12) {
LCD.Clear();
lcd.setCursor (0, 0);
LCD.Print ("för hans majestät");
lcd.setCursor (0, 1);
LCD.Print ("Dwight Whitaker");
PTR = 13.
}
annars om (jag == 13) {
LCD.Clear();
lcd.setCursor (0, 0);
LCD.Print ("Phys 128");
lcd.setCursor (0, 1);
LCD.Print ("Pomona College");
PTR = 14.
}
annars om (jag == 14) {
LCD.Clear();
lcd.setCursor (0, 0);
LCD.Print ("betalas av den");
lcd.setCursor (0, 1);
LCD.Print (SIO och Avd för");
PTR = 15.
}
annars om (jag == 15) {
LCD.Clear();
lcd.setCursor (0, 0);
LCD.Print ("fysik och");
lcd.setCursor (0, 1);
LCD.Print ("astronomi.");
PTR = 16.
}
}
void scrollUp(int i) {
om (jag == 2) {
Menu();
}
om (jag > 2) {
scrollDown(i-2);
}
}