Go Down

Topic: Combiner deux programmes dans un seul (Read 9891 times) previous topic - next topic

tom70

Bonjour,
Lycéen de 17 ans ayant un projet en électronique avec deux arduino et n'ayant pas beaucoup de temps pour approfondir le language arduino et pour finaliser la programmation de mon projet, je sollicite votre aide pour réussir a fusionner deux programmes assez différent. Un programme donnant la température et l'autre captant la luminosité en lux et active une led si il fait nuit. J'ai essayé de les combiner en copiant chacun des programmes avec les variables etc, j'obtient des résultat mais faut, la température varie de 15 a 25 chaque seconde et les lux ne bouge plus et je ne sais pas d'où sa vient ... Je vous fais parvenir les programmes complet, j'ai vraiment besoin d'aide :/ ...

Programme du capteur luminosité:

Quote

int photocellPin = 0; //
int photocellReading;
const int LED=2;

void setup(void) {
 
  Serial.begin(9600);
  pinMode(LED, OUTPUT);
}

void loop(void) {
  photocellReading = analogRead(photocellPin);
  Serial.print("Valeur en lux captee = ");
  Serial.print(photocellReading);
  if (photocellReading < 799) {
     digitalWrite(LED,HIGH);
    Serial.println(" - Nuit");
  } else if (photocellReading > 800) {
    digitalWrite(LED,LOW);
    Serial.println(" - Jour");
   
  }
  delay(500);
}


Programme de température

Quote
float mesure=0;       
  float tension=0;     
  float temperature=0;   
  float tempmin=100;     
  float tempmax=0;       
  int portana0 = 1;     


  void setup()
  {
    analogReference(INTERNAL);
    Serial.begin(9600);       
  }


  void loop()
  {
    mesure = analogRead(portana0);
    tension = mesure * 1.1 / 1024;
   
    temperature = tension * 100;   
    if (temperature < tempmin) {tempmin = temperature;}
    if (temperature > tempmax) {tempmax = temperature;}
   
 
    Serial.print("Tension : "); Serial.print (tension); Serial.print(" Volts - ");         
    Serial.print("Temperatures :");
    Serial.print(" >Actuelle : "); Serial.print (temperature);
    Serial.print(" >Mini : "); Serial.print (tempmin);
    Serial.print (" >Max : "); Serial.println (tempmax);
   
    delay(1000);                   
  }


Programme combiner :

Quote

int photocellPin = 0; //
int photocellReading;
const int LED=2;
float mesure=0;       
float tension=0;     
float temperature=0;   
float tempmin=100;     
float tempmax=0;       
int portana0 = 1;     


void setup(void) {
 
  Serial.begin(9600);
  pinMode(LED, OUTPUT);
  analogReference(INTERNAL);
  Serial.begin(9600);
}

void loop(void) {
  photocellReading = analogRead(photocellPin);
  Serial.print("Valeur en lux captee = ");
  Serial.print(photocellReading);
  if (photocellReading < 799) {
     digitalWrite(LED,HIGH);
    Serial.println(" - Nuit");
  } else if (photocellReading > 800) {
    digitalWrite(LED,LOW);
    Serial.println(" - Jour");
   
  }
   {
    mesure = analogRead(portana0);
    tension = mesure * 1.1 / 1024;
   
    temperature = tension * 100;   
    if (temperature < tempmin) {tempmin = temperature;}
    if (temperature > tempmax) {tempmax = temperature;}
   
 
    Serial.print("Tension : "); Serial.print (tension); Serial.print(" Volts - ");         
    Serial.print("Temperatures :");
    Serial.print(" >Actuelle : "); Serial.print (temperature);
    Serial.print(" >Mini : "); Serial.print (tempmin);
    Serial.print (" >Max : "); Serial.println (tempmax);                 
  }
  delay(500);
 
}



B@tto

Problème ici : analogReference(INTERNAL);
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

68tjs

Code: [Select]
void setup(void) {
  Serial.begin(9600);
  pinMode(LED, OUTPUT);
  analogReference(INTERNAL);
  Serial.begin(9600);
}

Un micro n'est pas sourdingue ce n'est pas la peine de lui répéter deux fois Serial.begin(9600);
Cela n'empêche pas de fonctionner mais c'est le résultat d'un coupé coller qui aurait pu être évité.


Problème ici : analogReference(INTERNAL);

+1
Je pense que tu peux trouver tout seul ce qui ne va pas.
Petit conseil (mince je te mets sur la voie) quand dans les mesures analogiques on change de référence il ne faut jamais garder les premières mesures : il faut laisser l'engin se stabiliser, idem quand on change de pin de mesure (passer de A0 à A1 par exemple). Pour chaque cycle de mesure tu jettes les 2 ou 3 premières mesures et tu gardes la 4eme ou la 5eme et tu sera Ok.

tom70

Le problème c'est que j'ai compris le système mais je sais pas comment gérer ça maintenant :/

68tjs

Un peu de réflexion logique et on n'arrête pas de le répéter du papier et un crayon, écrire cela aide à clarifier les idées. Vous êtes une classe d'age qui répugne à écrire, mais il faudra bien que vous en passiez par là car il n'y a pas d'autre solution pour avancer.

Par objet à mesurer:
1) Estimer l'ordre de grandeur de la tension.
- si c'est possible -> positionner la bonne référence pour l'adc
- si ce n'est pas possible faire une mesure avec reférence = Vcc. En fonction du résultat choisir  la référence la plus adaptée.

2) Si changement de référence, ou de pin d'entrée,  faire une boucle de 5 mesures ne garder que la dernière.

ATTENTION
Il est INTERDIT de mettre en service la référence interne quand une tension est présente sur AREF.
La partie ADC du micro dégage instantanément : c'est clairement indiquée dans la data sheet Atmel.

Donc pas question de mettre 3,3V sur Aref et de commuter entre la référence externe et la référence interne sans couper le 3,3V au préalable.
Par contre avec 3,3V sur Aref  il est possible de commuter entre la référence externe et la référence au Vcc.

tom70

C'est bon, j'ai compris le système suffisait de ce relire et de comprendre qu'il faut jeter une bonne dizaine de mesur a la poubelle avant de prend les bonnes.

Ayant, je l'avoue, copier le programme depuis un site j'ai un soucis de compréhension sur la formule, même en cherchant sur ma calculette ou même sur un bout de papier je n'arrive pas a comprendre pourquoi ça :   
Quote
tension = mesure * 1.1 / 1024;


En sortie on obtien des Mv, si j'ai bien compris le *1.1 remet cette mesure a un juste voltage car ce qui sort a été modifié par l'utilisation du voltage 1.1V de référence, n'est ce pas ? (je m'exprime mal peut être)
Mais le 1024 je ne comprend pas, pourquoi pas /1000 pour mettre directment en Volt ?

Merci pour votre aide, jusqu'a maintenant.

fdufnews

Le codeur utilise une référence de 1,1V et il code sur 1024 pas donc 1 pas= ?????

tom70

Je n'est aucune idée de comment fonctionne l'arduino en terme de voltage etc pour ça que je demande ...

B@tto

C'est pas compliquer : analogRead te renvoi une valeur comprise entre 0 et 1024 (ADC 10 bits). 0 = 0V et 1024 = AREF

Donc pour reprendre fdufnews, si le codeur utilise une référence de 1,1V et il code sur 1024 pas donc 1 pas= ?????
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

icare

Bonsoir,
J'ai trouvé la réponse mais j'ai du convertir en bonbons.  ;)
@+
2B OR NOT(2B) = FF
Arduino 1.0.5 à 1.8.5 + gEdit + Ubuntu 18.04 LTS

fdufnews


Je n'est aucune idée de comment fonctionne l'arduino en terme de voltage etc pour ça que je demande ...

En haut de la page tu cliques sur "Reference". Dans la fenêtre qui va s'ouvrir tu cliques sur analogReference() et tu lis ensuite tu cliques sur analogRead() et tu lis. Tu en sauras à peu près autant que nous.

tom70

Je crois avoir compris, 1.1 volt et le 1024 sont utlisés pour convertir la valeur envoyé par le capteur en mv c'est bien ça ? Le 1024 je n'ai pas vraiment compris vu que les explications sont en anglais et c'est pas mon fort, pareil pour 1.1 volt, quelqu'un pourrait me résumer en quoi ils consistent ?

fdufnews

#12
Dec 18, 2013, 09:54 am Last Edit: Dec 18, 2013, 10:24 am by fdufnews Reason: 1

Je crois avoir compris, 1.1 volt et le 1024 sont utlisés pour convertir la valeur envoyé par le capteur en mv c'est bien ça ? Le 1024 je n'ai pas vraiment compris vu que les explications sont en anglais et c'est pas mon fort, pareil pour 1.1 volt, quelqu'un pourrait me résumer en quoi ils consistent ?

T'as pas beaucoup de temps pour approfondir le langage arduino!!
T'as pas beaucoup de temps pour approfondir l'anglais!!

Tu fais un bac touriste  :smiley-mr-green:
Si tu fais un bac "technique" et que tu ne maîtrises pas l'anglais tu pars avec un gros handicap.

L'ADC encode le signal analogique sur 10bits (soit 1024 pas).
Il utilise une référence de 1,1V, une référence dépendante de l'alimentation ou alors une référence externe. Donc lorsque tu choisis la référence interne avec une carte "standard" elle fait 1,1V.
Donc 1 pas = 1,1/1024
(je te laisse faire la division en espérant que tu as eu le temps d'approfondir les 4 opérations)

B@tto

1024 = 2^10   

10 vient du fait que le convertisseur analogique -> numérique de l'atmega est un 10 bits => 1 bit c'est un 0 ou un 1, le fameux binaire

http://fr.wikipedia.org/wiki/Syst%C3%A8me_binaire

Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

68tjs

1024 = 2^10 c'est du niveau de la classe de seconde.

Projet_de_lycée  multiplié par zéro_travail_personnel = 0 au Bac

Tu auras un oral où il te faudra présenter ton travail personnel.
A l'écrit il arrive qu'on puisse faire illusion. Par contre  l'oral est  sans pitié, si tu n'a pas bossé tu ne pourra pas faire illusion.

Tu as jusqu'à fin avril  pour tenter de rattraper le temps perdu, parce que Mai sera bouffé par la rédaction et juin par la préparation de l'oral..

Go Up