DIY Arduino LCD-project: Bouw met weerstanden, drukknop en 16x2 display
Onderdelen en benodigdheden
| Weerstand 10k ohm | × | 2 | Eén voor de contrast van het LCD-scherm, de andere voor de knop. Belangrijk: Gebruik de weerstand in pull-down configuratie, in tegenstelling tot de pull-up configuratie in de handleiding. |
| Weerstand 1k ohm | × | 1 | Voor de contrast van het LCD-scherm. |
| SparkFun Drukknop 12mm | × | 1 | |
| Adafruit Standaard LCD - 16x2 Wit op Blauw | × | 1 | |
| Arduino UNO | × | 1 | |
| Draadbruggen (generiek) | × | 1 |
Over dit project
Achtergrond
Ik was betrokken bij een groter project maar er was vertraging. Daarom besloot ik iets te doen met mijn oude Arduino-kit. Ik had het LCD-scherm nog nooit gebruikt. Ik soldeerde de pennen in het scherm (ik leerde voor de eerste keer solderen).
Initieel kopieerde ik code van een online handleiding en uploadde deze. Het toonde alleen tekst die links en rechts beweegde. Hier werd ik geïntroduceerd aan de LiquidCrystal-bibliotheek. Ik schreef een code die het cijfer "0" over het scherm liet botsen, wat best leuk was. Toen dacht ik aan iets complexer, een spel. Ik googelde naar LCD-spellen op Arduino en vond er maar 3, waarvan 2 voor me werkten. De code van deze spellen was veel te complex om te begrijpen, dus besloot ik een eenvoudig spel te maken.
Opbouwen
Sluit de LCD-pennen aan op de Arduino met draden zoals in het schema hieronder getoond.
Ik gebruikte een 10k potentiometer om de contrast in te stellen en stelde deze in op de gewenste contrast. Ik meet de weerstand tussen de pennen met een multimeter en gebruikte geschikte weerstanden (1k en 10k ohm in serie) voor de VO-pin van de LCD.
Plaats een drukknop op het breadboard en sluit de ingangsdraad aan op pin 8 van de Arduino. Upload de code naar je Arduino en je bent klaar.
Let op: Gebruik de knopweerstand in pull-down modus, zoals in het schema getoond.
Het spel spelen
In dit spel ben je een voetballer met de bal aan je voeten. Je hebt verdedigers die op je afkomen, en je moet ze simpelweg ontwijken.
Na de intro, druk op de knop wanneer daarom wordt gevraagd. Wanneer de verdediger dichtbij genoeg komt, druk op de knop om te springen. De volgende verdediger komt met een hogere snelheid, en dit gaat door voor 10 verdedigers.
PS: Ik gebruikte initieel "0" als speler en "1" als obstakel. Omdat het WK voetbal 2018 bezig was en ik een fan ben van Messi, besloot ik het thema te veranderen.
Ik maakte de glyphs voor de speler en verdediger met een online generator: https://omerk.github.io/lcdchargen/
Code
lcd_1.ino
/* Dodge the defs!! Gemaakt door: Shreyas R P
* Gemaakt op: 21-06-2018
* E-mail: shreyasrp888@gmail.com
* Een eenvoudig spel voor 16x2 LCD met een knop.
* Als je verbeteringen of wijzigingen maakt, voeg je credits toe onder de streep:
* Veel plezier :)
* Copyright (C) 2018 Shreyas R P
* Dit programma is vrije software: je kunt het herdistribueren en/of wijzigen
* onder de voorwaarden van de GNU General Public License zoals gepubliceerd door
* de Free Software Foundation, versie 3 of (naar keuze) latere versies.
* Dit programma wordt gedistribueerd in de hoop dat het nuttig zal zijn,
* MAAR ZONDER ENIGE GARANTIE; zonder zelfs de impliciete garantie van
* VERKOOPBAARHEID of GESCHIKTHEID VOOR EEN BEPAALD DOEL.
* Zie de GNU General Public License voor meer details.
* Je zou een kopie van de GNU General Public License moeten hebben ontvangen.
* Zo niet, zie <https://www.gnu.org/licenses/>.
* -------------------------------------------------------------------------------------------- */
#include <LiquidCrystal.h>
const int btn = 8; // knop invoer pin
// teksten om weer te geven
char* introText[] = {"Dodge the defs!!", "Gemaakt op:", "Druk op de knop..."};
// variabele declaraties
int game = 0;
int buttonPress = 0;
int buttonState = 0;
int obstaclePos;
int obsDelay;
int score = 0;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;
int lastButtonState = LOW;
// GRAFIKEN
byte runnin1[8] = {
0b01100, 0b01100, 0b00000, 0b11100,
0b01110, 0b01100, 0b11110, 0b00011
};
byte runnin2[8] = {
0b00110, 0b00110, 0b00000, 0b00111,
0b01110, 0b00110, 0b01110, 0b00101
};
byte jump[8] = {
0b00100, 0b01100, 0b11100, 0b01110,
0b01100, 0b11111, 0b00000, 0b00001
};
byte def1[8] = {
0b00100, 0b00110, 0b00111, 0b01110,
0b00110, 0b01111, 0b01000, 0b00000
};
byte def2[8] = {
0b00100, 0b00110, 0b00111, 0b01110,
0b00110, 0b00110, 0b00110, 0b00010
};
byte slide[8] = {
0b00000, 0b00000, 0b00011, 0b00011,
0b00000, 0b01111, 0b11111, 0b00000
};
LiquidCrystal lcd(4, 6, 10, 11, 12, 13);
void setup() {
Serial.begin(9600);
pinMode(btn, INPUT);
lcd.begin(16, 2);
lcd.createChar(0, runnin1);
lcd.createChar(1, runnin2);
lcd.createChar(2, jump);
lcd.createChar(3, def1);
lcd.createChar(4, def2);
lcd.createChar(5, slide);
buttonState = digitalRead(btn);
}
void loop() {
intro();
while (game == 1) ballActive();
endGame();
}
void intro() {
score = 0;
lcd.clear();
lcd.print(introText[0]);
lcd.setCursor(7, 1);
lcd.print("By SRP888");
delay(2000);
lcd.clear();
lcd.print(introText[1]);
lcd.setCursor(0, 1);
lcd.print("21-06-2018");
delay(2000);
lcd.clear();
while (button() != 1) { // wachten op knopdruk
lcd.setCursor(0, 0);
lcd.print(introText[2]);
delay(100);
}
if (button() == 1) game = 1;
}
void reset() {
if (obstaclePos % 2 == 0) {
lcd.clear();
lcd.setCursor(0, 1);
lcd.write(byte(0));
} else {
lcd.clear();
lcd.setCursor(0, 1);
lcd.write(1);
}
}
void ballActive() {
obsDelay = 200; // initiële vertraging voor verdediger
obstaclePos = 15; // 16x2 LCD, index begint op 0
while (game == 1) {
reset();
if (button() == 1) { // als knop ingedrukt
lcd.clear();
lcd.setCursor(0, 0);
lcd.write(2); // speler springt
obstacle(obstaclePos); // verdediger tonen
delay(400); // voorkomen dat display te snel verdwijnt
lcd.clear();
lcd.setCursor(0, 1);
lcd.write(1); // speler weer op grond
obstacle(obstaclePos); // verdediger tonen
} else {
if (obstaclePos != 0) { // verdediger nog niet bij speler
reset();
obstacle(obstaclePos);
} else if (obstaclePos == 0) { // verdediger bij speler op grond
game = 0;
break;
}
}
obstaclePos--; // verdediger naderen
if (obstaclePos < 0) { // speler ontweken met succes
obsDelay = obsDelay - 20; // vertraging verkleinen (snelheid verhogen)
obstaclePos = 15; // verdediger terug naar start
score++; // score verhogen
}
if (obsDelay == 0) { // 10 verdedigers ontweken (200/20=10)
game = 0;
}
delay(obsDelay);
}
}
int button() {
int reading = digitalRead(btn);
if (reading != lastButtonState) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
buttonState = reading;
if (buttonState == HIGH) {
lastButtonState = reading;
return 1;
}
}
lastButtonState = reading;
return 0;
}
void obstacle(int i) {
if (obstaclePos % 2 == 0 && obstaclePos > 2) {
lcd.setCursor(i, 1);
lcd.write(3);
} else if (obstaclePos % 2 != 0 && obstaclePos > 2) {
lcd.setCursor(i, 1);
lcd.write(4);
} else { // 2 stappen van speler: glijden
lcd.setCursor(i, 1);
lcd.write(5);
}
}
void endGame() {
if (score == 10) {
lcd.clear();
lcd.print("Gefeliciteerd!");
lcd.setCursor(0, 1);
lcd.print("Je versloeg ze allemaal");
delay(3000);
} else if (score < 3) {
lcd.clear();
lcd.print("Je stinkt");
lcd.setCursor(0, 1);
lcd.print("Score: ");
lcd.print(score);
delay(3000);
} else if (score < 6) {
lcd.clear();
lcd.print("Niet slecht!");
lcd.setCursor(0, 1);
lcd.print("Score: ");
lcd.print(score);
delay(3000);
} else {
lcd.clear();
lcd.print("Geweldig!");
lcd.setCursor(0, 1);
lcd.print("Score: ");
lcd.print(score);
delay(3000);
}
}
Schema

Productieproces
- Bewezen Stappen Voor Snelle, Betaalbare Industriële Touchscreen Reparatie
- Waarom snell prototypen essentieel is voor succesvolle productontwikkeling
- Productontwerp meesteren: Bewezen strategieën om veelvoorkomende uitdagingen te overwinnen
- Vloeistofkristal Display (LCD): Technologie, Productie en Toekomstperspectief
- Professionele temperatuurbewaking met Raspberry Pi en DS18B20
- Primal Display: Een Raspberry Pi LCD-temperatuurmonitor bouwen
- Drone Pi: Een Dual-Mode Multiwii & Raspberry Pi Quadcopter voor Smartphone en Remote Besturing
- Archimedes: De Emotie-Detecterende AI Robot Uil
- Top bladblazers 2024: Vind het perfecte model voor uw tuin
- De Tetrode Buis: Ontwerp, Functie en Impact op Versterkerprestaties
- Strategische databronnen: de sleutel tot veerkrachtige supply chains