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/*
* 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();
}