Untitled

 avatar
user_6406267
c_cpp
5 months ago
2.4 kB
4
Indexable
#include <TimerOne.h>

byte D1 = 9;
byte D2 = 10;
byte D3 = 11;
byte D4 = 12;

byte A = 2;
byte B = 3;
byte C = 4;
byte D = 5;
byte E = 6;
byte F = 7;
byte G = 8;

const int potentiometerPin = A0;
// Define the input pins for the 7-segment display segments.
const int segmentPins[] = {A, B, C, D, E, F, G};

// Define the input pins for the 7-segment display digits.
const int digitPins[] = {D1, D2, D3, D4};

const byte digitSegmentsByte[] = {
    0b11111110, // 0
    0b01100000, // 1
    0b11011010, // 2
    0b11110010, // 3
    0b01100110, // 4
    0b10110110, // 5
    0b10111110, // 6
    0b11100000, // 7
    0b11111110, // 8
    0b11110110  // 9
};


// For common cathode
uint8_t digitON = LOW;
uint8_t digitOFF = HIGH;

uint8_t segmentON = HIGH;
uint8_t segmentOFF = LOW;

const int usedDigitsNumber = 4;
volatile int digits[4];
volatile int currentValue = 0;


void setup() {
    Serial.begin(9600);
    randomSeed(analogRead(0));
    splitNumberToDigits(0);
    
    Timer1.initialize(100000);
    Timer1.attachInterrupt(timerISR);

   // Pin initialization
   for (int i = 0; i < 8; i++) {
      pinMode(segmentPins[i], OUTPUT);
   }
   for (int i = 0; i < 4; i++) {
      pinMode(digitPins[i], OUTPUT);
      digitalWrite(digitPins[i], digitOFF);
   }

    pinMode(potentiometerPin, INPUT);
    currentValue = analogRead(potentiometerPin);
}

void loop()
{
  fillDisplay(usedDigitsNumber);
  Serial.println(currentValue);
}

void timerISR() {
    currentValue = analogRead(potentiometerPin); 
    splitNumberToDigits(currentValue);
}

void fillDisplay(int digitsNumber) {

  for(int i = 0; i < digitsNumber; i++) {
    for(int j = 0; j < 7; j++) {
      digitalWrite(segmentPins[j], bitRead(getDigitSegmentsByte(digits[i]), 7 - j) == 1 ? segmentON: segmentOFF);
    }
    digitalWrite(digitPins[i], digitON);
    delay(10);
    digitalWrite(digitPins[i], digitOFF);
  }

}


byte getDigitSegmentsByte(int digit) {
    if (digit >= 0 && digit <= 9) {
        return digitSegmentsByte[digit];
    } else {
        return digitSegmentsByte[0];
    }
}

void splitNumberToDigits(int number) {
    number = abs(number);

    for (int i = 0; i < 4; i++) {
        digits[i] = 0;
    }

    int index = 3;
    while (number > 0 && index >= 0) {
        digits[index--] = number % 10;
        number /= 10;
    }
}


int getRandomNumber() {

  return random(0, 10000);
}
Editor is loading...
Leave a Comment