Go Down

Topic: Contrôleur de T°, Humidité avec pilotage manuel ou automatique (Read 17217 times) previous topic - next topic

J-M-L

j'ai telecharger le .zip

et j ai inclu la bibliotheque depuis le zip
oui c'est le soucis - quand vous téléchargez le zip, il faut le décompresser puis virer le -master avant de la ranger dans les librairies (sinon pour certaines ça va "m*rder")
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

vtec35

bonne idée - proposez le code :)


pour les histoires de librairies, je ne sais pas comment vous les installez mais moi je n'ai pas de -master à la fin des noms  Arduino-Temperature-Control-Library-master

si vous installez à la main, faut les virer

le probleme est que je ne suis pas capable de le proposer...


en fait pour que ce code soit "mieux"

il faut pouvoir rendre la ventilation pwm ou tout ou rien, parce que là le relais aime pas trop le pwm
lorsque l'on est en mode programme et que l'on appui sur un bouton, la lettre du bouton s'affiche


quel est la condition pour la mise en route de la ventilation (si il y en a une)?

en tout cas merci pour ce tuto

concernant la librairie du capteur d humidité, elle à été mise a jour apparament

J-M-L

le probleme est que je ne suis pas capable de le proposer...
la modification des consignes, c'est dans la fonction void displayConsigne(). la détection du bouton se fait avec modif directe

le système ne réagit sinon qu'au relâchement des boutons, il faudrait donc rajouter du code spécifique au mode Param qui détecte un appui sur un bouton et met en inverse vidéo par exemple le symbole

Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

vtec35

la modification des consignes, c'est dans la fonction void displayConsigne(). la détection du bouton se fait avec modif directe

le système ne réagit sinon qu'au relâchement des boutons, il faudrait donc rajouter du code spécifique au mode Param qui détecte un appui sur un bouton et met en inverse vidéo par exemple le symbole


bon ba je vais devoir faire mettre les mains dedans à un pote qui maitrise mieux le sujet que moi, je vais essayer de regrouper le max d'information pour l'aiguiller afin qu'il ne perde pas de temps

je pensais trouver de l'aide sur un autre forum mais je me suis mis le doight dans l'oeil


du coup voici les amelioration que je vais essayer d'implemanter

gestion de l humidité de la terre avec la sortie relais qui pilote l'arrosage
gestion de l'eclairage, selon le seuil de luminosité prédefini, avec heure de début + durée selon le mois en cours opur faire des saisons.
gestion du ventilateur en tout ou rien avec une consigne periodique ou si trop chaud


et je pense que ça sera plustot complet

si il est possible d'avoir un max d'information sur ou allez trouver les endroits dans le code ça serait super cool sinon tant pis


et peut etre le truc qui pourrait nous bloque c est l histoire du tableau pour la durée d'éclairage selon le mois en cours, est ce que ça risque d'être complexe?

J-M-L

Vous pouvez aussi partir de zéro et bâtir votre solution c'est parfois plus simple que d'essayer de faire rentrer des changements dans un code pas pensé en ce sens

Ce code peut donner une idée de comment structurer votre approche en machine à Etat
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

dfgh

bonjour Jean Marc

je me suis mis sur ton code

et bien sur une question arrive :) :

c'est au sujet de la fonction de création des caractères pour afficher la vitesse du ventilateur.

tu créés un tableau à 2 dimensions pour dessiner les caractères sur une matrice de 6 x5
alors qu'il faut 8x5.

puis tu crées tes caractères avec la fonction "lcd.create" mais tu ne fais référence qu'à une seule dimension du tableau!!! le compilo accepte!!!

puis lorsque l'on affiche sur le lcd par lcd.write 0,1,2,3,4,5 on obtient le v et la barre qui augmente
alors que la création des caractères  ne tient pas compte de ce v qui apparait en bas

de plus le tableau de caractères ne dessine pas tous les pixels de la barre verticale...

peux tu m'expliquer stp

merci


J-M-L

tu créés un tableau à 2 dimensions pour dessiner les caractères sur une matrice de 6x5
alors qu'il faut 8x5.

puis tu crées tes caractères avec la fonction "lcd.create" mais tu ne fais référence qu'à une seule dimension du tableau!!! le compilo accepte!!!
Salut

il y a différents types de LCD. Le mien a une matrice 8(vert) x 5(horiz)



Un caractère se définira par 8 octets dont seulement 5 bits sont représentatifs. En général on définit donc un caractère spécial par un tableau d'octets à 1 dimension de 8 entrées, chaque entrée décrivant les pixels à allumer.

comme je veux pouvoir gérer quel type de caractère afficher sans faire des if/else ou un switch, je regroupe tous mes caractères spéciaux (donc leur tableau à 1 dimension) dans un tableau de tableaux.

Comme j'ai 6 caractères spéciaux, j'ai donc un tableaux 6 fois 8 entrées.
Le compilateur étant capable de calculer la dimension la plus externe d'un tableau, je l'ai défini comme
Code: [Select]
uint8_t ventilateurF_s[][8] = {...}
le compilo en regardant les données que je fournis en déduira la valeur 6, mais j'aurais pu préciser
Code: [Select]
uint8_t ventilateurF_s[6][8] = {...}

Ensuite je définis toutes mes entrées:
J'ai un tableau de 6 tableaux de 8 entrées, donc on met les données entre accolades séparées par des virgules - d'où le
Code: [Select]
uint8_t ventilateurF_s[][8] = {
  {0b00000, 0b00000, 0b00000, 0b00000, 0b10001, 0b10001, 0b01010, 0b00100},
  {0b00000, 0b00000, 0b00000, 0b00000, 0b10101, 0b10001, 0b01010, 0b00100},
  {0b00000, 0b00000, 0b00000, 0b00100, 0b10101, 0b10001, 0b01010, 0b00100},
  {0b00000, 0b00000, 0b00100, 0b00100, 0b10101, 0b10001, 0b01010, 0b00100},
  {0b00000, 0b00100, 0b00100, 0b00100, 0b10101, 0b10001, 0b01010, 0b00100},
  {0b00100, 0b00100, 0b00100, 0b00100, 0b10101, 0b10001, 0b01010, 0b00100}
};


Si vous regardez le premier sous tableau, sa définition est dans ventilateurF_s[0] (c'est la première entrée du tableau à 2 dimensions) et en regardant ce que forment ces 5 bits par octet, on voit bien que je dessine un v



et pour déclarer ce caractère je dois donc faire un
Code: [Select]
lcd.createChar(0, ventilateurF_s[0]);

il en va de même pour les autres entrées, qui dessinent les éléments suivants:



et donc il me suffit d'une boucle pour déclarer tous ces caractères spéciaux:
Code: [Select]
  for (byte i = 0; i <= 5; i++) lcd.createChar(i, ventilateurF_s[i]);


c'est plus clair ?

Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

dfgh

oui, je ne connaissais pas cette façon de faire
c'est bien vu et génial :)

merci pour ces explications détaillées. :)

edit: 1290

bcaster

Bonjour et encore félicitations pour cette superbe réalisation.

Bravo aussi pour le suivi apporté à l'évolution et aux remarques.

Pour moi qui débute l'étude de votre projet, un question peut-être idiote: quelle est la valeur du potentiomètre de consigne?

J'ai lu l'entièreté des posts mais je ne l'ai vue nulle part.

Bon WE

J-M-L

salut

merci pour les encouragements !

Le potentiomètre exact n'est pas super critique du moment qu'il permet bien d'avoir 0V d'un côté et 5V de l'autre ce qui est le principe d'un potentiomètre (pont diviseur de tension) et qu'il a une résistance raisonnable - entre 5kΩ et 20kΩ disons.

Avec un ATMEGA les pins analogiques (l'ADC) fonctionnent bien avec 10kΩ donc celui que j'ai utilisé dans le montage est un 10kΩ linéaire. C'est celui que l'on trouve un peu partout sur les sites de ventes (en Asie pour deux ou trois euros frais de ports compris suivant les moments - cherchez 'Electronic Slider 10K').


Tel que connecté à mon montage j'alimente le potentiomètre par les pins 5V et GND de l'arduino et j'ai déclaré la valeur à lire sur A0 (constante pinConsigne)
Code: [Select]
const byte pinConsigne = A0;

Suivant le mode sélectionné, je fais une simple fonction linéaire qui associe la valeur courant de la tension lue vers une unité du système par un map() entre 0 et 1023 qui sont les bornes pour 0V (tout à gauche) et 5V (tout à droite) vers  les valeurs souhaitées
Pour la temperature c'est entre les valeurs de minTemp et maxTemp:
Code: [Select]
c = map(analogRead(pinConsigne), 0, 1023, minTemp, maxTemp);
Pour l'humidité entre minHum et maxHum:
Code: [Select]
c = map(analogRead(pinConsigne), 0, 1023, minHum, maxHum);
Pour la vitesse du ventilateur comme c'est pour faire un contrôle PWM, je prends une valeur entre 0 et 255:
Code: [Select]
byte vv = map(c = analogRead(pinConsigne), 0, 1023, 0, 255);

Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Go Up