Go Down

Topic: besoin d'aide pour programme arduino gestion de température avec log (Read 6930 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