controle tension de sortie

Un shield de pilotage pour 4 moteurs à courant continu ou 2 moteurs pas à pas, qui permet une alimentation sur 12V et qui n'utilise que 4 sorties Pwm (sur 6) et 2 entrées analogiques (sur 6) de l'Arduino

controle tension de sortie

Message non lude nonos » Mer 17 Aoû 2011 17:41

bonjour,
si je comprends bien le principe de fonctionnement (reste a voir)
on fait varier la vitesse des moteurs, en modifiant par pwm la durée d'alimentation du moteur, sorte de microcoupure , plus ces coupures sont frequentes plus le moteur ralentie...
je voudrai savoir comment definir une tension de sortie max?
j'aurai besoin d'une tension de 10v
je suppose qu'il faudra une alimentation externe a l'arduino, mais faut il que cette tension soit de 10v exactement ou peut on la parametrer dans le code a partir d'une alimentation plus importante (12v).

j'explique mon projet.
en fait je souhaite detourner l'utilisation de la carte prevue a l'origine pour le controle de moteur, pour piloter un driver de led controlable par pwm. pour ce faire j'ai besoin d'une alimentation de 10v en dc.
merci
nonos
 
Messages: 15
Inscription: Mer 17 Aoû 2011 17:26

Re: controle tension de sortie

Message non lude fred » Mer 17 Aoû 2011 19:25

Bonjour,
Avez-vous regardé l'un de nos autres produits, le I2C Power Protoshield (lien) qui permet de disposer d'une ligne 12V via une alimentation externe sur la prise Molex et fonctionne, entre autre, avec un driver de led développé en interne (lien) ?
Fred.
Avatar de l’utilisateur
fred
 
Messages: 213
Inscription: Lun 20 Déc 2010 15:32
Localisation: Toulouse

Re: controle tension de sortie

Message non lude nonos » Jeu 18 Aoû 2011 09:21

bonjour
merci pour votre reponse, oui j'avais vu ces differents produits....j'ai hésité..et finallement j'ai choisis le rotoshield...
si je n'arrive pas a mes fins j'essaierai les autres.
je n'ai besoin que de 4 sorties pwm pour piloter des driver de led ( mean well eln-60-48p http://www.meanwell.com/search/eln-60/default.htm de haute puissance (12 cree xp-g 3w par driver ) et ces 4 sorties doivent etre de 10v exactement.
sur le descriptif j'ai vu que le rotoshield permet le pilotage de moteurs de 4.5VDC à 20VDC, donc a priori c'est possible d'avoir une sortie de 10v et c'est la que je ne sais pas comment faire.
soit je branche sur le bornier a 2 points "ext. power 5/18v" une arrivée de 10v et j'aurai mon pilotage en 10v (ceci me demande un bricolage pour adapter mon alimentation externe de 12v en 10v, faisable mais si je peux m'en passer ce ne serai que mieux)
soit je branche sur ce meme bornier une arrivée 12v et la tension de sortie peut etre ajustée par un autre moyen (comme dans le code par exemple ).
autre question si je branche une alimentation externe sur le rotoshield, est ce que celle ci alimentera aussi la carte arduino, ou faut il une alimentation séparée pour les 2 cartes?

merci
nonos
 
Messages: 15
Inscription: Mer 17 Aoû 2011 17:26

Re: controle tension de sortie

Message non lude Lionel » Lun 22 Aoû 2011 10:06

Bonjour,

A la lecture des spécifications de votre équipement, il semblerait que le rotoshield puisse faire l'affaire dans votre application
mais c'est sur le papier, a tester donc

Pour répondre a vos questions
Avec le rotoshield, vous allez transmettre une PWM (ou MLI) comprise entre 0 et la tension branchée sur M+ (ext power 5/18V)
Donc il faut que vous mettiez 10V seulement en tension d'alimentation si vous ne voulez pas dépasser 10V.

Sur le rotoshield, la ligne d'alimentation moteur M+ (ext power 5/18V) et la ligne d'alimentation des circuits logiques +5V sont séparées.
C'est impératif pour ne pas être trop perturbé lorsqu'on utilise la carte avec des moteurs par les parasites qu'ils génèrent en fonctionnement.
La ligne d'alimentation moteur M+ (ext power 5/18V) du rotoshield n'alimente donc pas l'arduino.

Pour votre application -si vous voulez continuer a utiliser le rotoshield- il serait néanmoins assez simple de faire quelque chose dans ce gout :
Ca alimentera la ligne M+ en 10V (grâce au régulateur 7810) et l'arduino en même temps, d'une pierre deux coups :)

xatx_10v_rotoshield.jpg
xatx_10v_rotoshield.jpg (41.67 Kio) Vu 7008 fois


Bon courage,

Lionel
Image - Distributeur officiel Arduino - Conception de shields
Avatar de l’utilisateur
Lionel
 
Messages: 734
Inscription: Mar 21 Déc 2010 09:52
Localisation: Toulouse

Re: controle tension de sortie

Message non lude nonos » Mar 23 Aoû 2011 08:39

merci lionel de ta reponse...
il me semblait bien que c'etait possible mais j'ai encore quelques questions...
avec ton montage les 10v je ne vais les retrouver que entre M+ et gnd ou vais je aussi les trouver aux bornes de m1, m2,m3,m4 et gnd ? je pensais passer par un lm317 pour obtenir les 10v...mais le principe reste a peu pres le meme
j'ai cherché sur le site des exemples de codes pour le controle de la tension dc en pwm mais il n'y a pas grand chose, sais tu quel code faut il utiliser pour faire varier la tension de sortie avec le temps? on trouve des exemples pour controler avec un joystic ou bouton mais pas pour controler avec le temps
puis utiliser la fonction M1.setSpeed(exemplem1pwm) dans void loop() au lieu de void setup ? avec exemplem1pwm comme variable defini au préalable pour controler cette tension de sortie?
merci
nonos
 
Messages: 15
Inscription: Mer 17 Aoû 2011 17:26

Re: controle tension de sortie

Message non lude Lionel » Mar 23 Aoû 2011 09:05

nonos a écrit:avec ton montage les 10v je ne vais les retrouver que entre M+ et gnd ou vais je aussi les trouver aux bornes de m1, m2,m3,m4 et gnd ?

En faisant ça tu vas retrouver les 10V entre M+ & GND.
La tension (en PWM) présente en m1, m2, m3 & m4 sera fonction du paramètre de vitesse dans M1.setSpeed(vitesse) avec vitesse entre 0 et 255

nonos a écrit:j'ai cherché sur le site des exemples de codes pour le controle de la tension dc en pwm mais il n'y a pas grand chose, sais tu quel code faut il utiliser pour faire varier la tension de sortie avec le temps? on trouve des exemples pour controler avec un joystic ou bouton mais pas pour controler avec le temps

Je vais publier quelques exemples de code hyper simplifié pour les moteurs DC
Mais il suffit de faire varier le paramètre de vitesse dans M1.setSpeed(vitesse) dans le loop pour changer celle ci

nonos a écrit:puis utiliser la fonction M1.setSpeed(exemplem1pwm) dans void loop() au lieu de void setup ? avec exemplem1pwm comme variable defini au préalable pour controler cette tension de sortie?
merci

Oui c'est tout à fait ça.
Image - Distributeur officiel Arduino - Conception de shields
Avatar de l’utilisateur
Lionel
 
Messages: 734
Inscription: Mar 21 Déc 2010 09:52
Localisation: Toulouse

Re: controle tension de sortie

Message non lude nonos » Mar 23 Aoû 2011 09:15

merci, je vais tester....
nonos
 
Messages: 15
Inscription: Mer 17 Aoû 2011 17:26

Re: controle tension de sortie

Message non lude nonos » Mar 23 Aoû 2011 09:54

je suppose qu il doit y avoir des erreurs, mais c'est juste pour essayer de bidouiller un code....

#include <Wire.h>
#include <snootor.h>

SnootorDC M1;
SnootorDC M2;
SnootorDC M3;
SnootorDC M4;
void setup(){
Serial.begin(115200);
Wire.begin();
M1.init(2);
M2.init(1);
M1.init(4);
M2.init(3);

}

void loop() {

M1.setSpeed(0);
M2.setSpeed(0);

M3.setSpeed(255);
M4.setSpeed(0);

}
nonos
 
Messages: 15
Inscription: Mer 17 Aoû 2011 17:26

Re: controle tension de sortie

Message non lude Lionel » Mar 23 Aoû 2011 09:56

En version minimaliste avec deux moteurs, ça peut donner plutôt ça :

Code: Tout sélectionner
// Ajout des librairies necessaires

#include <Wire.h>
#include <snootor.h>

// Declaration des moteurs
SnootorDC M1;
SnootorDC M2;

// initialisation
void setup(){
  Wire.begin();
  M1.init(1);
  M2.init(2);
}


// boucle programme principal
void loop(){
  M1.setSpeed(255); // réglage vitesse Moteur 1
  M1.run(FORWARD); // mise en marche moteur 1 en avant

  M2.setSpeed(255); // réglage vitesse Moteur 2
  M2.run(FORWARD); // mise en marche moteur 2 en avant

  delay(2000); // pause de deux secondes

  M1.setSpeed(255); // réglage vitesse Moteur 1
  M1.run(BACKWARD);// mise en marche moteur 1 en arrière

  M2.setSpeed(255);// réglage vitesse Moteur 2
  M2.run(BACKWARD);// mise en marche moteur 2 en arrière

  delay(2000); // pause de deux secondes
 }


Mais les vitesses sont fixes dans ce cas, les deux moteurs vont a fond dans un sens, puis a fond dans l'autre (séquence d'avance/recul avec pause de deux secondes entre les changements de sens)
Image - Distributeur officiel Arduino - Conception de shields
Avatar de l’utilisateur
Lionel
 
Messages: 734
Inscription: Mar 21 Déc 2010 09:52
Localisation: Toulouse

Re: controle tension de sortie

Message non lude nonos » Mar 23 Aoû 2011 13:06

je reprends ton code en ajoutant 2 moteurs donc 4 au total, et les faisant tourner a fond pendant 5s puis stopper 5 sec

// Ajout des librairies necessaires

#include <Wire.h>
#include <snootor.h>


// Declaration des moteurs
SnootorDC M1;
SnootorDC M2;
SnootorDC M3;
SnootorDC M4;

// initialisation
void setup(){

Wire.begin();
M1.init(1);
M2.init(2);
M3.init(3);
M4.init(4);

}

// boucle programme principal
void loop() {

M1.setSpeed(255);
M1.run(FORWARD);

M2.setSpeed(255);
M2.run(FORWARD);

M3.setSpeed(255);
M3.run(FORWARD);

M4.setSpeed(255);
M4.run(FORWARD);

delay(5000); // pause de 5 secondes

M1.stop();
M2.stop();
M3.stop();
M4.stop();

delay(5000); // pause de 5 secondes
}


le code fonctionne , les moteurs démarrent puis s’éteignent pendant 5 sec.
mais je ne comprends pas quelque chose.

j'ai branché le 10v, (10,35v exactement) et soudé le jumper, et je retrouve bien mon 10,35v entre m+ et gnd.
lorsque la vitesse est déterminée sur 255 ( M2.setSpeed(255); ) je devrai retrouver mes 10,35v aux bornes de m2
alors que la je n'obtiens que 8,49v (quelque soit le moteur choisi avec setspeed sur 255)
la carte "consomme" t elle une partie pour ses besoins?
ou alors 255 n'est pas la valeur maximale
merci
nonos
 
Messages: 15
Inscription: Mer 17 Aoû 2011 17:26

Re: controle tension de sortie

Message non lude seb03000 » Mar 23 Aoû 2011 13:47

Bonjour nonos la valeur maximal et belle et bien 255 max pour les servo ( Moteur )
Image

Voici mon chatterbot Jarvise Agent de conversation une IA
http://jarvise.atspace.cc/
Avatar de l’utilisateur
seb03000
 
Messages: 104
Inscription: Mer 17 Aoû 2011 15:03
Localisation: Auvergne

Re: controle tension de sortie

Message non lude Lionel » Mar 23 Aoû 2011 16:10

Re-

Oui après vérification, le composant L293DNE absorbe bien une partie de la tension,
La datasheet indique Vcc2-1.8V donc (M+)-1.8V

Donc, le LM317 était un bon choix, puisque vous allez pouvoir régler la tension d'alimentation un poil au dessus.

Cependant, je ne peux pas affirmer que le rotoshield fera l'affaire hein ?
Il n'a pas été conçu pour ça ;)

Mais tentons, tentons :)
Image - Distributeur officiel Arduino - Conception de shields
Avatar de l’utilisateur
Lionel
 
Messages: 734
Inscription: Mar 21 Déc 2010 09:52
Localisation: Toulouse

Re: controle tension de sortie

Message non lude nonos » Mar 23 Aoû 2011 17:04

alors resultats des tests "hardware"...
roulement de tambours....

ca marche!!!!!

et je n'ai meme pas besoin de lm317!!!
je recapitule donc...
je branche le 12v (en fait 11,98v) sur le rotoshield, soudure du pont....
j'obtiens 12v sur m+ et ground.....et 9.97v en sortie lorsque on entre comme valeur M1.setSpeed(255);
le driver de led se pilote entre 0 et 10v...
il faut ensuite reperer le + et le - du bornier du rotoshield, brancher le + sur le dimm+ (fil bleu) et le moins sur le dimm - (fil blanc)
et en avant....je peux ainsi regler l'intensité de mes leds de haute puissance...
il ne reste plus qu' a faire le code (facile a dire) pour faire varier cette intensité dans le temps....

quel est le but de tout ca me demanderiez-vous?
mon projet est une gallerie d'eclairage led pour mon aquarium avec simulation de lever/coucher de soleil (pas un simple ON/OFF) d'ou l'utilisation de 4 drivers partie gauche s'eclaire progressivement en premier,puis le milieu,puis à droite et le dernier pour une simulation de lune et augmenter l'eclairage global en pleine journée....
et il existe des systemes de contrôle a base d'arduino, mais la partie hardware est fastidieuse et aleatoire dans les forums il existe un concensus pour :
faire tomber la tension d'alimentation de 12 a 10v (d'ou le lm317 pas necessaire ici) et on controle la tension via le pwm par l'utilisation d'un transistor 2N2222 npn, plus de multiples resistances, a souder sur un support non prevu pour ca a la base...
ici on branche son alim classique, on soude le pont, on entre le code dans l'arduino est c'est tout....
je pense que votre rotoshield peut trouver un nouveau debouché dans le monde de l'aquariophilie (chercher sur le net c'est la solution d'avenir)
merci pour votre aide passée...et a venir pour developper le code...
nonos
 
