Voici mon travail concernant un distributeur de croquettes avec un arduino one et un servo, le servo fait tomber environ 100 g de croquettes pour mes trois chats et cela 2 fois par jours à 8h00 et à 18h00 .
Pour cela j'ai après plusieurs essais infructueux utilisé une boite de whisky métallique, ouverte à la dremel en partie haute pour former une trémie et j'ai utilisé le couvercle en partie basse (avec une découpe latérale)pour faire tomber les coquettes grâce au servo.
Je tiens à remercie toutes les personnes du forum qui m'ont aidé à mener à bien ce projet, c'est ma première réalisation je débute en arduino à 46 ans. (Je suis autodidacte en électronique, informatique et modélisme).
VIDEO DU DISTRIBUTEUR DE CROQUETTES
#include <Servo.h>
#include <DS3231.h>
#include <Wire.h>
DS3231 clock;
RTCDateTime dt;
Servo myservo;
int pos = 0; // variable pour la position 0 du servo
int b;
int bp = 2; // un bouton poussoir sur la borne (2)
// schema : (-) -------[R 10 Kohm]--------O BP O------------ (+)
// (2)--------------------------/
void setup() {
// initialise les leds aux pin 12 et 13 en sorties.
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
Serial.begin(9600); // lecture sur interface serie
myservo.attach(9); // entree servo sur borne (9)
myservo.write(pos); // positionne le servo à zéro
pinMode(bp, INPUT); // broche (2) en entrée pour le bouton poussoir
clock.begin();
// Mise a zero alarmes
clock.armAlarm1(false);
clock.armAlarm2(false);
clock.clearAlarm1();
clock.clearAlarm2();
// pour le reglage manuel de la date et heure (Year, Month, Day, Hour, Minute, Second)
// enlever les // devant clock ci dessous
//clock.setDateTime(2015, 11, 30, 16, 02, 00);
// Manual (YYYY, MM, DD, HH, II, SS
// heures de la journee pour le declenchement des cycles de distribution
// une alarme à9H00 le matin et une a 18h00 le soir
// setAlarm1(Date or Day, Hour, Minute, Second, Mode, Armed = true)
clock.setAlarm1(0, 8, 00, 00, DS3231_MATCH_H_M_S);//MATCH_H_M_S ===> seconde, minute, heure et jour de la semaine
clock.setAlarm2(0, 18, 00, DS3231_MATCH_H_M); //MATCH_M ===> minute, heure et jour de la semaine
// prise en compte alarme
checkAlarms();
}
void checkAlarms()
{
RTCAlarmTime a2;
RTCAlarmTime a1;
if (clock.isArmed1())
{
a1 = clock.getAlarm1();
Serial.print("Alarme 1 declenchee ");
switch (clock.getAlarmType1())
{
case DS3231_MATCH_H_M_S:
Serial.print("Quand il sera : ");
Serial.println(clock.dateFormat(" H:i:s", a1));
break;
}
} else
{
Serial.println("Alarm1 is disarmed.");
//////////////////////////////////////////////////////////////////
if (clock.isArmed2())
{
a2 = clock.getAlarm2();
Serial.print("Alarme 2 declenchee ");
switch (clock.getAlarmType2())
{
case DS3231_MATCH_H_M_S:
Serial.print("Quand il sera : ");
Serial.println(clock.dateFormat(" H:i:s", a2));
break;
}
} else
{
Serial.println("Alarm2 is disarmed.");
}
delay (1000);
//*******************************************************************
}
}
void loop() {
digitalWrite(13, HIGH); // turn the LED on (HIGH is the voltage level)
delay(30); // wait for a second
digitalWrite(13, LOW); // turn the LED off by making the voltage LOW
delay(30); // wait for a second
digitalWrite(12, HIGH); // turn the LED on (HIGH is the voltage level)
delay(10); // wait for a second
digitalWrite(12, LOW); // turn the LED off by making the voltage LOW
delay(10); // wait for a second
dt = clock.getDateTime();
Serial.println(clock.dateFormat("d-m-Y H:i:s - l", dt));
if (clock.isAlarm1())
{
distribution ();
Serial.println("ALARM 1 DECLENCHEE DONC DISTRIBUTION!");
}
//*********************************************************************
if (clock.isAlarm2())
{
distribution ();
Serial.println("ALARM 2 DECLENCHEE DONC DISTRIBUTION!");
}
delay(1000);
//*******************************************************************
//distribution manuelle
if ( digitalRead(bp) == HIGH) {
delay(30);
distribution ();
delay(100);
}
}
void distribution() {
// GESTION DU SERVO SUR SORTIE (9)
for (int i = 0; i <= 5; i++) // le chiffre 1 pour 2 cycles
for (pos = 0; pos <= 102; pos += 6) // va de 0 degrees a 190 degrees
{ // avec des pas de 1 degre
myservo.write(pos); // dit au servo d aller en position en fonction de la variable 'pos'
delay(40); // pause 15ms
}
for (pos = 102; pos >= -0; pos -= 8) // va de 190 degres a 0 degrees
{ // avec des pas de 4 degrees donc retour rapide
myservo.write(pos); // dit au servo d aller en position en fonction de la variable 'pos'
delay(10); // pause 15ms
}
}









