// Объявляем переменные:
// номер порта, на который выводятся биты, соединяется с SI входом
int dataPin = 9;
int clockPin = 11; // к выводу 11 регистра SCK
int latchPin = 12; // к выводу 12 регистра RCK
#define MOTOR_STEP 3
#define START_BOTTOM 2
#define POTENTIAL 0
byte dot_byte = 0b10000000;
bool flag = false;
// Для высвечивания номера данные переменные записываются в виде байта
const byte NumbersToSegments[11] = {
0b11000000, // 0
0b11111001, // 1
0b10100100, // 2
0b10110000, // 3
0b10011001, // 4
0b10010010, // 5
0b10000010, // 6
0b11111000, // 7
0b10000000, // 8
0b10010000, // 9
0b11111111 // Пустой (нет символа)
};
int Numbers = 5; // Переменная выбора номера
void setup()
{
Serial.begin(9600);
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(MOTOR_STEP, OUTPUT);
pinMode(START_BOTTOM, INPUT);
}
void loop()
{
start();
if(flag){
float val = mapFloat(analogRead(POTENTIAL), 0.0, 1023.0, 0.0, 10.0);
if(val >= 9.9) flag = false;
motor_speed(val);
int before_dot = val;
int afrter_dot = (val - before_dot)*10;
byte data[] = {NumbersToSegments[before_dot]-dot_byte, NumbersToSegments[afrter_dot]}; // Формируем массив
sendData(data); // Передаём массив и его размер
}
}
float mapFloat(float x, float in_min, float in_max, float out_min, float out_max) {
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
void sendData(byte *arr) {
digitalWrite(latchPin, LOW);
for (size_t i = 0; i < sizeof(arr); i++) {
shiftOut(dataPin, clockPin, LSBFIRST, arr[i]);
}
digitalWrite(latchPin, HIGH);
}
void start(){
if(digitalRead(START_BOTTOM)) {flag = true;
} else if(!flag){
byte data[] = {NumbersToSegments[0]-dot_byte, NumbersToSegments[0]};
sendData(data);
}
}
void motor_speed(float rps) {
int delay_time = 1000000 / (rps * 200*2); // Рассчитываем задержку в микросекундах
if(rps){
digitalWrite(MOTOR_STEP, HIGH);
delayMicroseconds(delay_time);
digitalWrite(MOTOR_STEP, LOW);
delayMicroseconds(delay_time);
}
}