//https://wokwi.com/projects/400147899883498497
//https://github.com/cemdenizdemir/boxing-machine
#include <LiquidCrystal.h>
#include "HX711.h"
HX711 scale1, scale2, scale3;
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
String header = "Box Makinesi";
int lampPin = 0;
int speedPin = A0;
int bellPin = 15;
int speed = 0;
int weight = 0;
int speedPinValue = 0;
int record = 800;
long int lampPrevMillis = 0;
long int lampInterval = 500;
unsigned long musicPrevMillis = 0;
int sequenceState = 0;
const int intervals[] = { 0, 1000, 400, 400, 1000, 400, 400, 1000, 400, 400, 1000, 1000 };
const int numberOfIntervals = sizeof(intervals) / sizeof(intervals[0]);
void setup() {
lcd.begin(20, 4);
pinMode(lampPin, OUTPUT);
scale1.begin(A1, A2);
scale2.begin(51, 53);
scale3.begin(20, 21);
}
void loop() {
speedPinValue = analogRead(speedPin);
speed = map(speedPinValue, 0, 1023, 0, 100);
weight = getWeight();
printScreen(speed, weight);
setLamp();
playMusic();
}
int getWeight() {
long w1 = scale1.read();
long w2 = scale2.read();
long w3 = scale3.read();
return (w1 + w2 + w3) / 420;
}
int setScore() {
int score = speed * weight / 3 - 1;
if(score < 0 ) { score = 0; }
if(score > 999 ) { score = 999; }
if(score > record) {record = score; }
return score;
}
void setLamp() {
long int currentMillis = millis();
if (currentMillis - lampPrevMillis > lampInterval) {
lampPrevMillis = currentMillis;
digitalWrite(lampPin, !digitalRead(lampPin));
}
}
void printScreen(int speed, int weight) {
// lcd.clear();
lcd.setCursor(0,0);
lcd.print(header);
lcd.setCursor(0, 1);
lcd.print("Hiz: ");
lcd.print(speed);
lcd.print(" km/h ");
lcd.setCursor(0, 2);
lcd.print("Kilo: ");
lcd.print(weight);
lcd.print(" kg ");
if(digitalRead(14) == LOW) {
lcd.setCursor(0, 3);
lcd.print("Puan: ");
lcd.print(setScore());
}
lcd.setCursor(10, 3);
lcd.print("Rekor: ");
lcd.print(record);
}
void playMusic() {
//https://forum.arduino.cc/t/piezo-buzzer-eye-of-the-tiger-intro/210011
unsigned long currentMillis = millis();
if (currentMillis - musicPrevMillis >= intervals[sequenceState]) {
musicPrevMillis = currentMillis;
switch (sequenceState) {
case 0:
tone(bellPin, 988, 250);
break;
case 1:
tone(bellPin, 988, 250);
break;
case 2:
tone(bellPin, 880, 250);
break;
case 3:
tone(bellPin, 988, 250);
break;
case 4:
tone(bellPin, 988, 250);
break;
case 5:
tone(bellPin, 880, 250);
break;
case 6:
tone(bellPin, 988, 250);
break;
case 7:
tone(bellPin, 988, 250);
break;
case 8:
tone(bellPin, 880, 250);
break;
case 9:
tone(bellPin, 784, 1000);
break;
case 10:
tone(bellPin, 880, 1000);
break;
}
sequenceState++;
if (sequenceState == numberOfIntervals) {
sequenceState = 0;
}
}
}