Messages: 15
Inscription: Mer 17 Aoû 2011 17:26

Re: controle tension de sortie

Message non lude Lionel » Mar 23 Aoû 2011 17:26

Cool 8-)

Content que le rotoshield aie trouvé une autre voie :)

N'hésitez pas a photographier votre montage pour nous le présenter en détails, et a venir nous reparler du code au besoin

Pour la simulation lune / soleil / lever / couché vous comptez utiliser une horloge RTC ?
Récupérer ces infos depuis le net ?
Les stocker en dur dans l'arduino et jouer avec les delay ?
Image - Distributeur officiel Arduino - Conception de shields
Avatar de l’utilisateur
Lionel
 
Messages: 734
Inscription: Mar 21 Déc 2010 09:52
Localisation: Toulouse

Re: controle tension de sortie

Message non lude nonos » Mar 23 Aoû 2011 19:53

je compte utiliser une horloge rtc
pour le reste c'est copier coller et readapter les codes trouver sur le net
mais comme je suis un débutant , c'est pas facile
j'ai trouvé un code a adapter c'est pas le plus facile mais je ne retrouve plus le code de base...
j'ai essayé d'adapter mais je bute dés le départ ,


[
// Set up RTC
#include "Wire.h"
#define DS1307_I2C_ADDRESS 0x68
#include <snootor.h>

// Declaration des moteurs
SnootorDC M1;
SnootorDC M2;
SnootorDC M3;
SnootorDC M4;


// RTC variables
byte second, rtcMins, oldMins, rtcHrs, oldHrs, dayOfWeek, dayOfMonth, month, year, psecond;


// LED variables (Change to match your needs)
byte bluePins[] = {9, 10, 11}; // pwm pins for blues
byte whitePins[] = {5, 6}; // pwm pins for whites

code originale


comment faire pour que bluepins envoie a l'utilisation de SnootorDC M1, SnootorDC M2;
SnootorDC M3; et non pas au port 9,10,11; et whitepins à SnootorDC M4; j'ai essayé byte bluePins[] = {M1,M2, M3}; // pwm pins for blues
byte whitePins[] = { M4}; // pwm pins for whites mais il y a une erreur lors de la compilation


j'ai aussi laissé sans touché, vu que M1, M2, M3,M4 renvoie par eux meme a ces meme ports..mais la rien ne se passe...


byte blueChannels = 3; // how many PWMs for blues (count from above)
byte whiteChannels = 2; // how many PWMs for whites (count from above)

byte blueMax = 255; // max intensity for Blue LED's.
byte whiteMax = 255; // max intensity for White LED's.

// Month Data for Start, Stop, Photo Period and Fade (based off of actual times, best not to change)

int daysInMonth[12] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; //Days in each month

int minMinuteStart[12] = {296, 321, 340, 357, 372, 389, 398, 389, 361, 327, 297, 285}; //Minimum start times in each month
int maxMinuteStart[12] = {320, 340, 356, 372, 389, 398, 389, 361, 327, 297, 285, 296}; //Max start time in each month

int minMinuteFade[12] = {350, 342, 321, 291, 226, 173, 146, 110, 122, 139, 217, 282}; //Minimum fade time in each month
int maxMinuteFade[12] = {342, 321, 291, 226, 173, 146, 110, 122, 139, 217, 282, 350}; //Max fade time in each month

int minMinuteStop[12] = {1126, 1122, 1101, 1068, 1038, 1022, 1025, 1039, 1054, 1068, 1085, 1108}; //minimum stop times each month
int maxMinuteStop[12] = {1122, 1101, 1068, 1038, 1022, 1025, 1039, 1054, 1068, 1085, 1108, 1126}; //maximum stop times each month

// Weather variables

/*int weather = 0;

int oktas[9] = {255, 239, 223, 207, 191, 175, 159, 143, 128}; // Cloud Values
int clearDays[12] = {15, 12, 20, 23, 28, 37, 43, 48, 51, 41, 29, 23};
int cloudyDays[12] = {60, 61, 62, 60, 64, 63, 68, 66, 63, 54, 52, 53};
int cloud1 = random(1,5);
int cloud2 = random(1,5);
*/
// Other variables.

int minCounter = 0; // counter that resets at midnight. Don't change this.
int fadeDuration = 0; // minutes to fade - calculated by map above
int ledStartMins = 0; // minute to start led’s - calculated by map above
int ledStopMins = 0; // minute to stop led’s - calculated by map above

/****** LED Functions ******/
/***************************/
//function to set LED brightness according to time of day
//function has three equal phases - ramp up, hold, and ramp down
byte setLed(int mins, // current time in minutes
byte ledPin, // pin for this channel of LEDs
int start, // start time for this channel of LEDs
//int period, // photoperiod for this channel of LEDs
int fade, // fade duration for this channel of LEDs
int stop, // stop time for this channel of LEDs
byte ledMax // max value for this channel
) {
byte ledVal = 0;
if (mins <= start || mins >= stop)
{
//this is when the LEDs are off, thus ledVal is 0;
ledVal = 0;
}
if (mins > start && mins <= start + fade)
{
//this is sunrise
ledVal = map(mins, start, start + fade, 0, ledMax);
}
if (mins > start + fade && mins < stop - fade)
{
ledVal = ledMax;
}
if (mins < stop && mins >= stop - fade)
{
//this is the sunset.
ledVal = map(mins, stop - fade, stop, ledMax, 0);
}
analogWrite(ledPin, ledVal);
j'ai remplacé analogWrite(ledPin, ledVal);

par
M1.setSpeed(ledVal);
M1.run(FORWARD);

M2.setSpeed(ledVal);
M2.run(FORWARD);

M3.setSpeed(ledVal);
M3.run(FORWARD);

M4.setSpeed(ledVal);
M4.run(FORWARD);





return ledVal;
}

/***** RTC Functions *******/
/***************************/
// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val)
{
return ( (val/10*16) + (val%10) );
}

// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
return ( (val/16*10) + (val%16) );
}

// 1) Sets the date and time on the ds1307
// 2) Starts the clock
// 3) Sets hour mode to 24 hour clock
// Assumes you're passing in valid numbers.
//void setDateDs1307(byte second, // 0-59
// byte minute, // 0-59
// byte hour, // 1-23
// byte dayOfWeek, // 1-7
// byte dayOfMonth, // 1-28/29/30/31
// byte month, // 1-12
// byte year) // 0-99
//{
// Wire.beginTransmission(DS1307_I2C_ADDRESS);
// Wire.send(0);
// Wire.send(decToBcd(second));
// Wire.send(decToBcd(minute));
// Wire.send(decToBcd(hour));
// Wire.send(decToBcd(dayOfWeek));
// Wire.send(decToBcd(dayOfMonth));
// Wire.send(decToBcd(month));
// Wire.send(decToBcd(year));
// Wire.endTransmission();
//}

// Gets the date and time from the ds1307
void getDateDs1307(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.send(0);
Wire.endTransmission();

Wire.requestFrom(DS1307_I2C_ADDRESS, 7);

*second = bcdToDec(Wire.receive() & 0x7f);
*minute = bcdToDec(Wire.receive());
*hour = bcdToDec(Wire.receive() & 0x3f);
*dayOfWeek = bcdToDec(Wire.receive());
*dayOfMonth = bcdToDec(Wire.receive());
*month = bcdToDec(Wire.receive());
*year = bcdToDec(Wire.receive());
}


void setup() {

// init I2C
Serial.begin(57600);
Wire.begin();


}

/***** Main Loop ***********/
/***************************/
void loop(){
getDateDs1307(&second, &rtcMins, &rtcHrs, &dayOfWeek, &dayOfMonth, &month, &year);

// Photo Period, Start Time, Fade Time Functions

ledStartMins = map(dayOfMonth, 1, daysInMonth[month-1], minMinuteStart[month-1], maxMinuteStart[month-1]); //LED Start time
fadeDuration = map(dayOfMonth, 1, daysInMonth[month-1], minMinuteFade[month-1], maxMinuteFade[month-1]); //LED Fade time
ledStopMins = map(dayOfMonth, 1, daysInMonth[month-1], minMinuteStop[month-1], maxMinuteStop[month-1]); // LED Stop tim

// LED State and Serial Print
if (psecond != second){
psecond = second;
// set LED states
minCounter = rtcHrs * 60 + rtcMins;
Serial.print("Current Minutes - ");
Serial.println(minCounter);
Serial.print("Start Time - ");
Serial.println(ledStartMins);
Serial.print("Fade - ");
Serial.print(fadeDuration);
Serial.println(" Minutes");
Serial.print("Stop Time - ");
Serial.println(ledStopMins);
update_leds();
}
delay(50);
}


void update_leds( void ){
int i;
byte ledVal;
for (i = 0; i < blueChannels; i++){
ledVal = setLed(minCounter, bluePins[i], ledStartMins, fadeDuration, ledStopMins, blueMax);
}
for (i = 0; i < whiteChannels; i++){
ledVal = setLed(minCounter, whitePins[i], ledStartMins, fadeDuration, ledStopMins, whiteMax);

}
}
nonos
 
Messages: 15
Inscription: Mer 17 Aoû 2011 17:26

Re: controle tension de sortie

Message non lude Lionel » Mar 23 Aoû 2011 20:19

Bonsoir,

a quoi devraient servir les leds bleues et blanches ?

est ce que le code vient d'ici ?
http://technology-flow.com/articles/aquarium-lights/

quelle horloge RTC utilisez vous ?
Image - Distributeur officiel Arduino - Conception de shields
Avatar de l’utilisateur
Lionel
 
Messages: 734
Inscription: Mar 21 Déc 2010 09:52
Localisation: Toulouse

Re: controle tension de sortie

Message non lude nonos » Mar 23 Aoû 2011 21:10

le code vient de cette adresse http://www.reefcentral.com/forums/showp ... tcount=234

je dispose d'une rampe led "homemade" faite de deux gros dissipateurs thermiques

cette rampe dispose de 3 regions principales:
12 led cree xp-g3w (blanches froides et chaudes), pilotés par un driver meanwell 60-48p (pwm 0-10v) dans le tiers gauche
12 led cree xp-g 3w (blanches froides et chaudes), pilotés par un driver meanwell 60-48p (pwm 0-10v) dans le tiers centre
12 led cree xp-g 3w (blanches froides et chaudes), pilotés par un driver meanwell 60-48p (pwm 0-10v) dans le tiers droit

9 led cree xr-e (bleus) reparties un peu partout par un driver meanwell 60-48p (pwm 0-10v)

je souhaite avoir le contrôle de la durée d’éclairage , de l'heure à laquelle se met en marche chaque regions, de la progressivité d'allumage/d'extinction (fade in/out)...(la composante passage nuageux aléatoire,ou simulation d'orage,etc...est trés secondaire)

la rampe s’éclaire doucement a gauche le reste étant éteint, l'intensité augmente mais faiblement ,puis la partie centrale commence a s’éclairer, a gauche l'intensité augmente suivi du centre....., puis la 3eme region s’éclaire et les 2 précédentes augmente....
lorsque toutes les régions sont sur l'intensité max, au milieu de la journée, les leds bleus s’éclairent,---->simulation levé de soleil
puis inversion jusqu' a l'extinction de la rampe----->simulation couché de soleil
une fois tout éteint les bleus se rallument mais doucement pour simuler la lune pendant une partie de la nuit.

mon module rtc est le ds1307
merci
nonos
 
Messages: 15
Inscription: Mer 17 Aoû 2011 17:26

Re: controle tension de sortie

Message non lude Lionel » Mer 24 Aoû 2011 16:25

Bonjour,

Suite au passage de notre idole du code, voici une proposition adaptée à tester pour votre application

Code: Tout sélectionner
// Aquarium light managment with snootlab Rotoshield & 4 drivers Meanwell 60-48p
// Original code from http://www.reefcentral.com/forums/showpost.php?p=17570550&postcount=234
// see http://forum.snootlab.com/viewtopic.php?f=31&t=124
//
// Use Snootlab Max 7313 Motor shield library
// Based on Adafruit Motor shield library
// copyleft Snootlab, 2011
// this code is public domain, enjoy!

// Set up RTC
#include "Wire.h"
#define DS1307_I2C_ADDRESS 0x68
#include <snootor.h>

// "Motors" (output) declaration
SnootorDC M1;
SnootorDC M2;
SnootorDC M3;
SnootorDC M4;


// RTC variables
byte second, rtcMins, oldMins, rtcHrs, oldHrs, dayOfWeek, dayOfMonth, month, year, psecond;


// Motor variables names (Change to match your needs)
SnootorDC bluePins[] = {M1}; // pwm pins for blues
SnootorDC whitePins[] = {M2,M3,M4}; // pwm pins for whites


byte blueChannels = 1; // how many PWMs for blue (count from above)
byte whiteChannels = 3; // how many PWMs for white (count from above) blue channel + white channel is 4 max.

byte blueMax = 255; // max intensity for Blue lights.
byte whiteMax = 255; // max intensity for White lights.

// Month Data for Start, Stop, Photo Period and Fade (based off of actual times, best not to change)

int daysInMonth[12] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; //Days in each month

int minMinuteStart[12] = {296, 321, 340, 357, 372, 389, 398, 389, 361, 327, 297, 285}; //Minimum start times in each month
int maxMinuteStart[12] = {320, 340, 356, 372, 389, 398, 389, 361, 327, 297, 285, 296}; //Max start time in each month

int minMinuteFade[12] = {350, 342, 321, 291, 226, 173, 146, 110, 122, 139, 217, 282}; //Minimum fade time in each month
int maxMinuteFade[12] = {342, 321, 291, 226, 173, 146, 110, 122, 139, 217, 282, 350}; //Max fade time in each month

int minMinuteStop[12] = {1126, 1122, 1101, 1068, 1038, 1022, 1025, 1039, 1054, 1068, 1085, 1108}; //minimum stop times each month
int maxMinuteStop[12] = {1122, 1101, 1068, 1038, 1022, 1025, 1039, 1054, 1068, 1085, 1108, 1126}; //maximum stop times each month

// Weather variables

/*int weather = 0;

int oktas[9] = {255, 239, 223, 207, 191, 175, 159, 143, 128}; // Cloud Values
int clearDays[12] = {15, 12, 20, 23, 28, 37, 43, 48, 51, 41, 29, 23};
int cloudyDays[12] = {60, 61, 62, 60, 64, 63, 68, 66, 63, 54, 52, 53};
int cloud1 = random(1,5);
int cloud2 = random(1,5);
*/
// Other variables.

int minCounter = 0; // counter that resets at midnight. Don't change this.
int fadeDuration = 0; // minutes to fade - calculated by map above
int ledStartMins = 0; // minute to start led’s - calculated by map above
int ledStopMins = 0; // minute to stop led’s - calculated by map above

/****** LED Functions ******/
/***************************/
//function to set LED brightness according to time of day
//function has three equal phases - ramp up, hold, and ramp down
byte setLed(int mins, // current time in minutes
SnootorDC M, // "Motor" object for this channel of lights
int start, // start time for this channel of LEDs
//int period, // photoperiod for this channel of LEDs
int fade, // fade duration for this channel of LEDs
int stop, // stop time for this channel of LEDs
byte ledMax // max value for this channel
) {
byte ledVal = 0;
if (mins <= start || mins >= stop)
{
//this is when the LEDs are off, thus ledVal is 0;
ledVal = 0;
}
if (mins > start && mins <= start + fade)
{
//this is sunrise
ledVal = map(mins, start, start + fade, 0, ledMax);
}
if (mins > start + fade && mins < stop - fade)
{
ledVal = ledMax;
}
if (mins < stop && mins >= stop - fade)
{
//this is the sunset.
ledVal = map(mins, stop - fade, stop, ledMax, 0);
}

// Light value set to corresponding output

M.setSpeed(ledVal);
M.run(FORWARD);

return ledVal;
}

/***** RTC Functions *******/
/***************************/
// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val)
{
return ( (val/10*16) + (val%10) );
}

// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
return ( (val/16*10) + (val%16) );
}

// 1) Sets the date and time on the ds1307
// 2) Starts the clock
// 3) Sets hour mode to 24 hour clock
// Assumes you're passing in valid numbers.
//void setDateDs1307(byte second, // 0-59
// byte minute, // 0-59
// byte hour, // 1-23
// byte dayOfWeek, // 1-7
// byte dayOfMonth, // 1-28/29/30/31
// byte month, // 1-12
// byte year) // 0-99
//{
// Wire.beginTransmission(DS1307_I2C_ADDRESS);
// Wire.send(0);
// Wire.send(decToBcd(second));
// Wire.send(decToBcd(minute));
// Wire.send(decToBcd(hour));
// Wire.send(decToBcd(dayOfWeek));
// Wire.send(decToBcd(dayOfMonth));
// Wire.send(decToBcd(month));
// Wire.send(decToBcd(year));
// Wire.endTransmission();
//}

// Gets the date and time from the ds1307
void getDateDs1307(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.send(0);
Wire.endTransmission();

Wire.requestFrom(DS1307_I2C_ADDRESS, 7);

*second = bcdToDec(Wire.receive() & 0x7f);
*minute = bcdToDec(Wire.receive());
*hour = bcdToDec(Wire.receive() & 0x3f);
*dayOfWeek = bcdToDec(Wire.receive());
*dayOfMonth = bcdToDec(Wire.receive());
*month = bcdToDec(Wire.receive());
*year = bcdToDec(Wire.receive());
}


void setup() {


// init I2C
Wire.begin();

// "Motors" (output) initialisation
M1.init(1);
M2.init(2);
M3.init(3);
M4.init(4);
}

/***** Main Loop ***********/
/***************************/
void loop(){
getDateDs1307(&second, &rtcMins, &rtcHrs, &dayOfWeek, &dayOfMonth, &month, &year);

// Photo Period, Start Time, Fade Time Functions

ledStartMins = map(dayOfMonth, 1, daysInMonth[month-1], minMinuteStart[month-1], maxMinuteStart[month-1]); //LED Start time
fadeDuration = map(dayOfMonth, 1, daysInMonth[month-1], minMinuteFade[month-1], maxMinuteFade[month-1]); //LED Fade time
ledStopMins = map(dayOfMonth, 1, daysInMonth[month-1], minMinuteStop[month-1], maxMinuteStop[month-1]); // LED Stop tim

// LED State and Serial Print
if (psecond != second){
psecond = second;
// set LED states
minCounter = rtcHrs * 60 + rtcMins;
Serial.print("Current Minutes - ");
Serial.println(minCounter);
Serial.print("Start Time - ");
Serial.println(ledStartMins);
Serial.print("Fade - ");
Serial.print(fadeDuration);
Serial.println(" Minutes");
Serial.print("Stop Time - ");
Serial.println(ledStopMins);
update_leds();
}
delay(50);
}


void update_leds( void ){
int i;
byte ledVal;
for (i = 0; i < blueChannels; i++){
ledVal = setLed(minCounter, bluePins[i], ledStartMins, fadeDuration, ledStopMins, blueMax);
}
for (i = 0; i < whiteChannels; i++){
ledVal = setLed(minCounter, whitePins[i], ledStartMins, fadeDuration, ledStopMins, whiteMax);

}
}


A tester donc !!
Image - Distributeur officiel Arduino - Conception de shields
Avatar de l’utilisateur
Lionel
 
Messages: 734
Inscription: Mar 21 Déc 2010 09:52
Localisation: Toulouse

Re: controle tension de sortie

Message non lude nonos » Jeu 25 Aoû 2011 16:59

alors j'ai testé le code mais malheureusement ca n'a pas l'air de fonctionner...
j'ai une tension egale a 0 aux bornes de m1 m2 m3 m4..
je ne sais pas si ca vient de mon materiel ou si c'est le code qui n'est pas encore au point...
en tout cas merci, ca me permet deja de commencer a comprendre les commandes du rotoshield...
nonos
 
Messages: 15
Inscription: Mer 17 Aoû 2011 17:26

Re: controle tension de sortie

Message non lude nonos » Lun 29 Aoû 2011 21:48

decidement il ya quelque chose qui bloque....
j'ai essayé un autre code plus simple..l'heure s'affiche bien sur l'ecran, mais les tensions aux bornes de m1,etc sont tjs egales a 0

edit:apres modification du code j'obtiens bien une tension, maximale aux bornes, reste a voir si elle varie au cours de la journée, mais c'est encourageant

code originale, les parties en verte sont celles que j ai modifié
]

originally written by Christian, cptbjorn@gmail.com

*/


#include "Wire.h"
#define DS1307_I2C_ADDRESS 0x68
#include <LiquidCrystal.h> // initialize the library with the numbers of the interface pins
/*||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| R E L A Y P A R T |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/
/*||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| S I M P L E O N A N D O F F F E A T U R E |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/



const int ledPin1 = 1; // pin number for relay 1
const int ledPin2 = 2; // pin number for relay 2


int ledState1 = LOW;
int ledState2 = LOW;
long previousMillis1 = 0;
long previousMillis2 = 0;
long interval1 = 30000; // interval at which to blink (milliseconds) for RELAY1
long interval2 = 50000; // interval at which to blink (milliseconds) for RELAY2


/*||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| L E D D I M M I N G P A R T |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/
/*||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| F A D E S I N A N D O U T |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/



int blueramptime = 60 ; // time for blue LEDs to dim on and off in minutes
int whiteramptime = 60 ; // time for white LEDs to dim on and off in minutes
int bluemin = 0 ; // minimmum dimming value of blue LEDs, range of 0-255
int bluemax = 255 ; // maximum dimming value of blue LEDs, range of 0-255
int whitemin = 0 ; // minimum dimming value of white LEDs, range of 0-255
int whitemax = 255 ; // maximum dimming value of white LEDs, range of 0-255
int photoperiod = 720 ; // amount of time array is on at full power in minutes
int ontime = 12 ; // time of day (hour, 24h clock) to begin photoperiod fade in
int blue = 3; // blue LEDs connected to digital pin 3 (pwm)
int white = 5; // white LEDs connected to digital pin 11 (pwm)



//int bluepercent[11] = { 0, 1, 2, 5, 8 ,12, 18, 27, 44, 80, 255 }; // this line is needed if you are using meanwell ELN60-48D
//int whitepercent[11] = { 0, 1, 2, 5, 8 ,12, 18, 27, 44, 80, 255 }; // these are the values in 10% increments

int bluepercent[11] = { 0, 26, 52, 78, 103, 128, 154, 180, 205, 230, 255 }; // this line is needed if you are using meanwell ELN60-48P
int whitepercent[11] = { 0, 26, 52, 78, 103, 128, 154, 180, 205, 230, 255 }; // these are the values in 10% increments




// int pwm_one = 10; // extra pwm pin for future use
// int pwm_one = 9; // extra pwm pin for future use


LiquidCrystal lcd(7, 8, 9, 10, 11, 12); // typically 8, 9, 4, 5, 6, 7
// have to change to free up more pwm pins



/*||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| R T C C L O C K D S 1 3 0 7 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/



byte decToBcd(byte val) // Convert normal decimal numbers to binary coded decimal
{
return ( (val/10*16) + (val%10) );
}


byte bcdToDec(byte val) // Convert binary coded decimal to normal decimal numbers
{
return ( (val/16*10) + (val%16) );
}

// 1) Sets the date and time on the ds1307
// 2) Starts the clock
// 3) Sets hour mode to 24 hour clock
// Assumes you're passing in valid numbers
void setDateDs1307(byte second, // 0-59
byte minute, // 0-59
byte hour, // 1-23
byte dayOfWeek,// 1-7
byte dayOfMonth,// 1-28/29/30/31
byte month, // 1-12
byte year) // 0-99
{
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.send(0);
Wire.send(decToBcd(second)); // 0 to bit 7 starts the clock
Wire.send(decToBcd(minute));
Wire.send(decToBcd(hour)); // If you want 12 hour am/pm you need to set
// bit 6 (also need to change readDateDs1307)
Wire.send(decToBcd(dayOfWeek));
Wire.send(decToBcd(dayOfMonth));
Wire.send(decToBcd(month));
Wire.send(decToBcd(year));
Wire.endTransmission();
}

// Gets the date and time from the ds1307
void getDateDs1307(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
// Reset the register pointer
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.send(0);
Wire.endTransmission();

Wire.requestFrom(DS1307_I2C_ADDRESS, 7);

// A few of these need masks because certain bits are control bits
*second = bcdToDec(Wire.receive() & 0x7f);
*minute = bcdToDec(Wire.receive());
*hour = bcdToDec(Wire.receive() & 0x3f); // Need to change this if 12 hour am/pm
*dayOfWeek = bcdToDec(Wire.receive());
*dayOfMonth = bcdToDec(Wire.receive());
*month = bcdToDec(Wire.receive());
*year = bcdToDec(Wire.receive());
}



/*||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| D E F I N E : O N E S E C O N D |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/



void onesecond() //function that runs once per second while program is running
{
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
lcd.setCursor(0, 0);
if(hour>0)
{
if(hour<=12)
{
lcd.print(hour, DEC);
}
else
{
lcd.print(hour-12, DEC);
}
}
else
{
lcd.print("12");
}
lcd.print(":");
if (minute < 10) {
lcd.print("0");
}
lcd.print(minute, DEC);
lcd.print(":");
if (second < 10) {
lcd.print("0");
}
lcd.print(second, DEC);
if(hour<12)
{
lcd.print("am");
}
else
{
lcd.print("pm");
}
lcd.print(" ");
delay(1000);
}




/*||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| D E F I N E : R E L A Y 1 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/




void relay1() //FUNCTION TO TURN ON AND OFF RELAY 1.
{
unsigned long currentMillis = millis();

if(currentMillis - previousMillis1 > interval1)
{
previousMillis1 = currentMillis;
if (ledState1 == LOW)
ledState1 = HIGH;
else
ledState1 = LOW;
digitalWrite(ledPin1, ledState1);
}
}



/*||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| D E F I N E : R E L A Y 2 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/




void relay2()
{
unsigned long currentMillis2 = millis();

if(currentMillis2 - previousMillis2 > interval2)
{
previousMillis2 = currentMillis2;
if (ledState2 == LOW)
ledState2 = HIGH;
else
ledState2 = LOW;
digitalWrite(ledPin2, ledState2);
}
}




/*||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| S E T U P |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/


void setup() {
pinMode(ledPin1, OUTPUT); // set the digital pin as output:
pinMode(ledPin2, OUTPUT); // set the digital pin as output:



/*||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| S E T U P - D I S P L A Y |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/



byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
Wire.begin();

// Change these values to what you want to set your clock to.
// You probably only want to set your clock once and then remove
// the setDateDs1307 call.
second = 56;
minute = 17;
hour = 18;
dayOfWeek = 4; // Sunday is 0
dayOfMonth = 15;
month = 6;
year = 11;
//setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year);

analogWrite(blue, bluemin);
analogWrite(white, whitemin);

lcd.begin(16, 2); // set up the LCD's number of rows and columns:
// lcd.print("12:00 80.6"); // Print a message to the LCD.
// lcd.print(char(223));
lcd.setCursor(0, 1);
lcd.print("bleu:");
lcd.print(33*bluemin/85);
lcd.setCursor(8, 1);
lcd.print("blanc:");
lcd.print(33*whitemin/85);
}




/*||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| L O O P |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/




void loop()
{
onesecond();
relay2();
relay1();





/*||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| L O O P - D I M F U N C T I O N |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/

byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
int daybyminute = ((hour * 60) + minute); //converts time of day to a single value in minutes


int bluerampup;
if (daybyminute >= (ontime*60))
bluerampup = (((ontime*60) + blueramptime) - daybyminute);
else
bluerampup = blueramptime;

int whiterampup;
if (daybyminute >= (ontime*60 + blueramptime))
whiterampup = (((ontime*60) + blueramptime + whiteramptime) - daybyminute);
else
whiterampup = whiteramptime;

int whiterampdown;
if (((ontime * 60) + photoperiod + blueramptime + whiteramptime) <= daybyminute)
whiterampdown = (((ontime*60) + photoperiod + blueramptime + 2*whiteramptime) - daybyminute);
else
whiterampdown = whiteramptime;

int bluerampdown;
if (((ontime * 60) + photoperiod + blueramptime + 2*whiteramptime) <= daybyminute)
bluerampdown = (((ontime*60) + photoperiod + 2*blueramptime + 2*whiteramptime) - daybyminute);
else
bluerampdown = blueramptime;






/*||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| L O O P - F A D E I N |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/


if (daybyminute >= (ontime*60))
{
if (daybyminute <= ((ontime*60) + blueramptime + (whiteramptime/10*9))) //if time is in range of fade in, start fading in + (whiteramptime/10*9)
{
// fade blue LEDs in from min to max.
for (int i = 1; i <= 10; i++) // setting ib value for 10% increment. Start with 0%
{
analogWrite(blue, bluepercent[i]);
lcd.setCursor(5, 1);
lcd.print(i);
lcd.print(" ");

int countdown = ((bluerampup*60)/10); // calculates seconds to next step
while (countdown>0)
{
onesecond(); // updates clock once per second
countdown--;
relay2();
relay1();
}
}

// fade white LEDs in from min to max.
for (int i = 1; i <= 10; i++) // setting i value for 10% increment. Start with 0%
{
analogWrite(white, whitepercent[i]);
lcd.setCursor(14, 1);
lcd.print(i);
lcd.print(" ");

int countdown = ((whiterampup*60)/10); // calculates seconds to next step
while (countdown>0)
{
onesecond(); // updates clock once per second
countdown--;
relay2();
relay1();
}
}
}
}


/*||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| L O O P - M A X V A L U E |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/



if (daybyminute >= ((ontime * 60) + blueramptime + whiteramptime))
{
if ( daybyminute < ((ontime * 60) + blueramptime + whiteramptime + photoperiod)) // if time is in range of photoperiod, turn lights on to maximum fade value
{
analogWrite(blue, 255);
lcd.setCursor(5, 1);
lcd.print(10);
lcd.print(" ");
analogWrite(white, 255);
lcd.setCursor(14, 1);
lcd.print(10);
lcd.print(" ");

}
}



/*||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| L O O P - F A D E O U T |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/



if (((ontime * 60) + photoperiod + blueramptime + whiteramptime) <= daybyminute)
{
if (((ontime * 60) + photoperiod + whiteramptime + 2*blueramptime + (blueramptime/10*9)) >= daybyminute)
{
// fade white LEDs out from max to min in increments of 1 point:
for (int i = 10; i >= 0; i--) // setting i value for 10% increment. Start with 10%
{
analogWrite(blue, 255);
lcd.setCursor(5, 1);
lcd.print(10);
lcd.print(" ");

analogWrite(white, whitepercent[i]);
lcd.setCursor(14, 1);
lcd.print(i);
lcd.print(" ");

int countdown = ((whiterampdown*60)/10); // calculates seconds to next step
while (countdown>0)
{
onesecond(); // updates clock once per second
countdown--;
relay2();
relay1();
}

}

// fade blue LEDs out from max to min in increments of 1 point:
for (int i = 10; i >= 0; i--) // setting i value for 10% increment. Start with 10%
{
analogWrite(blue, bluepercent[i]);
lcd.setCursor(5, 1);
lcd.print(i);
lcd.print(" ");

int countdown = ((bluerampdown*60)/10); // calculates seconds to next step
while (countdown>0)
{
onesecond(); // updates clock once per second
countdown--;
relay2();
relay1();
}
}
}
}


} // END LOOP[/quote


code modifié,les parties en rouge sont celles ajoutées/modifiées

originally written by Christian, cptbjorn@gmail.com

*/


