Go Down

Topic: Porte poulailler automatisé (Arduino+RTC+Ardumoto sheild+switch) [presque fini] (Read 712 times) previous topic - next topic

MrFOX

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.




Code: [Select]
#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 ?


Code: [Select]
#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);
}


jean-I

- 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.

Go Up