Stap 8: I2C LCD User-Interface en Menu
Er zijn vele manieren om de code van de user-interface en de menu met behulp van een Arduino en LCD shield. Onze schild heeft 2 rijen van scherm voor 16 tekens per stuk, vier directionele knoppen, een knop die bestemd voor een "select" functie, en een reset-knop. Codering proces vereenvoudigen, we alleen de vier directionele knoppen gebruikt, gemaakt van een nogal ruwe als-lusstructuur en instantievariabelen gebruikt voor een heleboel dingen. Voor degenen die meer comfortabel met C++, raden we u een gegevensstructuur (als hier wordt voorgesteld) of iets eleganter dan ook-veel-als-lussen. We wilden de gebruiker opgeslagen Toegangsstatistieken zoals de hoogste tijd pedaled in één keer, de totale "gedistantieerd" pedaled op deze fiets en de totale watturen gegenereerd sinds dag een. De gebruiker pedalen, maar we willen het scherm om statistieken te tonen zoals de tijd sinds gebruiker trappen, snelheid in kilometer per uur (omdat km is een onder gewaardeerd eenheid in de VS), energie wordt gegenereerd, watturen gegenereerd tijdens het fietsen. Voor lezers die niet gebruik hebben gemaakt van een I2C LCD schild voor, hier is een goede plaats om te beginnen.
De berekeningen voor deze statistieken waren niet moeilijk; voor RPM en km/s verdeeld we het aantal cycli pedaled tegen de tijd dat het nam voor de gebruiker om het pedaal dat vele cycli, en omgezet van de eenheden. We de straal van het achterwiel van onze fiets gemeten en vond de straal zich 28 cm. De omtrek is dus 175.929 cm, 0.00109317 mijlen of 0.00175929km. We berekend de afstand gefietst met behulp van afstand = tarief * tijd. Voor power gegenereerde, macht = huidige * spanning (P = IV). Als u een watturen gegenereerd, we de toevoeging van een Riemann-som-achtige uitgevoerd door te vermenigvuldigen met de tijd die verstreken (0.5 seconden) momentane macht en toe te voegen dat elke halve seconde de gebruiker heeft pedaled.
Wat betreft het menu we elk scherm geïndexeerd en gebruikt een dummy variabele tellen om door de schermen te navigeren. Op en neer zou aftrekken of toevoegen aan de dummy variabele, terwijl links keert ons terug naar de hogere trapsgewijze menu en rechts neemt ons mee naar de submenu's.
Hier is een schematische voorstelling van onze menukaart
Hoofdmenu
> top tijd
>> waarde weergeven
> de totale afgelegde afstand
>> waarde weergeven
> totale vermogen gegenereerd
>> waarde weergeven
> over
>> welke informatie er over de fiets is.
de volledige code vindt u op het einde van dit Instructable
de vette code is wat wij toevoegen aan de code van bovenaf
de code van de bibliotheek omvatten:
#include < Wire.h >
#include < Adafruit_MCP23017.h >
#include < Adafruit_RGBLCDShield.h >
#include < EEPROM.h > //for lange termijn opslag van de informatie op Arduinos
Dit gedeelte neemt woord voor woord van Adafruit de tutorial, die we gekoppeld hierboven
Het schild gebruikt de I2C SCL en SDA pinnen. Op klassieke Arduinos
Dit is analoog 4 en 5 zodat u niet die voor analogRead() meer kunt
Echter kunt u verbinden met andere I2C-sensoren de I2C-bus en het aandeel
de I2C-bus. Adafruit_RGBLCDShield lcd = Adafruit_RGBLCDShield();
Deze #defines maken het gemakkelijk om de kleur van de achtergrondverlichting instellen
#define RED 0x1
#define gele 0x3
#define groen 0x2
#define TEAL 0x6 gemaakt
#define BLUE 0x4
#define VIOLET 0x5
#define WHITE 0x7
Hier begint het deel dat we gecodeerd
int ptr = 0; menu aanwijzer
int minuten, seconden, kmh;
lange termijn opslag variabelen
int timeAddress = 0;
int distanceAddress = 1;
int powerAddress = 2;
byte timeValue, distanceValue, powerValue;
Boole isHome = waar;
VOID Setup {}
LCD.begin (16, 2);
LCD.Print ("Hello, world!");
lcd.setBacklight(WHITE);
timeValue = EEPROM.read(timeAddress);
distanceValue = EEPROM.read(distanceAddress);
powerValue = EEPROM.read(powerAddress);
root(); instellen beeldscherm naar hoofdmenu
}
uint8_t ik = 0; We zetten dit, omdat de tutorial opgenomen (niet precies weet wat het is voor)
void loop {}
menuFunction(); Zie als de knop wordt ingedrukt
Als (motorV > 1.0 & &! hasBeenOn) {}
LCD.Clear();
lcd.setCursor(0,0);
LCD.Print ("Warming-up...");
lcd.setCursor(0,1);
LCD.Print ("Keep trappen.");
lcd.setBacklight(GREEN);
digitalWrite (cc, hoge); Druk op start op de heffing controller
lcd.setBacklight(YELLOW);
delay(3500); Druk op start 3,5 seconden
cyclus = 0;
t0 = millis();
digitalWrite (cc, laag); stoppen op start te drukken
Nu moet worden opladen van de batterij
LCD.Clear();
lcd.setCursor(0,0);
hasBeenOn = true;
LCD.Print ("opladen batterij");
lcd.setBacklight(RED);
lcd.setCursor (3, 1);
timeOn = millis();
tijd van hoe lang persoon heeft zijn trappen
LCD.Print((Millis()-timeOn)/1000);
delay(wait);
isHome = false;
}
anders als (motorV > 1.0 & & hasBeenOn) {}
SEC = int((millis()-timeOn)/1000);
minuten = int(secs/60);
SEC = int(secs%60); Dit kan ook geschreven worden als een aparte functie
LCD.Clear();
lcd.setCursor (0, 0);
LCD.Print(mins);
lcd.setCursor (2, 0);
het aantal seconden sinds begin fietsen afdrukken
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(); Deze prints W, Wh
getkmh(); Dit drukt km/h
}
else {}
Als (timeValue > (millis()-timeOn/1000/60)) {}
timeValue = int(millis()-timeOn/1000/60);
EEPROM.write (timeAddress, timeValue);
}
if(!isHome) {}
root();
}
}
}
ongeldig getkmh() {}
kmh = rpm * 60,0 * revolutie;
lcd.setCursor (0, 1);
LCD.Print(kmh);
lcd.setCursor(2,1);
LCD.Print ("km/h");
}
ongeldig getCurrent() {}
huidige = (float(analogRead(hall))-514.5) / 26,5;
lcd.setCursor (6, 0);
LCD.Print (int (huidige * 13));
lcd.setCursor(8,0);
LCD.Print("W");
WH = Wh + zweven (wachten) /3600.0*current*13.0;
lcd.setCursor(10,0);
LCD.Print(WH);
lcd.setCursor(13,0);
LCD.Print("Wh");
}
ongeldig menuFunction() {}
delay(200);
uint8_t knoppen = lcd.readButtons();
Als (knoppen) {}
Als (knoppen & BUTTON_UP) {}
scrollUp(ptr);
}
Als (knoppen & BUTTON_DOWN) {}
if(PTR >0) {}
scrollDown(ptr);
}
}
Als (knoppen & BUTTON_LEFT) {}
Als (ptr > = 1 & & ptr < = 4) {}
root();
}
anders als (ptr > = 5) {}
menu();
}
}
Als (knoppen & BUTTON_RIGHT) {}
scrollRight();
}
}
}
ongeldig menu() {}
LCD.Clear();
lcd.setCursor (0, 0);
LCD.Print ("MENU (scroll V)");
lcd.setCursor (0, 1);
LCD.Print ("Top tijden");
PTR = 1;
}
ongeldig root() {}
LCD.Clear();
lcd.setCursor (0, 0);
LCD.Print ("fiets naar Charge!");
lcd.setCursor (0, 1);
LCD.Print ("Menu (rechts >)");
PTR = 0;
isHome = true;
}
ongeldig scrollRight() {}
Serial.println(PTR);
if(PTR == 0) {}
menu();
}
anders if(ptr == 1) {}
LCD.Clear();
lcd.setCursor (0, 0);
LCD.Print ("hoogste tijd");
lcd.setCursor (0, 1);
LCD.Print(TimeValue); HERINNER ME NUMMER!!! HOOGSTE TIJD
lcd.setCursor(13,1);
LCD.Print("min");
PTR = 5;
}
anders if(ptr == 2) {}
LCD.Clear();
lcd.setCursor (0, 0);
LCD.Print ("totale afstand");
lcd.setCursor (0, 1);
LCD.Print(distanceValue); HERINNER ME NUMMER!!! TOTALE AFSTAND
lcd.setCursor(14,1);
LCD.Print("Mi");
PTR = 6;
}
anders if(ptr == 3) {}
LCD.Clear();
lcd.setCursor (0, 0);
LCD.Print ("totale energie");
lcd.setCursor (0, 1);
LCD.Print(powerValue); HERINNER ME NUMMER!!! TOTALE WATTHOURS
lcd.setCursor(15,1);
LCD.Print("J");
PTR = 7;
}
anders if(ptr == 4) {}
LCD.Clear();
lcd.setCursor (0, 0);
LCD.Print ("Scroll naar beneden naar");
lcd.setCursor (0, 1);
LCD.Print ("Lees meer!!! (V)"); HERINNER ME NUMMER!!! TOTALE WATTHOURS
PTR = 8;
}
}
VOID scrollDown(int i) {}
Serial.println(i);
Als (ik == 1) {}
lcd.setCursor (0, 1);
LCD.Print ("totale afstand");
PTR = 2;
}
anders als (ik == 2) {}
lcd.setCursor (0, 1);
LCD.Print ("totale energie");
PTR = 3;
}
anders als (ik == 3) {}
lcd.setCursor (0, 1);
LCD.Print ("About!");
PTR = 4;
}
anders als (ik == 8) {}
LCD.Clear();
lcd.setCursor (0, 0);
LCD.Print ("elektronica fiets");
lcd.setCursor (0, 1);
LCD.Print ("werkte aan door:");
PTR = 9;
}
anders als (ik == 9) {}
LCD.Clear();
lcd.setCursor (0, 0);
LCD.Print ("A. McKay ' 13");
lcd.setCursor (0, 1);
LCD.Print ("J. Wong ' 15");
PTR = 10;
}
anders als (ik == 10) {}
LCD.Clear();
lcd.setCursor (0, 0);
LCD.Print("A.Karapetrova'15");
lcd.setCursor (0, 1);
LCD.Print ("S. Walecka ' 15");
PTR = 11;
}
anders als (ik == 11) {}
LCD.Clear();
lcd.setCursor (0, 0);
LCD.Print ("S. Li ' 17");
lcd.setCursor (0, 1);
LCD.Print ("N. Sandford ' 17");
PTR = 12;
}
anders als (ik == 12) {}
LCD.Clear();
lcd.setCursor (0, 0);
LCD.Print ("For His Majesty");
lcd.setCursor (0, 1);
LCD.Print ("Dwight Whitaker");
PTR = 13;
}
anders als (ik == 13) {}
LCD.Clear();
lcd.setCursor (0, 0);
LCD.Print ("Phys 128");
lcd.setCursor (0, 1);
LCD.Print ("Pomona College");
PTR = 14;
}
anders als (ik == 14) {}
LCD.Clear();
lcd.setCursor (0, 0);
LCD.Print ("betaald door de");
lcd.setCursor (0, 1);
LCD.Print (SIO en Dept van");
PTR = 15;
}
anders als (ik 15 ==) {}
LCD.Clear();
lcd.setCursor (0, 0);
LCD.Print ("fysica en");
lcd.setCursor (0, 1);
LCD.Print ("astronomie.");
PTR = 16;
}
}
VOID scrollUp(int i) {}
Als (ik == 2) {}
menu();
}
Als (ik > 2) {}
scrollDown(i-2);
}
}