Bonjour !
je suis soigneur animalier dans un parc animalier, mon projet du moment est de faire une boite ludique pour les primates !!!
le but est de récolté des informations .
dans une boite, j'ai mis plusieurs rang boutons, le 1er rang a 4 boutons est quant on appui sur un bouton poussoir , une led s'allumé et s'éteint lorsque on appui plus dessus.
le 2eme rang de bouton je voulais le faire le son, et c'est la toute ma difficulté
le projet est le même que le 1er,mais avec une bande sonore
c'est a dire j'appui sur bouton et j'ai un son qui sort de l'enceinte , bouton 1, son 1, bouton 2 son ... jusqu'a 4..
c'est la ou je vous demande un petit coup de main a savoir la carte que je doit prendre! (actuellement j'ai sd card mudule mais je trouve pas de tuto )pour cette configuration
merci
salut!
moi aussi je suis un primate, même si je me soigne tout seul, alors tu penses que je vais essayer de t'aider si possible!
au vu de ton projet, on est à 2 doigts du tuto pour arduino, j'entends par là que le codage ne devrait pas poser de problèmes.
à mon niveau, je saurais te proposer des sons de mauvaise qualité (mode game boy ou équivalent). Si tu veux quelque chose de plus évolué, ça demandera nécessairement un matériel un poil plus poussé (et surtout, des gens qui s'y connaissent mieux que moi).
PS: le lecteur de carte SD ne sera nécessaire que si tu envisages de faire jouer des mp3 (et pas ma proposition de musique 8bit).
tu dis que tu as déjà monté des boutons et des leds? tu pourrais nous fournir une photo et si possible un schéma électrique?
à titre personnel je m'interroge sur les boutons que tu as utilisé pour les rendre facilement accessibles aux petits doigts boudinés de nos cousins.
Allez au boulot: la bibliothèques "tone" ou "pitches" disponible sur gitHub contient les infos nécessaires pour jouer des notes (elle crée une pulsation d'une fréquence connue, et qui est alignée sur le solfège: do, ré mi etc...). tu peux donc connecter un petit haut parleur sur une sortie PWM d'une carte arduino meme très basique (le modèle UNO, une nano micro) et faire jouer la succession de note que tu souhaites.
En liant la fonction de lecture des notes à l'appui d'un bouton tu devrais pouvoir obtenir l'effet désiré.
Je vois ça comme une fonction bloquante lisant l'état du bouton, ainsi qu'une liste (array ou tableau) qui contient la liste des notes à jouer.
Si le bouton est appuyé, la carte joue la première note de la liste, puis incrémente un compteur, et vérifie à nouveau si le bouton est pressé. SI c'est le cas, il joue la note suivante (la note présente dans le tableau à la position indiquée par le compteur). Si le bouton est relaché, le compteur revient à zéro (la 1ère note) et tu sors de la boucle. Le programme sera prêt à reprendre la mélodie du début.
2 remarques malgré tout:
- ma proposition bloque le déroulement du code tant que le bouton est appuyé, pas de changement sur les leds possibles
- brancher un haut parleur en direct sur une arduino n'est pas une très bonne idée d'après ce que j'ai lu à droite à gauche. Je l'ai fait un peu et ça marche malgré tout.
une petite image de montage haut parleur dégotté sur le net:

fais signe si ça peut convenir, on discutera programmation proprement dite!
Salut.
Il utilise un DFPlayer mieux que le lecteur de carte SD.
DFPlayer_Mini_SKU_DFR0299-DFRobot
oui, c'est exactement ce qu'il faut pour son projet. Même pas besoin d'arduino.
merci gonpezzi, je vais m'en commander une ![]()
merci nico 25845, je commande la carte!!! je reviens vers vous pour la suite du projet ![]()
je te remercie pour ta réponse !! mais je pense que ca va être moins compliqué de mettre en place le projet avec un DFPlayer mais Ya pas de souci, je mettrai une photo du projet ![]()
super, j'adorerai ca.
et aucun souci si tu trouves une solution plus en adéquation avec tes besoins, bien au contraire!
Bonjour je reviens vers vous pour mon petit projet
voila j'ai testé mes codes et mes branchement , tout fonctionne bien, maintenent il faut que je fusionne tout le monde sur la même carte arduino mega
j'ai commencé par mes codes led, pas souci ca fonctionne, ensuite le moteur continu, que je vais appelé "ventilateur " et la j'ai une erreur sur la ligne "void loop" Compilation error: a function-definition is not allowed here before '{' token je comprent pas...et ensuite je voudrai mettre le code de mon servo moteur dans cette compilation et viendra apres le son !!!!
voici les codes
const int bouton = 1; // le bouton est connecté à la broche 1 de la carte Adruino
const int relais_moteur = 10; // // le relais est connecté à la broche 1 de la carte Adruino
int etatBouton;
//pins boutons poussoir
const byte s_bleu = 2;
const byte s_jaune = 3;
const byte s_rouge = 4;
const byte s_vert = 5;
//pins connexion leds
const byte bleu_led = 6;
const byte jaune_led = 7;
const byte rouge_led = 8;
const byte vert_led = 9;
// etat des leds
bool etat_bleu_led = false;
bool etat_jaune_led = false;
bool etat_rouge_led = false;
bool etat_vert_led = false;
void setup(){
Serial.begin(9600);
for (byte i = 2; i <= 5; i++) {
Serial.println(i);
pinMode(i, INPUT_PULLUP);
}
for (byte i = 6; i <= 9; i++) {
Serial.println(i);
pinMode(i, OUTPUT);
digitalWrite(i, LOW);
pinMode(bouton, INPUT); // le bouton est une entrée
pinMode(relais_moteur, OUTPUT);
}
void loop(){
bool appui_1, appui_2, appui_3, appui_4;
appui_1 = !digitalRead(s_bleu);
appui_2 = !digitalRead(s_jaune);
appui_3 = !digitalRead(s_rouge);
appui_4 = !digitalRead(s_vert);
// changement de l'etat de la led a chaque appui
if (appui_1) {
if (etat_bleu_led == true)
etat_bleu_led = false;
else
etat_bleu_led = true;
}
if (appui_2) {
if (etat_jaune_led == true)
etat_jaune_led = false;
else
etat_jaune_led = true;
}
if (appui_3) {
if (etat_rouge_led == true)
etat_rouge_led = false;
else
etat_rouge_led = true;
}
if (appui_4) {
if (etat_vert_led == true)
etat_vert_led = false;
else
etat_vert_led = true;
}
digitalWrite(bleu_led, etat_bleu_led);
digitalWrite(jaune_led, etat_jaune_led);
digitalWrite(rouge_led, etat_rouge_led);
digitalWrite(vert_led, etat_vert_led);
}
etatBouton = digitalRead(bouton);
if (etatBouton == 0) // On appuie sur le bouton poussoir
{
digitalWrite(relais_moteur, HIGH); // Le moteur se met à tourner
}
else // On relache le bouton poussoir
{
digitalWrite(relais_moteur, LOW); // Le moteur s'arrête de tourner
}
delay(100);
}
}
et celui du servo moteur
#include <Servo.h>
const byte SERVO_A_ANGLE_MIN = 0;
const byte SERVO_A_ANGLE_MAX = 1;
const byte SERVO_EN_MOUVEMENT_VERS_ANGLE_MAX = 2;
const byte SERVO_EN_MOUVEMENT_VERS_ANGLE_MIN = 3;
const int angleMin = 500;
const int angleMax = 3000;
Servo monServo;
int vitesse = 0;
int angle = angleMin;
byte etatServo = SERVO_A_ANGLE_MIN;
const int pinBouton = 0; /* le bouton est connecté à la broche A0 */
const boolean PRESSE = true;
const boolean RELACHE = false;
boolean etatBouton = RELACHE;
const byte AUCUN_EVENEMENT = 0;
const byte EVENEMENT_PRESSE = 1;
const byte EVENEMENT_RELACHE = 2;
/*
* fonctions de gestion du poussoir
*/
boolean lirePoussoir()
{
boolean resultat = RELACHE;
if (analogRead(pinBouton) > 512) {
resultat = PRESSE;
}
return resultat;
}
byte lireEvenement()
{
byte evenement;
boolean nouvelEtat = lirePoussoir();
if (nouvelEtat == etatBouton)
evenement = AUCUN_EVENEMENT;
if (nouvelEtat == PRESSE && etatBouton == RELACHE)
evenement = EVENEMENT_PRESSE;
if (nouvelEtat == RELACHE && etatBouton == PRESSE)
evenement = EVENEMENT_RELACHE;
etatBouton = nouvelEtat;
return evenement;
}
/*
* La fonction setup() est exécutée 1 fois
* au démarrage du programme
*/
void setup()
{
monServo.attach(9);
}
/*
* La fonction loop() est exécutée
* répétitivement
*/
void loop()
{
/* actualisation de l'angle du servo */
monServo.writeMicroseconds(angle);
angle = angle + vitesse;
if (angle > angleMax) {
angle = angleMax;
vitesse = 0;
etatServo = SERVO_A_ANGLE_MAX;
}
else if (angle < angleMin) {
angle = angleMin;
vitesse = 0;
etatServo = SERVO_A_ANGLE_MIN;
}
/* lecture de la commande de l'utilisateur */
byte evenement = lireEvenement();
if (evenement == EVENEMENT_PRESSE) {
switch (etatServo) {
case SERVO_A_ANGLE_MIN:
case SERVO_EN_MOUVEMENT_VERS_ANGLE_MIN:
vitesse = 1;
etatServo = SERVO_EN_MOUVEMENT_VERS_ANGLE_MAX;
break;
case SERVO_A_ANGLE_MAX:
case SERVO_EN_MOUVEMENT_VERS_ANGLE_MAX:
vitesse = -1;
etatServo = SERVO_EN_MOUVEMENT_VERS_ANGLE_MIN;
break;
}
}
delay(3);
}
L'erreur t'indique que tu as mal fermé tes accolades, tu as du code hors fonction après la fermeture de ta focntion loop.
Essaye d'intenter ton code, c'est complétement illisible en l'état ![]()
Bonjour,
Formate ton code avec ctrl t et tu verras qu'il manque le } de la 2eme boucle for qui est dans le setup.
merci terwal et kamill !!
j'ai bien trouvé } qui manqué m'a compil est bonne, aucune erreur, mais sur les 4 boutons leds 2 fonctionnes, le vert et le rouge et 2 fonctionnes pas, je jaune et le bleu ainsi que mon moteur auriez vous une idée ? ![]()
const int bouton = 1; // le bouton est connecté à la broche 1 de la carte Adruino
const int relais_moteur = 10; // // le relais est connecté à la broche 1 de la carte Adruino
int etatBouton;
//pins boutons poussoir
const byte s_bleu = 2;
const byte s_jaune = 3;
const byte s_rouge = 4;
const byte s_vert = 5;
//pins connexion leds
const byte bleu_led = 6;
const byte jaune_led = 7;
const byte rouge_led = 8;
const byte vert_led = 9;
// etat des leds
bool etat_bleu_led = false;
bool etat_jaune_led = false;
bool etat_rouge_led = false;
bool etat_vert_led = false;
void setup() {
Serial.begin(9600);
for (byte i = 2; i <= 5; i++) {
Serial.println(i);
pinMode(i, INPUT_PULLUP);
}
{
pinMode(bouton, INPUT); // le bouton est une entrée
pinMode(relais_moteur, OUTPUT);
}
for (byte i = 6; i <= 9; i++) {
Serial.println(i);
pinMode(i, OUTPUT);
digitalWrite(i, LOW);
}
}
void loop() {
bool appui_1, appui_2, appui_3, appui_4;
appui_1 = !digitalRead(s_bleu);
appui_2 = !digitalRead(s_jaune);
appui_3 = !digitalRead(s_rouge);
appui_4 = !digitalRead(s_vert);
// changement de l'etat de la led a chaque appui
if (appui_1) {
if (etat_bleu_led == true)
etat_bleu_led = false;
else
etat_bleu_led = true;
}
if (appui_2) {
if (etat_jaune_led == true)
etat_jaune_led = false;
else
etat_jaune_led = true;
}
if (appui_3) {
if (etat_rouge_led == true)
etat_rouge_led = false;
else
etat_rouge_led = true;
}
if (appui_4) {
if (etat_vert_led == true)
etat_vert_led = false;
else
etat_vert_led = true;
}
digitalWrite(bleu_led, etat_bleu_led);
digitalWrite(jaune_led, etat_jaune_led);
digitalWrite(rouge_led, etat_rouge_led);
digitalWrite(vert_led, etat_vert_led);
}
void ventil() {
etatBouton = digitalRead(bouton);
if (etatBouton == 0) // On appuie sur le bouton poussoir
{
digitalWrite(relais_moteur, HIGH); // Le moteur se met à tourner
} else // On relache le bouton poussoir
{
digitalWrite(relais_moteur, LOW); // Le moteur s'arrête de tourner
}
delay(100);
}
merci :wink:
Le problème est le même pour tous les boutons. Il faut que tu testes quand le bouton vient d'être appuyé en non l'état du bouton.
Pour cela il faut mémoriser l'état du bouton au cycle précédent et voir si il a changé d'état.
Remarques:
- tu utilises la pin 1 pour le bouton alors qu'elle est utilisée par Serial
- tu aurais intérêt à faire une boucle au lieu de faire quatre fois la même chose.
- tu peux relire l'état des leds, ce n'est pas nécessaire de le mémoriser.
merci kamill pour tes explications !!
j'arrive pas du tous a me dépatouillé,
comment on mémorise l'état des bouton au cycle précédant ?
j"ai mis le bouton poussoir du moteur sur la broche 23, il ne ce pas rien non plus !!!
merci de vos réponses ![]()
Voila par exemple le traitement pour le premier bouton
static bool appui_1_precedent=false;
// changement de l'etat de la led a chaque appui
if (appui_1!=appui_1_precedent)
{
if (appui_1)
digitalWrite(bleu_led, !digitalRead(bleu_led));
appui_1_precedent=appui_1;
delay(20); // anti rebond
}
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.
