Aller au contenu

Arduino et connectivité Internet


Denisio

Messages recommandés

Bonjour,
 
Encore un sujet sur l'Arduino ! Mais il me semble que plus d'un récifaliste a dû s'y mettre pour améliorer sa maintenance. Donc, toujours dans l'esprit "le bricolage au service des zanimaux", je souhaiterais bien être initié sur la manière de communiquer à distance avec un équipement automatisé de l'aquarium.
 
Ma question n'est pas anodine. J'en ai besoin sans savoir par quel bout prendre tout çà, et puis je crois bien savoir que Frenatus et Bubble_maxi ont pas mal travaillé le sujet et qu'ils seraient prêt à nous en faire profiter.
 
On pourrait partir d'un cas "simple" d'osmolation en abordant plusieurs points (dans le désordre) :

  • Un microcontrôleur Arduino récupère la position d'un capteur de niveau pour piloter une pompe. 
  • L'état du capteur serait envoyé à distance, sans fil
  • Il serait lu à distance (PC, smartphone... ?).
  • Soyons fou, à distance ou pourrait forcer l'état du capteur ou de la pompe.
  • Les états du capteur seraient régulièrement stockés au fil du temps (carte SD, mémoire...avant ou après stockage ?)
  • Enfin, on pourrait visualiser les état au fil du temps, sous forme graphique
  • ...

Le hard n'est pas le plus complexe, mais on peut le développer et commencer par ça. Par contre le code sur connectivité Internet est une autre histoire. Mais j'aime bien les histoires bien contées. Et pourquoi pas, je pourrai la raconter à mon tour (si j'ai tout compris) dans le cadre d'un tuto synthétisé.
 
Un bon moyen peut-être de prendre un train d'initiation à l'Arduino ;)
 
Merci d'avance :)
 
================= ARDUINO ET CONNECTIVITE INTERNET - CAS d'UN OSMOLATEUR =================
 
A – ARDUINO
 
1 - La carte Arduino

 

