Go Down

Topic: besoin d'aide pour programme arduino gestion de température avec log (Read 7810 times) previous topic - next topic

barbudor

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().
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 ?

jhonnyy

okay merci

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

barbudor

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

Mais çà va pas durer après mi-mai ;)
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 ?

jhonnyy

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: [Select]
/*
* 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();
}



jhonnyy


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?

barbudor

Avec une loupe tu devrais mieux voir ;)

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


Le reste doit découler de la 1ere erreur :D
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 ?

jhonnyy

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

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy