Простой Arduino-счетчик на 7-сегментном индикаторе

Это простой проект на Arduino, заключающийся в создании счетчика на обычном 7-сегментном индикаторе с общим катодом. Код, приведенный ниже, позволяет при нажатии кнопки запускать счет от 0 до 9.

https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/digitrode/106-prostoy-arduino-schetchik-na-7-segmentnom-indikatore/images/prostoy-arduino-schetchik-na-7-segmentnom-indikatore-1.png

Вся схема может быть запитана от стандартной 9-вольтовой батарейки или от любого Arduino-совместимого блока питания.

https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/digitrode/106-prostoy-arduino-schetchik-na-7-segmentnom-indikatore/images/prostoy-arduino-schetchik-na-7-segmentnom-indikatore-2.png

7-сегментный индикатор – очень простое устройство. Он представляет собой комбинацию 8 светодиодов (восьмой светодиод отвечает за точку) с общим катодом, которые можно включать в определенной последовательности так, чтобы они образовывали цифры. Следует обратить внимание, что в данном случае выводы 3 и 8 отведены под катод.

https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/digitrode/106-prostoy-arduino-schetchik-na-7-segmentnom-indikatore/images/prostoy-arduino-schetchik-na-7-segmentnom-indikatore-3.png

Ниже показана таблица соответствия выводов Arduino и выводов индикатора.

https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/digitrode/106-prostoy-arduino-schetchik-na-7-segmentnom-indikatore/images/prostoy-arduino-schetchik-na-7-segmentnom-indikatore-4.jpg

Код этого проекта:

/*
Arduino-счетчик на 7-сегментном индикаторе с общим катодом
Выводы Arduino: 2,3,4,5,6,7,8
Выводы индикатора: 7,6,4,2,1,9,10
Выводы индикатора 3 и 8 должны быть соединены с землей
Кнопка на вывод 9
*/
byte numbers[10] = {
                    B11111100, B01100000, B11011010, B11110010, B01100110,
                    B10110110, B10111110, B11100000, B11111110, B11100110
                    };
void setup() {
    for(int i = 2; i <= 8; i++) {
        pinMode(i, OUTPUT);
    }
    pinMode(9, INPUT);
}

int counter = 0;
bool go_by_switch = true;
int last_input_value = LOW;

void loop() {
    if(go_by_switch) {
        int switch_input_value = digitalRead(9);
        if(last_input_value == LOW && switch_input_value == HIGH) {
            counter = (counter + 1) % 10;
        }
        last_input_value = switch_input_value;
    } else {
        delay(500);
        counter = (counter + 1) % 10;
    }
    writeNumber(counter);
}

void writeNumber(int number) {
    if(number < 0 || number > 9) {
        return;
    }
    byte mask = numbers[number];
    byte currentPinMask = B10000000;
    for(int i = 2; i <= 8; i++) {
        if(mask & currentPinMask) digitalWrite(i,HIGH);
        else digitalWrite(i,LOW);
    currentPinMask = currentPinMask >> 1;
    }
}