Porte poulailler automatisé (Arduino+RTC+Ardumoto sheild+switch) [presque fini]

Bonjour!

Mon projet consiste à automatiser l'ouverture de mon poulailler . Le matin la porte s'ouvre et le soir elle se ferme a une heure programmé.

La "porte" est en réalité un velux. Il y a un poid à l'exterieur qui force le velux à s'ouvrir, à l'interieur du poulailler un moteur DC équipé d'un petit pignon tracte une chaine de velo qui est attaché au velux.

#include <Wire.h>
#include "RTClib.h" 
#include <Time.h>
#include <TimeAlarms.h>
RTC_DS1307 RTC;
int pwm_b = 11;
int dir_b = 13;
time_t syncProvider()     
{
 return RTC.now().unixtime();
}
void setup()
{
  Serial.begin(9600);
  Wire.begin();
  RTC.begin();
  if (! RTC.isrunning()) 
  {
   Serial.println("RTC is NOT running!");
   //RTC.adjust(DateTime(__DATE__, __TIME__));
  }

  setSyncProvider(syncProvider);
  pinMode(pwm_b, OUTPUT);
  pinMode(dir_b, OUTPUT);
  // create the alarms 
  Alarm.alarmRepeat(13,42,0, MorningAlarm); //horaires test
  Alarm.alarmRepeat(13,42,20,EveningAlarm); 
}

void  loop(){  
  digitalClockDisplay();
  Alarm.delay(1000); // wait one second between clock display
}

// functions to be called when an alarm triggers:
void MorningAlarm(){
  Serial.println("ouverture");
  digitalWrite(dir_b, HIGH);
  analogWrite(pwm_b, 225);
  delay(4000);
  analogWrite(pwm_b, LOW);  
}

void EveningAlarm(){
  Serial.println("fermeture");
  digitalWrite(dir_b,LOW);
  analogWrite(pwm_b, 225);
  delay(4500);
 analogWrite(pwm_b, LOW); 
}

void digitalClockDisplay()
{
  // digital clock display of the time
  Serial.print(hour());
  printDigits(minute());
  printDigits(second());
  Serial.println(); 
}

void printDigits(int digits)
{
  Serial.print(":");
  if(digits < 10)
    Serial.print('0');
  Serial.print(digits);
}

J'ai réussi sauf que la fermeture demande plus d'effort au moteur. Demander au moteur de tourner plus longtemps que pendant l'ouverture n'est pas une solution, c'est alors que j'ai pensé a des switch de fin de course pour etre sur que la porte soit bien fermé.

Mes 2 switchs sont en série, je posterais le schema complet prochainement.

Mais voila que je n'arrive pas à coder le tout.

une idée? un conseil ?

#include <Wire.h>
#include "RTClib.h" 
#include <Time.h>
#include <TimeAlarms.h>
RTC_DS1307 RTC;
int pwm_b = 11;
int dir_b = 13;
int sw1 = 6;
int sw2 = 7;
time_t syncProvider()     
{
 return RTC.now().unixtime();
}
////////////////////////////////////////////////
void setup()
{
  Serial.begin(9600);
  Wire.begin();
  RTC.begin();
  if (! RTC.isrunning()) 
  {
   Serial.println("RTC is NOT running!");
   //RTC.adjust(DateTime(__DATE__, __TIME__));
  }
  setSyncProvider(syncProvider);

  pinMode(pwm_b, OUTPUT);
  pinMode(dir_b, OUTPUT);
  pinMode(sw1, INPUT);  
  pinMode(sw2, INPUT);

  Alarm.alarmRepeat(12,17,0, MorningAlarm);
  Alarm.alarmRepeat(12,18,0,EveningAlarm); 
}
//////////////////////////////////////////////////////////////////////////////
void  loop(){  
  digitalClockDisplay();
  Alarm.delay(1000);
////////////////////////////////////////
void MorningAlarm(){
  Serial.println("ouverture");
  while(digitalRead(sw1) == LOW){
  digitalWrite(dir_b, HIGH);
  analogWrite(pwm_b, 225);
  }  
}
/////////////////////////////////////////////////
void EveningAlarm(){
  Serial.println("fermeture");
  while(digitalRead(sw2) == LOW){
  digitalWrite(dir_b, HIGH);
  analogWrite(pwm_b, 225);
  } 
}
////////////////////////////////////////////////
void digitalClockDisplay()
{
  Serial.print(hour());
  printDigits(minute());
  printDigits(second());
  Serial.println(); 
}

void printDigits(int digits)
{
  Serial.print(":");
  if(digits < 10)
    Serial.print('0');
  Serial.print(digits);
}

20140803_172103[1].jpg

  • si tes deux switch sont en serie, je ne voit pas comment tu pourrai avoir les entrées sw1 et sw2 discossiées.
  • tu as cablé les switch en NC.
  • il te manque une fermeture de parenthese dans ton void loop.
  • tu n'arrete pas la sortie pwm apres la detection FDC.