Étape 5: L’Arduino code
2009 : Martin ReeD, Ned Burns, Jon Ward, John Kestner
constantes :
const int ledPin = 12 ; le circuit du solénoïde est connecté à la broche numérique 12
const int knockSensor = 0 ; le piezo est connecté à la broche analogique 0
const int seuil = 20 ; valeur de seuil de décider quand le bruit détecté est un coup ou pas ;
modifier cette option pour régler la sensibilité sur votre propre bloc
int sensorReading = 0 ; variable pour stocker la valeur lue de l’axe du capteur
int ledState = faible ; variable utilisée pour st4re le dernier état de la LED, pour activer/désactiver la lumière
Heure actuelle
int current_millis_value = 0 ;
int previous_millis_value = 0 ;
int m = 0 ;
secondes int = 0 ;
int minutes = 45 ; Définissez manuellement les minutes qu'il commence à partir quand allumé
int h = 6 ; Définissez manuellement les heures, qu'il commence à partir quand allumé
Initialiser des Variables de Knock-suivi
long lastKnock = 0 ;
long curKnock = 0 ;
int lastIntensity = 0 ;
int shouldKnock = 0 ;
knockSpaces long [100] ;
void setup() {}
pinMode (ledPin, sortie) ; déclarer la ledPin comme sortie
pinMode (knockSensor, entrée) ;
Serial.Begin(9600) ; utiliser le port série
Serial.println ("Welcome to Knock Clock bloc!") ;
}
void loop() {}
Gérer le temps
current_millis_value = millis() ;
m += current_millis_value - previous_millis_value ;
m += secondes / 1000 ;
m = m % 1000 ;
minutes += secondes / 60 ;
secondes = secondes % 60 ;
heures = minutes / 60 ;
minutes = minutes % 60 ;
heures = heures % 24 ;
previous_millis_value = current_millis_value ;
lire le capteur et la stocker dans la variable sensorReading :
sensorReading = analogRead(knockSensor) ;
curKnock = millis() ;
Si la lecture du capteur est supérieure au seuil, considérez-la comme un coup
Si (sensorReading > = seuil) {}
Si ((curKnock-lastKnock) < 1000) {}
knockSpaces [shouldKnock] = (curKnock - lastKnock) ;
shouldKnock ++ ;
}
lastKnock = curKnock ;
lastIntensity = sensorReading ;
Delay(150) ; éviter d’accidentellement déclencher plus d’une fois
Si ce n’est pas, vérifiez si 1000 ms est écoulé et commencer à frapper :
} else if ((curKnock-lastKnock) > 1000 & & shouldKnock > = 1) {}
Si (shouldKnock < 5) {}
Coups de réinitialisation
shouldKnock = 0 ;
lastKnock = 0 ;
lastIntensity = 0 ;
Frapper les heures
pour (int y = 0; y < h; y ++) {}
Serial.println ("Knock ! (Heures) ") ;
knockOut(round((max(sensorReading,lastIntensity) / 50) * 18)) ;
retarder (200 + random(90)) ;
}
Delay(900) ;
Frapper les Minutes (par tranches de 15 min)
pour (int y = 0; y < floor(minutes / 15); y ++) {}
Serial.println ("Knock ! (Minutes) ") ;
knockOut(round((max(sensorReading,lastIntensity) / 50) * 18)) ;
retarder (900 + random(200)) ;
}
} else {}
Frapper en retour
pour (int y = 0; y < shouldKnock; y ++) {}
Serial.println ("Knock ! (Fun!) ") ;
knockOut(0) ;
retard ((knockSpaces [y] - 20)) ;
}
Coups de réinitialisation
shouldKnock = 0 ;
lastKnock = 0 ;
lastIntensity = 0 ;
knockOut(0) ;
Delay(150) ; éviter d’accidentellement déclencher plus d’une fois
}
Delay(100) ; éviter d’accidentellement déclencher plus d’une fois
}
}
Effectuer un coup
void knockOut (int tVolume) {}
ledState = élevé ;
digitalWrite (ledPin, ledState) ;
retarder (20 + random(tVolume)) ; Randomize, intensité
ledState = bas ;
digitalWrite (ledPin, ledState) ;
}