Table des matières:
2025 Auteur: John Day | [email protected]. Dernière modifié: 2025-01-13 06:57
Projet HKU - ITTT (If This Then That) - Julia Berkouwer, 1B
Vous êtes-vous déjà senti stressé et vous ne savez tout simplement pas comment vous calmer, alors vous devriez essayer ces lunettes de relaxation ! Vous les mettez et fermez les yeux, puis un schéma de respiration jouera. En suivant ce schéma de respiration, votre rythme respiratoire se réduira à inspirer et expirer 6 fois par minute. En faisant cela, il libère le stress quotidien.
Vous pouvez également suivre l'intensité de votre respiration en appuyant sur un interrupteur à l'aide d'un capteur fsr.
Avec ce didacticiel, je vais vous guider pas à pas dans la construction de vos propres lunettes de relaxation.
Étape 1: Matériaux et pièces nécessaires:
Matériaux:
1x arduino uno;
1 planche à pain ou PCV;
3x 10k résistances
Fils (de préférence des couleurs différentes pour qu'il soit plus facile de dire quelles choses vont au sol et lesquelles vont à différentes broches, etc.);
Certains tubes thermorétractables;
2x Anneau NeoPixel - 16 x 5050 LED RVB avec Pilotes Intégrés;
1x interrupteur;
1x capteur FSR;
1x lunettes SteamPunk (vous pouvez les acheter dans un magasin de fête, elles sont faciles à utiliser car la bague néopixel s'adapte parfaitement aux lunettes. Vous essayez toujours d'utiliser d'autres lunettes ou de créer les vôtres.);
1x une sorte de bande (elastick) à mettre autour de votre poitrine.
Outils:-Ordinateur portable
-Fer à souder
-Logiciel IDE Arduino
Vous verrez deux boutons et un interrupteur sur mon pvc, je n'utilise que le bouton gauche pour le connecter à l'interrupteur, je n'utilise pas le deuxième bouton à droite de la photo. J'ai mis les boutons sur le pvc avant de réaliser que je n'en avais pas besoin et que j'avais besoin d'utiliser un interrupteur à la place.
Ci-dessous, vous verrez des photos de tout ce que j'ai utilisé:
Étape 2: anneaux néopixels
Le fil blanc est relié à la terre à l'arrière de l'anneau néopixel.
Le fil orange est connecté au 5V.
Et le fil marron est connecté à l'entrée de données
Étape 3: Connexions
Voici à quoi ressemblait ma maquette lors du prototypage, vous pouvez l'utiliser comme référence.
J'ai également fait un schéma du câblage de ce à quoi il est censé ressembler avec un seul bouton.
Étape 4: Le code:
Ce n'est probablement pas le code le plus efficace, mais il fonctionne pour moi. Mettez-vous au défi et essayez de le rendre plus efficace;P
#comprendre
// Lequel
broche sur l'Arduino est connectée aux NeoPixels?
#définir
NIP 6
// Lequel
la broche de l'Arduino est connectée au bouton
#définir
BUTTON_PIN 9
// Comment
de nombreux NeoPixels sont attachés à l'Arduino?
#définir
NUMPIXELS 16
// Lorsque
nous configurons la bibliothèque NeoPixel, nous lui indiquons combien de pixels et quelle broche utiliser pour envoyer des signaux.
// Noter
que pour les anciennes bandes NeoPixel, vous devrez peut-être modifier le troisième paramètre - voir le strandtest
//
exemple pour plus d'informations sur les valeurs possibles.
Adafruit_NeoPixel
pixels = Adafruit_NeoPixel (NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
pause int
= 1; //retard2
entier
pause2 = 80; // baisse lorsque fsr est utilisé
entier
pause3 = 150; // faire quand fsr est utilisé
entier
délaival = 4; // retard1
entier
fsrPin = 0; // le FSR et le pulldown 10K sont connectés à a0
entier
fsrLecture;
annuler
mettre en place() {
pinMode(BUTTON_PIN, INPUT);
Serial.begin(9600);
pixels.begin(); // Ceci initialise le
Bibliothèque NeoPixel.
pixels.show();
}
bool
bouton pressé(int pin){
return digitalRead(pin);
}
annuler
loop() { // lit si l'entrée de la broche est vraie ou fausse
fsrReading = analogRead(fsrPin);
Serial.print("Lecture analogique = ");
Serial.print(fsrReading);
if (bouton pressé (BUTTON_PIN) == vrai){
//effet de lumière lors de l'utilisation du capteur fsr
if (fsrReading > 50){
pixels.setPixelColor(0, 1, 0, 1);
pixels.setPixelColor(15, 1, 0, 1);
pixels.setPixelColor(1, 1, 0, 1);
pixels.setPixelColor(14, 1, 0, 1);
pixels.show();
retard (pause3);
}
if (fsrLecture < 52){
pixels.setPixelColor(0, 0, 0, 0);
pixels.setPixelColor(15, 0, 0, 0);
pixels.setPixelColor(1, 0, 0, 0);
pixels.setPixelColor(14, 0, 0, 0);
pixels.show();
retard (pause2);
}
if (fsrReading > 57){
pixels.setPixelColor(2, 1, 0, 1);
pixels.setPixelColor(13, 1, 0, 1);
pixels.setPixelColor(3, 1, 0, 1);
pixels.setPixelColor(12, 1, 0, 1);
pixels.show();
retard (pause3);
}
if (fsrLecture < 59){
pixels.setPixelColor(2, 0, 0, 0);
pixels.setPixelColor(13, 0, 0, 0);
pixels.setPixelColor(3, 0, 0, 0);
pixels.setPixelColor(12, 0, 0, 0);
pixels.show();
retard(pause2);
}
if (fsrReading > 65){
pixels.setPixelColor(4, 1, 0, 1);
pixels.setPixelColor(11, 1, 0, 1);
pixels.setPixelColor(5, 1, 0, 1);
pixels.setPixelColor(10, 1, 0, 1);
pixels.show();
retard (pause3);
}
if (fsrLecture <67){
pixels.setPixelColor(4, 0, 0, 0);
pixels.setPixelColor(11, 0, 0, 0);
pixels.setPixelColor(5, 0, 0, 0);
pixels.setPixelColor(10, 0, 0, 0);
pixels.show();
retard (40);
}
if (fsrReading > 79){
pixels.setPixelColor(6, 1, 0, 1);
pixels.setPixelColor(9, 1, 0, 1);
pixels.setPixelColor(7, 1, 0, 1);
pixels.setPixelColor(8, 1, 0, 1);
pixels.show();
retard (pause3);
}
if (fsrLecture <85){
pixels.setPixelColor(6, 0, 0, 0);
pixels.setPixelColor(9, 0, 0, 0);
pixels.setPixelColor(7, 0, 0, 0);
pixels.setPixelColor(8, 0, 0, 0);
pixels.show();
retard(20);
}
}
autre{
respirer_bleu (20, 100, 0, 1, 1); // Ordinaire
effet
}
}
// Pause
= délai entre les transitions
// Pas
= nombre de pas
// R, V, B = valeurs RVB complètes
// De void respirer est voor het licht effect als de
fsrsensor niet gebruikt wordt. Deze void wordt in de void loop() weer aangeroepen.
void breathe_blue(int pause, int étapes, octet R, octet G, octet B) {
entier
tmpR, tmpG, tmpB; // Valeurs temporaires
// Fondu vers le haut
for (int s=1; s<=steps; s++) {
tmpR = (R * s) /
pas; // Multipliez d'abord pour éviter les erreurs de troncature
tmpG = (G * s) / pas;
tmpB = (B * s) / pas;
pour (entier i=0;
jepixels.setPixelColor(0, tmpR, tmpG+1, tmpB);
pixels.setPixelColor(15, tmpR, tmpG+1, tmpB);
}
pixels.show();
retard(4);
}
// Fondu vers le haut
for (int s=1; s<=steps; s++) {
tmpR = (R * s) /
pas; // Multipliez d'abord pour éviter les erreurs de troncature
tmpG = (G * s) / pas;
tmpB = (B * s) / pas;
pour (entier i=0;
jepixels.setPixelColor(1, tmpR, tmpG+1, tmpB);pixels.setPixelColor(14, tmpR, tmpG+1, tmpB);
}
pixels.show();
retard(4);
}
// Fondu vers le haut
for (int s=1; s<=steps; s++) {
tmpR = (R * s) /
pas; // Multipliez d'abord pour éviter les erreurs de troncature
tmpG = (G * s) / pas;
tmpB = (B * s) / pas;
pour (entier i=0;
jepixels.setPixelColor(2, tmpR, tmpG+2, tmpB);pixels.setPixelColor(13, tmpR, tmpG+2, tmpB);
}
pixels.show();
retard (3.5);
}
// Fondu vers le haut
for (int s=1; s<=steps; s++) {
tmpR = (R * s) /
pas; // Multipliez d'abord pour éviter les erreurs de troncature
tmpG = (G * s) / pas;
tmpB = (B * s) / pas;
pour (entier i=0;
jepixels.setPixelColor(3, tmpR, tmpG+3, tmpB+5);pixels.setPixelColor(12, tmpR, tmpG+3, tmpB+5);
}
pixels.show();
retard(3);
}
pour (entier i=0;
jepixels.setPixelColor(0, 0, 0, 0);pixels.setPixelColor(15, 0, 0, 0);
}
// Fondu vers le haut
for (int s=1; s<=steps; s++) {
tmpR = (R * s) /
pas; // Multipliez d'abord pour éviter les erreurs de troncature
tmpG = (G * s) / pas;
tmpB = (B * s) / pas;
pour (entier i=0;
je
pixels.setPixelColor(4, tmpR, tmpG+3, tmpB+15);pixels.setPixelColor(11, tmpR, tmpG+3, tmpB+15);
}
pixels.show();
retard(3);
}
// Fondu vers le haut
for (int s=1; s<=steps; s++) {
tmpR = (R * s) /
pas; // Multipliez d'abord pour éviter les erreurs de troncature
tmpG = (G * s) / pas;
tmpB = (B * s) / pas;
pour (entier i=0;
jepixels.setPixelColor(5, tmpR, tmpG+4, tmpB+20);pixels.setPixelColor(10, tmpR, tmpG+4, tmpB+20);
}
pixels.show();
retard(2);
}
pour (entier i=0;
jepixels.setPixelColor(1, 0, 0, 0);
pixels.setPixelColor(14, 0, 0, 0);
}
// Fondu vers le haut
for (int s=1; s<=steps; s++) {
tmpR = (R * s) /
pas; // Multipliez d'abord pour éviter les erreurs de troncature
tmpG = (G * s) / pas;
tmpB = (B * s) / pas;
pour (entier i=0;
jepixels.setPixelColor(6, tmpR, tmpG+2, tmpB+40);
pixels.setPixelColor(9, tmpR, tmpG+2, tmpB+40);
}
pixels.show();
délai (valeur de délai);
}
pour (entier i=0;
jepixels.setPixelColor(2, 0, 0, 0);pixels.setPixelColor(13, 0, 0, 0);
}
// Fondu vers le haut
for (int s=1; s<=steps; s++) {
tmpR = (R * s) /
pas; // Multipliez d'abord pour éviter les erreurs de troncature
tmpG = (G * s) / pas;
tmpB = (B * s) / pas;
pour (entier i=0;
je
pixels.setPixelColor(7, tmpR, tmpG, tmpB+44);pixels.setPixelColor(8, tmpR, tmpG, tmpB+44);
}
pixels.show();
délai (valeur de délai);
}
// Fondu vers le bas
for (int s=steps; s>0; s--) {
tmpR = (R * s) / pas; // Multipliez d'abord pour éviter la troncature
les erreurs
tmpG = (G * s) / pas;
tmpB = (B * s) / pas;
pour (int i=0; i
pixels.setPixelColor(7, tmpR, tmpG, tmpB);
pixels.setPixelColor(8, tmpR, tmpG, tmpB);
}
pixels.show();
retard(1);
}
// Fondu vers le bas
for (int s=steps; s>0; s--) {
tmpR = (R * s) / pas; // Multipliez d'abord pour éviter la troncature
les erreurs
tmpG = (G * s) / pas;
tmpB = (B * s) / pas;
pour (int i=0; i
pixels.setPixelColor(6, tmpR, tmpG, tmpB);
pixels.setPixelColor(9, tmpR, tmpG, tmpB);
}
pixels.show();
retard(1);
}
// Fondu vers le bas
for (int s=steps; s>0; s--) {
tmpR = (R * s) / pas; // Multipliez d'abord pour éviter la troncature
les erreurs
tmpG = (G * s) / pas;
tmpB = (B * s) / pas;
pour (int i=0; i
pixels.setPixelColor(5, tmpR, tmpG, tmpB);
pixels.setPixelColor(10, tmpR, tmpG, tmpB);
}
pixels.show();
retard(2);
}
// Fondu vers le bas
for (int s=steps; s>0; s--) {
tmpR = (R * s) / pas; // Multipliez d'abord pour éviter la troncature
les erreurs
tmpG = (G * s) / pas;
tmpB = (B * s) / pas;
pour (int i=0; i
pixels.setPixelColor(4, tmpR, tmpG, tmpB);
pixels.setPixelColor(11, tmpR, tmpG, tmpB);
}
pixels.show();
retard(2);
}
// Fondu vers le bas
for (int s=steps; s>0; s--) {
tmpR = (R * s) / pas; // Multipliez d'abord pour éviter la troncature
les erreurs
tmpG = (G * s) / pas;
tmpB = (B * s) / pas;
pour (int i=0; i
pixels.setPixelColor(3, tmpR, tmpG, tmpB);
pixels.setPixelColor(12, tmpR, tmpG, tmpB);
}
pixels.show();
retard(3);
}
// Fondu vers le bas
for (int s=steps; s>0; s--) {
tmpR = (R * s) / pas; //
Multipliez d'abord pour éviter les erreurs de troncature
tmpG = (G * s) / pas;
tmpB = (B * s) / pas;
pour (int i=0; i
pixels.setPixelColor(2, tmpR, tmpG, tmpB);
pixels.setPixelColor(13, tmpR, tmpG, tmpB);
}
pixels.show();
retard(3);
}
// Fondu vers le bas
for (int s=steps; s>0; s--) {
tmpR = (R * s) / pas; // Multipliez d'abord pour éviter la troncature
les erreurs
tmpG = (G * s) / pas;
tmpB = (B * s) / pas;
pour (int i=0; i
pixels.setPixelColor(1, tmpR, tmpG, tmpB);
pixels.setPixelColor(14, tmpR, tmpG, tmpB);
}
pixels.show();
retard(4);
}
// Fondu vers le bas
for (int s=steps; s>0; s--) {
tmpR = (R * s) / pas; // Multipliez d'abord pour éviter la troncature
les erreurs
tmpG = (G * s) / pas;
tmpB = (B * s) / pas;
pour (int i=0; i
pixels.setPixelColor(0, tmpR, tmpG, tmpB);
pixels.setPixelColor(15, tmpR, tmpG, tmpB);
}
pixels.show();
retard(4);
}
}
Étape 5: Tout assembler:
Vous pouvez simplement laisser tous vos fils connectés à votre planche à pain ou à un PVC, c'est à vous de décider (j'ai choisi de mettre un PVC sur l'arduino c'est joli et soigné comme ça).
L'étape suivante consiste à mettre des tubes thermorétractables autour de tous les fils afin que ce soit moins de gâchis.
Si vous avez choisi d'utiliser un PVC, vous devriez déjà avoir tout soudé ensemble.
Après cela, vous placez les anneaux néopixels à l'extérieur des lunettes (assurez-vous que les leds sont alignées au fond) et fixez-les en place avec du ruban adhésif ou de la colle (j'ai utilisé du ruban adhésif).
Vous pouvez choisir de coller le capteur fsr à l'élastique avec du ruban adhésif ou de le laisser seul.
Profitez de vos lunettes:)