Automate aquarium bricoleau

Bonjour

Voici une première description de mon chantier en cours.

Il s’agit d’un automate pour aquarium d’eau douce, dont je compte équiper tous mes bacs.

En pièce jointe : les fonctionnalités prises en charge, sous un angle aquariophile.

Principaux composants hardware :

  • Arduino mega + shield ethernet
  • sondes de température DS18b20
  • horloge DS1307
  • platine de relais avec une interface I2C, construite autour d’une arduino mini esclave
  • platine d’entrées numériques avec une interface I2C, construite avec un PCF8574 et un 74HC00 (pour bascule RS).

Il s’agit d’un gros chantier, engagé depuis 18 mois, à mon rythme et selon mes dispos.
J’en suis presque au bout, et espère une première mise en service courant septembre.

Tous les composants matériels / logiciels ont été prototypés et testés.
Le packaging physique est terminé.
Le source définitif avoisinera les 20.000 lignes de code, réparties dans une trentaine de librairies.

Pas besoin d’aide, aucune visée commerciale, mais tous les avis / suggestions / commentaires sont les bienvenus :stuck_out_tongue:

Automate bricoleau - fonctions.pdf (33.1 KB)

Super boulot !

Chouette cahier des charges.

Il y a vraiment de très bonne idée. Très chouette boulot.

Tu as des photos de l'automate ? pour voir à quoi cela ressemble ?

C'est vrai que tout ça est très littéraire (pour changer :D). Mais au bout d'un moment j'ai ressenti le besoin de cette rédaction, pour me désencombrer le cerveau et y voir plus clair.

Je publierai quelques photos d'ici ce week end.

Juste pour rire : le code du sketch principal

//Bricoleauduino
//Automate pour aquarium d'eau douce
//@Bricoleau 2015

//Librairies standard Arduino
#include <Arduino.h>
#include <EEPROM.h>
#include <Wire.h>
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
#include <SD.h>
#include <OneWire.h>

//Librairies Bricoleauduino
#include "BricoleauduinoScheduler.h"

#include "BricoleauduinoProcessusHorloge.h"
#include "BricoleauduinoProcessusMaintenance.h"
#include "BricoleauduinoProcessusTemp.h"
#include "BricoleauduinoProcessusEntrees.h"
#include "BricoleauduinoProcessusChgtEau.h"
#include "BricoleauduinoProcessusNourrissage.h"
#include "BricoleauduinoProcessusPompe.h"
#include "BricoleauduinoProcessusChauffage.h"
#include "BricoleauduinoProcessusEclairage.h"
#include "BricoleauduinoProcessusRelais.h"
#include "BricoleauduinoProcessusNTP.h"
#include "BricoleauduinoProcessusHTTP.h"
#include "BricoleauduinoProcessusUdp.h"
#include "BricoleauduinoProcessusAlertes.h"
#include "BricoleauduinoProcessusLog.h"
#include "BricoleauduinoProcessusLCD.h"

void setup()
{
  scheduler.run();
}

void loop()
{
}

Le reste, je le garde à mon niveau, au moins tant que le projet n’est pas abouti :smiling_imp:

tres beau boulo! on attend les photo maintenant! :)

Joli classe main ;)

Juste une question as-tu un exemple de découpage idéal d'un projet arduino ? Car je ne trouve pas d'exemple de découpage correct. Ou un tutoriel ca m’intéresse.

Merci

Désolé je ne comprends pas la question.

Pour ma part, je code mes librairies via notepad++ et je n'utilise l'IDE arduino que pour charger / compiler / téléverser le sketch principal ci-dessus.

Je vais reformulé:

Tu as séparer les différentes parties de ton programme comme le montre le sketch principal.

Ce que je recherche c'est un tutorial justement qui montre comment séparer les différentes parties d'un programme. Car comme on peut le voir dans ton sketch principal tu n'as rien dans la boucle loop. Ce qui suppose que tu utilises des mécanismes propres à arduino comme les interruptions ? ou je me trompe complètement ?

