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,