distributeur de grillon par un débutant

Bonjour,

Mon projet est de réaliser un distributeur de grillon pour nourrir mon pogona (lézard) lors de mes absences. Je sais qu’il existe énormément de distributeurs type croquettes avec une vis sans fin mais les grillons sont vivants et fragiles, j’ai donc décidé de créer mon propre distributeur et donc de me mettre à essayer de programmer mon premier ARDUINO…

Le grand principe serait de déplacer des récipients contenant la dose quotidienne via un servomoteur (je pense que 5 rotations du servo devrait suffire pour une dose).
Je voudrais programmer une horaire fixe à laquelle se déclenchera le nourrissage, dès que le déplacement du récipient sera terminé (5 mouvement du servo) un solénoïde (remplacé par une LED sur le schéma) tapera 5 fois sur le récipient pour s’assurer que les grillons tombent bien et cela servira aussi de signal sonore via une clochette sur ce même solénoïde.

Un bouton servira aussi à déclencher le solénoïde-clochette au besoin.
Un autre bouton servira à déclencher les mouvements du servo pour nourrir en dehors de la programmation si nécessaire.

Le matériel (pas encore reçu): un arduino UNO + module DS3231 + un servo 9g + 1 solenoide (12v mais je l’alimenterai via un relai et une alim 12v)

Mon projet de cablage :

Et enfin mon code :

#include <Servo.h>
#include <Wire.h>
#include <DS3231.h>

Servo monservo;                //création de l'objet Servo
int pos = 0;                  // mettre le servo en position initiale
RTClib RTC;                    // utile pour heure ???
const int cloche = 2;          // la clochette est sur la broche 2
const int boutoncloche = 3;    // le bouton clochette est sur la broche 3
const int boutonavance = 4;     // le bouton avance est sur la broche 4
int etatboutoncloche;
int etatboutonavance;

void setup() {
  
pinMode(cloche, OUTPUT);                    // met la broche 2 en sortie
pinMode(boutoncloche, INPUT);               // met la broche 3 en entrée
pinMode(boutonavance, INPUT);               // met la broche 4 en entrée
monservo.attach(9);                         //servo relié a la broche 9
Serial.begin(57600);
Wire.begin();                              //demarrage liaison série
}


void loop() {

DateTime now = RTC.now();

if((now.hour() == 17) && (now.minute() == 30) && (now.second() == 00))   //heure minutes seconde de declenchement: 12h30m00s
  
{  
for(int compteur = 0; compteur < 5; compteur++)   //permet d'exécuter 5 fois le code ci-dessous

{
 for (pos = 0; pos <= 180; pos += 1)  // va de 0° à 180° par pas de 1
   {
    monservo.write(pos);              // dit au servo de prendre la position 'pos'
    delay(50);                        // attendre 50ms pour servo arrive position
  }
  for (pos = 180; pos >= 0; pos -= 2)  // va de 180° à 0° par pas de 2
    {
      monservo.write(pos);              // dit au servo de prendre la position 'pos'
    delay(50);                         // attendre 50ms pour servo arrive position
  }
}
}


// utilisation manuelle de la cloche

etatboutoncloche = digitalRead(boutoncloche);       // verification de l'état du boutoncloche
if(etatboutoncloche == HIGH)                                   // enclenchement du bouton cloche
for(int compteur = 0; compteur < 5; compteur++)    //permet d'exécuter 5 fois le code ci-dessous
{
digitalWrite(cloche, HIGH);                     //declenchement de la cloche via solenoide
 delay(100);
digitalWrite(cloche, LOW);                        
 delay(100);
}


// avance manuelle
etatboutonavance = digitalRead(boutonavance);       // verification de l'état du boutonavance
if(etatboutonavance == HIGH)                       // enclenchement du bouton avance
{  
for(int compteur = 0; compteur < 5; compteur++)   //permet d'exécuter 5 fois le code ci-dessous

{
 for (pos = 0; pos <= 180; pos += 1)  // va de 0° à 180° par pas de 1
   {
    monservo.write(pos);              // dit au servo de prendre la position 'pos'
    delay(50);                       // attendre 50ms pour servo arrive position
  }
  for (pos = 180; pos >= 0; pos -= 2)  // va de 180° à 0° par pas de 2
    {
      monservo.write(pos);              // dit au servo de prendre la position 'pos'
    delay(50);                       // attendre 50ms pour servo arrive position
  }
}

}
}

Pourriez-vous svp m’indiquer si je fais de grosses erreurs de code ? N’ayant pas encore le matériel je ne peux pas le tester. J’imagine qu’il y a beaucoup de possibilités pour simplifier mon code mais je préfère partir sur du basique que je peux comprendre plutôt que sur des optimisations que je ne maîtriserai pas.

Merci,

Bonjour et bienvenue sur le forum !

Il n'est pas superflu, à l'arrivée sur le forum de prendre connaissance du 'mode d'emploi' de celui-çi
Il est décrit dans plusieurs messages épinglée en tête du forum principal.

Entre autres choses il est indiqué que les sous-forums ne sont pas destinés à poser les questions générales.
En particulier ce sous forum exclusivement dédié a ce qui est achevé, fini.(voir le titre)

->Faire déplacer ce message : En bas à gauche du message publié figure un lien 'Report to Moderator.', l'auteur du message et lui seul demande au modérater le déplacement dans le forum général

De temps à autre le modérateur fait le ménage, mieux vaut prendre les devants !

Merci du conseil, demande de déplacement effectuée.

Topic déplacé....

Bonjour,

Le déclenchement par la RTC ne fait pas sonner la cloche.

Zlika:
Bonjour,

Le déclenchement par la RTC ne fait pas sonner la cloche.

En effet j'ai oublié cette tache, merci.
Je rajoute la sonnerie:

#include <Servo.h>
#include <Wire.h>
#include <DS3231.h>

Servo monservo;                //création de l'objet Servo
int pos = 0;                  // mettre le servo en position initiale
RTClib RTC;                    // utile pour heure ???
const int cloche = 2;          // la clochette est sur la broche 2
const int boutoncloche = 3;    // le bouton clochette est sur la broche 3
const int boutonavance = 4;     // le bouton avance est sur la broche 4
int etatboutoncloche;
int etatboutonavance;

void setup() {
  
pinMode(cloche, OUTPUT);                    // met la broche 2 en sortie
pinMode(boutoncloche, INPUT);               // met la broche 3 en entrée
pinMode(boutonavance, INPUT);               // met la broche 4 en entrée
monservo.attach(9);                         //servo relié a la broche 9
Serial.begin(57600);
Wire.begin();                              //demarrage liaison série
}


void loop() {

DateTime now = RTC.now();

if((now.hour() == 17) && (now.minute() == 30) && (now.second() == 00))   //heure minutes seconde de declenchement: 12h30m00s
  
{  
for(int compteur = 0; compteur < 5; compteur++)   //permet d'exécuter 5 fois le code ci-dessous

{
 for (pos = 0; pos <= 180; pos += 1)  // va de 0° à 180° par pas de 1
   {
    monservo.write(pos);              // dit au servo de prendre la position 'pos'
    delay(50);                        // attendre 50ms pour servo arrive position
  }
  for (pos = 180; pos >= 0; pos -= 2)  // va de 180° à 0° par pas de 2
    {
      monservo.write(pos);              // dit au servo de prendre la position 'pos'
    delay(50);                         // attendre 50ms pour servo arrive position
  }
  for(int compteur = 0; compteur < 5; compteur++)    //permet d'exécuter 5 fois le code ci-dessous
{

  
digitalWrite(cloche, HIGH);                     //declenchement de la cloche via solenoide
 delay(100);
digitalWrite(cloche, LOW);                        
 delay(100);
}
}
}


// utilisation manuelle de la cloche

etatboutoncloche = digitalRead(boutoncloche);       // verification de l'état du boutoncloche
if(etatboutoncloche == HIGH)                                   // enclenchement du bouton cloche
for(int compteur = 0; compteur < 5; compteur++)    //permet d'exécuter 5 fois le code ci-dessous
{
digitalWrite(cloche, HIGH);                     //declenchement de la cloche via solenoide
 delay(100);
digitalWrite(cloche, LOW);                        
 delay(100);
}


// avance manuelle
etatboutonavance = digitalRead(boutonavance);       // verification de l'état du boutonavance
if(etatboutonavance == HIGH)                       // enclenchement du bouton avance
{  
for(int compteur = 0; compteur < 5; compteur++)   //permet d'exécuter 5 fois le code ci-dessous

{
 for (pos = 0; pos <= 180; pos += 1)  // va de 0° à 180° par pas de 1
   {
    monservo.write(pos);              // dit au servo de prendre la position 'pos'
    delay(50);                       // attendre 50ms pour servo arrive position
  }
  for (pos = 180; pos >= 0; pos -= 2)  // va de 180° à 0° par pas de 2
    {
      monservo.write(pos);              // dit au servo de prendre la position 'pos'
    delay(50);                       // attendre 50ms pour servo arrive position
  }
}

}
}

Merci de vos avis,

Fada34:
...
Le grand principe serait de déplacer des récipients contenant la dose quotidienne via un servomoteur (je pense que 5 rotations du servo devrait suffire pour une dose).

Je voudrais programmer une horaire fixe à laquelle se déclenchera le nourrissage, dès que le déplacement du récipient sera terminé (5 mouvement du servo) un solénoïde (remplacé par une LED sur le schéma) tapera 5 fois sur le récipient pour s’assurer que les grillons tombent bien et cela servira aussi de signal sonore via une clochette sur ce même solénoïde.

Bonsoir
Explique un peu mieux la cinématique de ton "système" telle que que tu l'envisage :grin:

AMHA , il y a peut être(surement) moyen de simplifier un peu mécaniquement ton "usine à gaz" 8)

J’avance encore un peu la construction et vous post quelques photos demain.
Le principe est un carrousel en canette de coca dont la rotation est effectuée via le servo: chaque aller retour du servo fera avancer le carrousel de 1/32eme de tour, chaque 1/8 de tour, une des 8 canette sera en position pour que les grillons tombent...
J'aurai pu partir sur un moteur pap mais techniquement je le sentais moins...

Fada34:
J’avance encore un peu la construction et vous post quelques photos demain.
Le principe est un carrousel en canette de coca dont la rotation est effectuée via le servo: chaque aller retour du servo fera avancer le carrousel de 1/32eme de tour, chaque 1/8 de tour, une des 8 canette sera en position pour que les grillons tombent...
J'aurai pu partir sur un moteur pap mais techniquement je le sentais moins...

Bonsoir
Ok
J'imagine déjà un peu mieux ta mecanique :grin:

Post qq photos , c'est tours plus facile de reflechir "avec de la matiére"

Voici donc quelques photos de mon futur distributeur à grillons:

Il est constitué d'un seau avec dans sa partie basse une demi bouteille pour servir d'entonnoir et guider les grillons jusqu'au terrarium:

à l’intérieur, vers la moitié, il y a un disque en bois avec une ouverture donnant vers l’entonnoir/bouteille:

au dessus est disposé une roue avec 8 trou correspondants aux 8 canettes utilisées pour le stockage des grillons:

sur le dessous de cette roue, il y a 32 encoches collées:

Le système permettant au servo de faire avancer la roue:

J'y connais rien... mais si vous mettez plein directement dans le terrarium "8 doses" de grillons, votre lézard va se morfaler et tout attraper en une fois et ne rien laisser pour plus tard?

il ne faut pas mettre tout les grillons pour 2 raisons principales:

  • les pogonas sont de vrai morfales surtout jeunes: en 2 jours max il n'y aura plus rien
  • il ne faut en principe pas laisser de grillons en liberté dans le terrarium car ils peuvent s'attaquer au lézard quand il dors (c'est vorace les grillons !)

OK -> alors c'est une bonne idée de sortir l'Arduino :slight_smile:

Bonjour,
Pas beaucoup de commentaires sur mon bout de code :confused: ...

Ayant fait quelques légères modifs (4 cycles de servo au lieu de 5, déplacement de certaines accolades pour ne pas faire sonner la cloche a chaque avance du servo), je repost le code:

#include <Servo.h>
#include <Wire.h>
#include <DS3231.h>

Servo monservo;                //création de l'objet Servo
int pos = 0;                  // mettre le servo en position initiale
RTClib RTC;                    // utile pour heure ???
const int cloche = 2;          // la clochette est sur la broche 2
const int boutoncloche = 3;    // le bouton clochette est sur la broche 3
const int boutonavance = 4;     // le bouton avance est sur la broche 4
int etatboutoncloche;
int etatboutonavance;

void setup() {
  
pinMode(cloche, OUTPUT);                    // met la broche 2 en sortie
pinMode(boutoncloche, INPUT);               // met la broche 3 en entrée
pinMode(boutonavance, INPUT);               // met la broche 4 en entrée
monservo.attach(9);                         //servo relié a la broche 9
Serial.begin(57600);
Wire.begin();                              //demarrage liaison série
}


void loop() {

DateTime now = RTC.now();

if((now.hour() == 17) && (now.minute() == 30) && (now.second() == 00))   //heure minutes seconde de declenchement: 12h30m00s
  
{  
for(int compteur = 0; compteur < 4; compteur++)   //permet d'exécuter 4 fois le code ci-dessous

{
 for (pos = 0; pos <= 180; pos += 1)  // va de 0° à 180° par pas de 1
   {
    monservo.write(pos);              // dit au servo de prendre la position 'pos'
    delay(50);                        // attendre 50ms pour servo arrive position
  }
  for (pos = 180; pos >= 0; pos -= 2)  // va de 180° à 0° par pas de 2
    {
      monservo.write(pos);              // dit au servo de prendre la position 'pos'
    delay(50);                         // attendre 50ms pour servo arrive position
  }

}
  for(int compteur = 0; compteur < 5; compteur++)    //permet d'exécuter 5 fois le code ci-dessous
{
digitalWrite(cloche, HIGH);                     //declenchement de la cloche via solenoide
 delay(100);
digitalWrite(cloche, LOW);                        
 delay(100);
}
}


// utilisation manuelle de la cloche

etatboutoncloche = digitalRead(boutoncloche);       // verification de l'état du boutoncloche
if(etatboutoncloche == HIGH)                        // enclenchement du bouton cloche
for(int compteur = 0; compteur < 5; compteur++)    //permet d'exécuter 5 fois le code ci-dessous
{
digitalWrite(cloche, HIGH);                     //declenchement de la cloche via solenoide
 delay(100);
digitalWrite(cloche, LOW);                        
 delay(100);
}


// avance manuelle
etatboutonavance = digitalRead(boutonavance);       // verification de l'état du boutonavance
if(etatboutonavance == HIGH)                       // enclenchement du bouton avance
{  
for(int compteur = 0; compteur < 4; compteur++)   //permet d'exécuter 4 fois le code ci-dessous

{
 for (pos = 0; pos <= 180; pos += 1)  // va de 0° à 180° par pas de 1
   {
    monservo.write(pos);              // dit au servo de prendre la position 'pos'
    delay(50);                       // attendre 50ms pour servo arrive position
  }
  for (pos = 180; pos >= 0; pos -= 2)  // va de 180° à 0° par pas de 2
    {
      monservo.write(pos);              // dit au servo de prendre la position 'pos'
    delay(50);                       // attendre 50ms pour servo arrive position
  }
}

}
}

Je ne peux pas tester ce code complet dans tinkercad car la librairie du RTC n'est pas présente.
Par contre en enlevant la partie "horloge" cela fonctionne mais mon solénoïde semble s’initialiser à 90° au lieu de 0°... bizarre je lui dit pourtant: int pos = 0; pour mettre le servo en position initiale.

Si vous avez des pistes ... Merci

appuyez sur ctrl-T dans l'éditeur de code Arduino avant de copier le code pour poster... ce sera indenté et on y verra quelque chose...

si vous voulez mettre votre servo à la position de départ, il faut le dire dans le setup() --> rajoutez un monservo.write(pos); à la fin du setup

Ok pour le formatage du code avant de le copier.

J'ai bien dis au servo de se mettre en position initiale et nickel le servo se positionne bien dés le départ.

Merci,

#include <Servo.h>
#include <Wire.h>
#include <DS3231.h>

