Go Down

Topic: TMP36 le retour (Read 297 times) previous topic - next topic

pomme-poire

Mar 26, 2019, 04:04 pm Last Edit: Mar 26, 2019, 04:05 pm by pomme-poire
....sur le mega cette fois. Avec afficheur lcd
Bon, j'ai relu 200 fois mon code mais rien, niet nada zéro

Avec le metrix, j'ai 0.73 V (ce qui me va bien) mais le CAN trouve 0.88 V .
Attention : je dis le CAN mais c'est peu être mon code qui est pourris !

Bien sur, j'ai tenté avec l'alim du PCB

tant pis, je me résigne à soumettre mon code  :smiley-confuse: <----smiley ridicule c'est nul je sais

Code: [Select]

                                      // library SPFD5408 c'est celle là pour le mega

#include <SPFD5408_Adafruit_GFX.h>    // Bibliothèque graphique principale
#include <SPFD5408_Adafruit_TFTLCD.h> // Bibliothèque spécifique à matériel

                                      // LCD Pin pour le méga, pas pour les autres, pu...j'ai cherché!
#define LCD_CS A3 // CS
#define LCD_CD A2 // RS
#define LCD_WR A1 // WR
#define LCD_RD A0 // RD
#define LCD_RESET A4                  // Facultatif : autrement se connecter à la broche de réinitialisation d'Arduino

                                      // certaines valeurs de couleur ALC de 16 bits
#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF

                                      // initialisation
int tempPin = A14;
float volts = 0;
float degre = 0;



Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);

                                      //Configuration de l'alim virtuel (même résultat avec alim VCC  PCB)

void setup(void) {
Serial.begin(9600);  
const int vcc = A13;
pinMode(vcc,OUTPUT);                  //vcc virtuel
digitalWrite(vcc,HIGH);
const int gnd = A15;
pinMode(gnd,OUTPUT);                  //gnd virtuel
digitalWrite(gnd,LOW);
                                      // Initialise le controleur
  tft.reset();

  tft.begin(0x9341);

  tft.setRotation(3);                 // rotation de l'écran

                                      // gueule de l'écran

    tft.fillScreen(BLACK);            //couleur du fond
    tft.setTextColor(GREEN);          //couleur texte
    tft.setTextSize (2);              //taille du texte
                                      //texte hors de la boucle
                                        
    tft.println("Commence par me gonfler ce capteur"); //texte
 
 }

// boucle

void loop()
{
      tempPin=analogRead(A14);             //acquisition
      float volts = (tempPin * 5.0)/1024.0;//traduction des données en volts (avec ou sans float, j'ai la même chose)
      degre=(1000*volts-500)/10;           //traduction en degrés
      tft.setCursor (0,80);                //point de départ pour l'écriture sur lécran
      tft.setTextColor(GREEN);             //couleur du texte
      tft.setTextSize (2);                 //taille du texte
      tft.print("T : ");                  
      tft.print(degre);                    //écriture de ma valeur en degré, enfin ça devrait
      tft.print("  Tension : ");
      tft.print(volts);
      delay(2000);                         //on bois le café
      tft.setCursor (0,80);                //repositionement
      tft.setTextColor(BLACK);             //couleur
      tft.print("T : ");
      tft.print(degre);                    //éffacement mais c'est chiant ça clignote
      tft.print("  Tension : ");
      tft.print(volts);                    //bon vous avez compris, je lis 0.73 avec mon metrix et 0.88 avec le CAN
      
// pour tester sans écran avec le moniteur série
Serial.print("t°  ");
Serial.println(degre);
Serial.print("tension :  ");
Serial.println(volts);
Serial.print("valeur du CAN :  ");
Serial.println(tempPin);
  
}



lesept

Ce lien indique comment utiliser la référence interne sur un Mega pour faire une mesure de tension plus précise
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

pomme-poire

cool merci, je regarde demain, ma femme va rentrer ! Elle n'est pas en retraite elle, vous m'avez pas vu.

pomme-poire

#3
Mar 26, 2019, 05:14 pm Last Edit: Mar 26, 2019, 05:15 pm by pomme-poire
et voilà !

lesept

Belle photo ! Je l'imprime en grand et je l'affiche au dessus de mon lit !!! :)
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

dbrion06

Mais qu'est ce qui peut perturber l'alimentation de l'atmega au point de biaiser son alimentation?
L'écran -doit consommer-? La malchance?

fdufnews

Le fait d'utiliser une sortie de l'ATmega pour le gnd ce n'est pas une très bonne idée. Autant utiliser une IO pour le +5 du capteur n'est pas très gênant car le LM36 peut fonctionner avec 2,7V autant en utiliser une pour le GND est plus problématique car la sortie n'est absolument pas tenue de descendre à 0V et cela peut introduire un biais que tu ne maîtrise pas car ce biais dépend de pas mal de paramètres comme la température par exemple (mais pas que ...).

L'alimentation de ton arduino n'est pas non plus égale à 5,0000V et cela peut aussi fausser le résultat.

hbachetti

Tout dépend comment l'ARDUINO est alimenté.

Si c'est par l'USB, le 5V est loin de valoir 5V.
Mon USB : 5.34V mais ça varie.

Si c'est par VIN, c'est mieux. Le régulateur de la MEGA fait le boulot.

Il est possible de mesurer la tension 5V de la MEGA et ensuite tu corriges dans le code :

Code: [Select]


// par exemple
#define VREF 5.05

      float volts = (tempPin * VREF)/1024.0;



Tu peux également mesurer la référence 1.1V de la MEGA (pin VREF) et faire la même opération.

C'est un étalonnage ...

Sur un AtMega la référence 1.1V n'est pas précise (10%) et varie en fonction de la température.

Voir 31.8    ADC Characteristics
https://ww1.microchip.com/downloads/en/devicedoc/atmel-2549-8-bit-avr-microcontroller-atmega640-1280-1281-2560-2561_datasheet.pdf



Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

hbachetti

Quote
Le fait d'utiliser une sortie de l'ATmega pour le gnd ce n'est pas une très bonne idée.
En effet je ne vois pas l'intérêt ...
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

pomme-poire

donc, bien sur que j'avais aussi alimenté avec le gnd vcc du pcb (comme je l'avais précisé, faudrait écouter hein, va y'avoir des heures de colle !)
Mais c'était idem.
J'avais aussi essayé avec une batterie
mais toujours pareil
donc, correction de la valeur de réf.
J'étais plus habitué à ça !

L'intérêt de mon bidule ALC ?

Planter le capteur direct sur le connecteur de la  pcb

hé oui, fainéant

Et puis, je voulais voir.

Et j'avais l'idée au dépars de trouver un capteur autonome en terme de régulation. Je vois que non.

Mais bon, y'a 2 mois je ne savais pas ce qu'était un arduino. J'apprends, ça serre à ça le retraite !

On se marre bien je trouve, et comme je ne suis plus en 2ndmachintruc, j'ai le temps de faire des conneries

Merci les amis

dbrion06

Vous faites peu de conneries.
Cependant, si vous n'appréciez pas defaire clignoter votre écran quand la température varie peu, l'esquisse de squelette de  bout de code qui introduit une hysteresis peut être agréable:
declarer une variable globale float oldTempe;
si (abs(oldTempe - tempe) > 0.5) {
  oldTempe = tempe;
  afficher....
}

et vous buvez le café rapidement....

pomme-poire

#11
Mar 26, 2019, 07:39 pm Last Edit: Mar 26, 2019, 09:16 pm by pomme-poire
il faut me tutoyer !sinon ça me met mal à l'aise car je tutoie tout le monde.

merci, c'est une question à laquelle j'allais m'attaquer. Je me suis dis que ma petite phrase sur ce sujet serait peut être remarquée discretement !! trop fort Mr dbrion

édit: ça ne suffira pas. il faut que je ne modifie que ce qui change sur l'afficheur.
faire un écran noir entre 2, c'est cata, écrire l'ancien nombre couleur du fond, ça va bien si y'a pas grand chose qui bouge
Le coup de la variable, ça va dans cette fonction de thermomètre mais pour des trucs plus complexes que je ferrai, faut que je trouve autre chose

bonne nuit

fdufnews

#12
Mar 26, 2019, 09:51 pm Last Edit: Mar 26, 2019, 09:54 pm by fdufnews
Et j'avais l'idée au dépars de trouver un capteur autonome en terme de régulation. Je vois que non.
Le TMP36 fonctionne sur une fourchette d'alimentation assez large. Le problème que l'on évoque c'est:
  • la stabilité de la référence de l'ADC. Par défaut la référence de celui-ci est la tension d'alimentation qui dépend donc de l'alimentation utilisée
  • le fait de mettre le gnd du LM36 génère un biais non maîtrisé.

pomme-poire

j'ai fait le montage hors arduino

alim de 3 à 6 v

température contrôlé donc stable

--> variation de la sortie (chargé) presque .01v

mais la courbe reste linéaire donc il suffi d'incorporer un offset dans la formule ou un potar pour étaloner.

J'en suis la

byebye

dbrion06

Je réagis à
Quote
"

édit: ça ne suffira pas. il faut que je ne modifie que ce qui change sur l'afficheur.
faire un écran noir entre 2, c'est cata, écrire l'ancien nombre couleur du fond, ça va bien si y'a pas grand chose qui bouge
Le coup de la variable, ça va dans cette fonction de thermomètre mais pour des trucs plus complexes que je ferrai, faut que je trouve autre chose
"
Si vous avez plusieurs variables dignes d'interet à afficher, rien n'empêche de faire un ou logique || pour décider de rafraîchir l'écran (l'une au moins des variables a suffisamment changé pour qu'un rafraîchissement s'impose).

Normalement, vous n'aurez jamais d'écran noir (au besoin, initialiser oldTempe à -99999.9, oldHumi à -9, valeurs qui n'ont pas de sens physique....)

Par ailleurs, j'ai écrit "dignes d'interet": j'avais insisté pour que les étapes intermédiaires du calcul soient affichées pour dépanner, mais est ce judicieux (au moins sur l'écran, qui doit rester sobre et sexy) en final (on peut cependant les garder sur le port série, si on ne se noye pas avec des dizaines de lignes...)

Go Up