// ESP32 7-segment 0-9 sayıcı (Ortak Anot)
// Pin atamalarını kendi devrenize göre değiştirebilirsiniz.
const int segPins[7] = {21, 19, 18, 5, 17, 16, 4}; // a, b, c, d, e, f, g
const int dpPin = 2; // nokta (kullanmazsanız boş bırakın)
const int buttonPin = 15; // isteğe bağlı buton, dahili pullup kullanılıyor
// digit bit order: bit0=a, bit1=b, bit2=c, bit3=d, bit4=e, bit5=f, bit6=g
const uint8_t digits[10] = {
0x3F, // 0 -> 0b00111111 (a b c d e f)
0x06, // 1 -> 0b00000110 (b c)
0x5B, // 2 -> a b d e g
0x4F, // 3 -> a b c d g
0x66, // 4 -> b c f g
0x6D, // 5 -> a c d f g e? (standart)
0x7D, // 6
0x07, // 7 -> a b c
0x7F, // 8 -> tüm segmentler
0x6F // 9
};
int current = 0;
unsigned long lastAutoMillis = 0;
const unsigned long autoInterval = 1000; // 1 saniyede bir otomatik artış
// buton debouncing
unsigned long lastBtnMillis = 0;
const unsigned long btnDebounce = 50;
int lastButtonState = HIGH; // pullup olduğundan normal HIGH
int buttonState = HIGH;
void setup() {
// segment pinleri çıkış
for (int i = 0; i < 7; ++i) {
pinMode(segPins[i], OUTPUT);
digitalWrite(segPins[i], HIGH); // ortak anotta başlangıç: kapalı (HIGH)
}
pinMode(dpPin, OUTPUT);
digitalWrite(dpPin, HIGH); // dp kapalı
// buton giriş, dahili pullup
pinMode(buttonPin, INPUT_PULLUP);
// başlangıç gösterimi
showDigit(current);
}
void loop() {
unsigned long now = millis();
// otomatik sayaç
if (now - lastAutoMillis >= autoInterval) {
lastAutoMillis = now;
current++;
if (current > 9) current = 0;
showDigit(current);
}
// butonla ilerleme (isteğe bağlı, pullup ile aktif düşük)
int raw = digitalRead(buttonPin);
if (raw != lastButtonState) {
lastBtnMillis = now;
}
if (now - lastBtnMillis > btnDebounce) {
if (raw != buttonState) {
buttonState = raw;
if (buttonState == LOW) { // butona basıldı
current++;
if (current > 9) current = 0;
showDigit(current);
// butonla arttırınca otomatik sayaç zamanlamasını sıfırlamak isterseniz:
lastAutoMillis = now;
}
}
}
lastButtonState = raw;
}
void showDigit(int d) {
if (d < 0 || d > 9) return;
uint8_t pattern = digits[d];
for (int i = 0; i < 7; ++i) {
bool segmentOn = pattern & (1 << i);
// Ortak anotta: segment açık -> LOW, kapalı -> HIGH
digitalWrite(segPins[i], segmentOn ? LOW : HIGH);
}
// DP kapalı
digitalWrite(dpPin, HIGH);
}