Servo monservo;                //création de l'objet Servo
int pos = 0;                  // valeur initiale de la variable "pos" du servo
RTClib RTC;                    // utile pour heure ???
const int cloche = 2;          // la clochette est sur la broche 2
const int boutoncloche = 3;    // le bouton clochette est sur la broche 3
const int boutonavance = 4;     // le bouton avance est sur la broche 4
int etatboutoncloche;
int etatboutonavance;

void setup() {

  pinMode(cloche, OUTPUT);                    // met la broche 2 en sortie
  pinMode(boutoncloche, INPUT);               // met la broche 3 en entrée
  pinMode(boutonavance, INPUT);               // met la broche 4 en entrée
  monservo.attach(9);                         //servo relié a la broche 9
  monservo.write(pos);                        // met le servo en position initiale
  Serial.begin(57600);
  Wire.begin();                              //demarrage liaison série
}


void loop() {

  DateTime now = RTC.now();

  if ((now.hour() == 17) && (now.minute() == 30) && (now.second() == 00))  //heure minutes seconde de declenchement: 12h30m00s

  {
    for (int compteur = 0; compteur < 4; compteur++)  //permet d'exécuter 4 fois le code ci-dessous

    {
      for (pos = 0; pos <= 180; pos += 1)  // va de 0° à 180° par pas de 1
      {
        monservo.write(pos);              // dit au servo de prendre la position 'pos'
        delay(50);                        // attendre 50ms pour servo arrive position
      }
      for (pos = 180; pos >= 0; pos -= 2)  // va de 180° à 0° par pas de 2
      {
        monservo.write(pos);              // dit au servo de prendre la position 'pos'
        delay(50);                         // attendre 50ms pour servo arrive position
      }

    }
    for (int compteur = 0; compteur < 5; compteur++)   //permet d'exécuter 5 fois le code ci-dessous
    {
      digitalWrite(cloche, HIGH);                     //declenchement de la cloche via solenoide
      delay(100);
      digitalWrite(cloche, LOW);
      delay(100);
    }
  }


  // utilisation manuelle de la cloche

  etatboutoncloche = digitalRead(boutoncloche);       // verification de l'état du boutoncloche
  if (etatboutoncloche == HIGH)                       // enclenchement du bouton cloche
    for (int compteur = 0; compteur < 5; compteur++)   //permet d'exécuter 5 fois le code ci-dessous
    {
      digitalWrite(cloche, HIGH);                     //declenchement de la cloche via solenoide
      delay(100);
      digitalWrite(cloche, LOW);
      delay(100);
    }


  // avance manuelle
  etatboutonavance = digitalRead(boutonavance);       // verification de l'état du boutonavance
  if (etatboutonavance == HIGH)                      // enclenchement du bouton avance
  {
    for (int compteur = 0; compteur < 4; compteur++)  //permet d'exécuter 4 fois le code ci-dessous

    {
      for (pos = 0; pos <= 180; pos += 1)  // va de 0° à 180° par pas de 1
      {
        monservo.write(pos);              // dit au servo de prendre la position 'pos'
        delay(50);                       // attendre 50ms pour servo arrive position
      }
      for (pos = 180; pos >= 0; pos -= 2)  // va de 180° à 0° par pas de 2
      {
        monservo.write(pos);              // dit au servo de prendre la position 'pos'
        delay(50);                       // attendre 50ms pour servo arrive position
      }
    }

  }
}

Fada34:
Ok pour le formatage du code avant de le copier.

...
Bonsoir
Vu tes photos

qq questions :

  • une "dose " de grillons "prêt à être bouffés" :grin: çà représente quoi en terme de :
    -- volume
    -- nb individus ?
  • quand le pogona est jeune (6 premiers mois) il a besoin de 10 a 20 grillons de taille moyenne (1cm) par jour (si possible en 2 repas)
  • puis une douzaine en taille adulte (2cm) quotidiennement jusqu’à ses 1 an
  • ensuite après 1 an, il mange des végétaux a 80 % et une douzaine de grillons par semaine seulement.

Wow c'est un carnage !!

Oui c'est assez goulu :smiley:
je les achète par 500 en plus de mon petit élevage perso