Innholdsfortegnelse:

Arduino berøringsskjermkalkulator: 7 trinn
Arduino berøringsskjermkalkulator: 7 trinn

Video: Arduino berøringsskjermkalkulator: 7 trinn

Video: Arduino berøringsskjermkalkulator: 7 trinn
Video: Mind-boggling Arduino touchscreen artwork #arduino #electronics #electrician #elektronik #engineer 2024, Juli
Anonim
Arduino berøringsskjerm kalkulator
Arduino berøringsskjerm kalkulator

Hallo! Dette er et prosjekt for å lage en berøringsskjermkalkulator med en Arduino Uno og et TFT LCD -skjerm. Jeg kom på konseptet for programmeringsklassen min i hjemmeskolen, og erfaringen med å bygge dette prosjektet var veldig interessant. Denne kalkulatoren kan utføre de fire enkle matematiske operasjonene (addisjon, subtraksjon, multiplikasjon og divisjon). Det viser også opptil to desimaler for divisjonssvarene som har dem. La oss dykke rett inn! Rekvisita for dette prosjektet er listet opp nedenfor.

Rekvisita

- Arduino Uno

-2.4 TFT LCD-skjerm (her kjøpte jeg det:

- USB A til B -kabel (ledning for å koble Arduino til datamaskin)

- Datamaskin med Arduino IDE installert

- Du må også laste ned to biblioteker: MCUFRIEND_kbv og berøringsskjerm. Den første finner du på github (lenke: https://github.com/prenticedavid/MCUFRIEND_kbv) eller du kan bruke bibliotekets zip -fil jeg har inkludert nedenfor. Den andre er i Arduino Library manager for installasjon.

Trinn 1: Maskinvaretilkoblinger

Maskinvaretilkoblinger
Maskinvaretilkoblinger
Maskinvaretilkoblinger
Maskinvaretilkoblinger
Maskinvaretilkoblinger
Maskinvaretilkoblinger

Tilkoblingen av berøringsskjermen til Arduino Uno er enkel og rask. Alt du trenger å gjøre er å stille de laveste pinnene på skjoldet med de laveste pinnene på Arduino og skyve skjoldet inn i pinnene. Den øverste 5V -pinnen og den umerkede pinnen på kraftsiden bør ikke ha pinner fra skjoldet i seg, med de samme parameterne som gjelder for pinnene merket SCL og SDA på den andre siden av brettet. Nå er vi klare til å kode!

Trinn 2: Koden: Globale definisjoner og oppsett

#inkludere

MCUFRIEND_kbv tft; // fastkoblet for UNO-skjold uansett

#inkludere

#definere YP A3

#define XM A2

#definere YM 9

#define XP 8

TouchScreen ts = TouchScreen (XP, YP, XM, YM, 300);

#define MINPRESSURE 10

Dette er begynnelsen på koden, der vi inkluderer biblioteker (MCUFRIEND_kbv og berøringsskjerm), definerer X- og Y -pinnene, konfigurerer berøringsskjermparametrene og definerer minimumstrykk som er nødvendig for Arduino for å registrere et brukerpress.

int ID;

int user_selection;

float lagret_nummer = 0;

float term1;

int op_num;

flyte resultat;

int cursorLocX = 5;

int cursorLocY = 20;

Rett før oppsett må vi sette opp noen globale variabler. ID hjelper deg med å få berøringsskjermen i gang. user_selection har et tall som tilsvarer tasten brukeren velger når du trykker på berøringsskjermen. save_number er variabelen som vi skriver ut på skjermen etter en brukeroppføring (mer om dette i løkken). Det er en flottør, så den kan inneholde desimaltall så vel som heltall. term1 er variabelen som det første tallet i ligningen blir lagret i etter at en operand er valgt. op_num lagrer operanden som et tall (1 for tillegg, 2 for subtraksjon, 3 for multiplikasjon og 4 for divisjon). resultat er variabelen som skrives ut på skjermen etter at brukeren har trykket likhetstegnet. Det er også en flottør. cursorLocX og cursorLocY er kartpunktene på berøringsskjermen der markøren er satt til flere ganger (den ligger i den grå linjen øverst, ellers kjent som resultatfeltet).

ugyldig oppsett () {

tft.reset ();

ID = tft.readID ();

tft.begin (ID);

tft.setRotation (0);

tft.fillScreen (TFT_DARKGREY);

firkanter ();

tall ();

tft.setTextSize (3);

tft.setTextColor (TFT_BLUE, TFT_DARKGREY);

}

Oppsettfunksjonen vår inneholder først initialiseringen av berøringsskjermen (linje 1-3). Retningen til skjoldet angis ved hjelp av kommandoen tft.setRotation (), med 0 som er oppreist. Hele skjermen er mørkegrå med kommandoen tft.fillScreen (), som vi skriver over toppen av (bortsett fra resultatfeltet). Funksjonene i rutene () og tallene () tegner rutene til kalkulatoren, farger rutene svart og hvitt i et rutemønster, og skriver tall/operander på rutene i blått. Vi kommer til dem i neste trinn. Kommandoen tft.setTextSize () setter tekststørrelsen i resultatfeltet til 3, som er en middels skrift. Kommandoen tft.setTextColor () setter tekstfargen i resultatfeltet til blått, som skrives over det mørkegrå feltet.

Trinn 3: Koden: Loop

void loop () {numberSelect ();

forsinkelse (100);

hvis (user_selection == 16) {

;

}ellers{

hvis (user_selection <10) {

lagret_nummer = lagret_nummer * 10 + bruker_valg;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (lagret_nummer);

} annet hvis (brukervalg> 10) {

bytte (brukervalg) {

sak 11:

op_num = 1;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("+");

term1 = lagret_nummer;

lagret_nummer = 0;

gå i stykker;

sak 12:

op_num = 2;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("-");

term1 = lagret_nummer;

lagret_nummer = 0;

gå i stykker;

sak 13:

op_num = 3;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("X");

term1 = lagret_nummer;

lagret_nummer = 0;

gå i stykker;

sak 14:

op_num = 4;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("/");

term1 = lagret_nummer;

lagret_nummer = 0;

gå i stykker;

sak 15:

lagret_nummer = 0;

term1 = 0;

op_num = 0;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("");

gå i stykker;

}

tft.setCursor (cursorLocX, cursorLocY);

Dette er mye å tygge på, så jeg skal forklare det som er ovenfor. Vi starter med å ringe funksjonen numberSelect (), som tildeler et tall til hver firkant på berøringsskjermen. Når en bruker trykker på en av disse rutene, setter funksjonen variabelen user_selection til nummeret på kvadratet. Den første if -setningen skal bare kjøre gjennom løkken hvis et gyldig brukervalg er gjort. Hvis det er det, spør neste setning om bruker_valg har et tall mindre enn 10 lagret i det (tallene 0-9). Hvis den gjør det, blir lagret_nummer multiplisert med 10 og tallet i bruker_valg blir lagt til i lagret_nummer, som skrives ut i resultatfeltet på berøringsskjermen. Hvis den ikke gjør det, spør neste setning om bruker_valg har et tall større enn 10 lagret i det (operand -tallene: 11 for +, 12 for -, 13 for X, 14 for /og 15 for den klare skjermfeltet). En bryterfunksjon tar seg av hvert tilfelle (bestemmes av user_selection). Variabelen op_num får et tall som tilsvarer operanden som ble valgt (1 for +, 2 for -, 3 for X og 4 for /). Verdien i save_number lagres i variabelen term1 slik at variable_number -variabelen kan brukes i andre halvdel av ligningen. Operandsymbolet skrives ut på skjermen sammen med sletting av tall i resultatfeltet. Det eneste unntaket er den klare skjermfeltet, som tilbakestiller alle beregningsvariablene og sletter resultatfeltet for alt som er på den.

}ellers{

bytte (op_num) {

sak 1:

resultat = term1 + lagret_nummer;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (dobbelt (resultat));

gå i stykker;

sak 2:

resultat = term1 - lagret_nummer;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (dobbelt (resultat));

gå i stykker;

sak 3:

resultat = term1 * lagret_nummer;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (dobbelt (resultat));

gå i stykker;

sak 4:

resultat = float (term1) / float (lagret_nummer);

tft.setCursor (cursorLocX, cursorLocY);

tft.print (resultat);

gå i stykker;

}

tft.setCursor (cursorLocX, cursorLocY);

lagret_nummer = resultat;

term1 = 0;

op_num = 0;

forsinkelse (1000);

}

}

}

Den siste delen av sløyfen omhandler hendelsen der brukeren velger likhetstegnet (user_selection == 10). En annen bryterfunksjon fungerer gjennom de fire matematiske funksjonene (bestemt av op_num). Addisjonssaken (sak 1) legger sammen term1 og save_number og lagrer tallet i resultatvariabelen. Resultatet skrives ut til resultatfeltet som en dobbel. Subtraksjonstilfellet (tilfelle 2) trekker lagret_nummer fra term1 og lagrer tallet i resultatvariabelen. Resultatet skrives ut til resultatfeltet som en dobbel. Multiplikasjonstilfellet (sak 3) multipliserer term1 med save_number og lagrer tallet i resultatvariabelen. Resultatet skrives ut i resultatfeltet som en dobbel. Divisjonstilfellet (sak 4) deler term1 med save_number sammen og lagrer tallet i resultatvariabelen. Resultatet skrives ut til resultatfeltet som en flyter (fordi divisjonssvarene kan være desimaltall). Etter at enten et tall, operand eller resultat skrives ut på skjermen, tilbakestilles markøren, lagret_nummer settes til det forrige resultatet, og term1 & op_num nullstilles.

Noen få notater: brukeren kan ikke legge inn desimaltall i kalkulatoren på grunn av mangel på et desimaltegn. Brukeren kan også bare gjøre en ligning om gangen. Du kan ikke beregne et resultat og deretter legge til/trekke/multiplisere/dele det resultatet. I funksjonen numberSelect () er det en funksjon som sletter skjermen etter at et resultat er skrevet ut hvis en bruker har trykket på en annen firkant.

Trinn 4: Koden: Firkanter -funksjonen

ugyldige firkanter () {

// svarte og hvite ruter veksler på hver rad, og den første og tredje raden har et motsatt mønster enn den andre og fjerde raden

tft.fillRect (0, 60, 60, 65, TFT_BLACK); // første rad med ruter starter, svart til hvitt tft.fillRect (60, 60, 60, 65, TFT_WHITE);

tft.fillRect (120, 60, 60, 65, TFT_BLACK);

tft.fillRect (180, 60, 60, 65, TFT_WHITE); // første rad med ruter ender

tft.fillRect (0, 125, 60, 65, TFT_WHITE); // andre rad med ruter starter, hvit til svart tft.fillRect (60, 125, 60, 65, TFT_BLACK);

tft.fillRect (120, 125, 60, 65, TFT_WHITE);

tft.fillRect (180, 125, 60, 65, TFT_BLACK); // andre rad med ruter ender

tft.fillRect (0, 190, 60, 65, TFT_BLACK); // tredje rad med ruter starter, svart til hvitt tft.fillRect (60, 190, 60, 65, TFT_WHITE);

tft.fillRect (120, 190, 60, 65, TFT_BLACK);

tft.fillRect (180, 190, 60, 65, TFT_WHITE); // den tredje raden med ruter ender

tft.fillRect (0, 255, 60, 65, TFT_WHITE); // fjerde rad med ruter starter, hvit til svart tft.fillRect (60, 255, 60, 65, TFT_BLACK);

tft.fillRect (120, 255, 60, 65, TFT_WHITE);

tft.fillRect (180, 255, 60, 65, TFT_BLACK); // fjerde rad med ruter ender

}

Firkanten () -funksjonen er ganske grei. Kommandoen tft.fillRect (X1, Y1, X2, Y2, TFT_COLOR) tegner et rektangel i henhold til parametrene som sendes til den, som er x og ys første posisjoner, x og ys andre posisjoner, og fargen som rektangelet er fylt med. Denne funksjonen tegner alle fire rader med firkanter (teknisk rektangler) og fyller hver firkant med fargen som er sendt til den.

Trinn 5: Koden: tall -funksjonen

ugyldige tall () {

tft.setTextColor (TFT_BLUE); // setter nummer/tegnfarge til blå

tft.setTextSize (5); // setter tall/tegnstørrelse til 5

tft.setCursor (18, 75); // setter markøren for første linje med tall/tegn

tft.print ("7 8 9 /"); // skriver ut første linje med tall/tegn

tft.setCursor (18, 140); // setter markøren for andre linje med tall/tegn

tft.print ("4 5 6 X"); // skriver ut andre linje med tall/tegn

tft.setCursor (18, 205); // setter markør for tredje linje med tall/tegn

tft.print ("1 2 3 -"); // skriver ut tredje linje med tall/tegn

tft.setCursor (18, 270); // setter markøren for fjerde linje med tall/tegn

tft.print ("C 0 = +"); // skriver ut fjerde linje med tall/tegn

}

Tallene () -funksjonen er også grei. De to første linjene setter tekststørrelsen større og fargen til blå. Kommandoen tft.setCursor () setter markøren til posisjonen på hver rad hvor skriving av tallene starter. Deretter skriver kommandoen tft.print () ut tallene/tegnene over rutene.

Trinn 6: Koden: Nummer Velg funksjon

void numberSelect () {

TSPoint p = ts.getPoint ();

pinMode (XM, OUTPUT);

pinMode (YP, OUTPUT);

hvis (p.z> MINPRESSURE) {

p.x = kart (p.x, 250, 845, 0, 239);

p.y = map (p.y, 245, 860, 0, 319);

hvis (resultat! = 0) {

resultat = 0;

lagret_nummer = 0;

tft.print ("SLETT VERDIER");

forsinkelse (500);

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("");

tft.setCursor (cursorLocX, cursorLocY);

}

For å starte funksjonen numberSelect () ber vi om brukerinngang fra berøringsskjermen med kommandoen ts.getPoint (). Når dataene er samlet inn, sjekker vi om minimumstrykket er overskredet (eller, med andre ord, om brukeren har trykket et sted på berøringsskjermen). Hvis det er det, blir x- og y-koordinatene kartlagt fra kartesiske koordinater til berøringsskjermspesifikke koordinater. (0, 0) er øvre venstre hjørne av berøringsskjermen, med x -aksen på tvers og y -aksen ned. Den neste delen sjekker om det er lagret et nummer i resultatet. Hvis det er det, blir resultat og lagret_nummer tilbakestilt til 0. Meldingen "SLETT VERDIER" skrives ut over resultatfeltet, og skjermen slettes med markøren tilbake til utgangsposisjonen.

if (s.y. 60) {// første firkantrekke

hvis (s. x <60)

user_selection = 7;

annet hvis (s. x <120)

user_selection = 8;

annet hvis (s. x <180)

user_selection = 9;

ellers user_selection = 14;

} annet hvis (s.y 125) {// andre firkantrekke

hvis (s. x <60)

user_selection = 4;

annet hvis (s. x <120)

user_selection = 5;

annet hvis (s. x <180)

user_selection = 6;

ellers user_selection = 13;

} annet hvis (s. 190) {// tredje rute med firkanter

hvis (s. x <60)

user_selection = 1;

annet hvis (s. x <120)

user_selection = 2;

annet hvis (s. x <180)

user_selection = 3;

ellers user_selection = 12;

} annet hvis (s.y> 255) {// fjerde rad med ruter

hvis (s. x <60)

user_selection = 15;

annet hvis (s. x <120)

user_selection = 0;

annet hvis (s. x <180)

user_selection = 10;

ellers user_selection = 11;

}

}ellers{

user_selection = 16; // user_selection er satt til 16 (ingenting variabel)

}

}

Dette er delen som bestemmer hvilken knapp som er valgt. Begynner med den øverste raden med firkanter og slutter med den nederste raden, ser Arduino etter hvor skjermen faktisk ble trykket på. Den tildeler deretter firkanten et tall og lagrer dette tallet i user_selection. Tallene 0-9 tilsvarer tallkvadratene, tallene 11-15 tilsvarer operand-rutene og den klare ruten, og tallet 10 tilsvarer likhetstegnet firkant. Hvis det ikke er valgt noen firkant, er user_selection satt til 16, noe som får sløyfen til å starte på nytt (se sløyfefunksjon).

Trinn 7: Nyt det ferdige prosjektet

Der har du det! Du har nå en berøringsskjermkalkulator som kan gjøre addisjon, subtraksjon, multiplikasjon og divisjon. Dette prosjektet endret hele måten jeg trodde en kalkulator fungerte på. Mens jeg jobbet med dette prosjektet, husker jeg at jeg sa til instruktøren min på klassen: "Jeg vil aldri se på en kalkulator på samme måte igjen!" Funksjonene du som bruker synes er enkle, er litt vanskelige når du står bak datamaskinen og prøver å etterligne ideen din. Jeg håper du likte prosjektet, og jeg håper at tankegangen din om hvordan en kalkulator fungerer har blitt endret også!

Her er hele koden for din bekvemmelighet. Den er fylt med kommentarer, så hvis du har problemer, bør de vise deg hva hver linje gjør.

Anbefalt: