Trochę zagmatwany ...
Kod:
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include <Stepper.h>
#define STEPS_PER_MOTOR_REVOLUTION 600
#define STEPS_PER_OUTPUT_REVOLUTION 7000
boolean backlight = false;
int contrast=1;
int frame = 1;
int frames = 12;
int menuitem = 1;
int page = 1;
Stepper small_stepper(STEPS_PER_MOTOR_REVOLUTION, 8, 10, 9, 11);
int Steps2Take;
const byte logo[] PROGMEM = {84,48,
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011100,B00000000,B00000000,B00000000,B00000000,
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B00000000,B00000000,B00000000,B00000000,
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01100011,B00000000,B00000000,B00000000,B00000000,
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01100011,B00000000,B00000000,B00000000,B00000000,
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01100011,B00000000,B00000000,B00000000,B00000000,
B00000011,B11111000,B00000011,B11111100,B00000011,B11111100,B01110111,B00000000,B00000000,B00000000,B00000000,
B00001111,B11111110,B00000111,B11111110,B00000111,B11111110,B00111110,B00000000,B00000000,B00000000,B00000000,
B00001111,B11111111,B00001111,B11111111,B00001111,B11111111,B00001000,B00000000,B00000000,B00000000,B00000000,
B00011111,B00011111,B00001111,B00001111,B00001111,B10011111,B00000000,B00000000,B00000000,B00000000,B00000000,
B00011110,B00011111,B00011111,B00001111,B10011111,B00001111,B10000000,B00000000,B00000000,B00000000,B00000000,
B10000000,B00011111,B00011111,B00000000,B00011111,B00001111,B10011100,B00000000,B00000000,B00000000,B00000011,
B10000000,B00011110,B00011110,B01111000,B00011111,B00001111,B10011111,B00000000,B00000000,B00000000,B00011111,
B10000000,B11111100,B00011111,B11111110,B00011111,B00001111,B10011111,B11100000,B00000000,B00000000,B01111111,
B10000000,B11111110,B00011111,B11111111,B00011111,B00001111,B10011111,B11111000,B00000000,B00000001,B11111111,
B10000000,B01111111,B00011111,B00001111,B10011111,B00001111,B10011111,B11111100,B00000000,B00000111,B11111111,
B00000000,B00001111,B00011111,B00001111,B10011111,B00001111,B10011111,B11111111,B00000000,B00001111,B11111111,
B00000000,B00001111,B10011110,B00001111,B10011111,B00001111,B10000111,B11111111,B10000000,B00011111,B11111110,
B00011110,B00001111,B10011111,B00001111,B10011111,B00001111,B10000111,B11111111,B10000000,B00111111,B11111100,
B00011111,B00111111,B00001111,B10011111,B00001111,B10011111,B00000011,B11111111,B11000000,B01111111,B11111000,
B00011111,B11111111,B00001111,B11111111,B00001111,B11111111,B00000011,B11111111,B11000000,B01111111,B11111000,
B00001111,B11111110,B00000111,B11111110,B00000111,B11111110,B00000011,B11111111,B11100000,B01111111,B11111000,
B00000011,B11111000,B00000001,B11111000,B00000001,B11111000,B00000011,B11111111,B11100000,B01111111,B11111000,
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011,B11111111,B11000000,B01111111,B11111100,
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11111111,B11000000,B01111111,B11111110,
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11111111,B10000000,B00111111,B11111111,
B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B10000000,B00011111,B11111111,
B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111,B11111111,B00000000,B00001111,B11111111,
B11111100,B00000000,B11000000,B00000000,B00000000,B00000111,B11111111,B11111110,B00000000,B00000111,B11111111,
B11111111,B11000000,B11111000,B00000000,B00000000,B01111111,B11111111,B11111000,B00000000,B00000011,B11111111,
B11111111,B11111110,B11111111,B10000000,B00011111,B11111111,B11111111,B11100000,B00000000,B00000000,B11111111,
B11111111,B11111111,B11111111,B11110000,B00111111,B11111111,B11111111,B10000000,B00000000,B00000000,B00111111,
B11111111,B11111111,B11111111,B11111111,B00000000,B11111111,B11111110,B00000000,B00000000,B00000000,B00000111,
B11111111,B11111111,B11111111,B11111111,B11100000,B11111111,B11110000,B00000000,B00000000,B00000000,B00000000,
B00001111,B11111111,B11111111,B11111111,B11000011,B11111111,B00000000,B00000000,B00000000,B00000000,B00000000,
B00000000,B01111111,B11111111,B11111100,B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,
B00000000,B00000000,B11111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
B00000000,B00000000,B11111100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
B00000000,B00000000,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
B00111100,B00111000,B01111100,B01111100,B00111000,B01111000,B00000000,B00000000,B00000000,B00000000,B00000000,
B01000000,B01000100,B01000000,B00010000,B01000100,B01000100,B00000000,B00000000,B00000000,B00000000,B00000000,
B00111000,B01000100,B01110000,B00010000,B01000100,B01000100,B00000000,B00000000,B00000000,B00000000,B00000000,
B00000100,B01000100,B01000000,B00010000,B01111100,B01111000,B00000000,B00000000,B00000000,B00000000,B00000000,
B01000100,B01000100,B01000000,B00010000,B01000100,B01010000,B00000000,B00000000,B00000000,B00000000,B00000000,
B00111000,B00111000,B01000000,B00010000,B01000100,B01001100,B00000000,B00000000,B00000000,B00000000,B00000000,
};
volatile boolean up = false;
volatile boolean down = false;
volatile boolean middle = false;
volatile boolean run = false;
int speakerPin = A0;
int length = 50; // the number of notes
char notes[] = "cccde e defg ccc ggg eee ccc g fe dc "; // a space represents a rest
int beats[] = { 2,2,2,1,2,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 };
int tempo = 100;
int downButtonState = 0;
int upButtonState = 0;
int selectButtonState = 0;
int runButtonState = 0;
int lastDownButtonState = 0;
int lastSelectButtonState = 0;
int lastUpButtonState = 0;
int lastRunButtonState = 0;
Adafruit_PCD8544 display = Adafruit_PCD8544( 6, 5, 4);
//////////// VOID SETUP ////////////
void setup() {
pinMode(speakerPin, OUTPUT);
pinMode(3, INPUT_PULLUP);
pinMode(2, INPUT_PULLUP);
pinMode(1, INPUT_PULLUP);
pinMode(0, INPUT_PULLUP);
pinMode(7,OUTPUT);
digitalWrite(7,HIGH); //Turn Backlight ON
Serial.begin(9600);
display.begin();
display.setContrast(contrast); //Set contrast to 1
display.clearDisplay();
display.drawBitmap(0, -1, logo, 84, 48, 1);
display.display();
music();
delay(1000);
}
//////////// MAIN LOOP ////////////
void loop() {
drawMenu();
runButtonState = digitalRead(3);
downButtonState = digitalRead(2);
selectButtonState = digitalRead(1);
upButtonState = digitalRead(0);
checkIfRunButtonIsPressed();
checkIfDownButtonIsPressed();
checkIfUpButtonIsPressed();
checkIfSelectButtonIsPressed();
if (up && page == 1 ) {
up = false;
menuitem--;
if (menuitem==0)
{
menuitem=4;
}
}
else if (up && page == 2 ) {
up = false;
if(contrast <=1){
contrast = 1;
}else{
contrast--;
setContrast();
}
}
if (down && page == 1) {
down = false;
menuitem++;
if (menuitem==5)
{
menuitem=1;
}
}else if (down && page == 2 ) {
down = false;
contrast++;
setContrast();
}
if (middle) {
middle = false;
if (page == 1 && menuitem==2)
{
if (backlight)
{
backlight = false;
turnBacklightOff();
}
else
{
backlight = true;
turnBacklightOn();
}
}
if(page == 1 && menuitem ==3)
{
resetDefaults();
}
else if (page == 1 && menuitem==1) {
page=2;
}
else if (page == 2) {
page=1;
}
if(page == 1 && menuitem ==4)
{
display.clearDisplay();
display.setTextColor(BLACK, WHITE);
display.setTextSize(1);
display.setCursor(0, 4);
display.print("Centering");
display.setTextSize(3);
display.setCursor(4, 15);
display.print("Wait");
display.drawCircle(display.width()/2, display.height()/2, 8, BLACK);
delay(300);display.display();
display.drawCircle(display.width()/2, display.height()/2, 12, BLACK);
delay(300);display.display();
display.drawCircle(display.width()/2, display.height()/2, 16, BLACK);
delay(300);display.display();
display.drawCircle(display.width()/2, display.height()/2, 20, BLACK);
delay(300);display.display();
display.drawCircle(display.width()/2, display.height()/2, 24, BLACK);
delay(300);display.display();
Steps2Take = STEPS_PER_OUTPUT_REVOLUTION;
small_stepper.setSpeed(37);
small_stepper.step(Steps2Take);
display.drawCircle(display.width()/2, display.height()/2, 8, WHITE);
delay(300);display.display();
display.drawCircle(display.width()/2, display.height()/2, 12, WHITE);
delay(300);display.display();
display.drawCircle(display.width()/2, display.height()/2, 16, WHITE);
delay(300);display.display();
display.drawCircle(display.width()/2, display.height()/2, 20, WHITE);
delay(300);display.display();
display.drawCircle(display.width()/2, display.height()/2, 24, WHITE);
delay(300);display.display();
music();
delay(1000);
}
}
}
//////////// FUNCTIONS ////////////
void runProgram(int prog = contrast)
{
frames = prog * 12;
display.setTextSize(1);
display.clearDisplay();
display.setTextColor(BLACK, WHITE);
display.setCursor(0, 0);
display.print("Program: ");
display.print(prog);
display.drawFastHLine(0,8,83,BLACK);
display.setCursor(0, 12);
display.print("frame");
display.setTextColor(BLACK, WHITE);
display.setTextSize(1);
display.setCursor(35, 40);
display.print(" RUNNING ");
for(int i=1; i <= frames; i++){
display.setTextSize(3);
display.setCursor(0, 22);
display.print(i);
display.setTextSize(1);
display.print("/");
display.print(frames);
display.display();
Steps2Take = STEPS_PER_OUTPUT_REVOLUTION / frames;
small_stepper.setSpeed(75);
small_stepper.step(Steps2Take);
delay(1000);
if(i>=frames){
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 4);
display.print("WELL");
display.setTextSize(3);
display.setCursor(4, 15);
display.print("DONE");
display.display();
music();
delay(1000);
}
}
delay(2000);
}
void checkIfRunButtonIsPressed()
{
if (runButtonState != lastRunButtonState)
{
if (runButtonState == 0)
{
run=true;
runProgram(contrast);
}
delay(50);
}
lastRunButtonState = runButtonState;
}
void checkIfDownButtonIsPressed()
{
if (downButtonState != lastDownButtonState)
{
if (downButtonState == 0)
{
down=true;
}
delay(50);
}
lastDownButtonState = downButtonState;
}
void checkIfUpButtonIsPressed()
{
if (upButtonState != lastUpButtonState)
{
if (upButtonState == 0) {
up=true;
}
delay(50);
}
lastUpButtonState = upButtonState;
}
void checkIfSelectButtonIsPressed()
{
if (selectButtonState != lastSelectButtonState)
{
if (selectButtonState == 0) {
middle=true;
}
delay(50);
}
lastSelectButtonState = selectButtonState;
}
void drawMenu()
{
if (page==1)
{
display.setTextSize(1);
display.clearDisplay();
display.setTextColor(BLACK, WHITE);
display.setCursor(15, 0);
display.print("MAIN MENU");
display.drawFastHLine(0,8,83,BLACK);
display.setCursor(0, 10);
if (menuitem==1)
{
display.setTextColor(WHITE, BLACK);
}
else
{
display.setTextColor(BLACK, WHITE);
}
display.print(">Program");
display.setCursor(0, 20);
if (menuitem==2)
{
display.setTextColor(WHITE, BLACK);
}
else
{
display.setTextColor(BLACK, WHITE);
}
display.print(">Backlight: ");
if (backlight)
{
display.print("ON");
}
else
{
display.print("OFF");
}
display.display();
if (menuitem==3)
{
display.setTextColor(WHITE, BLACK);
}
else
{
display.setTextColor(BLACK, WHITE);
}
display.setCursor(0, 30);
display.print(">Reset");
display.display();
if (menuitem==4)
{
display.setTextColor(WHITE, BLACK);
}
else
{
display.setTextColor(BLACK, WHITE);
}
display.setCursor(0, 40);
display.print(">Centering");
display.display();
}
else if (page==2)
{
display.setTextSize(1);
display.clearDisplay();
display.setTextColor(BLACK, WHITE);
display.setCursor(0, 0);
display.print("SELECT program");
display.drawFastHLine(0,10,83,BLACK);
display.setCursor(5, 15);
display.print("program");
display.setTextSize(3);
display.setCursor(5, 25);
display.print(contrast);
display.setTextColor(WHITE, BLACK);
display.setTextSize(1);
display.setCursor(54, 40);
display.print(" RUN ");
display.display();
}
}
void resetDefaults()
{
contrast = 1;
setContrast();
backlight = true;
turnBacklightOn();
}
void setContrast()
{
display.setContrast(contrast);
display.display();
}
void turnBacklightOn()
{
digitalWrite(7,HIGH);
}
void turnBacklightOff()
{
digitalWrite(7,LOW);
}
////////////////////////////////////////////////////
void playTone(int tone, int duration)
{
for (long i = 0; i < duration * 1000L; i += tone * 2)
{
digitalWrite(speakerPin, HIGH);
delayMicroseconds(tone);
digitalWrite(speakerPin, LOW);
delayMicroseconds(tone);
}
}
////////////////////////////////////////////////////
void playNote(char note, int duration)
{
char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' };
int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956 }; // play the tone corresponding to the note name
for (int i = 0; i < 8; i++)
{
if (names[i] == note)
{
playTone(tones[i], duration);
}
}
}
void music(){
for (int i = 0; i < length; i++)
{
if (notes[i] == ' ')
{
delay(beats[i] * tempo); // rest
}
else
{
playNote(notes[i], beats[i] * tempo);
} // pause between notes
delay(tempo / 2);
}
}