Pages: [1] 2 3   Go Down
Author Topic: besoin d'aide pour programme arduino gestion de température avec log  (Read 6105 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 24
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,
Premier post sur le forum
je vais essayer d'etre comprit
Je possede
-le ds18b20 (sonde température) 1-wire
-arduino uno
-shield ethernet +sd

et je voudrait :
-affiche la temp sur une page web
-enregistré la temp tous les jours sur carte sd
-comparer la valeur afin d'activer le chaufage ou non !

voici mes bout de programme

COMPARAISON DE TEMP POUR RELAIS
Code:
// Déclaration des pins
const int temp = A0;    // pin d'entrée capteur
const int relay = 13;       // pin sortie relais
// variables
// Valeurs à déterminer en faonction du capteur (tension délivrée par le capteur)
int tmin = 0;            // t° min
int tmax = 1024;            // T° max
int t = 0;

void setup() {
  digitalWrite(relay, LOW);
}
void loop() {
  // Lecture t°:
  t = analogRead(temp);
 
  //Comparaison :
 
  if (t < tmin) {
  
    while (t < tmax){
          digitalWrite(relay, HIGH);
    };
        
  };
}
ENREGISTREMENT SUR SD

Code:
// --- Programme Arduino ---
// Trame de code générée par le générateur de code Arduino
// du site www.mon-club-elec.fr

// Auteur du Programme : X. HINAULT - Tous droits réservés
// Programme écrit le : 18/02/1012

// ------- Licence du code de ce programme -----
//  This program is free software: you can redistribute it and/or modify
//  it under the terms of the GNU General Public License as published by
//  the Free Software Foundation, either version 3 of the License,
//  or any later version.
//  This program is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//  GNU General Public License for more details.
//  You should have received a copy of the GNU General Public License
//  along with this program.  If not, see <http://www.gnu.org/licenses/>.

// ////////////////////  PRESENTATION DU PROGRAMME ////////////////////

// -------- Que fait ce programme ? ---------
 /* Ce programme teste le stockage de valeurs issues
de mesures analogiques dans un fichier
sur carte mémoire micro-SD
Données au format CSV pour utilisation directe
dans un tableur OpenOffice.  */

// --- Fonctionnalités utilisées ---

// Utilise la connexion série vers le PC
// Utilise la conversion analogique numérique 10 bits
// Utilise une carte mémoire micro-SD avec le module Ethernet Arduino
// Utilise une fonction permettant de connaitre la RAM restant disponible

// -------- Circuit à réaliser ---------

// La connexion série vers le PC utilise les broches 0 et 1 (via le câble USB)

// Le module Ethernet est à enficher broche à broche sur la carte Arduino
// Connecter broche SCLK du module Ethernet sur la broche 13
// Connecter broche MISO du module Ethernet sur la broche 12
// Connecter broche MOSI du module Ethernet sur la broche 11
// Connecter broche Select Ethernet du module Ethernet sur la broche 10
// Connecter broche Select SD Card du module Ethernet sur la broche 4
// Le module Ethernet est compatible avec la carte Mega via le connecteur ICSP

// Broche 14 : Une résistance variable de 10 KOhms

// /////////////////////////////// 1. Entête déclarative ///////////////////////
// A ce niveau sont déclarées les librairies incluses, les constantes, les variables, les objets utiles...

// --- Déclaration des constantes ---

// --- Inclusion des librairies ---

#include <SD.h> // crée automatiquement un objet racine SD représentant la carte mémoire SD

// --- Déclaration des constantes utiles ---

// --- Déclaration des constantes des broches E/S numériques ---

const int brocheSDCardSelect=4; // broche utilisée pour sélectionner la SD card

// --- Déclaration des constantes des broches analogiques ---

const int analog0= A0; // Constante pour la broche analogique 0

// --- Déclaration des variables globales ---

int mesure_brute=0;// Variable pour acquisition résultat brut de conversion analogique numérique
float mesuref=0.0;// Variable pour calcul résultat décimal de conversion analogique numérique

int test; // Variable utilisée pour tester valeur renvoyée par fonctions SD Card


// --- Déclaration des objets utiles pour les fonctionnalités utilisées ---

