Pages: 1 2 [3]   Go Down
Author Topic: besoin d'aide pour programme arduino gestion de température avec log  (Read 5878 times)
0 Members and 1 Guest are viewing this topic.
Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

NTP, y'a un exemple sur le site Arduino : http://arduino.cc/en/Tutorial/UdpNtpClient
Je ne sais pas ce qu'il vaut.


Pour l'instant tes fonctions sont courtes et bien ciblées, donc rien a redire sur l'organisation.
Fait attention à l'indentation pour que cela reste lisible (c'est peut être bon dans l'IDE mais sur le forum ca passe pas terrible).

Après tu peux chercher à découper dans plusieurs fichiers sources (des .cpp pas des .ino) pour chaque tâches.
Ce qui permet aussi d'organiser chaque module de manière bien indépendante avec son setup_Xxxx() et son loop_Xxxx() et dans le INO il ne reste finalement que une fonction setup qui appele les setup_Xxxx() et une fonction loop qui appele les loop_Xxxx().
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

okay merci

mais j'ai l'impression que tu es le seul sur le post pourquoi ?
étrange.
Logged

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

Parce que j'ai beaucoup de temps ces temps ci.

Mais çà va pas durer après mi-mai smiley-wink
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

merci d'avoir du temps à me consacrer

je ne comprend pas je test un code ntp client qui me parait vraiment bien

https://github.com/jhjaggars/arduino-ntp/tree/master/examples/ntp

Code:
/*
* Info
*Broche utilisé par les fonctions
- D4 : chip-select de la carte SD
- D10 : chip-select du chip Ethernet W5100
- D11, D12, D13
*Broche à relier
- D1 :
- D2 :
- D3 :
- D5 : relai vmc
- D6 : Relai chauffage
- D7 : sonde de temp >> ds18b20
- D8 :
- D9 :
*/


//librairie
#include <SD.h>
#include <SPI.h>
#include <Ethernet.h>
#include <OneWire.h> // Inclusion de la librairie OneWire
#inculde <NTP.h>
//broche et variables
#define DS18B20 0x28     // Adresse 1-Wire du DS18B20
#define BROCHE_ONEWIRE 7 // Broche utilisée pour le bus 1-Wire
#define PERIODE_LENTE        60000
#define PERIODE_RAPIDE        1000
#define temp_enregistrement_sd 600000
const int relay_chauffage = 6;       // pin sortie relais
const int relay_vmc = 6;
const int chipSelectsd = 4;
//Valeur a déterminé-----------------------------------------------------------------------------------------------
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,0,20 };
byte gw[] = { 192, 168,0,254 };

byte time_dot_nist_dot_gov[] = { 192, 43, 244, 18}; // time.nist.gov
EthernetServer server(80);
unsigned long intervalchauffage = PERIODE_LENTE;  // ATTENTION AU TYPE : On traite les millis() en unsigned long
unsigned long previousMillis = 0;  // ATTENTION AU TYPE : On traite les millis() en unsigned long
unsigned long enregistrementcarte = temp_enregistrement_sd;
OneWire ds(BROCHE_ONEWIRE); // Création de l'objet OneWire ds

bool chauffageOn = false;
// 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;
}
void Temp_ntp() {

NTP ntp(time_dot_nist_dot_gov);
    unsigned long time = ntp.get_gmt();
    Serial.println(time);}
void temperature(){

//boucle avec fonction de temps pour la lecture de la température et action du relay chauffage
// voilà comment on gère correctement le timing
// il faut à chaque fois comparer avec "maintenant" donc avec la valeur retournée par millis() à cet instant présent
if( (millis() - previousMillis) > intervalchauffage) {
previousMillis = millis();  // on mémorise la valeur de maintenant
/* --- Affiche la temperature dans le moniteur serial ---*/

float temp; // je n'aime pas trop les variables flotantes mais bon passons ...

// 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 ( chauffageOn )
                        {
                               if ( t > tmax )
                                {
                                      digitalWrite(relay_chauffage, LOW);
                                      chauffageOn = false;
                                      intervalchauffage = PERIODE_LENTE;
                                }
                                else
                                {
                                      intervalchauffage = PERIODE_RAPIDE;
                                }
                        }
                        else  // if ( chauffageOn )
                        {
       if (t < tmin)
                                {
                                      digitalWrite(relay_chauffage, HIGH);
                                      chauffageOn = true;
                                      intervalchauffage = PERIODE_RAPIDE;
 
                                }
                                else
                                {
                                      intervalchauffage = PERIODE_LENTE;
                                }
                        }   // if ( chauffageOn ) else
Serial.print("Chauffage :");
Serial.println( chauffageOn ? "marche" : "arrêt" );
                }
                else  // If ( getTemperature() )
                {
                        // en cas d'erreur de lecture on passe en période rapide pour venir retester rapidemment
                        intervalchauffage = PERIODE_RAPIDE;
                 Serial.println( "ALARME: Erreur de lecture de la température" );
} // If ( getTemperature() ) else

/*-------------------------------------------*/
}

}
void reseau(){
EthernetClient client = server.available();
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();

            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 est de ");
            client.print(t);
            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();
    }
}
void enregistrementsd() {
if( (millis() - previousMillis) > enregistrementcarte) {
previousMillis = millis();
String dataString = "";

File dataFile = SD.open("logtemp.txt", FILE_WRITE);

// if the file is available, write to it:
  if (dataFile) {
    dataFile.println(t);
    dataFile.close();
    // print to the serial port too:
    Serial.println(dataString);
  }  
  // if the file isn't open, pop up an error:
  else {
    Serial.println("error opening datalog.txt");
  }
}
}

void setup() {

digitalWrite(relay_chauffage, LOW);
Serial.begin(9600); // Initialisation du port série
//Initialisation de la partie web
Ethernet.begin(mac,ip,gw);
server.begin();
// initialiser previousMillis pour être sur de réclencher le test la 1ère fois
  previousMillis = millis() - intervalchauffage;
 // parti sd  
  Serial.print("Initializing SD card...");
   pinMode(10, OUTPUT);
     if (!SD.begin(chipSelectsd)) {
    Serial.println("Card failed, or not present");
    // don't do anything more:
    return;
  }
  Serial.println("card initialized.");
}

void loop()
{
 temperature();
reseau();
enregistrementsd();
}

Logged

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


dsl deux posts car trop de caractères
et j'ai un gro message d'erreur
J'ai vérifié la lib cela me parait ok

sketch_may08a.cpp:24:2: error: invalid preprocessing directive #inculde
sketch_may08a.cpp: In function 'void Temp_ntp()':
sketch_may08a:90: error: 'NTP' was not declared in this scope
sketch_may08a:90: error: expected `;' before 'ntp'
sketch_may08a:91: error: 'ntp' was not declared in this scope

UNE solution?
Logged

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

Avec une loupe tu devrais mieux voir smiley-wink

#include <OneWire.h> // Inclusion de la librairie OneWire
#inculde <NTP.h>


Le reste doit découler de la 1ere erreur smiley-grin
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

MERCI j'ai passé pas mal de temps pour ceci !!!!!!!!!!!!!!!!!!!!!!!!!
Logged

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