#include "Wire.h"
#define DS1307_I2C_ADDRESS 0x68
#include <LiquidCrystal.h> // initialize the library with the numbers of the interface pins
#include <snootor.h>


/*||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| R E L A Y P A R T |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/
/*||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| S I M P L E O N A N D O F F F E A T U R E |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/

// "Motors" (output) declaration
SnootorDC M1;
SnootorDC M2;
SnootorDC M3;
SnootorDC M4;



SnootorDC blue[] = {M1}; // pwm pins for blues [color=#4000BF] utilité de ces 2 lignes?????
SnootorDC white[] = {M2,M3,M4}; // pwm pins for whites[/color]

const int ledPin1 = 1; // pin number for relay 1
const int ledPin2 = 2; // pin number for relay 2


int ledState1 = LOW;
int ledState2 = LOW;
long previousMillis1 = 0;
long previousMillis2 = 0;
long interval1 = 30000; // interval at which to blink (milliseconds) for RELAY1
long interval2 = 50000; // interval at which to blink (milliseconds) for RELAY2


/*||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| L E D D I M M I N G P A R T |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/
/*||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| F A D E S I N A N D O U T |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/



int blueramptime = 60 ; // time for blue LEDs to dim on and off in minutes
int whiteramptime = 60 ; // time for white LEDs to dim on and off in minutes
int bluemin = 0 ; // minimmum dimming value of blue LEDs, range of 0-255
int bluemax = 255 ; // maximum dimming value of blue LEDs, range of 0-255
int whitemin = 0 ; // minimum dimming value of white LEDs, range of 0-255
int whitemax = 255 ; // maximum dimming value of white LEDs, range of 0-255
int photoperiod = 720 ; // amount of time array is on at full power in minutes
int ontime = 12 ; // time of day (hour, 24h clock) to begin photoperiod fade in



//int bluepercent[11] = { 0, 1, 2, 5, 8 ,12, 18, 27, 44, 80, 255 }; // this line is needed if you are using meanwell ELN60-48D
//int whitepercent[11] = { 0, 1, 2, 5, 8 ,12, 18, 27, 44, 80, 255 }; // these are the values in 10% increments

int bluepercent[11] = { 0, 26, 52, 78, 103, 128, 154, 180, 205, 230, 255 }; // this line is needed if you are using meanwell ELN60-48P
int whitepercent[11] = { 0, 26, 52, 78, 103, 128, 154, 180, 205, 230, 255 }; // these are the values in 10% increments




// int pwm_one = 10; // extra pwm pin for future use
// int pwm_one = 9; // extra pwm pin for future use


LiquidCrystal lcd(7, 8, 9, 10, 4, 12); // typically 8, 9, 4, 5, 6, 7
// have to change to free up more pwm pins



/*||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| R T C C L O C K D S 1 3 0 7 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/



byte decToBcd(byte val) // Convert normal decimal numbers to binary coded decimal
{
return ( (val/10*16) + (val%10) );
}


byte bcdToDec(byte val) // Convert binary coded decimal to normal decimal numbers
{
return ( (val/16*10) + (val%16) );
}

// 1) Sets the date and time on the ds1307
// 2) Starts the clock
// 3) Sets hour mode to 24 hour clock
// Assumes you're passing in valid numbers
void setDateDs1307(byte second, // 0-59
byte minute, // 0-59
byte hour, // 1-23
byte dayOfWeek,// 1-7
byte dayOfMonth,// 1-28/29/30/31
byte month, // 1-12
byte year) // 0-99
{
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.send(0);
Wire.send(decToBcd(second)); // 0 to bit 7 starts the clock
Wire.send(decToBcd(minute));
Wire.send(decToBcd(hour)); // If you want 12 hour am/pm you need to set
// bit 6 (also need to change readDateDs1307)
Wire.send(decToBcd(dayOfWeek));
Wire.send(decToBcd(dayOfMonth));
Wire.send(decToBcd(month));
Wire.send(decToBcd(year));
Wire.endTransmission();
}

// Gets the date and time from the ds1307
void getDateDs1307(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
// Reset the register pointer
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.send(0);
Wire.endTransmission();

Wire.requestFrom(DS1307_I2C_ADDRESS, 7);

// A few of these need masks because certain bits are control bits
*second = bcdToDec(Wire.receive() & 0x7f);
*minute = bcdToDec(Wire.receive());
*hour = bcdToDec(Wire.receive() & 0x3f); // Need to change this if 12 hour am/pm
*dayOfWeek = bcdToDec(Wire.receive());
*dayOfMonth = bcdToDec(Wire.receive());
*month = bcdToDec(Wire.receive());
*year = bcdToDec(Wire.receive());
}



/*||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| D E F I N E : O N E S E C O N D |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/



void onesecond() //function that runs once per second while program is running
{
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
lcd.setCursor(0, 0);
if(hour>0)
{
if(hour<=12)
{
lcd.print(hour, DEC);
}
else
{
lcd.print(hour-12, DEC);
}
}
else
{
lcd.print("12");
}
lcd.print(":");
if (minute < 10) {
lcd.print("0");
}
lcd.print(minute, DEC);
lcd.print(":");
if (second < 10) {
lcd.print("0");
}
lcd.print(second, DEC);
if(hour<12)
{
lcd.print("am");
}
else
{
lcd.print("pm");
}
lcd.print(" ");
delay(1000);
}




/*||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| D E F I N E : R E L A Y 1 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/




void relay1() //FUNCTION TO TURN ON AND OFF RELAY 1.
{
unsigned long currentMillis = millis();

if(currentMillis - previousMillis1 > interval1)
{
previousMillis1 = currentMillis;
if (ledState1 == LOW)
ledState1 = HIGH;
else
ledState1 = LOW;
digitalWrite(ledPin1, ledState1);
}
}



/*||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| D E F I N E : R E L A Y 2 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/




void relay2()
{
unsigned long currentMillis2 = millis();

if(currentMillis2 - previousMillis2 > interval2)
{
previousMillis2 = currentMillis2;
if (ledState2 == LOW)
ledState2 = HIGH;
else
ledState2 = LOW;
digitalWrite(ledPin2, ledState2);
}
}




/*||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| S E T U P |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/


void setup() {
pinMode(ledPin1, OUTPUT); // set the digital pin as output:
pinMode(ledPin2, OUTPUT); // set the digital pin as output:



/*||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| S E T U P - D I S P L A Y |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/



byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
Wire.begin();

// Change these values to what you want to set your clock to.
// You probably only want to set your clock once and then remove
// the setDateDs1307 call.
second = 56;
minute = 17;
hour = 18;
dayOfWeek = 4; // Sunday is 0
dayOfMonth = 15;
month = 6;
year = 11;
//setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year);

// "Motors" (output) initialisation
M1.init(1);
M2.init(2);
M3.init(3);
M4.init(4);


M1.setSpeed(bluemin);
M1.run(FORWARD);

M2.setSpeed(whitemin);
M2.run(FORWARD);
M3.setSpeed(whitemin);
M3.run(FORWARD);
M4.setSpeed(whitemin);
M4.run(FORWARD);






lcd.begin(16, 2); // set up the LCD's number of rows and columns:
// lcd.print("12:00 80.6"); // Print a message to the LCD.
// lcd.print(char(223));
lcd.setCursor(0, 1);
lcd.print("bleu:");
lcd.print(33*bluemin/85);
lcd.setCursor(8, 1);
lcd.print("blanc:");
lcd.print(33*whitemin/85);
}




/*||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| L O O P |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/




void loop()
{
onesecond();
relay2();
relay1();





/*||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| L O O P - D I M F U N C T I O N |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/

byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
int daybyminute = ((hour * 60) + minute); //converts time of day to a single value in minutes


int bluerampup;
if (daybyminute >= (ontime*60))
bluerampup = (((ontime*60) + blueramptime) - daybyminute);
else
bluerampup = blueramptime;

int whiterampup;
if (daybyminute >= (ontime*60 + blueramptime))
whiterampup = (((ontime*60) + blueramptime + whiteramptime) - daybyminute);
else
whiterampup = whiteramptime;

int whiterampdown;
if (((ontime * 60) + photoperiod + blueramptime + whiteramptime) <= daybyminute)
whiterampdown = (((ontime*60) + photoperiod + blueramptime + 2*whiteramptime) - daybyminute);
else
whiterampdown = whiteramptime;

int bluerampdown;
if (((ontime * 60) + photoperiod + blueramptime + 2*whiteramptime) <= daybyminute)
bluerampdown = (((ontime*60) + photoperiod + 2*blueramptime + 2*whiteramptime) - daybyminute);
else
bluerampdown = blueramptime;






/*||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| L O O P - F A D E I N |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/


if (daybyminute >= (ontime*60))
{
if (daybyminute <= ((ontime*60) + blueramptime + (whiteramptime/10*9))) //if time is in range of fade in, start fading in + (whiteramptime/10*9)
{
// fade blue LEDs in from min to max.
for (int i = 1; i <= 10; i++) // setting ib value for 10% increment. Start with 0%
{

M1.setSpeed(bluepercent[i]);
M1.run(FORWARD);


lcd.setCursor(5, 1);
lcd.print(i);
lcd.print(" ");

int countdown = ((bluerampup*60)/10); // calculates seconds to next step
while (countdown>0)
{
onesecond(); // updates clock once per second
countdown--;
relay2();
relay1();
}
}

// fade white LEDs in from min to max.
for (int i = 1; i <= 10; i++) // setting i value for 10% increment. Start with 0%
{

M2.setSpeed(whitepercent[i]);
M2.run(FORWARD);
M3.setSpeed(whitepercent[i]);
M3.run(FORWARD);
M4.setSpeed(whitepercent[i]);
M4.run(FORWARD);





lcd.setCursor(14, 1);
lcd.print(i);
lcd.print(" ");

int countdown = ((whiterampup*60)/10); // calculates seconds to next step
while (countdown>0)
{
onesecond(); // updates clock once per second
countdown--;
relay2();
relay1();
}
}
}
}


/*||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| L O O P - M A X V A L U E |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/



if (daybyminute >= ((ontime * 60) + blueramptime + whiteramptime))
{
if ( daybyminute < ((ontime * 60) + blueramptime + whiteramptime + photoperiod)) // if time is in range of photoperiod, turn lights on to maximum fade value
{

M1.setSpeed(255);
M1.run(FORWARD);


lcd.setCursor(5, 1);
lcd.print(10);
lcd.print(" ");

M2.setSpeed(255);
M2.run(FORWARD);
M3.setSpeed(255);
M3.run(FORWARD);
M4.setSpeed(255);
M4.run(FORWARD);


lcd.setCursor(14, 1);
lcd.print(10);
lcd.print(" ");

}
}



/*||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| L O O P - F A D E O U T |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/



if (((ontime * 60) + photoperiod + blueramptime + whiteramptime) <= daybyminute)
{
if (((ontime * 60) + photoperiod + whiteramptime + 2*blueramptime + (blueramptime/10*9)) >= daybyminute)
{
// fade white LEDs out from max to min in increments of 1 point:
for (int i = 10; i >= 0; i--) // setting i value for 10% increment. Start with 10%
{

M1.setSpeed(255);
M1.run(FORWARD);


lcd.setCursor(5, 1);
lcd.print(10);
lcd.print(" ");


M2.setSpeed(whitepercent[i]);
M2.run(FORWARD);
M3.setSpeed(whitepercent[i]);
M3.run(FORWARD);
M4.setSpeed(whitepercent[i]);
M4.run(FORWARD);



lcd.setCursor(14, 1);
lcd.print(i);
lcd.print(" ");

int countdown = ((whiterampdown*60)/10); // calculates seconds to next step
while (countdown>0)
{
onesecond(); // updates clock once per second
countdown--;
relay2();
relay1();
}

}

// fade blue LEDs out from max to min in increments of 1 point:
for (int i = 10; i >= 0; i--) // setting i value for 10% increment. Start with 10%
{

M1.setSpeed(bluepercent[i]);
M1.run(FORWARD);


lcd.setCursor(5, 1);
lcd.print(i);
lcd.print(" ");

int countdown = ((bluerampdown*60)/10); // calculates seconds to next step
while (countdown>0)
{
onesecond(); // updates clock once per second
countdown--;
relay2();
relay1();
}
}
}
}


} // END LOOP
nonos
 
Messages: 15
Inscription: Mer 17 Aoû 2011 17:26


Retourner vers Rotoshield

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité