Bonjour,
je compte faire une station météo, et pour l'instant j'ai 2/3 problèmes.
Je veux brancher sur l'arduino : 2 capteurs (2 broches ana.) 1 broche digi. (la data seras transmise par radio)
+une RTC (2 broches ana.)
+un écran LCD (6 broches digi.)
+3 boutons (3 broches digi. une broche ana.)
+une carte SD (5 broches digi., comme ça)
Ce qui fait un total de 4 broches ana. et 14 digi. 5 broches ana. et 10 digi. 2 broches ana. et 12 digi.
Peut-on brancher des trucs (boutons par ex.) sur les broches 0 et 1 ? -> oui, mais il vaut mieux les mettre en entré et encore mieux non
Peut-on brancher l'écran LCD sur n'importe quelle broche ? -> oui
Savez-vous où trouver une horloge RTC pas trop chère (je trouve rien sur google) ? -> ici
Avez-vous des infos. sur comment communiquer avec la carte SD avec 6 broches digitales et 1 analogique (ou moins) ?-> oui (4 broches digi.)
Savez-vous où trouver une humidistance pas trop chère ?-> DHTxx
Mon écran est trop sombre, et ce n'est pas a cause du contraste, pourquoi ?-> J'ai oublier de mettre le rétro-éclairage ...
Comment résoudre le bug de noël (+ de jours que prévu) ?
Comment mettre la librairie virtualwire sur l'ATtiny45 ?
Merci de votre lecture, et, j’espère, de vos réponse
Tu peux brancher des trucs sur les broches 0 et 1, mais dans ce cas tu ne pourras pas utiliser la voie série USB pour afficher des trucs.
Tu peux aussi utiliser les voies analogiques inutilisés comme des voies numériques classiques.
L'écran LCD peut-être branché sur les broches que tu veux. Il te faudra juste faire attention en utilisant la librairie LiquidCrystal à utilisé les bonnes broches (chapitre sur les LCD en cours de rédaction)
J'ai trouvé une RTC sur "dx.com" pour 3 euros (avec la pile). Je ne l'ai pas encore essayé (car je fais le LCD avant).
Pour la carte SD, je n'en ai aucune idée, une bonne piste serait de commencer par la doc officielle (et les docs sur le shield que tu comptes utiliser)
Tu peux brancher des trucs sur les broches 0 et 1, mais dans ce cas tu ne pourras pas utiliser la voie série USB pour afficher des trucs.
Oui alors je rajoute qu'il faut faire attention car le bootloader de l'arduino est en permanence en train de scruter s'il y a quelque chose qui arrive sur sa liaison série. Cela engendre parfois bien des problèmes. Le mieux c'est de ne pas utiliser les broches en sortie, en entrée cela va un peu mieux, mais la meilleur solution reste de ne pas les utiliser.
Après tes boutons tu peut les mettre sur tes entrées analogiques en créant un système avec pont diviseur de tension. De plus je crois que l'on peut se servir des broches analogique en broche logique d'entrée (ou de sortie, je sais plus)
Merci,
j'ai éditer.
Pour les modules RTC j'ai trouver ça de mon coté, je crois le moins chère dans la gamme DS1307,
j'ai vu que le tien est un 1302 : deux questions :
-Ses broches ne porte pas le même nom que le 1307, c'est compatible ?
-A t-il de la mémoire (je crois que l'on dit EEPROM) ?
C'est broche ne sont effectivement pas les memes car le mien (1302) utilise un protocole de ommunication différent du tien (le mien est dans une liaison série particulière et le tien est en liaison I²C)
Pourquoi une EEPROM ? La date et l'heure sont stockés dans la RAM du composant car elle change sans arret.
Pourquoi une EEPROM ? La date et l'heure sont stockés dans la RAM du composant car elle change sans arret.
Je n'était pas sur du nom, mais je sais que dans le modèle 1307 on peut stocker des donnée, je vais garder le 1307, plus chère mais j'ai vus plus de tutos dessus.
Up, J'ai un problème, j'ai un capteur de température dont la résistance baisse quand la température monte, comment avoir une correspondance ?
Par exemple, je sais qu'a 16.6°C sa résistance est à 62.9K et a 16.4, elle est à 63K, donc comment savoir que un nombre de 0 à 1023 va donner tant de degrés ?
Pour savoir quelle valeur tu auras pour quelle température il faut se référer à la documentation constructeur de ton capteur. Tu auras alors de belle courbe qui te montreront la résistance attendu en fonction de la température
Le graphique de l'évolution est linéaire, en sachant 2 données, je devrait savoir le coef température/résistance.
Mais comment savoir la résistance du capteur à partir de l'Arduino ?
Mon début -300 lignes - de code ici (dite moi si je me suis tromper, svp) :
Pour mesurer ta résistance, je vois deux possibilités :
1) créer un générateur de courant (c'est un simple montage à transistor) et mesurer la tension (qui sera proportionnelle à la résistance)
2) faire un pont diviseur avec une résistance fixe (en ayant mesuré sa valeur, vu que tu utilise probablement des résistances à 10%). La mesure de tension au milieu du pont vaudra R1/(R1+R2) * U.
La seconde solution est moins précise (parce que la courbe n'est pas linéaire et qu'il est difficile d'exploiter toute la plage de l'ADC), mais demande beaucoup moins d'électronique.
J'ai fais un code qui donne le nb de jour av. noël :
#include <Wire.h>
#include "RTClib.h"
RTC_Millis RTC;
long double J = 17;
long double Mo = 6;
long double A = 2012;
long double H = 14;
long double Mi = 37;
long double S = 41;
long double TotS = 0;
long double J2 = 25;
long double Mo2 = 12;
long double A22 = 2012;
long double H2 = 0;
long double Mi2 = 0;
long double S2 = 0;
long double TotS2 = 0;
int Jj = 17;
int Hh = 14;
int Mii = 37;
int Ss = 41;
void setup () {
// following line sets the RTC to the date & time this sketch was compiled
Wire.begin();
RTC.begin(DateTime(__DATE__, __TIME__));
TotS2 += S2;
TotS2 += (Mi2*60);
TotS2 += ((H2*60)*60);
TotS2 += ((((J2*24)*60)*60)*Mo2);
Serial.begin(57600);
}
void loop ()
{
//333334rduiMeteo33333
//110J*02H*50min*20sec
//*****avant noel*****
//<-Humi.******Temp.->
DateTime now = RTC.now();
TotS = 0;
J = now.day();
Mo = now.month();
A = now.year();
H = now.hour();
Mi = now.minute();
S = now.second();
TotS += S;
TotS += (Mi*60);
TotS += ((H*60)*60);
TotS += (((J*24)*60)*60);
TotS += ((((30*24)*60)*60)*Mo-1);
TotS = TotS2 - TotS;
Mi = TotS/60;
H = Mi/60;
J = H/24;
Ss = ((int)TotS)%60;
Mii = ((int)Mi)%60;
Hh = ((int)H)%24;
Jj = ((int)J);
Serial.print(Jj);Serial.print("J ");
Serial.print(Hh);Serial.print("H ");
Serial.print(Mii);Serial.print("min ");
Serial.print(Ss);Serial.println("sec");
Serial.println("Avant noel");
Serial.println("");
delay(1000);
}
Il ne marche pas, des fois les secondes sont négatives et elle avance de 3 en 3 une idée de pourquoi ?
Ouai, secondes est sur un int... ce qui et trop petit pour stocker les valeurs... met toi sur du unsigned long tu seras plus tranquille... (tu pourras aller jusqu'à 4 294 967 295 secondes, ce qui fait grosso modo 136 ans alors qu'avec un int (signed par défaut) tu feras à peine 9 heures (car 32 767 valeurs possibles en positifs))
En prenant en compte qu'une année c'est 365 jours et qu'il y a un jours en plus tout les 4 ans, on peut dire qu'une année c'est "en moyenne" 365.25 jours, ce qui donne donc 365.25/12 = 30.4375 jours par mois
#include <Wire.h>
#include "RTClib.h"
RTC_Millis RTC;
long double J = 17;
long double Mo = 6;
long double A = 2012;
long double H = 14;
long double Mi = 37;
long double S = 41;
long double TotS = 0;
long double J2 = 25;
long double Mo2 = 12;
long double A22 = 2012;
long double H2 = 0;
long double Mi2 = 0;
long double S2 = 0;
long double TotS2 = 0;
int Jj = 17;
int Hh = 14;
int Mii = 37;
int Ss = 41;
void setup () {
// following line sets the RTC to the date & time this sketch was compiled
analogWrite(A3,HIGH);
analogWrite(A2,LOW);
Wire.begin();
RTC.begin(DateTime(__DATE__, __TIME__));
TotS2 += S2;
TotS2 += (Mi2*60);
TotS2 += ((H2*60)*60);
TotS2 += ((((J2*24)*60)*60)*Mo2);
Serial.begin(57600);
Serial.println((double)TotS2);
}
void loop ()
{
//333334rduiMeteo33333
//110J*02H*50min*20sec
//*****avant noel*****
//<-Humi.******Temp.->
DateTime now = RTC.now();
TotS = 0;
J = now.day();
Mo = now.month();
A = now.year();
H = now.hour();
Mi = now.minute();
S = now.second();
TotS += S;//Seconde
TotS += (Mi*60);//Minute
TotS += ((H*60)*60);//heure
TotS += (((J*24)*60)*60);//jour
TotS += 30,4375 * (Mo-1);//mois
TotS = TotS2 - TotS;//Sec tot avant noël
Mi = TotS/60;//Minutes tot avant noël
H = Mi/60;//Heure tot avant noël
J = H/24;//Jours tot avant noël
Ss = ((long int)TotS)%60;//Sec avant noël
Mii = ((long int)Mi)%60;//Minutes avant noël
Hh = ((long int)H)%24;//Heure avant noël
Jj = ((long int)J);//Jours avant noël
Serial.print(Jj);Serial.print("J ");
Serial.print(Hh);Serial.print("H ");
Serial.print(Mii);Serial.print("min ");
Serial.print(Ss);Serial.println("sec");
Serial.println("Avant noel");
Serial.println("");
delay(1000);
}
Il reste un problème : (à mon avis c'est juste que l'arduino ne manipule pas bien les grands nombres)
296J 13H 34min 4sec
Avant noel
296J 13H 34min 4sec
Avant noel
296J 13H 34min 4sec
Avant noel
296J 13H 34min 2sec
Avant noel
296J 13H 34min 0sec
Avant noel
296J 13H 34min 0sec
Avant noel
296J 13H 34min 0sec
Avant noel
296J 13H 33min 58sec
Avant noel
296J 13H 33min 56sec
Avant noel
296J 13H 33min 56sec
Avant noel
296J 13H 33min 56sec
Avant noel
296J 13H 33min 54sec
Avant noel
Je trouve qu'il y a beaucoup de variables et de cast dans ton programme... Tu pourrais commenter un peu plus et on pourra voir pourquoi ca bugouille...
/*transformation de la date en secondes*/
TotS += S;//Seconde
TotS += (Mi*60);//Minute
TotS += ((H*60)*60);//heure
TotS += (((J*24)*60)*60);//jour
TotS += 30,4375 * (Mo-1);//mois
/*Seconde totale avant noël*/
TotS = TotS2 - TotS;
/*transformation des secondes en date*/
//transformation en totale : tant de secondes = tant de minutes = tant d'heures = tant de jours
Mi = TotS/60;//Minutes
H = Mi/60;//Heure
J = H/24;//Jours
//transformation finale : il y a tant de secondes, tant de minutes, tant d'heures, tant de jours avant noël
Ss = ((long int)TotS)%60;//Secondes avant noël
Mii = ((long int)Mi)%60;//Minutes avant noël
Hh = ((long int)H)%24;//Heure avant noël
Jj = ((long int)J);//Jours avant noël
Et l'écran que j'ai acheter ici a une luminosité très faible : c'est normale ? si oui, comment y remédier ?
Pour l'écran, c'est le rétroéclairage qui est faible ou le contraste entre le bleu et le blanc ? Si c'est la deuxième, alors il y a une broche nommé V0 sur laquelle doit se trouver un potentiomètre et qui permet justement de régler ce contraste.
Petite remarque, tu utilises uniquement des valeurs entières, donc pourquoi déclarer des doubles ? (ta multiplication du mois sera casté au retour).
Sinon je vois pas trop la vite fait pourquoi ca "lag" (car si j'ai bien compris le problème est la). Apparemment les calculs sont OK...
Essai de diminuer ton delay() à la fin du programme (genre delay(500)) car en le faisant toutes les secondes je pense que ca pourrait etre une raison pour voir juste des secondes paires...
C'est le rétroéclairage, j'ai mis le contraste au max.
Les double sont plus grand non ?
Avec un delay de 500ms j'ai ça :
296J 12H 20min 0sec
Avant noel
296J 12H 20min 0sec
Avant noel
296J 12H 20min 0sec
Avant noel
296J 12H 20min 0sec
Avant noel
296J 12H 20min 0sec
Avant noel
296J 12H 20min 0sec
Avant noel
296J 12H 19min 58sec
Avant noel
296J 12H 19min 58sec
Avant noel
EDIT : avec ce code ça marche nickel ! :
#include <Wire.h>
#include "RTClib.h"
RTC_Millis RTC;
unsigned long int J = 17;
unsigned long int Mo = 6;
unsigned long int A = 2012;
unsigned long int H = 14;
unsigned long int Mi = 37;
unsigned long int S = 41;
unsigned long int TotS = 0;
unsigned long int J2 = 25;
unsigned long int Mo2 = 12;
unsigned long int A22 = 2012;
unsigned long int H2 = 0;
unsigned long int Mi2 = 0;
unsigned long int S2 = 0;
unsigned long int TotS2 = 0;
int Jj = 17;
int Hh = 14;
int Mii = 37;
int Ss = 41;
void setup () {
// following line sets the RTC to the date & time this sketch was compiled
analogWrite(A3,HIGH);
analogWrite(A2,LOW);
Wire.begin();
RTC.begin(DateTime(__DATE__, __TIME__));
TotS2 += S2;
TotS2 += (Mi2*60);
TotS2 += ((H2*60)*60);
TotS2 += ((((J2*24)*60)*60)*Mo2);
Serial.begin(57600);
Serial.println((double)TotS2);
}
void loop ()
{
//333334rduiMeteo33333
//110J*02H*50min*20sec
//*****avant noel*****
//<-Humi.******Temp.->
DateTime now = RTC.now();
TotS = 0;
J = now.day();
Mo = now.month();
A = now.year();
H = now.hour();
Mi = now.minute();
S = now.second();
TotS += S;//Seconde
TotS += (Mi*60);//Minute
TotS += ((H*60)*60);//heure
TotS += (((J*24)*60)*60);//jour
TotS += (unsigned long int)(30,4375 * (Mo-1));//mois
TotS = TotS2 - TotS;//Sec tot avant noël
Mi = TotS/60;//Minutes tot avant noël
H = Mi/60;//Heure tot avant noël
J = H/24;//Jours tot avant noël
Ss = TotS%60;//Sec avant noël
Mii = Mi%60;//Minutes avant noël
Hh = H%24;//Heure avant noël
Jj = J;//Jours avant noël
Serial.print(Jj);Serial.print("J ");
Serial.print(Hh);Serial.print("H ");
Serial.print(Mii);Serial.print("min ");
Serial.print(Ss);Serial.println("sec");
Serial.println("Avant noel");
Serial.println("");
delay(1000);
}
Console :
296J 4H 56min 27sec
Avant noel
296J 4H 56min 26sec
Avant noel
296J 4H 56min 25sec
Avant noel
296J 4H 56min 24sec
Avant noel
les doubles sont surtout des nombres à virgules, et donc beaucoup plus long à gérer pour les calculs, si tu n'as que des entiers, long tout court sera très bien.
Mais bon, vu ce que tu en fait, un simple entier sur 16bits serait suffisant si tu optimisais un peu ton algo (cela dit, je suis pas expert en arduino, mais si c'est des micro 8bits, long doit te donner ça :p)
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !