2019-12-03 20:25:05 (Modification du message : 2019-12-08 09:29:38 par OrOoX.)
Allez histoire d'arrêter de flood le Blabla, petit sujet régul à base d'arduino Uno,
du coup j'ai mis tout ça au propre sur une planche de mdf en attendant un truc définitif.
Comme je voyais pas ce qui ce passait j'ai rajouté un écran LCD, donc là le détendeur électronique
sera régulé à partir de la pression d'évaporation et une sonde 1-Wire pour la surchauffe.
Comme j'ai remarqué que les régulateurs 5 et 12V chauffaient ( plus le 5V ) j'ai fabriqué un petit rad en alu
avec de la patte thermique, ça aide mais ça picoque toujours les doigts, à voir.
Pour éviter d'envoyer une tension trop élevée dans la bobine du détendeur, et accessoirement j'en ai
besoin pour l'ampli aussi car je vais en profiter pour réguler le compresseur
2019-12-04 19:38:20 (Modification du message : 2019-12-04 19:43:34 par OrOoX.)
T'arrête pas à la première ligne
Bon par contre le programme est relou là ... il arrive pas à me calculer un truc qui me donne le bon résultat
quand je le fais moi même sur la calculatrice.
Il manque des parenthèses, l'ordre du calcul n'est pas forcément celui que tu pense ni celui de ta calculatrice. Il faut toujours forcer la précédence avec des parenthèses quand c'est important.
Ton faux résultat est probablement dû à ça ou à un overflow (d'où le comportement correct quand tu passes en flottant).
Et c'est quoi ce calcul ? c'est le bordel, si je devais deviner je dirais que t'as mélangé du scaling, de la calibration et de l'ampli. Tu devrais vraiment séparer et commenter les constantes (genre 102 c'est quoi ?) parce que le jour où tu voudras modifier un paramètre tu vas plus rien comprendre et tu vas passer des heures à reverse-engineerer ton propre code...
Et un 78xx c'est pourri comme référence de tension, perso je baserais pas ma régu là-dessus.
Congratulations !!! You've just created a temporal loophole... Mon site | Mon forum
// Définition des pins utilisés par le Shield LCD
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
#define ONE_WIRE_BUS 6 // Définition de la valeur du BUS OneWire
OneWire oneWire(ONE_WIRE_BUS); // Définition du BUS OneWire
DallasTemperature sensors(&oneWire); // Conversion OneWire > DallasTemperature
Perso je ferais tous mes calculs en virgule fixe pour éviter les flottants (spa vraiment ce qu'il y a de mieux sur l'arduino...).
~
Une référence de tension, genre TL431 par ex. A défaut une zener correctement biaisée.
Le problème du régu c'est qu'il dérive avec la température (-1 mV/°C, vu la Rthjc t'es vite entre 50 et 100 mV dans les choux) et comme il s'échauffe en fonction du courant consommé la dérive est aléatoire. Sans compter tous les autres défauts qui sont en principe pas un problème vu qu'il n'est pas prévu pour ça à la base (la tension peut être n'importe où entre 11.5 et 12.5 V en sortie d'usine, +/- 100 mV selon le courant consommé, ...). Quand tu cumules tous les effets tu te retrouves avec une précision vraiment pourrie.
Congratulations !!! You've just created a temporal loophole... Mon site | Mon forum
Virgule fixe ? C'est quoi la différence ? Limiter le nombre de chiffres après la virgule ?
Quand même étonnant ce que tu annonce pour les régulateurs, tous les fabricants en utilisent sur leurs PCB principal pour alimenter
les sondes & capteurs et il n'y aucune régulation derrière, ça va direct du régulateur au composant final et pourtant c'est sujet à des températures
qui peut être -10°C comme 50°C vu qu'elles sont toujours dans l'UE.
Par exemple dans le cas d'hitachi ça alimente en direct les capteurs de pression, c'est pourtant un organe critique pour la régulation.
En gros oui, sauf que comme tu connais le nombre de chiffres après la virgule tu peux utiliser des simples entiers. Par exemple pour un prix ce sera toujours 2 décimales donc tu peux le représenter comme 123.45 ou alors 12345. Pour des °C tu peux travailler avec des dixièmes de degrés, 25.3 °C devient 253 par ex.
Je n'ai pas dit que ça marchait pas, je dis que c'est imprécis. Les fabricants préfèrent économiser et simplifier les PCB (ce qui engendre d'autres économies au passage...) donc ils sont prêts à sacrifier cette précision. Mais si je conçois un truc moi-même je préfère rajouter 34 cts (le coût d'un TL431...) et avoir une vraie référence...
Après c'est ce que je ferais et ce que je conseille, t'es pas obligé du tout de suivre, mais ne crois pas que tu pourras réguler à 2 décimales (ou même une en fait; 5 % de 50 °C ça fait déjà 2.5 °C, et 5 % c'est optimiste...) si tu te bases sur un 78xx comme ref de tension.
Congratulations !!! You've just created a temporal loophole... Mon site | Mon forum
2019-12-04 21:43:39 (Modification du message : 2019-12-04 21:44:14 par OrOoX.)
Pas con de fonctionner avec des entiers mais ça fait rajouter des calculs en plus pour reconvertir les données à chaque fois que
tu veux les afficher ou autres, donc kif kif, après j'ai un délais de presque 1 seconde entre chaque boucle donc je lui demande pas
l'impossible non plus en terme de vitesse, surtout que j'utilise des delay et step qui sont bloquants.
Pour les 78xx, les températures donnés étaient à titre indicatif, dans mon cas l'arduino va être dans une armoire métallique avec une température
beaucoup plus linéaire qu'en extérieur et c'est un circuit test, c'est loin d'être une version définitive vu que la plus part des fonctions doivent être
reprises par l'automate siemens une fois programmé, mais certaines resterons sur arduino comme le détendeur vu que pas de pwm sur le siemens.
2019-12-04 23:28:49 (Modification du message : 2019-12-04 23:33:41 par BiduleOhm.)
En principe y'a qu'un seul calcul, qui est juste une division d'ailleurs, vu que tu affiches les valeurs qu'à un endroit.
Faut absolument que t’apprenne à faire un vrai timer (non bloquant) si tu veux faire un truc sérieux (voir ci-après), tu peux pas te permettre de bloquer la régu juste pour pouvoir afficher un truc par ex, sans compter que tu peux pas faire plusieurs choses à différentes vitesses avec des delay().
T'oublie l'échauffement du régu lui-même, c'est pas juste l'environnement, mais comme je disais c'est toi qui vois, je te laisse tranquille
Donc, concernant le timer c'est vraiment pas compliqué; le concept c'est de de stocker le temps au début du timer et de calculer la différence entre le temps actuel et le départ: si la durée obtenue est inférieure au délai voulu on ne fait rien, si elle est supérieure on exécute ce qu'on voulait exécuter après le délai voulu :
Code :
uint32_t start;
void setup()
{
start = millis();
}
void loop()
{
if ((millis() - start) > 5000) {
//
// fait ce que t'as à faire après 5 secondes
//
start = millis(); // supprime cette ligne si tu veux juste que le timer s'exécute une seule fois après le démarrage
}
}
Pour un peu plus de propreté et pouvoir faire plusieurs timers sans se mélanger les pinceaux je m'étais fait une classe https://pastebin.com/zr5AGtr2 t'as juste à inclure ce code avant le reste et pour l'utiliser c'est simple :
Code :
Timer *myTimer = new Timer();
Timer *myOtherTimer = new Timer();
void setup()
{
myTimer->reset(5000UL);
}
void loop()
{
myTimer->update();
if (myTimer->hasEnded()) {
// fait ce que tu veux ici après 5 secondes
}
myOtherTimer->update();
if (myOtherTimer->hasEnded(1000UL)) {
myOtherTimer->reset();
// fait ce que tu veux ici toutes les secondes
}
}
Comme tu peux voir il y a deux utilisations possibles: en général on utilise la première version (myTimer) quand on veut un timer qui s'exécute qu'une fois, et on utilisera la seconde version (myOtherTimer) qui prend le délai directement dans le test de fin quand on ne sait pas le délai à l'avance (dans setup()), ou quand on veut un timer qui boucle à l'infini ou encore quand on veut pouvoir changer le délai dynamiquement.
Si tu veux un timer qui s'exécute qu'une fois il suffit de retirer le ->reset(); qui est dans le if, comme dans l'exemple du premier timer.
N'oublies pas le ->update(); parce que sinon le délai sera infini et le code s'exécutera jamais...
Et même si le timer n'est pas bloquant n'oublies pas que ce que tu exécutes l'est. Par exemple dans le premier timer si tu prends 2 sec pour faire un truc alors ce que tu exécutes dans le second timer ne sera pas exécuté toutes les secondes comme voulu mais toutes les 2 secondes, l'arduino n'est pas multi-tâches...
Congratulations !!! You've just created a temporal loophole... Mon site | Mon forum
2019-12-05 21:14:54 (Modification du message : 2019-12-05 21:44:07 par OrOoX.)
Bon bah moi pas comprendre ... La fonction mapf fait n'importe quoi avec les valeurs ...
Si je met "mapf(Capteur_BP, 102, 1023, 0.0, 9.8)", ça me renvoie une pression complètement bidon par contre si je
met "mapf(Capteur_BP, 0, 1023, 0.0, 9.8)" j'ai la bonne pression.
Les températures sont quand à elles complètement à l'ouest mais je me doute du pourquoi, elles ne sont visiblement
pas du tout linéaire d'après le tableau et on en avait déjà parlé avec la fonction quadratique pour corriger de mémoire.
( qui donne y = 0,0022x2 - 0,0098x + 0,4992 et j'ai trouvé ça https://eskimon.fr/tuto-arduino-502-diff...de-mesures )
La valeur 102 est importante vu que c'est le point zéro du capteur, à 0bars relatif il est à 0.5V que ce soit pour le BP
ou le HP, par contre à 2bars relatif je suis à 1V sur le BP et 0.6V sur le HP ( arrondi ).
D'où sort mapf() ? parce qu'elle ne fait pas partie de la lib standard de l'arduino. J'aimerais bien avoir au moins le proto, mais le code complet serait encore mieux parce que sinon je ne peux pas t'aider sans plus d'infos.
Concernant la non linéarité tu utilises quel capteur ?
Congratulations !!! You've just created a temporal loophole... Mon site | Mon forum