TMP36 le retour

....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 :confused: <----smiley ridicule c'est nul je sais

                                      // 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);
  
}

Ce lien indique comment utiliser la référence interne sur un Mega pour faire une mesure de tension plus précise

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

et voilà !

Belle photo ! Je l'imprime en grand et je l'affiche au dessus de mon lit !!! :)

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

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.

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 :

// 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

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

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

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

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

pomme-poire:
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é.

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

Je réagis à

"

é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…)

Il faut me tutoyer.
Restons calme,

je l’ai fait rapide car c’était pas mon sujet.

dbrion06:
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…)

bien évidement. le port série n’était là que pour pouvoir utiliser le code sans posséder d’afficheur lcd .
Et bien évidement, un code qui servira pour de vrais sera optimiser pour ne rafraîchire les variables que si nécessaire !
Je ne vais pas rafraîchire la température sur un thermostat toutes les 3 millisecondes.

dbrion06:
Je réagis à 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).
[/quote]

Je pense qu’il faudrait ne toucher qu’aux pixels qui on varié.
donc (toujours je pense) qu’il va falloir aborder d’une manière graphique plutôt que de se contenter du jeux de caractère.
Une première étape améliore grandement les choses : juste avant d’afficher un caractère chantant, “j’imprime” l’ancien en noir ce qui supprime quasiment le clignotement mais pas complètement, un langage évolué puis compilé, c’est pas comme si on écris en assembleur.
Quand on écris sur ce type d’afficheur, si j’écris “8” et plus tard je le remplace par ‘1’ le “8” ne s’efface pas, on écris " par dessus " pas donc je dois soit :
- rafraîchir totalement
- imprimer une page vierge est tout recopier
- effacer les pixels indésirables et les remplacer par la couleur du fond.
dans ce dernier cas qui est le bon (me semble il):
je traite comme un sprit mon caractère.
2 solutions :
- j’efface mon sprit en utilisant le jeux de caractère donc je fait une action double et …c’est 2 actions , ça va si pas grand chose ne bouge
- je crée mes propre sprit (je savais le faire sur attari en assembleur mais alors c’est loin) qui occupe l’espace . Là, je n’ai plus qu’une action.
Et je pourrais faire des caractères de tailles plus grande (je suis vieux et presbyte (et casse c,) qui ressembles à quelques chose.
Dans les deux cas, si par exemple je doit imprimer une variable, cela m’oblige à analyser cette variable . Exemple, x=2000, tftprint (x) vas écrire 2000. Si x devient 2200, je ne dois pas écrire 2200 mais 2_, je conserve 2_00, donc juste le 2_ vas clignoter. Ce qui va être plus " sexy" , mais c’est des lignes de codes !
**Peut être existe il d’autres solutions, surement même , je suis loin de tout connaître. **

Je voyais une solution beaucoup plus simple, ne rafraîchissant que des rectangles contenant du texte (plus rapide que de tout rafraîchir, ne nécessite pas de mémoriser le texte précédent pour le mettre à la couleur d'arrière plan, permet de mettre des fonds de diverses couleurs... ainsi que les textes)

Je ne sais pas ce que c’est que ces librairies

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

mais la librairie GFX d’Adafruit gère l’arrière plan automatiquement lors du tracé des caractères si la valeur bg est définie

    setTextColor(uint16_t c),
    setTextColor(uint16_t c, uint16_t bg),

.si on utilise la deuxième méthode de setTextColor() alors l’arrière plan est défini et le tracé d’un caractère efface le fond ET dessine le caractère sans intervention supplémentaire/

fdufnews:
Je ne sais pas ce que c’est que ces librairies

#include <SPFD5408_Adafruit_GFX.h>    // Bibliothèque graphique principale

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



mais la librairie GFX d'Adafruit gère l'arrière plan automatiquement lors du tracé des caractères si la valeur bg est définie


setTextColor(uint16_t c),
    setTextColor(uint16_t c, uint16_t bg),


.si on utilise la deuxième méthode de setTextColor() alors l'arrière plan est défini et le tracé d'un caractère efface le fond ET dessine le caractère sans intervention supplémentaire/

je découvre quelque chose. J’étais sur la même idée que dbrion06, voir recréer une bibliotheque, mais là, tu m’interpelle . Quand j’aurais le temps, je regarderai cette piste. Je fini d’abord avec mon capteur.

donc vous m'avez conduit ici : http://webge.dyndns-server.com/dokuwiki/doku.php?id=arduino:libadagfx