当前位置:网站首页>Arduino tutorial - Simon games
Arduino tutorial - Simon games
2022-07-06 06:53:00 【Wonderful drifting of coal】
Simon game Simon Game
《 Simon game 》 Is a puzzle leisure games , The rules of the game are , Let players remember the lighting sequence of lights of different colors , Click on the lights in turn , If the order is the same as AI The order of giving is the same , Then the game continues and increases the difficulty , Otherwise the game is over , Reset game .
On-line arduino Simon game
Code
/** Simon Game for ATTiny85 Copyright (C) 2018, Uri Shaked Licensed under the MIT License. */
#include <avr/sleep.h>
#include <avr/interrupt.h>
#include "pitches.h"
/* Constants - define pin numbers for leds, buttons and speaker, and also the game tones */
byte buttonPins[] = {
1, 2, 3, 4};
#define SPEAKER_PIN 0
#define MAX_GAME_LENGTH 100
int gameTones[] = {
NOTE_G3, NOTE_C4, NOTE_E4, NOTE_G5};
/* Global variales - store the game state */
byte gameSequence[MAX_GAME_LENGTH] = {
0};
byte gameIndex = 0;
/** Set up the GPIO pins */
void setup() {
// The following line primes the random number generator. It assumes pin A0 is floating (disconnected)
randomSeed(analogRead(1));
// Disable ADC - saves about 324.5uA in sleep mode!
ADCSRA = 0;
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
for (int i = 0; i < 4; i++) {
pinMode(buttonPins[i], INPUT_PULLUP);
}
pinMode(SPEAKER_PIN, INPUT);
}
ISR(PCINT0_vect) {
GIMSK &= ~0b00100000; // Turn off pin change interrupts
sleep_disable();
}
void sleep() {
sleep_enable();
noInterrupts();
GIMSK |= 0b00100000; // Turn on pin change interrupts
for (byte i = 0; i < 4; i++) {
PCMSK |= 1 << buttonPins[i];
}
interrupts();
sleep_cpu();
}
// The sound-producing function
void beep (unsigned char speakerPin, int frequencyInHertz, long timeInMilliseconds)
{
// http://web.media.mit.edu/~leah/LilyPad/07_sound_code.html
int x;
long delayAmount = (long)(1000000 / frequencyInHertz);
long loopTime = (long)((timeInMilliseconds * 1000) / (delayAmount * 2));
pinMode(speakerPin, OUTPUT);
for (x = 0; x < loopTime; x++) {
digitalWrite(speakerPin, HIGH);
delayMicroseconds(delayAmount);
digitalWrite(speakerPin, LOW);
delayMicroseconds(delayAmount);
}
pinMode(speakerPin, INPUT);
}
/** Lights the given led and plays the suitable tone */
void lightLedAndPlaySound(byte ledIndex) {
pinMode(buttonPins[ledIndex], OUTPUT);
digitalWrite(buttonPins[ledIndex], LOW);
beep(SPEAKER_PIN, gameTones[ledIndex], 300);
pinMode(buttonPins[ledIndex], INPUT_PULLUP);
}
/** Plays the current sequence of notes that the user has to repeat */
void playSequence() {
for (int i = 0; i < gameIndex; i++) {
byte currentLed = gameSequence[i];
lightLedAndPlaySound(currentLed);
delay(50);
}
}
/** Waits until the user pressed one of the buttons, and returns the index of that button */
byte readButton() {
for (;;) {
for (int i = 0; i < 4; i++) {
byte buttonPin = buttonPins[i];
if (digitalRead(buttonPin) == LOW) {
return i;
}
}
sleep();
}
}
/** Plays the tone associated with a specific button + debouncing mechanism */
void playButtonTone(byte buttonIndex) {
beep(SPEAKER_PIN, gameTones[buttonIndex], 150);
// Wait until button is released.
while (digitalRead(buttonPins[buttonIndex]) == LOW);
delay(50);
}
/** Play the game over sequence, and report the game score */
void gameOver() {
gameIndex = 0;
delay(200);
// Play a Wah-Wah-Wah-Wah sound
beep(SPEAKER_PIN, NOTE_DS5, 300);
beep(SPEAKER_PIN, NOTE_D5, 300);
beep(SPEAKER_PIN, NOTE_CS5, 300);
for (int i = 0; i < 200; i++) {
beep(SPEAKER_PIN, NOTE_C5 + (i % 20 - 10), 5);
}
delay(500);
}
/** Get the user input and compare it with the expected sequence. If the user fails, play the game over sequence and restart the game. */
void checkUserSequence() {
for (int i = 0; i < gameIndex; i++) {
byte expectedButton = gameSequence[i];
byte actualButton = readButton();
playButtonTone(actualButton);
if (expectedButton == actualButton) {
/* good */
} else {
gameOver();
return;
}
}
}
/** Plays an hooray sound whenever the user finishes a level */
void levelUp() {
beep(SPEAKER_PIN, NOTE_E4, 150);
beep(SPEAKER_PIN, NOTE_G4, 150);
beep(SPEAKER_PIN, NOTE_E5, 150);
beep(SPEAKER_PIN, NOTE_C5, 150);
beep(SPEAKER_PIN, NOTE_D5, 150);
beep(SPEAKER_PIN, NOTE_G5, 150);
}
/** The main game loop */
void loop() {
// Add a random color to the end of the sequence
gameSequence[gameIndex] = random(0, 4);
gameIndex++;
playSequence();
checkUserSequence();
delay(300);
if (gameIndex > 0) {
levelUp();
delay(300);
}
}
边栏推荐
- Attributeerror: can 't get attribute' sppf 'on < module' models. Common 'from' / home / yolov5 / Models / comm
- 中青看点阅读新闻
- 【Hot100】739. 每日温度
- Delete external table source data
- The difference between get and post request types
- AttributeError: Can‘t get attribute ‘SPPF‘ on <module ‘models.common‘ from ‘/home/yolov5/models/comm
- Call, apply, bind rewrite, easy to understand with comments
- 【Hot100】739. 每日溫度
- 从autojs到冰狐智能辅助的心里历程
- Day 248/300 关于毕业生如何找工作的思考
猜你喜欢
UWA Pipeline 2.2.1 版本更新说明
Fedora/rehl installation semanage
The ECU of 21 Audi q5l 45tfsi brushes is upgraded to master special adjustment, and the horsepower is safely and stably increased to 305 horsepower
我的创作纪念日
How to convert flv file to MP4 file? A simple solution
C语言_双创建、前插,尾插,遍历,删除
Prefix and array series
kubernetes集群搭建Zabbix监控平台
Brief introduction to the curriculum differences of colleges and universities at different levels of machine human major -ros1/ros2-
What are the commonly used English words and sentences about COVID-19?
随机推荐
Facebook AI & Oxford proposed a video transformer with "track attention" to perform SOTA in video action recognition tasks
Data security -- 13 -- data security lifecycle management
详解SQL中Groupings Sets 语句的功能和底层实现逻辑
Prefix and array series
Bitcoinwin (BCW): 借贷平台Celsius隐瞒亏损3.5万枚ETH 或资不抵债
CS certificate fingerprint modification
E-book CHM online CS
Is it difficult for girls to learn software testing? The threshold for entry is low, and learning is relatively simple
[brush questions] how can we correctly meet the interview?
SSO流程分析
Redis Foundation
AttributeError: Can‘t get attribute ‘SPPF‘ on <module ‘models.common‘ from ‘/home/yolov5/models/comm
机器人类专业不同层次院校课程差异性简述-ROS1/ROS2-
Pallet management in SAP SD delivery process
Briefly describe the differences between indexes, primary keys, unique indexes, and joint indexes in mysql, and how they affect the performance of the database (in terms of reading and writing)
Day 248/300 关于毕业生如何找工作的思考
【服务器数据恢复】IBM服务器raid5两块硬盘离线数据恢复案例
Day 239/300 注册密码长度为8~14个字母数字以及标点符号至少包含2种校验
L'Ia dans les nuages rend la recherche géoscientifique plus facile
At the age of 26, I changed my career from finance to software testing. After four years of precipitation, I have been a 25K Test Development Engineer