Wattmètre avec ecran 16x32 rgb + shield

Bonjour,

Je me permet d ouvrir ce nouveau post car ceci est un nouveau projet (lié en partie avec mon précédent sur la rénovation d un ancien ampèremètre gousset)

Cette fois ci il d agit de retranscrire les infos sur un écran led 16*32 d adafruit avec l aide d un Shield, le tout en couleur. :slight_smile:

Pour le raccordement de l écran à l arduino il y a de la documentation sur adafruit.com. Plus qu a trouver la bonne via le shield.

La première partie du circuit est la même que précédemment (lecture données pince ampèremètrique)

Il faudra penser à rajouter un calcul P=U*I ou ici U sera fixé à 230 volts (perte de précision) et I sera lue par la pince.

Le problème qui se pose ici est d écrire la valeur calculée sur l écran led. J ai trouver le moyen d écrire un mot lettre part lettre via matrix avec l exemple ci dessous.

matrix.setTextColor(matrix.Color333(7,0,0));
  matrix.print('1');
  matrix.setTextColor(matrix.Color333(7,4,0)); 
  matrix.print('6');
  matrix.setTextColor(matrix.Color333(7,7,0));
  matrix.print('x');
  matrix.setTextColor(matrix.Color333(4,7,0)); 
  matrix.print('3');
  matrix.setTextColor(matrix.Color333(0,7,0));  
  matrix.print('2');
 
  matrix.setCursor(1, 9);   // next line
  matrix.setTextColor(matrix.Color333(0,7,7)); 
  matrix.print('*');
  matrix.setTextColor(matrix.Color333(0,4,7)); 
  matrix.print('R');
  matrix.setTextColor(matrix.Color333(0,0,7));
  matrix.print('G');
  matrix.setTextColor(matrix.Color333(4,0,7)); 
  matrix.print("B");
  matrix.setTextColor(matrix.Color333(7,0,4));

Source : adafruit.com

Je ne vois pas comment écrire ma donnée (par exemple 4 chiffres) avec ce système d écriture.

dbrion06 m a alors conseillé de chercher des infos sur les (c)string, mais la non plus je ne suis pas sûr de moi...

J ai trouver cela sur arduino.cc :

char *myStrings[] = {"This is string 1", "This is string 2", "This is string 3",
                     "This is string 4", "This is string 5", "This is string 6"
                    };

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

void loop() {
  for (int i = 0; i < 6; i++) {
    Serial.println(myStrings[i]);
    delay(500);
  }
}

Donc si je remplace la phrase du char par ma valeur —> char *myStrings[] = {val}; cela va t il fonctionner ? Ou bien simplement m écrire val ?

J en doute ^^ qui plus est comment puis je faire avec ce système pour la couleur ? Puis je définir que, peut importe la valeur, à telle ligne tel point la couleur sera toujours la même ?

Il faudrait donner, pour les paresseux -comme moi-, la référence à matrix de lady Ada;
set textColor a l'air de fixer la couleur du texte suivant en rgb... avez vous essayé de la fixer une fois pour toutes ;
avez vous essayé
matrix.print( 123 ); // si ça marche, votre problème est résolu
ou
matrix.print( "salut" ); // si ça marche, et que l'essai précédent ne marche pas, vous devez convertir un nombre en String....

Si la librairie utilisée est celle-ci :

Il faut aussi celle-ci :

Comme la classe Adafruit_GFX hérite de Print, on peut faire avec tout ce que l'on fait avec Print ou Serial.print.

Merci.

Pour les librairies j ai trouvé celles ci mais je ne sais pas si elles sont adaptées. Personnellement je ne comprends pas grand chose au contenu...

Tu parle de ceci :

un écran led 16*32 d adafruit

Cette librairie LCD : RGB LCD Shield Kit w/ 16x2 Character Display - Only 2 pins used! [NEGATIVE DISPLAY] : ID 714 : $24.95 : Adafruit Industries, Unique & fun DIY electronics and kits n'a rien à voir avec ton produit LED matrix.

Si tu répondais aux questions, tu ne crois pas que ce serait plus facile ?

Il faudrait donner, pour les paresseux -comme moi-, la référence à matrix de lady Ada;

Votre lien est adapté à un LCD 16x2

This is a library for the Adafruit RGB 16x2 LCD Shield

Le lien de HBachetti est plus vraisemblable ; une référence à la matrice que vous avez achetée (des fois, le vendeur donne le lien vers la librairie qu'il recommande) permettrait de s'en dépatouiller.

Veuillez m excuser je n avais pas bien fait attention...

Voici le modèle :

Petite précision concernant mon fonctionnement. J ai pas mal de petits projets et malheureusement pas toujours les finances pour que tout le matériel suive.

La plupart du temps je monte donc mes projets sur papiers en avançant le plus possible dessus.

Il arrivera souvent que je développe un projet sans que je ne puisse tester le matériel de suite..

Merci pour le lien, qui est limpide

We have a full wiring diagrams and working Arduino library code with examples from drawing pixels, lines, rectangles, circles and text. You'll get your color blasting within the hour!

Le lien est dirigé vers une aide complète (et , n'étant pas très habile en matériel, ... je suis rempli d'admiration et d'horreur devant le câblage), qui ... confirme les intuitions de HBachetti concernant les choix des bibliothèques.

Il arrivera souvent que je développe un projet sans que je ne puisse tester le matériel de suite..

Vous pouvez tester la génération de code sans avoir le matériel:

int watt = 123;
  matrix.print( watt ); // si ça marche, votre problème est résolu
float wattF=123.4;
 matrix.print( wattf ); // si ça marche, votre problème est résolu dans tous les cas de figure

permetrrait de savoir si le compilateur proteste (s'il ne proteste pas, le post 2 de HBachetti a l'air de très bon augure)

J ai survolé le post mais je vois pas trop le problème, utilise plutôt un ecran oled i2c au lieu de ce lcd qui me semble une usine a gaz, et convertit ta valeur watts qui est un float je suppose, en char array avec dtostrf par exemple

Ce n'est pas un lcd; c'est une matrice de leds tricolores (mais , du point de vue câblage, c'est impressionnant et plus complexe qu'une petite usine à gaz).
Je ne pense pas que l'affichage soit un problème; ce qui me chagrine, c'est le
calcul des watts (je suppose qu'il faut, soit
échantillonner aussi vite que possible l'intensité et la tension pendant 20 ms -la période du secteur en France-, faire des produits et moyenner le résultat,
soit échantillonner pendant longtemps -de préférence un multiple de 20 ms- et ... faire des produits et moyenner le résultat)

Ah pardon pour l affichage, pour le reste je dirais moyenne des résultats mais je suis pas spécialiste

Je vais me placer dans le cas idéal d'une tension alternative de 1 volt crête appliquée à une resistance parfaite de 1 Ohm (pour ne pas avoir à trâiner des multiplications) :
la puissance instantanée sera de cos(t)**2, soit 0.5 * (cos(2t) +1) , soit 1/2 en moyenne; l'écart par rapport à la puissance moyenne étant de cos(2t).
La puissance moyenne estimée sur un temps fini sera réaliste si
on échantillonne très vite pendant une demi periode (ou un multiple); si on n'échantillonne pas pendant une (demi) periode, il restera un terme en cos(2t), qui correspondra à une erreur de 10 % si on a utilisé 10 demi- périodes :
il faut alors moyenner sur une "longue" période pour que ce terme ne soit pas gênant.

Il reste à expliquer la confusion entre demi periode et periode (ce que j'avais recommandé): pour ne pas trop user des fers à souder, des gens mettaient une diode en série avec leur fer (qui restait une resistance "parfaite"). Là, un calcul sur une demi periode a des chances d'être très irréaliste...

Merci de vos retour d infos.

Erreur de ma part... je n avais pas pris en compte beaucoup d infos pour le calcul sur le réseau.. j ai du boulot !!

Je vais calculer à l aide de l arduino la puissance instantanée (real power).

Coté lecture intensité c est réglé, il faut maintenant que j obtienne une donnée de tension. Pour cela je possède déjà un chargeur d iPhone que j ai démonté transformant le 230v AC du réseau en 5v DC. Il faudrait que je régule la tension à 4,6 volts à l aide de résistance pour faciliter les calculs (rapport de 50).

Une fois que je possède ces données je peux commencer à calculer ma puissance.

J ai trouver ceci sur open energy

for (n=0; n// inst_voltage and inst_current calculation from raw ADC input goes here

  inst_power = inst_voltage * inst_current;

  sum_inst_power += inst_power;
}

real_power = sum_inst_power / number_of_samples;

Il faut que je rajoute au préalable un calcul pour la tension

analogPin1 = 4 // entrée analogique 4 tension 

val_V = 0 // variable valeur tension

Void loop ()

{
val_V = analogRead (analogPin1)

inst_voltage = val_V * 50 // valeur tension 0-4,6 volts x facteur division transformateur

Delay (20) // tempo 20 millisecondes

Il faut aussi, je pense, intégrer EmonLib au programme, maintenant je ne sais pas trop comment elle fonctionne. Je crois qu elle sert pour la calibration sans certitude.

Cela donnerait

# incluse emonLib.h <>

EnergyMonitor.emon1 ;

Void setup ()
{
emon1.current (analogPin, ??) ; // pin, quelle calibration ?
emon1.voltage (analogPin1, ??) ; // pin, calibration ?
}

Le chargeur d'accus que vous avez demonté est fait comment?
Parce que j'ai un chargeur Nokia, qui accepte 100 à 240v et sort ... du 5volts (sous 0.35A en continue).: il a une telle régulation qu'il ne peut suivre en aucune façon les variations du secteur (+-20% si ma mémoire est bonne). Ceci est une hypothèse de départ qui méritera d'être raffinée par la suite.
A noter que, pour le moment, si vous décrétez que la tension secteur est constante et fixée (ça peut poser problème si vous allez avec votre watt mètre en Grande Bretagne; heureusement qu'il y a le Brexit), vous pouvez ne pas faire le calcul de la puissance moyenne, mais uniquement celui de l'intensité moyenne: ceci vous économise une multiplication en flottant (qui est assez coûteuse en cycles)
il vous reste à regarder comment est l'intensité: je suppose qu'elle sort d'une pince ampéremètrique, réglée pour donner 1volt/ampère... et cadrée par le réseau de resistance de HBachetti (du post précédent) :
à 0Ampères, vous avez 2.5volts sur la patte analogique;
à 1 Ampères, vous aurez 1.5v ou 3.5 volts....
Vous devrez calculer la moyenne quadratique du courant, proportionnelle à (ADC-512)**2 -chaque terme a 10 bits; au carré, ça fait 32 bits ou un float, en supposant que l'intensité est parfaitement cadrée.
Pour ce faire, je propose de faire en 2 étapes:
mesurer à toute vitesse les valeurs sur l'ADC, et les mettre dans un tableau, ce pendant 20 millisecondes(je fais l'hypothèse que le secteur est parfait, et parfaitement à 50 hz): comme la vitesse maximale du CAN est de 13khz -période 77 micosecondes- ; ça vous fera ... moins de 300 mesures sur 2 octets (à mettre en regard des 8 koctets de RAM: on en mange 10%, ce qui n'est pas gênant) .

Une fois ce tableau rempli, calculer sa valeur moyenne (on peut la calculer sur 16 bits, IMO) et décréter que ce sera le cadrage de l'intensité.
Calculer la valeur moyenne du carré de la différence (mesure -cadrage), et en prendre la racine carrée (là, vous devez utiliser des floats; sinon, c'est héroîque -ou faire un pari sur le caractère sinusoîdal de l'intensité,...)
Elle sera alors prête à être multipliée par 220 (notez que je n'utilise qu'une période du secteur: ceci garantit des rafraîcissements très rapides; si au contraire, vous attendez 20 millisecondes (au lieu de ca 80 microsecondes) pour refaire une mesure, vous aurez, par un effet stroboscopique, une valeur sinusoîdale qui varie lentement et il faudra un temps de dingue pour qu'elle se stabilise)

si on veut faire les choses très proprement, il faut déterminer le début et la fin d'une période -la valuer passe au dessus de la valeur moyenne en début et en fin- et ne calculer des carrés qu'entre ces deux moments -je relâche l'hypothèse qu'on a du "vrai" 50 hz...

@dbrion06

Tu as vu la tartine que tu as écris.... ?

tu n'arriverais pas à aéré un peu ton texte, sans vouloir faire de reproches, on le demande aux nouveau posteurs...

Merci d avoir pris le temps d écrire une réponse aussi complète, ca m a l air bien complexe tout ca. Il va me falloir un peu de temps pour décanter ça ^^ Je ne suis pas à l aise :stuck_out_tongue:

Pour le chargeur c était bien mon inquiétude... je pense que vous avez raison il dois être bien régulé, je vais donc en rechercher un autre plus « classique »

Pour faciliter la chose je pourrais effectivement fixer la valeur de la tension à 230 volts. Je vais perdre en précision mais ce n est pas un problème du moment que j ai la consommation « approximative » de la puissance au moment t. Je vais sûrement me diriger sur cette solution pour le moment.

Je me suis trompé tout à l heure, le circuit pour l intensité est bon mais pas la partie lecture calcul. Je pensais tout simplement recuperer la valeur et la multiplier par le nombre de spires du transfo. Est il absolument nécessaire de moyenner les résultats ? Je vais rechercher des infos là dessus parce que je ne connais pas.

Ensuite utiliser P = U*I pour avoir le total en watts. Je ne sais pas s il est nécessaire de multiplier par cos(phi) en fonction du matériel..

Mais comme rien est simple dans la vie je sens que je vais dans le mur.

"tu n'arriverais pas à aéré un peu ton texte, sans vouloir faire de reproches, on le demande aux nouveau posteurs...
"

J'espère que je n'ai pas fait 2 fôtes de grammaire par ligne. (ça fait au moins autant mal aux yeux qu'un texte long)

Par ailleurs, je serais preneur d'une explication claire et concise du calcul de la valeur efficace (qui a un sens pour l'intensité) ou de la puissance (le sujet), sachant que les intensités et voltages sont mesurés à une constante additive près (qui perturbe le calcul); ce pour un signal périodique.
Quelle est la requête magique à google?

"Pour le chargeur c était bien mon inquiétude... je pense que vous avez raison il dois être bien régulé, je vais donc en rechercher un autre plus « classique »
"
Pour le moment, il faut se concentrer sur le traitement de l'intensité, qui est convertie en une grandeur assimilaable par le CAN DAC = a+b I; a est inconnu (mais permet de ne pas mettre des tensions négatives dans la CAN). Si on moyenne le CAN sur une période, le terme lié au caractère alternatif de l'intensité disparaît; reste (une règle de trois)
Ensuite, l'intensité efficace est la racine carrée de la moyenne de (b
(I -moyenne CAN)**2), toujours sur une période (on peut faire un pari sur b)...

Soit vous
a) déduisez phi du temps entre le passage de U au dessus de sa moyenne (u[i-1] < moyenneU et u > moyenne) et le passage de I au dessus de la moyenne
b) vous pariez que cos phi == 1 (cas de radiateurs, bouilloires)
c) vous faites le produit de I instantané et U instantané (au lieu d'élever I au carré) et vous moyennez le tout sur une période ... ou un temps très long... ou un multiple entier d'une période

J ai trouver des infos sur ce site :

https://learn.openenergymonitor.org/electricity-monitoring/ac-power-theory/arduino-maths

Ceci pour la calibration :

https://learn.openenergymonitor.org/electricity-monitoring/ctac/calibration

Et pour le système de calcul j ai trouver cela :

https://learn.openenergymonitor.org/electricity-monitoring/ct-sensors/how-to-build-an-arduino-energy-monitor-measuring-current-only?redirected=true