/*
Sd2Card card; // création d'un objet Sd2Card
SdVolume volume; // création d'un objet SdVolume
SdFile root; // création d'un objet SdFile pour le répertoire racine
SdFile file; // création d'un objet SdFile pour le fichier utilisé
*/

File file; // objet file
File root; // objet root pour le répertoire racine


// ////////////////////////// 2. FONCTION SETUP = Code d'initialisation //////////////////////////
// La fonction setup() est exécutée en premier et 1 seule fois, au démarrage du programme

void setup()   { // debut de la fonction setup()

// --- ici instructions à exécuter 1 seule fois au démarrage du programme ---

// ------- Initialisation fonctionnalités utilisées -------  

Serial.begin(115200); // initialise connexion série à 115200 bauds
// IMPORTANT : régler le terminal côté PC avec la même valeur de transmission

//---- initialise l'utilisation de la carte mémoire SD en mode SPI  
pinMode(10, OUTPUT); // met la broche 10 (SS) en sortie (nécessaire avec module ethernet)
digitalWrite(10, HIGH); // mais désactive le  circuit intégré W5100 du module ethernet!

  //----- initialisation de la carte SD -----
  Serial.println("Initialisation de la SD card...");

  pinMode(10, OUTPUT); // laisser la broche SS en sortie - obligatoire avec librairie SD

  test=SD.begin(brocheSDCardSelect); // initialisation de la carte SD avec broche 4 en tant que CS - renvoie true/false

  if (test!=true) { // si initialisation n'est pas réussie
    Serial.println("Echec initialisation!"); // message port Série
  }
  else { // si nitialisation réussie
    Serial.println("Initialisation reussie !"); // message port Série

  //----- affiche le contenu du répertoire

  root = SD.open("/"); // ouvre la SD Card à la racine

  Serial.println("Repertoire racine ouvert !");

  } // fin si initialisation réussie

// ------- Broches en sorties numériques -------  

// ------- Broches en entrées numériques -------  

// ------- Activation si besoin du rappel au + (pullup) des broches en entrées numériques -------  

// ------- Initialisation des variables utilisées -------  

} // fin de la fonction setup()
// ********************************************************************************

////////////////////////////////// 3. FONCTION LOOP = Boucle sans fin = coeur du programme //////////////////
// la fonction loop() s'exécute sans fin en boucle aussi longtemps que l'Arduino est sous tension

void loop(){ // debut de la fonction loop()

  //---- efface fichier au préalable ---
  test=SD.remove("data.txt"); // efface fichier et mémorise résultat opération  
  if (test) Serial.println("Fichier efface"); // affiche message si fichier bien effacé

  //---- crée fichier en écriture ---
  file = SD.open("data.txt", FILE_WRITE); // ouvre le fichier en écriture
  // NB : le fichier est créé si il n'existe pas !

  //---- test si fichier dispo en écriture
  if (!file) { // si fichier pas dispo

    Serial.println ("Erreur ouverture fichier !");

  } // fin if

  else { // si le fichier existe et est ouvert

    Serial.println ("Fichier pret pour ecriture !");

    //----- Ecriture dans le fichier au format CSV -----

    // premiere ligne du fichier CSV - entete avec liste des champs
    file.println("NumeroMesure;ValeurBrute;ValeurFloat;Millis");

    Serial.println ("Enregistrement en cours :");

    for (int i=0; i<1000; i++) { // n mesures CAN

      // acquisition conversion analogique numérique (100µs env.) sur broche analogique indiquée
      mesure_brute= analogRead(A0) ;

      // calcul tension en Volts
      mesuref=mesure_brute*5.0;
      mesuref=mesuref/1023.0;

      // valeur premier champ
      file.print(i), file.print(';');

      // valeur deuxieme champ
      file.print(mesure_brute), file.print(';');

      // valeur troisieme champ
      file.print(mesuref), file.print(';');

      // valeur quatrieme champ
      file.print(millis());

      // le dernier champ doit se terminer par un saut de ligne +++
      file.println();

      delay(10); // entre chaque mesure
      if ((i+1)%50) Serial.print("."); else  Serial.println(".");// affiche ligne de 50 points

    } // fin boucle for

    file.close(); // ferme le fichier
    Serial.println("Fin enregistrement !");  
    Serial.println("Fermeture fichier !");  

    Serial.println("Retirez SD-Card et la lire sur le PC !");  


  } // fin else

  while(1); // stoppe loop

} // fin de la fonction loop() - le programme recommence au début de la fonction loop sans fin
// ********************************************************************************
AFFICHAGE WEB me pose des problemme



question?
comment faire pour intégré une variable dans une page web et comment intégré la variable de temp la partie comparaison .

thanks
« Last Edit: April 30, 2012, 08:54:08 am by jhonnyy » Logged

Made in Belgium
Offline Offline
God Member
*****
Karma: 1
Posts: 756
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Réglement et charte du forum... à lire impérativement avant de poster
http://arduino.cc/forum/index.php/topic,102175.0.html

Quote
Pensez à l'utilisation des balises [code][/code] pour nous exposer votre code.
Bouton
Logged


France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

Pour la partie web regarde du coté de "webduino" sur google smiley-wink

Au passage, copier des morceaux de code par ci par là n'apportera rien de bon à la fin.
Il faut comprendre les morceaux, puis faire son propre code.
Ce sera plus propre et il y a aura pas d'erreurs du a des conflit entre plusieurs morceaux.
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Offline Offline
Newbie
*
Karma: 0
Posts: 24
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

désolé

merci pour cet indice
Logged

Made in Belgium
Offline Offline
God Member
*****
Karma: 1
Posts: 756
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

C'est beaucoup mieux.  smiley-mr-green smiley-wink
Sinon en ce qui concerne ta question, il suffit d'intégrer ta mesure dans la chaine de caractère de ton code html en réponse à la requête.
Maintenant comme Skywodd te le conseil, il faut évité de copier du code par ci par là mais plutôt le comprendre, faire des testes (même si ça ne correspond pas au but final) , modifier, etc ...

Une chose me perturbe quand même :
Code:
 while(1); // stoppe loop

} // fin de la fonction loop() - le programme recommence au début de la fonction loop sans fin
// ********************************************************************************

Attention à ce "stoppe loop" qui bloque tout simplement ton programme ... donc contrairement au commentaire suivant loop ne recommencera pas au début ... au temps tout mettre dans le setup alors smiley-confuse (ou alors reset entre chaque insertion ??? j'ai pas de sd donc ...)
« Last Edit: April 30, 2012, 09:29:24 am by osaka » Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 24
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonsoir,

j'avance doucement merci pour vos conseils !

voici une nouvelle version mais je n'arrive pas a afficher la page web !!!

une idée ?

les fonction sont mal séparé ?
est il possible d'afficher l'heure sur un uno sans shield supplémentaire ?

cdt

Code:
#include <SPI.h>
#include <Ethernet.h>
#include <OneWire.h>
//Déclaration des Pins
const int relay = 13;       // pin sortie relais

#define DS18B20 0x28     // Adresse 1-Wire du DS18B20
#define BROCHE_ONEWIRE 7 // Broche utilisée pour le bus 1-Wire
OneWire ds(BROCHE_ONEWIRE); // Création de l'objet OneWire ds

// Fonction récupérant la température depuis le DS18B20
// Retourne true si tout va bien, ou false en cas d'erreur
boolean getTemperature(float *temp){
 byte data[9], addr[8];
 // data : Données lues depuis le scratchpad
 // addr : adresse du module 1-Wire détecté

 if (!ds.search(addr)) { // Recherche un module 1-Wire
   ds.reset_search();    // Réinitialise la recherche de module
   return false;         // Retourne une erreur
 }
 
 if (OneWire::crc8(addr, 7) != addr[7]) // Vérifie que l'adresse a été correctement reçue
   return false;                        // Si le message est corrompu on retourne une erreur

 if (addr[0] != DS18B20) // Vérifie qu'il s'agit bien d'un DS18B20
   return false;         // Si ce n'est pas le cas on retourne une erreur

 ds.reset();             // On reset le bus 1-Wire
 ds.select(addr);        // On sélectionne le DS18B20
 
 ds.write(0x44, 1);      // On lance une prise de mesure de température
 delay(800);             // Et on attend la fin de la mesure
 
 ds.reset();             // On reset le bus 1-Wire
 ds.select(addr);        // On sélectionne le DS18B20
 ds.write(0xBE);         // On envoie une demande de lecture du scratchpad

 for (byte i = 0; i < 9; i++) // On lit le scratchpad
   data[i] = ds.read();       // Et on stock les octets reçus
 
 // Calcul de la température en degré Celsius
 *temp = ((data[1] << 8) | data[0]) * 0.0625;
 
 // Pas d'erreur
 return true;
}

// variables
// Valeurs à déterminer

    int tmin = 10;            // t° min // Valeur réelle en °C

    int tmax = 25;            // T° max // valeur réelle en °C

    int t = 0;



// Définir l'adresse MAC et l'IP de la carte
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x3D, 0x0A };
byte ip[] = { 192,168,1,20 };

// Initialisation de la bibliothèque Ethernet server
// avec l4IP définie et le port (80 par défaut en HTTP)
EthernetServer server(80);

void setup()
{
digitalWrite(relay, LOW);
Serial.begin(9600); // Initialisation du port série
// démarrage de la connection Ethernet connection et du serveur:
Ethernet.begin(mac, ip);
server.begin();
}

void loop()
{
// attente de clients (un navigateur web par exemple)
EthernetClient client = server.available();
float temp;
if (client) {

    // une demande HTTP se termine par une ligne vide
    boolean currentLineIsBlank = true;
    while (client.connected()) {

        if (client.available()) {

            char c = client.read();
            // if you've gotten to the end of the line (received a newline
            // character) and the line is blank, the http request has ended,
            // so you can send a reply
            if (c == '\n' && currentLineIsBlank) {
            // Header HTTP usuel
            //
            client.println("HTTP/1.1 200 OK");
            client.println("Content-Type: text/html");
            client.println();

            // renvoie la valeur de la tension de la pin analogique 0
            // et fait la conversion en celsius
            // le tout dans une page HTML5 !
            client.print("<!doctype html><html><head><meta charset='utf-8'/><title>Serveur de température Arduino</title>");
            // script qui réactualise la page toutes les 1000 mSec
            client.print("<script type='text/javascript'>function reFresh() {  location.reload(true) } window.setInterval('reFresh()',1000); </script>");
            client.print("</head><body><html>");
            client.print("<h1 style='font-family:verdana;'>Serveur de Température - Arduino</h1>");
            client.print("<p style='font-family:arial;color:red;font-size:20px;'>La temperature relevée sur l'entrée ");
            client.print(" est de : ");
            client.print(temp);
            client.println(" °C.</p></body></html>");
            

        break;

    }

    if (c == '\n') {

    // you're starting a new line
    currentLineIsBlank = true;
    }
    else if (c != '\r') {

            // you've gotten a character on the current line
            currentLineIsBlank = false;

            }

        }

    }

    // on laisse du temps au navigateur web de recevoir les données
    delay(1);
    // close the connection:
    client.stop();

    }
/* --- Affiche la temperature dans le moniteur serial ---*/
    
 // Lit la température ambiante à ~1Hz
 if(getTemperature(&temp)) {
   
   // Affiche la température
   Serial.print("Temperature : ");
   Serial.print(temp);
   Serial.write(176); // caractère °
   Serial.write('C');
   Serial.println();
}
  /*-----------------------------------------------------*/
  /*--- Comparaison et enclenchement du relais ---*/
  // Lecture t°:
  t = temp;
  //Comparaison :
  if (t < tmin) {
    while (t < tmax){digitalWrite(relay, HIGH); };
                  }
   else {digitalWrite(relay, LOW);}
  
   /*-------------------------------------------*/

delay(600000); // 10min


}[/quote][code]
][/code]
« Last Edit: May 01, 2012, 02:46:22 pm by jhonnyy » Logged

Offline Offline
Faraday Member
**
Karma: 34
Posts: 5071
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonsoir,

j'avance doucement merci pour vos conseils !

voici une nouvelle version mais je n'arrive pas a afficher la page web !!!

une idée ?

les fonction sont mal séparé ?
est il possible d'afficher l'heure sur un uno sans shield supplémentaire ?

cdt


bonsoir

Il faut proceder par etapes et sans les bruler
ton code ne compile déjà pas !

regarde ici , il y a un bout code,  j'avais mis une verrue 1wire sur le code
http://arduino.cc/forum/index.php/topic,82555.msg624025.html#msg624025

ça affiche la T° d'un DS18B20 sur une page web
attention le code est prevu pour que le 1W soit sur le pin digital4
pour changer de 4 en 7
modifier la ligne
const int broche_OneWire=pinD04; //declaration constante de broche
par
const int broche_OneWire=pinD07; //declaration constante de broche

le DS18B20 est bien cablé ? avec sa R de 4.7K ?
voir photos sur le lien

et attention à l'adresse IP
192, 168, 1, 167

apres il faut adapter
« Last Edit: May 01, 2012, 02:22:00 pm by Artouste » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 24
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

il compile je me suis trompé en envoyant une ancienne version .

Je vois pas ou le programme bloque!!!!

Logged

Offline Offline
Faraday Member
**
Karma: 34
Posts: 5071
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

il compile je me suis trompé en envoyant une ancienne version .

Je vois pas ou le programme bloque!!!!


Un peu de rigueur prealable ça ne fait pas de mal  smiley-mr-green
post ton code "qui compile"
et mets ton code entre les balises codes
Code:
pas les balises
Quote
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 24
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

désolé

merci pour vos conseils .

le code est envoyé
Logged

Made in Belgium
Offline Offline
God Member
*****
Karma: 1
Posts: 756
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Yop Yop,
Tu as testé séparément la partie ethernet de la partie temp ds18b20 ?
Bien procédé par étapes et non tout un en d'un coup, essaie déjà la partie ethernet avec une valeur fictive pour la temp.
Attention delay est bloquant donc ton code bloquera purement et simplement pendant ses 10 minutes ...  smiley-confuse (
Code:
delay(600000); // 10min

http://arduino.cc/en/Tutorial/BlinkWithoutDelay
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 24
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Tu as testé séparément la partie ethernet de la partie temp ds18b20 ?
oui j'ai testé et cela fonctionne

essaie déjà la partie ethernet avec une valeur fictive pour la temp.
comment faire

Attention delay est bloquant donc ton code bloquera purement et simplement pendant ses 10 minutes ...  smiley-confuse (
ah bon comment lui dire
un loop(600000);

non ?

merci
cdt
Logged

Offline Offline
Faraday Member
**
Karma: 34
Posts: 5071
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Yop Yop,
Tu as testé séparément la partie ethernet de la partie temp ds18b20 ?
Bien procédé par étapes et non tout un en d'un coup, essaie déjà la partie ethernet avec une valeur fictive pour la temp.
Attention delay est bloquant donc ton code bloquera purement et simplement pendant ses 10 minutes ...  smiley-confuse (
Code:
delay(600000); // 10min

http://arduino.cc/en/Tutorial/BlinkWithoutDelay

bonsoir osaka
c'est de la compil sous IDE 1.0

la partie ds18B20 est OK (valeur OK sous serial au reset)

et en supprimant le delai (60000) c'est ok chez moi  smiley-mr-green
http://cjoint.com/12mi/BEbwyodUgkR_capt4021.jpg
« Last Edit: May 01, 2012, 03:25:06 pm by Artouste » Logged

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ca veut dire quoi "lui faire un loop(60000)" ?

Si tu connais un minimum de C tu comprendra peut être mieux ce que fot setup() et loop() en apprenant que la lib "core" de l'Arduino contient une fonction main() écrite comme ceci :
Code:
void main()
{
    setup();  // Appellé 1 seule fois pour initialiser les modules

    while(1)
        loop();   // Appellé en boucle pour gérer les traitements
}

Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Offline Offline
Newbie
*
Karma: 0
Posts: 24
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

je connais très peux le langage c
mais essai d'apprendre et je vous remercie de prendre le temps de m'expliquer smiley-roll-sweat

c'est de la compil sous IDE 1.0
cela veux dire quoi ? svp

et en supprimant le delai (60000) c'est ok chez moi  smiley-mr-green
si on supprime le dely (6000) cela vas ré effectue une recherche de temp quand ? une seule fois non ?

thanks
Logged

Pages: [1] 2 3   Go Up
Jump to: