Skip to content

Instantly share code, notes, and snippets.

@futureshocked
Created August 1, 2019 22:56
Show Gist options
  • Save futureshocked/57b546c4b140b1cff88d09bdc6f2f361 to your computer and use it in GitHub Desktop.
Save futureshocked/57b546c4b140b1cff88d09bdc6f2f361 to your computer and use it in GitHub Desktop.
This sketch implements an electronic dice.
/* 8.40 - Grove - Project 2: Make an electronic dice
This sketch implements an electronic dice.
When you press the momentary button or touch the touch sensor, the electronic dice
will start to "roll", and then display your lucky number on the LCD.
During the roll, the gadget will produce a tone of changin pitch, to add to the
anticipation, and several random numbers will appear in the LCD.
Components
----------
- Grove Base Shield
- An Arduino Uno compatible board (such as Arduino/Genuino Uno or Seeeduino)
- Grove LCD RGB Backlight module
- Grove - momentary button or Grove touch sensor
- Grove - LED buzzer
- Three Grove cables
- Optional: a mounting piece of cardboard with nylon nuts, bolts and spacer.
IDE
---
Arduino IDE
Libraries
---------
- Wire.h (part of the Arduino IDE)
- rgb_lcd.h (Get it from https://github.com/Seeed-Studio/Grove_LCD_RGB_Backlight)
Connections
-----------
- Use a Grove cable to connect the button or touch sensor module to Grove connector D4.
- Use a Grove cable to connect the buzzer module to Grove connector D8.
- Use a Grove cable to connect the LCD module to Grove connector I2C.
Other information
-----------------
_ Use this sketch along side the video lecture 09.40 of Grove For Busy People
- Grove LCD RGB Backlight: https://txplo.re/0c9fb
- Grove momentary button: https://txplo.re/a8cb6
- Grove touch sensor: https://txplo.re/63d60
- Grove buzzer: https://txplo.re/c4221
Github Gist
-----------
For course information, please go to https://techexplorations.com/product/grove-for-busy-people/
Created on July 9 2019 by Peter Dalmaris
*/
#include <Wire.h>
#include "rgb_lcd.h"
#include "pitches.h"
rgb_lcd lcd;
int button = 4; //The button that "throws" the dice. If you prefer,
// you can connect a touch sensor instead of a button.
int buzzer = 8; // buzzer pin
long randomNumber;
String dice_in_words[6] = { "one",
"two",
"three",
"four",
"five",
"six"};
// notes in the melody:
int melody[] = {
NOTE_C4,
NOTE_G3,
NOTE_G3,
NOTE_A3,
NOTE_G3,
0,
NOTE_B3,
NOTE_C4
};
// note durations: 4 = quarter note, 8 = eighth note, etc.:
int noteDurations[] = {
4,
8,
8,
4,
4,
4,
4,
4
};
// make some custom characters:
/*
ONE:
x x x x x
x x x x x
x x x x x
x o o o x
x o o o x
x o o o x
x x x x x
x x x x x
*/
byte one[8] = {
0b00000,
0b00000,
0b00000,
0b01110,
0b01110,
0b00000,
0b00000,
0b00000
};
/*
TWO:
o o x x x
o o x x x
x x x x x
x x x x x
x x x x x
x x x x x
x x x o x
x x x o x
*/
byte two[8] = {
0b11000,
0b11000,
0b00000,
0b00000,
0b00000,
0b00000,
0b00011,
0b00011
};
/*
THREE:
o o x x x
o o x x x
x x x x x
x o o x x
x o o x x
x x x x x
x x x o o
x x x o o
*/
byte three[8] = {
0b11000,
0b11000,
0b00000,
0b01100,
0b01100,
0b00000,
0b00011,
0b00011
};
/*
FOUR:
o o x o o
o o x o o
x x x x x
x x x x x
x x x x x
x x x x x
o o x o o
o o x o o
*/
byte four[8] = {
0b11011,
0b11011,
0b00000,
0b00000,
0b00000,
0b00000,
0b11011,
0b11011
};
/*
FIVE:
o o x o o
o o x o o
x x x x x
x o o x x
x o o x x
x x x x x
o o x o o
o o x o o
*/
byte five[8] = {
0b11011,
0b11011,
0b00000,
0b01100,
0b01100,
0b00000,
0b11011,
0b11011
};
/*
SIX:
o o x o o
o o x o o
x x x x x
o o x o o
o o x o o
x x x x x
o o x o o
o o x o o
*/
byte six[8] = {
0b11011,
0b11011,
0b00000,
0b11011,
0b11011,
0b00000,
0b11011,
0b11011
};
/*
smiley:
x x x x x
x x x x x
x o x o x
x x x x x
x x x x x
o x x x o
x o o o x
x x x x x
*/
byte smiley[8] = {
0b00000,
0b00000,
0b01010,
0b00000,
0b00000,
0b10001,
0b01110,
0b00000
};
void setup()
{
randomSeed(analogRead(0));
lcd.begin(16, 2);
lcd.clear();
// create a new character
lcd.createChar(1, one);
// create a new character
lcd.createChar(2, two);
// create a new character
lcd.createChar(3, three);
// create a new character
lcd.createChar(4, four);
// create a new character
lcd.createChar(5, five);
lcd.createChar(6, six);
lcd.createChar(7, smiley);
lcd.setCursor(0,0);
lcd.write("Press button...");
}
void loop()
{
if (digitalRead(button) == HIGH) //read the button state; if high then roll the dice
{
lcd.setCursor(0,0);
lcd.write("Rolling... ");
lcd.setColor(RED);
for (int i=0; i<20;i++)
{
randomNumber = random(1, 7);
delay(100); // small delay to make dice value visible
Serial.println(randomNumber);
lcd.setCursor(5,1);
lcd.write((unsigned char)randomNumber);
lcd.setCursor(7,1);
lcd.print(randomNumber);
lcd.setCursor(9,1);
lcd.print(" ");
lcd.setCursor(9,1);
lcd.print(dice_in_words[randomNumber-1]);
tone(speaker, 50*i);
}
noTone(speaker);
lcd.setCursor(0,0);
lcd.write("Press button...");
lcd.setCursor(15,0);
lcd.write((unsigned char)7);
play_music();
lcd.setColor(BLUE);
}
}
void play_music()
{
lcd.setColor(GREEN);
for (int thisNote = 0; thisNote < 8; thisNote++) {
// to calculate the note duration, take one second divided by the note type.
//e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.
int noteDuration = 1000 / noteDurations[thisNote];
tone(8, melody[thisNote], noteDuration);
// to distinguish the notes, set a minimum time between them.
// the note's duration + 30% seems to work well:
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
// stop the tone playing:
noTone(8);
}
}
/*************************************************
* Public Constants
*************************************************/
#define NOTE_B0 31
#define NOTE_C1 33
#define NOTE_CS1 35
#define NOTE_D1 37
#define NOTE_DS1 39
#define NOTE_E1 41
#define NOTE_F1 44
#define NOTE_FS1 46
#define NOTE_G1 49
#define NOTE_GS1 52
#define NOTE_A1 55
#define NOTE_AS1 58
#define NOTE_B1 62
#define NOTE_C2 65
#define NOTE_CS2 69
#define NOTE_D2 73
#define NOTE_DS2 78
#define NOTE_E2 82
#define NOTE_F2 87
#define NOTE_FS2 93
#define NOTE_G2 98
#define NOTE_GS2 104
#define NOTE_A2 110
#define NOTE_AS2 117
#define NOTE_B2 123
#define NOTE_C3 131
#define NOTE_CS3 139
#define NOTE_D3 147
#define NOTE_DS3 156
#define NOTE_E3 165
#define NOTE_F3 175
#define NOTE_FS3 185
#define NOTE_G3 196
#define NOTE_GS3 208
#define NOTE_A3 220
#define NOTE_AS3 233
#define NOTE_B3 247
#define NOTE_C4 262
#define NOTE_CS4 277
#define NOTE_D4 294
#define NOTE_DS4 311
#define NOTE_E4 330
#define NOTE_F4 349
#define NOTE_FS4 370
#define NOTE_G4 392
#define NOTE_GS4 415
#define NOTE_A4 440
#define NOTE_AS4 466
#define NOTE_B4 494
#define NOTE_C5 523
#define NOTE_CS5 554
#define NOTE_D5 587
#define NOTE_DS5 622
#define NOTE_E5 659
#define NOTE_F5 698
#define NOTE_FS5 740
#define NOTE_G5 784
#define NOTE_GS5 831
#define NOTE_A5 880
#define NOTE_AS5 932
#define NOTE_B5 988
#define NOTE_C6 1047
#define NOTE_CS6 1109
#define NOTE_D6 1175
#define NOTE_DS6 1245
#define NOTE_E6 1319
#define NOTE_F6 1397
#define NOTE_FS6 1480
#define NOTE_G6 1568
#define NOTE_GS6 1661
#define NOTE_A6 1760
#define NOTE_AS6 1865
#define NOTE_B6 1976
#define NOTE_C7 2093
#define NOTE_CS7 2217
#define NOTE_D7 2349
#define NOTE_DS7 2489
#define NOTE_E7 2637
#define NOTE_F7 2794
#define NOTE_FS7 2960
#define NOTE_G7 3136
#define NOTE_GS7 3322
#define NOTE_A7 3520
#define NOTE_AS7 3729
#define NOTE_B7 3951
#define NOTE_C8 4186
#define NOTE_CS8 4435
#define NOTE_D8 4699
#define NOTE_DS8 4978
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment