Pages: [1]   Go Down
Author Topic: Porte poulailler automatisé (Arduino+RTC+Ardumoto sheild+switch) [presque fini]  (Read 378 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 1
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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:
#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 (1312.34 KB, 2560x1536 - viewed 92 times.)
« Last Edit: August 03, 2014, 10:43:40 am by MrFOX » Logged

Offline Offline
Full Member
***
Karma: 2
Posts: 105
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Pages: [1]   Go Up
Jump to: