/*
USB Test Cihazı - ATtiny85
Pin Bağlantıları:
- PB0: Buzzer çıkışı
- PB5 (ADC0): USB 5V ölçümü (gerilim bölücü ile)
- PB3 (ADC3): USB D+ hattı analog okuma
- PB4 (ADC2): USB D- hattı analog okuma
Gerilim Bölücü (PB5 için):
USB 5V --- [10kΩ] --- PB5 --- [6.8kΩ] --- GND
5V → ~2V (ADC için güvenli)
*/
const int BUZZER_PIN = 0; // PB0
const int LED_PIN = 1; // PB1
const int USB_5V_PIN = 0; // PB5 = ADC0
const int USB_D_PLUS = 3; // PB3 = ADC3
const int USB_D_MINUS = 2; // PB4 = ADC2
// Eşik değerleri
const int VOLTAGE_THRESHOLD = 195; // 4.8V için ADC değeri (255 * 4.8/5 ≈ 245)
const int D_PLUS_LOW_LIMIT = 50; // D+ kısa devre eşiği
const int D_PLUS_HIGH_LIMIT = 200; // D+ normal minimum
const int D_MINUS_HIGH_LIMIT = 200; // D- anormal maximum
const int D_MINUS_LOW_LIMIT = 50; // D- normal maximum
const int LINE_DIFF_THRESHOLD = 30; // D+ ve D- fark eşiği
void setup() {
pinMode(BUZZER_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);
digitalWrite(BUZZER_PIN, LOW);
digitalWrite(LED_PIN, LOW);
delay(2000); // Başlangıç beklemesi
// Test sırasını başlat
runUSBTest();
}
// ATtiny85'te tone() fonksiyonu yoksa manuel buzzer kontrolü
void tone(int pin, int frequency, int duration) {
long period = 1000000L / frequency;
long half_period = period / 2;
long cycles = ((long)frequency * duration) / 1000;
for (long i = 0; i < cycles; i++) {
digitalWrite(pin, HIGH);
delayMicroseconds(half_period);
digitalWrite(pin, LOW);
delayMicroseconds(half_period);
}
}
void loop() {
// Sürekli veri transferi kontrolü
monitorUSBDataTransfer();
}
void runUSBTest() {
// 1. ADIM: USB 5V Testi
if (!check5VPower()) {
// 4.8V altında - sürekli bip
continuousBeep();
return; // Test durur
} else {
// 4.8V üzeri - tek bip
singleBeep();
delay(500);
}
// 2. ADIM: USB Data Hatları Kısa Devre Testi
if (checkDataLineShort()) {
// Kısa devre var - bip bip bip
shortCircuitAlarm();
return; // Test durur
}
// 3. ADIM: Her şey tamam - başarı melodisi
successMelody();
// 4. ADIM: LED'i aç ve sürekli veri transferi moduna geç
digitalWrite(LED_PIN, HIGH);
delay(1000); // 1 saniye sabit yanar (hazır olduğunu gösterir)
}
bool check5VPower() {
int voltage_reading = analogRead(USB_5V_PIN);
// Gerilim bölücü: 5V → ~2V (ADC referansı 3V)
// 4.8V → ~1.92V → ADC: (1.92/3)*255 ≈ 163
// Ama hesabımız 195 değerini kullanıyor
if (voltage_reading >= VOLTAGE_THRESHOLD) {
return true; // 4.8V üzeri
}
return false; // 4.8V altı
}
bool checkDataLineShort() {
delay(10); // ADC kararlılığı için
int d_plus_value = analogRead(USB_D_PLUS);
int d_minus_value = analogRead(USB_D_MINUS);
// D+ kısa devre kontrolü
if (d_plus_value < D_PLUS_LOW_LIMIT) {
return true; // D+ kısa devre
}
// D- anormal yüksek kontrolü
if (d_minus_value > D_MINUS_HIGH_LIMIT) {
return true; // D- anormal
}
// D+ ve D- birbirine kısa devre kontrolü
if (abs(d_plus_value - d_minus_value) < LINE_DIFF_THRESHOLD &&
d_plus_value > 100 && d_minus_value > 100) {
return true; // Birbirine kısa devre
}
return false; // Normal durumda
}
// Ses fonksiyonları
void singleBeep() {
tone(BUZZER_PIN, 1000, 200); // 1kHz, 200ms
delay(300);
}
void continuousBeep() {
for (int i = 0; i < 50; i++) {
tone(BUZZER_PIN, 800, 200);
delay(300);
tone(BUZZER_PIN, 600, 200);
delay(300);
}
}
void shortCircuitAlarm() {
for (int i = 0; i < 50; i++) {
tone(BUZZER_PIN, 1500, 100);
delay(150);
tone(BUZZER_PIN, 1500, 100);
delay(150);
tone(BUZZER_PIN, 1500, 100);
delay(500);
}
}
void successMelody() {
// Basit başarı melodisi
int melody[] = {250, 523, 659, 784, 523, 1047}; // C, E, G, C (oktav)
int durations[] = {50, 50, 50, 50, 50, 400};
for (int i = 0; i < 6; i++) {
tone(BUZZER_PIN, melody[i], durations[i]);
delay(durations[i] + 50);
}
}
// ATtiny85'te tone() fonksiyonu yoksa manuel buzzer kontrolü
void monitorUSBDataTransfer() {
static int previousDPlus = 0;
static int previousDMinus = 0;
static unsigned long lastActivity = 0;
static bool firstRun = true;
// İlk çalıştırmada referans değerleri al
if (firstRun) {
previousDPlus = analogRead(USB_D_PLUS);
previousDMinus = analogRead(USB_D_MINUS);
firstRun = false;
digitalWrite(LED_PIN, HIGH); // LED her zaman yanık
return;
}
int currentDPlus = analogRead(USB_D_PLUS);
int currentDMinus = analogRead(USB_D_MINUS);
// Veri hattlarında değişiklik var mı kontrol et
bool dataActivity = false;
if (abs(currentDPlus - previousDPlus) > 20 ||
abs(currentDMinus - previousDMinus) > 20) {
dataActivity = true;
lastActivity = millis();
}
// LED davranışı:
if (dataActivity || (millis() - lastActivity < 200)) {
// Veri aktivitesi var veya son 200ms içinde vardı - hızlı yanıp sön
static unsigned long lastBlink = 0;
static bool blinkState = true;
if (millis() - lastBlink > 50) { // 50ms aralıklarla hızlı yanıp sön
blinkState = !blinkState;
digitalWrite(LED_PIN, blinkState);
lastBlink = millis();
}
} else {
// Veri aktivitesi yok - LED sürekli yanık (standby)
digitalWrite(LED_PIN, HIGH);
}
previousDPlus = currentDPlus;
previousDMinus = currentDMinus;
delay(5); // CPU yükünü azalt ama hızlı response için kısa delay
}