C’est un microcontrôleur (µc, uc ou MCU (Micro Control Unit), c’est-à-dire un circuit qui intègre les éléments essentiels d'un ordinateur : processeur (CPU), mémoires (morte et vive), unités périphériques et interfaces d'entrées (capteurs, sondes…) et de sorties (commandes de moteurs, d’EV, de relais…). Petit frère du microprocesseurs utilisé dans nos PC, ils est moins énergivore, moins puissant, moins rapide mais moins cher et plus adapté pour s’initier à la robotique.

 

Il existe plusieurs modèles Arduino plus ou moins évolués (vitesse, nombre d’entrées et sorties, périphériques…) et spécialisés. Le modèle le plus courant UNO répond à des exigences basiques ; le modèle MEGA2560 est un peu plus performant. Pour la gestion de systèmes complexes, on pourra s'intéresser à d'autres cartes comme celles de la gamme Raspberry.

 

2 - IDE - Environnement intégré de développement (IDE)
 
L'IDE (Integrated development environment) est l'outil de communication entre l’homme et le processeur. Un peu comme un traitement de texte il permet d’éditer le code (texte du programme) dans un langage relativement évolué, de déboguer (corriger la syntaxe), de compiler (traduire le code en langage binaire machine) et de téléverser (transférer) le code vers le processeur.
 
Installer un IDE parmi les plus utilisés :

  • Logiciel Arduino : le plus simple, malheureusement trop simpliste, peu ergonomique, à réserver à de petits programmes comme celui-ci pour notre osmolateur. La page en lien propose soit de télécharger  l'IDE Arduino IDE pour éditer localement sur son PC, soit de lancer Arduino Web Editor pour une édition on line.
  • Microsoft Visual Studio Community , gratuit, pour Windows ou IOS, beaucoup plus complexe, il devient avec le complément Arduino IDE for Visual Studio un outil complet et indispensable pour structurer de longs programmes. Installation.

Le langage Arduino

 

Le langage Arduino de programmation, relativement simple, se limite à quelques instructions  du langage C++.

Arduino UNO

 

Voici la carte avec pleins de petits numéros. C'est ce que l'on appelle les pins, ou encore les GPIO ou en français les entrées/sorties. Ce sont ces entrées/sorties que l'on va commander avec le code et dire à  la carte envoie du courant électrique sur la sortie 9, cesse d'envoyer du courant électrique sur la sortie 9.

 

Voici un schéma de ces fameux pins. On constate que des pins peuvent avoir plusieurs fonctions (données d'entrées et/ou commandes en sorties, digitales ou analogiques, communication : serial/SPI/I2C, des interruptions...), mises en œuvre selon les déclarations dans le code.

Arduino-Uno-R3-Pinout-1024x1024.png

 

 
B - REALISATION DE L'OSMOLATEUR
 
1 -  Matériel

2 - montage

 

Ca c'est le schéma de Frenatus, l'oeuvre d'une nuit agiteé, probablement. On fera mieux plus tard ;)

5685798c002b29ce61e94e12a348d75f.png

 

 

3 - Code Arduino du programme d'osmolation

 

Paramétrage de la carte

  • Brancher la carte Arduino UNO
    à son alimentation puis au PC via son cable USB. Si vous acheté un modèle à puce de communication Atmega 16U2, la reconnaissance est automatique. Sinon, pour une connexion CH340, il faudra peut-être installer un pilote sur le PC.
  • Paramétrer l'IDE
    L'Arduino IDE étant installé sur le PC, lancer le logiciel. Il faudra sélectionner la carte utilisée (Arduino UNO) et affecter le port de communication USB vers la carte. Enfin, on pourra activer le terminal de communication ou moniteur série proposé dans l'IDE, il permettra, si besoin, d'obtenir des informations (textes, valeurs....) durant le programme pour mieux en suivre le déroulement. Je vous propose ce tuto bien expliqué : Installation et prise en main de l'IDE Arduino.

 

 

C - RENDRE L'OSMOLATEUR COMMUNICANT

Lien vers le commentaire
Partager sur d’autres sites

Le premier point, c'est donc de faire l'osmolateur le moins cher du marché...

Le second c'est de faire le premier osmolateur communiquant du marché...

 

Comme tu es grand chef, tu dois pouvoir éditer ton post en permanence. Enfin j'espère...

Tu devrais peut être mettre la liste du matos:

- une carte uno avec son petit cable usb (5 euros en chine, 20 en France)

- une alimentation 12 V pour la carte (3 euros en chine, aucune idée en france)

- 2 capteurs à flotteur (1.5 euros en chine aucune idée en france)

- quelques ligne dupont males/femelles à la louche 5 (0.000000001 euros)

- un module 1 relais 5V coupant jusqu'à 220 V.

Genre ca quoi :

 

Et puis ou trouver l'ide et comment l'installer.... ?

 

 

Lien vers le commentaire
Partager sur d’autres sites

Non mais oh..! J'suis vieux... Va pas me brusquer.....

Donc on va faire un truc du genre...... Et je ne veux aucune remarque sur mes qualités de dessinateur.. Ca m'a juste pris la nuit pour faire cette oeuvre d'art... :

5685798c002b29ce61e94e12a348d75f.png

 

Bon, durant la nuit vous avez donc acheté tout le matériel, installer l'IDE (je vous conseille la version officielle de base, Visual Studio ça va vous faire peur).

Nous avons donc une carte avec pleins de petits numéros. C'est ce que l'on appelle les pins, ou encore les GPIO ou en français les entrées/sorties. Ce sont ces entrées/sorties que l'on va commander avec le code et dire à  la carte envoie du courant électrique sur la sortie 9, cesse d'envoyer du courant électrique sur la sortie 9.

Voici un schéma de ces fameuses entrées/sorties :

Arduino-Uno-R3-Pinout-1024x1024.png

 

Bon.. On va faire notre premier code, je laisse Denisio allumer l'IDE, sélectionner la carte et le bon port, ainsi que d'ouvrir le moniteur série... :siffle

 

Donc nous avons cela :


void setup() {
  
C'est là que l'on met les instruction que la carte doit effectuer lorsqu'elle démarre.
}

void loop() {
 
C'est là que l'on met notre programme. La carte va effectuer une boucle sans fin 
}

Autrement dit, un code vide.... Il est néanmoins composé de 2 parties.

La partie setup, qui va contenir les instructions à faire au démarrage. Cela ne sera fait qu'une fois.

La partie Loop (traduire "boucle") ou l'on va réellement mettre notre programme. Tant qu'elle sera allumée, la carte va lire en boucle les instructions placées à cet endroit.

 

On essaie.... Voici un code test :

void setup() {
  Serial.begin(9600); 
  Serial.println("Je démarre");//Envoie la chaine de caractère "Je démarre" au PC.
}

void loop() {
 Serial.println ("Va prendre ta douche, il est déjà 10H00");
 delay(10000);

}

Je laisse Denisio téléverser dans la carte... :siffle

Que fait ce programme ...

La carte démarre.....

Et donc commence par lire les instructions dans le Setup.

- Serial.begin(9600);   //indique la vitesse de discussion entre la carte et le PC. Prenez 9600

- Serial.println("Je démarre");      //Envoie la chaine de caractère "Je démarre" au PC, qui l'affichera dans le moniteur série.

 

Puis lit ensuite les instructions dans loop et les effectuent à l'infini

Donc, écrit qu'il est l'heure que j'aille prendre ma douche.

Puis :

delay(10000);

delay, c'est pour attendre. Donc on lis demande d’attendre 10000.... 10000 quoi? Et bien 10000 millisecondes.

Donc à l'échelle humaine, on lui demande d'attendre 10 sec.

Et hop, esuite elle repart au début de Loop..

 

Voilà ce que l'on obtient à l'affichage. 

Je démarre
Va prendre ta douche, il est déjà 10H00
Va prendre ta douche, il est déjà 10H00
Va prendre ta douche, il est déjà 10H00

Nous avons bien "Je demarre" une seule fois, puis "Va prendre ta douche" qui s'inscrire toutes les 10 secondes à l'écran...

 

Bon, voilà... On sait désormais l'essentiel.

Reste à prendre sa douche avant de passer au montage des composants qui est..... encore plus simple que ca...

 

Bubulle, n'hésite pas à me dire si t'as pas compris?  :yahoo

Lien vers le commentaire
Partager sur d’autres sites

Le montage....

Bon, je suis fainéant, alors plutot que de passer une nouvelle nuit à dessiner, j'ai fait un montage bidon avec des grands fils sur un établi. Cela donne le principe de connexion.

Je suis désolé, je n'ai pas de module un seul relais, le plus petit que j'ai c'est un 4 relais...

Et ce sont les seuls capteurs qui me restent et ils ne sont pas identiques...

Un courageux va nous faire un schéma....

 

post-2577-0-09183800-1520076263_thumb.jpg

 

Connexion du module relais :

Le pin 5V de la carte sur le pin Vcc du relais.

Le pin Gnd de la carte sur le pin Gnd du relais

Le pin 9 de la carte sur le pin signal ou channel ou autre chose (enfin le pin restant, quoi) sur le module relais.

 

Connexion des flotteurs...

Le pin 12 sur un fil de flotteur, l'autre morceau de fil du premier flotteur au second et enfin le dernier fil au Gnd de la carte.

On fait un circuit partant du pin 12 au gnd de la carte en incluant les deux capteurs dedans.

 

Alors bien sur il faudra adapter, là clairement il n'y a pas assez de fil pour permettre le mettre le flotteur dans le bac...

Mais vous pouvez ajouter autant de fil que vous voulez... 12 metres si cela vous chante...

Le seul point ou il faut être attentif, c'est la connexion des fils qui sont proches de l'eau.

Rendez les étanches... Le silicone est ton ami... ;-)

 

Bon, Denisio bricole et après la sieste digestive, on fait le code.

 

 

 

Lien vers le commentaire
Partager sur d’autres sites

Il sera dit que je ne ferai pas de sieste.... :(

 

Bon.... Observons le montage et écrivons en français ce que nous voulons.

Ahhh... Déjà pourquoi 2 capteurs....

2 capteurs parce que à 1 euro le capteur, on va s'offrir un peu de sécurité.

Autrement dit, on va les placer l'un au dessus de l'autre dans le bac... Le capteur inférieur détectera un niveau trop bas, et l'eau sera injectée.

Mais nous ne sommes pas à l'abri qu'un vilain escargot décide de se placer dessus et l’empêche de remonter correctement et donc d'interrompre l'ajout d'eau.

Pas grave, nous avons donc le second capteur un peu plus haut, qui lui remontera avec l'eau et coupera de toute manière le circuit.

 

Bon.. En français nous voulons quoi ?

En français, nous voulons :

- Détecter la fermeture du circuit électrique des capteurs.

- Lorsque ce circuit est fermé, nous voulons déclencher le relais afin que la pompe soit alimenté en électricité et ajoute de l'eau dans notre bac...

- Des que le circuit des capteurs est ouvert (le niveau d'eau est remontée suffisamment), nous voulons couper le relais.

 

Simple non?

Le code est aussi simple que cela..

Je vais juste utiliser une astuce que je ne vais pas vous expliquer.

C'est pour votre bien, c'est pour vous éviter des soudures et l'ajout d'une résistance.

 

Le code :

void setup() {
  pinMode(9, INPUT_PULLUP); // au demarrage nous disons que le pin 9 (celui des cateurs) est en mode lecture
  pinMode(12,OUTPUT); // au demarrage nous disons que le pin 12, celui du relais peut envoyer du courant.
}

void loop() {
 if(digitalRead(9)==LOW){ //if en anglais c'est "si". Ca dit donc "si le circuit 9 est ferme"
  digitalWrite(12,HIGH); // envoie du courant sur le pin 12, autrement dit active le relais
 }
 else{ // sinon
  digitalWrite(12,LOW); // n'envoie plus de courant sur le circuit 12, donc coupe le relais
 }
}

Et voilà...... Vous téléversez ça sur la carte, les capteur dans le bac, une pompe sur le relais et c'est terminé.

 

Elle est pas belle la vie.... Pour 10 euros vous venez de réaliser immolateur le moins cher du marché...

 

Si, si, promis, ca marche nickel d'enfer..... Quand on pense que vous avez payé près de 80 euros un osmolateur commerciale, vous êtes quand même un peu des moutons, non?  :tapemur

Lien vers le commentaire
Partager sur d’autres sites

Allons bon..... Il y a déjà bubulle qui râle au fond de la salle....

"Il n'est pas logique ton circuit"...

Non.... C'est ça l'astuce, j'ai utilisé une résistance interne à la carte...

Comme je doute que ca interesse quelqu'un mis à part les bubulle.... l'explication sous forme de lien : http://www.locoduino.org/spip.php?article122

 

Ah ben tiens.... Un Denisio plus rapide que son ombre qui râle parce que sa pompe ne fait que de se déclencher et s’arrêter sans cesse..

Et il a raison le bougre......

L'eau bouge un peu, il y a du clapot dans nos bacs.... Du coup, le capteur se déclenche et s'arrête sans cesse...

La pompe fait donc de même.... Cela va l'user prématurément, ce n'est pas une bonne idée...

Mais comment faire ?

 

Je vous ai déjà donné la solution.... Rappelez vous.... Toutes les 10 secondes, la carte me rappelait que je devais aller à la douche...

delay(10000).

Alors pour éviter le clapot on va modifier le code pour dire à la carte :

Ok, ma grande... Quand les capteurs se déclenchent tu envoies la sauce sur le relais mais au moins pour 20 secondes.... Histoire que cela vaille le coup..

Allez hop au taf...

void setup() {
  pinMode(9, INPUT_PULLUP);
  pinMode(12,OUTPUT); 
}

void loop() {
 if(digitalRead(9)==LOW){ 
  digitalWrite(12,HIGH);
  delay(20000);// tu attends 20 secondes, marre du clapot
 }
 else{ // sinon
  digitalWrite(12,LOW);
 }
}

Autre chose?    

En fait, oui.... Le Chef s'en fout de l'osmolateur.. Lui il veut la connectivité internet...

Mais bon, indiquer qu'on osmole sur le telephone... Bof...

Alors on va ajouter un controle de la température du bac et le déclenchement du chauffage...

Vous n'avez jamais flippé que votre super thermoplongeur se bloque ?

Perso, ça m'est arrivé en eau douce... Depuis, j'ai la hantise de ces saloperies de thermostat à lame.

Et ce sera un prétexte à la connectivité internet, on enverra la température sur le net...

 

Mais bon.. sieste avant....

Lien vers le commentaire
Partager sur d’autres sites

Comment install t on l environment ?

Comment règle t on les paramètres de compilation ?

Le compilateur arduino, quel version ? Il vient d ou ?

 

Alors là t'abuses, j'ai rajouté plein d'infos demandées par Frenatus dans le premier post :tapechaise

 

Mais bon, j'ai du mal à suivre le rythme et je ne suis pas sûr que cette méthode soit la bonne. De toutes façons elle trouvera vite les limites autorisées dans un post.

A voir...

Lien vers le commentaire
Partager sur d’autres sites

Oh l'autre.....

On lui fait brancher trois fils et tapoter 5 lignes de codes et ça va trop vite.... :horreur

On dirait un de ces jeunes d'aujourd'hui....  :D

J'suis sur que tu veux un tuto sous youtube parce que ca te fatigue les yeux de lire.... :D

Lien vers le commentaire
Partager sur d’autres sites

Bon à ce stade nous avons un osmolateur.

Ceci dit, nous avons un peu utilisé une masse pour planter un clou.

Rajoutons quelques conforts....

Par exemple, c'est bien beau de compléter le niveau dans le bocal, mais qui contrôle que la réserve d'eau n'est pas vide ?

Et qui rempli cette fameuse réserve?

 

Avant toute chose, il faut déjà modifier le programme afin de supprimer les fonctions "delay".

En effet, celle-ci mettent le programme en pause (le bloque) ord nous avons besoin d'un ordinateur qui fonctionne en permanence.

Nous allons donc gérer le temps.

Le contrôleur possède une fonction qui compte les millisecondes et nous renseigne dessus...

C'est la fonction millis().... Nous allons donc enregistrer la fonction millis() au démarrage d'une procédure et regarder en permanence la différence de temps.

 

Nouveau code...

unsigned long enregistre_milli=0; // nous créeons la variable qui va nous permettre d'enregristrer un temps

void setup() {
  pinMode(9, INPUT_PULLUP);
  pinMode(12,OUTPUT); 
}

void loop() {
 
 if(digitalRead(9)==LOW){ // nous disons "si le capteur est bas"
  digitalWrite(12,HIGH); ///active l'ajout d'eau
  enregistre_milli = millis(); // j'enregistre la valeur de milli(), le temps.
 }
 else{ // sinon
  if (millis()>enregistre_milli+20000){// si il s'est écoulé au moins 20 seconde depuis que j'ai déclenche l'ajout
    digitalWrite(12,LOW); // n'envoie plus de courant sur le circuit 12
  }
 }
}

Nous venons de découvrir par ailleurs, que nous pouvions créer des choses accessibles partout et tout le temps.

Simplement en les écrivant en tout début de programme.

Profitons en.... Nous avons dit 20 secondes d'injection, mais pour certains ils voudront 10 sec, d'autres 50...

Il faudrait un moyen simple de modifier cela...

Nous allons utiliser le fait de pouvoir créer ce que l'on appelle une variable globale, que chacun pourra changer facilement.

const unsigned long temps_mini_osmolation =20000; /// ici on indique le temps minimum d'osmolation en milliseconde 20 secondes c'est 20 000 milliseconde
unsigned long enregistre_milli; // nous créeons la variable qui va nous permettre d'enregristrer un temps

void setup() {
  pinMode(9, INPUT_PULLUP);
  pinMode(12,OUTPUT); 
}

void loop() {
 
 if(digitalRead(9)==LOW){ // nous disons "si le capteur est bas"
  digitalWrite(12,HIGH); ///active l'ajout d'eau
  enregistre_milli = millis(); // j'enregistre la valeur de milli(), le temps.
 }
 else{ // sinon
  if (millis()>enregistre_milli+temps_mini_osmolation){// si il s'est écoulé au moins que la valeur choisie comme durée mini d'osmolation
    digitalWrite(12,LOW); // n'envoie plus de courant sur le circuit 12
  }
 }

Et tant qu'on y est, comme chacun va choisir les pins qu'il veut faisons la même chose avec les pins

const unsigned long temps_mini_ =20000; /// ici on indique le temps minimum d'osmolation en milliseconde 20 secondes c'est 20 000 milliseconde
const byte pin_relais=12; // numero du pin choisi pour les capteurs
const byte pin_capteur=9; // numero du pin choisi pour le relais.
unsigned long enregistre_milli_osmolation; // nous créeons la variable qui va nous permettre d'enregristrer un temps

void setup() {
  pinMode(pin_capteur, INPUT_PULLUP);
  pinMode(pin_relais,OUTPUT); 
}

void loop() {
 
 if(digitalRead(pin_capteur)==LOW){ // nous disons "si le capteur est bas"
  digitalWrite(pin_relais,HIGH); ///active l'ajout d'eau
  enregistre_milli= millis(); // j'enregistre la valeur de milli(), le temps.
 }
 else{ // sinon
  if (millis()>enregistre_milli+temps_mini_osmolation){// si il s'est écoulé au moins que la valeur choisie comme durée mini d'osmolation
    digitalWrite(pin_relais,LOW); // n'envoie plus de courant sur le circuit 12
  }
 }
}

Bon.... On s'occupe de la réserve d'eau ?

Il nous faut mettre un capteur en bas de la reserve et un capteur au niveau max.

Et bien sur une electrovanne pour l'osmoseur qui sera controlée par un relais.

La regle sera la suivante. Lorsque le capteur bas s'active, tu me remplis la reserve d'eau, jsuqu'à ce que le capteur haut s'active.

 

Le code que maintenant vous êtes en capacité de comprendre tout seul :

const unsigned long temps_mini_osmolation =20000; /// ici on indique le temps minimum d'osmolation en milliseconde 20 secondes c'est 20 000 milliseconde
const byte pin_relais=12; // numero du pin choisi pour les capteurs
const byte pin_capteur=9; // numero du pin choisi pour le relais.
const byte pin_capteur_bas_reserve =6;//numero pin capteur bas reserve
const byte pin_capteur_haut_reserve =7;//numero pin capteur bas reserve
const byte pin_relais_vanne_osmoseur = 8;//le relais qui controle la vanne de l'osmoseur
unsigned long enregistre_milli; // nous créeons la variable qui va nous permettre d'enregristrer un temps

void setup() {
  pinMode(pin_capteur, INPUT_PULLUP);
  pinMode(pin_capteur_bas_reserve, INPUT_PULLUP);
  pinMode(pin_capteur_haut_reserve, INPUT_PULLUP);
  pinMode(pin_capteur, INPUT_PULLUP);
  pinMode(pin_relais,OUTPUT); 
}

void loop() {
 //la nous gérons l'osmolation
 if(digitalRead(pin_capteur)==LOW){ // nous disons "si le capteur est bas"
  digitalWrite(pin_relais,HIGH); ///active l'ajout d'eau
  enregistre_milli = millis(); // j'enregistre la valeur de milli(), le temps.
 }
 else{ // sinon
  if (millis()>enregistre_milli+temps_mini_osmolation){// si il s'est écoulé au moins que la valeur choisie comme durée mini d'osmolation
    digitalWrite(pin_relais,LOW); // n'envoie plus de courant sur le circuit 12
  }
 }
//là nous allons gérer le remplissage de la réserve d'eau.
 if(digitalRead(pin_capteur_bas_reserve)==LOW){ // la reserve d'eau est basse
  digitalWrite(pin_relais_vanne_osmoseur,HIGH); ///active l'osmoseur pour qu'il remplisse la réserve
 }
 if(digitalRead(pin_capteur_haut_reserve)==HIGH){ ///si le capteur haut de la reserve se désactive c'est que la reserve est pleine
  digitalWrite(pin_relais_vanne_osmoseur,LOW); //on coupe l'osmoseur
}
}
Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...

Information importante

En poursuivant votre navigation, vous acceptez l’utilisation des cookies pour vous proposer des contenus adaptés à vos centres d’intérêt et réaliser des mesures pour améliorer votre expérience sur le site. Pour en savoir plus et gérer vos paramètres, cliquez ici