il n’y a pas forcement de rapport avec les interuptions , rien ne t’empéche d’ecrire differente librairie, dont une qui contient la majorité de ton sketch.
la fonction loop peut totalement etre exclut c’est vraisenblablement ce que fait bricoleau avec sont scketch.

il lance la fonction "scheduler.run();"dans setup et en suite tout ce pase dans la comunication/utilisation entre les diferentes librairie de sont programme .

en gros chaque partie et decouper en librairie et le programe global n’est “qu’un” assemblage de celle ci.

au debut on a tendance a coder tout dans la boucle loop puis on en vien vite a decoupé certaine partie en fonction et ensuite a regrouper des fonction dans des librairie.

Bonjour

Il y là deux sujets distincts :

  1. la structuration du code en librairies
    Il s’agit avant tout de structurer et organiser son développement.
    Grosso modo, une librairie est un ensemble cohérent de fonctions, dont une partie est rendu visible pour les autres modules, via un fichier .h

Cela permet de masquer la complexité de certains pans du programme, de mettre au point et tester le contenu via un programme spécifique, puis de refermer le tout en une boîte noire dont seul le .h et connu.

Les librairies présentes dans mon sketch principal ne sont que les librairies de plus haut niveau.
Elles s’appuient elles-mêmes sur plusieurs autres couches de librairies.

  1. l’organisation du déroulement des traitements
    Là il s’agit de maîtriser la répartition du temps d’exécution sur chaque partie du programme.
    Pour cela, j’utilise un ordonnanceur que je me suis fabriqué spécifiquement, et qui me donne toute satisfaction.
    Je n’ai en effet pas trouvé un “arduino scheduler” qui réponde à mes exigences (celui du playground ne me plaisait pas)

Cet ordonnanceur n’utilise pas d’interruptions
J’ai aussi écrit une petite description là-dessus. Voir pièce jointe

automate bricoleau - ordonnanceur.pdf (8.27 KB)

Photos :

Le boitier de l’automate


Seulement 5 fils branchés sur l’arduino : 5V + GND + SDA + SCL + OneWire

J’ai “normalisé” à ma sauce les connecteurs externes :

  • Din 4 broches pour I2C vers la rampe 220V
  • Din 3 broches pour OneWire vers la sonde de température étanche
  • Cinch pour capteur de niveau

Et la seconde partie : la rampe 220V à commande I2C


Basée sur un assemblage goulotte + prises Legrand avec, de gauche à droite :

  • L’arrivée 220 V
  • Les prises 220 V
  • La platine de relais
  • Un ACS712 branché sur l’une des prises (celle dédiée au chauffage)
  • Deux alims 5V : une pour les relais, l’autre pour tout le reste jusqu’au boitier inclus
  • Une arduino pro mini 328P

Pour la partie ordonnanceur, une toute petite librairie dérivée de celle de mon automate est disponible ICI

Celle de mon automate est nettement plus étoffée. Elle délivre des statistiques d'exécution de chaque tâche, le taux d'occupation CPU, ainsi que quelques fonctions systèmes transverses. Elle permet aussi de synchroniser des taches entre elles (plus efficace pour le modèle producteur => consommateur).

Je dois encore y intégrer la fonction watchdog, avant de la mettre à dispo.

Je vais suivre ça de près, ça ressemble à ce que je suis en train de faire, mais moi c'est pour une piscine !!! :) :) :)

J'ai retenu les mêmes techniques que toi, DS18B20 en OneWire, LCD et DS1307 en I²C.

J'attends une livraison de chez alie... pour continuer, il me faut encore intégrer un keypad, et je vais changer ma Duemilanove contre une Mega, je n'ai plus assez d'E/S.

Tavail très impressionnant ! Autant de fonctions, pour moi qui suis aussi en train de coder un automate (ici), ça me donne presque le vertige. Ça représente en quelque sorte le graal que je n'atteindrait sans doutejamais :D

impressionnant, trés beau travail, a l'époque ou j'ai fabriqué mon bac (240X70X70), il y a environ 8 ans, j'avais opté pour un systeme assez simple, un IMO Ismart qui ne gérait que l'éclairage jour/nuit, la pompe et la distrib de nourriture en cas d'abs.

haaaaa, si j'avais eu un arduino a l'époque...