Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Projet Arduino LCD DIY : Assemblage avec résistances, bouton poussoir et afficheur 16x2

Composants et fournitures

Résistance 10k ohm (×2) Une pour le contraste LCD, l'autre pour le bouton. Important : Utilisez la résistance en configuration pull-down, pas pull-up comme dans le manuel.
Résistance 1k ohm (×1) Pour le contraste de l'écran LCD.
Interrupteur poussoir SparkFun 12mm (×1)
Adafruit LCD Standard 16x2 Blanc sur Bleu (×1)
Arduino UNO (×1)
Fils de connexion (génériques) (×1)

À propos de ce projet

Contexte

Je faisais partie d'un projet plus important mais il y a eu un retard. J'ai donc décidé de faire quelque chose avec mon vieux kit Arduino. Je n'avais jamais utilisé l'écran LCD. J'ai donc soudé les broches sur l'écran (j'ai appris à souder pour la première fois).

Au début, j'ai copié le code d'un manuel en ligne et l'ai téléversé. Il n'affichait que du texte défilant gauche/droite. C'est ainsi que j'ai découvert la bibliothèque LiquidCrystal. J'ai écrit un code faisant rebondir le chiffre « 0 » sur l'écran, c'était amusant. J'ai alors pensé à créer quelque chose de plus complexe, un jeu. J'ai cherché des jeux LCD sur Arduino et n'en ai trouvé que 3, dont 2 fonctionnaient pour moi. Les codes étaient trop complexes à comprendre, alors j'ai décidé de créer un jeu simple.

Mise en place

Connectez les broches du LCD à l'Arduino avec des fils comme indiqué dans le schéma ci-dessous.

J'ai utilisé un potentiomètre 10k pour régler le contraste et l'ai ajusté. J'ai mesuré la résistance entre les broches au multimètre et utilisé des résistances appropriées (1k et 10k ohms en série) pour la broche VO du LCD.

Placez un bouton poussoir sur la plaque d'essai et connectez le fil d'entrée à la broche 8 de l'Arduino. Téléversez le code et c'est prêt.

Note : Utilisez la résistance du bouton en mode pull-down, comme indiqué dans le schéma.

Jouer au jeu

Dans ce jeu, vous êtes un footballeur avec le ballon aux pieds. Des défenseurs s'approchent, vous devez les esquiver.

Après l'intro, appuyez sur le bouton quand demandé. Quand le défenseur est assez proche, appuyez pour sauter. Le suivant arrive plus vite, et ainsi de suite pour 10 défenseurs.

PS : J'utilisais au début « 0 » pour le joueur et « 1 » pour l'obstacle. La Coupe du Monde FIFA 2018 étant en cours et étant fan de Messi, j'ai changé le thème.

J'ai créé les glyphes du joueur et du défenseur avec un générateur en ligne : https://omerk.github.io/lcdchargen/

Code

lcd_1.ino (Arduino)

/* Dodge the defs!! Créé par : Shreyas R P
 * Créé le: 21-06-2018
 * Email : shreyasrp888@gmail.com
 * Jeu simple pour LCD 16x2 avec un bouton.
 * Licence GNU GPL v3 */
#include <LiquidCrystal.h>
const int btn = 8; // broche bouton

// Textes d'intro
char* introText[] = {"Dodge the defs!!", "Created on:", "Hit the button..."};

// Variables
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;

// GRAPHISMES (caractères personnalisés 5x8)
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) {
    lcd.setCursor(0, 0);
    lcd.print(introText[2]);
    delay(100);
  }
  if (button() == 1) game = 1;
}

void reset() {
  // Alterne l'affichage du joueur (course) selon obstaclePos
  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; // délai initial défenseur
  obstaclePos = 15; // position départ (écran 16 colonnes, index 0-15)
  while (game == 1) {
    reset();
    if (button() == 1) { // bouton pressé = saut
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.write(2); // joueur saute
      obstacle(obstaclePos);
      delay(400); // pause pour voir l'action
      lcd.clear();
      lcd.setCursor(0, 1);
      lcd.write(1); // joueur au sol
      obstacle(obstaclePos);
    } else {
      if (obstaclePos != 0) { // défenseur pas encore arrivé
        reset();
        obstacle(obstaclePos);
      } else { // défenseur atteint joueur au sol = game over
        game = 0;
        break;
      }
    }
    obstaclePos--; // défenseur avance
    if (obstaclePos < 0) { // esquive réussie
      obsDelay -= 20; // accélère
      obstaclePos = 15; // remise à position départ
      score++;
    }
    if (obsDelay == 0) game = 0; // 10 défenseurs esquivés (200/20=10)
    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); // défenseur court
  } else if (obstaclePos % 2 != 0 && obstaclePos > 2) {
    lcd.setCursor(i, 1);
    lcd.write(4); // défenseur court (autre frame)
  } else {
    lcd.setCursor(i, 1);
    lcd.write(5); // défenseur glisse (proche)
  }
}

void endGame() {
  if (score == 10) {
    lcd.clear();
    lcd.print("Congratulations!");
    lcd.setCursor(0, 1);
    lcd.print("You beat 'em all");
    delay(3000);
  } else if (score < 3) {
    lcd.clear();
    lcd.print("You suck");
    lcd.setCursor(0, 1);
    lcd.print("Score: "); lcd.print(score);
    delay(3000);
  } else if (score < 6) {
    lcd.clear();
    lcd.print("Not bad!");
    lcd.setCursor(0, 1);
    lcd.print("Score: "); lcd.print(score);
    delay(3000);
  } else {
    lcd.clear();
    lcd.print("Great!");
    lcd.setCursor(0, 1);
    lcd.print("Score: "); lcd.print(score);
    delay(3000);
  }
}

Schéma

Projet Arduino LCD DIY : Assemblage avec résistances, bouton poussoir et afficheur 16x2

Processus de fabrication

  1. Pourquoi le prototypage rapide est essentiel au développement produit réussi
  2. Maîtriser le design produit : stratégies éprouvées pour surmonter les défis courants
  3. Surveillance de température professionnelle sur Raspberry Pi avec DS18B20
  4. Primal Display : Construire un moniteur de température LCD avec Raspberry Pi
  5. Drone Pi : Quadricoptère Multiwii & Raspberry Pi double mode pour smartphone et radiocommande
  6. Archimède : Le hibou robotique IA à détection d'émotions
  7. Approvisionnement stratégique en données : la clé de chaînes d'approvisionnement résilientes
  8. Étapes éprouvées pour une réparation rapide et abordable d'écrans tactiles industriels
  9. Meilleurs Souffleurs de Feuilles 2024 : Trouvez le Modèle Idéal pour Votre Jardin