Search Code

ESP32-zelfstudie 33/55 - Digitale dobbelsteen met behulp van SunFounder's ESP32 IoT-leerkit

ESP32-zelfstudie 33/55 - Digitale dobbelsteen met behulp van SunFounder's ESP32 IoT-leerkit

In deze tutorial maken we een digitale dobbelsteen met behulp van een zevensegmentdisplay en de ESP32 van SunFounder's IoT-leerkit. Met dit project kun je een virtuele dobbelsteen rollen die bij het indrukken van een knop getallen van 1 tot 6 genereert. Dit is een fantastische manier om de mogelijkheden van de ESP32 te verkennen terwijl je leert over het aansturen van displays en knoppen. Voor extra duidelijkheid kun je de video bekijken op (in video op 0:00).

ESP32-33_digital-dice-main

Hardware uitgelegd

De belangrijkste componenten voor dit project zijn de ESP32-microcontroller, een 74HC595-schuifregister, een zevensegmentdisplay en een drukknop. De ESP32 is een krachtige microcontroller met geïntegreerde Wi-Fi en Bluetooth, waardoor deze geschikt is voor IoT-toepassingen. Met het 74HC595-schuifregister kunnen we het zevensegmentdisplay aansturen met minder pinnen dan wanneer we elk segment rechtstreeks zouden verbinden.

Het zevensegmentdisplay toont cijfers en wordt aangestuurd door gegevens van het schuifregister te verzenden. De drukknop wordt gebruikt om de dobbelsteenworp te activeren, waarbij een willekeurig getal wordt gegenereerd dat wordt weergegeven. Wanneer ingedrukt, verbindt de knop met pin 13 op de ESP32, die een interne pull-upweerstand heeft om deze in een hoge staat te houden wanneer niet ingedrukt.

Datasheetdetails

Fabrikant Texas Instruments
Onderdeelnummer 74HC595
Logica/IO-spanning 2 V tot 6 V
Voedingsspanning 4,5 V tot 5,5 V
Uitgangsstroom (per kanaal) 6 mA max
Piekstroom (per kanaal) 35 mA max
PWM-frequentierichtlijn Niet van toepassing
Ingangslogische drempels VIH ≥ 2 V, VIL ≤ 0,8 V
Spanningsval / RDS(on) / verzadiging 0,5 V max
Thermische limieten 150 °C
Behuizing DIP-16
Opmerkingen / varianten Vaak gebruikt in digitale displays

 

  • Zorg voor correcte spanningsniveaus (4,5 V tot 5,5 V) voor betrouwbare werking.
  • Beperk de uitgangsstroom om beschadiging van het schuifregister te voorkomen.
  • Gebruik ontkoppelcondensatoren nabij de voedingspinnen om de spanning te stabiliseren.
  • Sluit het zevensegmentdisplay correct aan om verkeerde weergave van cijfers te voorkomen.
  • Controleer de bedrading op losse verbindingen die tot onverwacht gedrag kunnen leiden.

Bedradingsinstructies

ESP32-33_digital-dice-wiring

Om de digitale dobbelsteen te bedraden, begin je met het opzetten van de voedingsverbindingen. Verbind de grond (blauwe lijn) op je breadboard met de grondpin op de ESP32 en zorg ervoor dat alle aardpunten met elkaar verbonden zijn. Verbind vervolgens een 3,3V-pin van de ESP32 met de voedingsrail (rode lijn) op het breadboard.

ESP32-33_digital-dice-schematic

Voor het 74HC595-schuifregister moet je ervoor zorgen dat pin 1 is verbonden met de 3,3V-rail en pin 8 met de grond. Verbind de data-uitgangspin (DS) met pin 25 op de ESP32, de schuifklokpin (SHCP) met pin 26 en de opslagklokpin (STCP) met pin 27. De drukknop moet worden verbonden tussen pin 13 op de ESP32 en de grond, zodat deze de pin laag trekt wanneer ingedrukt.

Codevoorbeelden & uitleg

In de code definiëren we eerst de pinnen die worden gebruikt voor het schuifregister en de knop. De knop-pin wordt gedefinieerd als buttonPin en is ingesteld op pin 13 op de ESP32. De data-array datArray bevat de binaire representaties van de cijfers 0-9 voor het zevensegmentdisplay.


const int STcp = 27;//ST_CP
const int SHcp = 26;//SH_CP 
const int DS = 25; //DS 
const int buttonPin = 13;
int datArray[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

In de setup()-functie stellen we de knop-pin in op invoermodus en de schuifregisterpinnen op uitvoermodus. Dit bereidt de pinnen voor op het lezen van invoer van de knop en het verzenden van gegevens naar het display.


void setup ()
{
  pinMode(buttonPin,INPUT); 
  pinMode(STcp,OUTPUT);
  pinMode(SHcp,OUTPUT);
  pinMode(DS,OUTPUT);
}

De hoofdlogica van het programma bevindt zich in de loop()-functie. Deze controleert of de knop is ingedrukt, genereert een willekeurig getal en roept de show_number()-functie aan om het getal op het zevensegmentdisplay weer te geven.


void loop()
{
  if(digitalRead(buttonPin) == LOW)
  {
    int diceNumber = random(1, 7);
    show_number(diceNumber);
    delay(50);
  }
}

De show_number()-functie verzendt de juiste waarde uit de data-array naar het schuifregister, dat vervolgens de segmenten van het display aanstuurt om het gegenereerde getal weer te geven. Deze functie is cruciaal voor visuele feedback wanneer de knop wordt ingedrukt.

74HC595 LED Display: Seven-Segment Explained
74HC595 LED-display: zevensegment uitgelegd

Demonstratie / wat je kunt verwachten

Wanneer de opstelling compleet is en de code is geüpload, zal het indrukken van de knop een willekeurig getal tussen 1 en 6 genereren, dat wordt weergegeven op het zevensegmentdisplay. Als alles correct is bedraad, zou het display elke keer dat de knop wordt ingedrukt een getal moeten tonen. Wees voorzichtig met zwevende ingangen; zorg ervoor dat de knop goed is verbonden met de aarde om grillig gedrag te voorkomen (in video op 1:30).

Videotijdstippen

  • 00:00 Start
  • 1:48 Projectintroductie
  • 3:40 Bedrading voor digitale dobbelsteen uitgelegd
  • 13:16 Arduino-code voor digitale dobbelsteen uitgelegd
  • 19:19 ESP32-board en COM-poort selecteren in Arduino IDE
  • 21:00 Demonstratie van digitale dobbelsteen
  • 22:15 Arduino-code corrigeren

Afbeeldingen

74HC595 LED Display: Seven-Segment Explained
74HC595 LED Display: Seven Segment explained
ESP32-33_digital-dice-wiring
ESP32-33_digital-dice-wiring
ESP32-33_digital-dice-main
ESP32-33_digital-dice-main
ESP32-33_digital-dice-schematic
ESP32-33_digital-dice-schematic
834-ESP32 Tutorial 33/55- Arduino code for digital dice
Taal: C++
// Define the pins used for the 74hc595 and button
const int STcp = 27;//ST_CP
const int SHcp = 26;//SH_CP 
const int DS = 25; //DS 
const int buttonPin = 13;

// Define an array of values to display numbers on a 7-segment display
int datArray[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
int buttonState = false;

void setup ()
{
  // Set the button pin to input mode
  pinMode(buttonPin,INPUT); 

  //Set pins to 74hc595
  pinMode(STcp,OUTPUT);
  pinMode(SHcp,OUTPUT);
  pinMode(DS,OUTPUT);
}

void loop()
{
  // Check if the button is pressed
  if(digitalRead(buttonPin) == LOW)
  {
    // Generate a random number between 1 and 6
    int diceNumber = random(1, 7);

     // Display the number on the 7-segment display
    show_number(diceNumber);

    // Delay for 50 milliseconds
    delay(50);
  }
}

// Function to display a number on a 7-segment display
void show_number(int num)
{
  // Ground ST_CP and hold low for as long as you are transmitting
  digitalWrite(STcp, LOW);

  // Send the data for the number to the shift register
  shiftOut(DS, SHcp, MSBFIRST, datArray[num]);

  // Pull the ST_CP to save the data
  digitalWrite(STcp, HIGH);
}

Hulpmiddelen en referenties

Bestanden📁

Geen bestanden beschikbaar.