Offline
Full Member
Karma: 0
Posts: 110
|
 |
« on: May 31, 2011, 09:09:20 am » |
Bonjour, j ai un souci de programmation le code : #include <OneWire.h> //librairie Onewire - Port OneWire - sorte de pilote contenant les instructions pour s'en servir #include <DallasTemperature.h> // librairie dallastemperature - T° - sorte de pilote contenant les instructions pour s'en servir
/* Arduino branchement Analog Pin 0 = H% Sensor Analog Pin 1 = H% Sensor Analog Pin 2 = H% Sensor Analog Pin 3 = H% Sensor Analog Pin 4 = SDA pour ds1307 Analog Pin 5 = SCL pour ds1307 Digital Pin 0 = Relais Chauffage Terra 1 Digital Pin 1 = Relais Chauffage Terra 2 Digital Pin 2 = Relais Chauffage Terra 3 Digital Pin 3 = Relais Chauffage Terra 4 Digital Pin 4 = Relais H% Terra 1 Digital Pin 5 = Relais H% Terra 2 Digital Pin 6 = Relais H% Terra 3 Digital Pin 7 = Relais H% Terra 4 Digital Pin 8 = Relais Lumière Terras Digital Pin 9 = Digital Pin 10 = Digital Pin 11 = Digital Pin 12 = Digital Pin 13 = T° Sensor
*/
int time; int val_up=0; int val_down=0; long last_time1 = 0; long last_time2 = 0;
//Définition pin de sortie int CTerra1 = 0; int CTerra2 = 1; int CTerra3 = 2; int CTerra4 = 3; int HTerra1 = 4; int HTerra2 = 5; int HTerra3 = 6; int HTerra4 = 7; int LTerra = 8;
// Définition pin entrée digital Dallas #define ONE_WIRE_BUS 13 // Définition communication avec tout matériel Onewire OneWire oneWire(ONE_WIRE_BUS); // Référence t° Dallas DallasTemperature sensors(&oneWire);
// arrays to hold device addresses uint8_t T1[8], T2[8], T3[8], T4[8], T5[8], T6[8], T7[8], T8[8];
char buf1[10]; char buf2[10]; char buf3[10]; char buf4[10]; char buf5[10]; char buf6[10]; char buf7[10]; char buf8[10];
// Nuit_Jour Temp float Temp1Nuit=22.0; float Temp1Jour=25.0;
void setup(void) { // Pin mis en sortie pinMode(CTerra1, OUTPUT); pinMode(CTerra2, OUTPUT); pinMode(CTerra3, OUTPUT); pinMode(CTerra4, OUTPUT); pinMode(HTerra1, OUTPUT); pinMode(HTerra2, OUTPUT); pinMode(HTerra3, OUTPUT); pinMode(HTerra4, OUTPUT); pinMode(LTerra, OUTPUT); // Démarre le port série Serial.begin(1200); Serial.println("Gestion Terra"); /*RTC.stop(); // a enlever /* à la première initialisation et a remettre ensuite RTC.set(DS1307_SEC,00); //réglage secondes du moment RTC.set(DS1307_MIN,28); //réglage minutes du moment RTC.set(DS1307_HR,11); //réglage heures du moment RTC.set(DS1307_DOW,1); //réglage jour de la semaine du moment RTC.set(DS1307_DATE,31); //réglage date du moment RTC.set(DS1307_MTH,05); //réglage mois du moment RTC.set(DS1307_YR,11); //réglage année du moment RTC.start(); // a enlever /* à la première initialisation et a remettre ensuite */
// Démarre la librairie sensors.begin(); if (!sensors.getAddress(T1, 0)) Serial.println("Unable to find address for Device 0"); if (!sensors.getAddress(T2, 1)) Serial.println("Unable to find address for Device 1"); if (!sensors.getAddress(T3, 2)) Serial.println("Unable to find address for Device 2"); if (!sensors.getAddress(T4, 3)) Serial.println("Unable to find address for Device 3"); if (!sensors.getAddress(T5, 4)) Serial.println("Unable to find address for Device 4"); if (!sensors.getAddress(T6, 5)) Serial.println("Unable to find address for Device 5"); if (!sensors.getAddress(T7, 6)) Serial.println("Unable to find address for Device 6"); if (!sensors.getAddress(T8, 7)) Serial.println("Unable to find address for Device 7"); // show the addresses we found on the bus Serial.print("Device 0 Address: "); printAddress(T1); Serial.println(); Serial.print("Device 1 Address: "); printAddress(T2); Serial.println(); Serial.print("Device 2 Address: "); printAddress(T3); Serial.println(); Serial.print("Device 3 Address: "); printAddress(T4); Serial.println(); Serial.print("Device 4 Address: "); printAddress(T5); Serial.println(); Serial.print("Device 5 Address: "); printAddress(T6); Serial.println(); Serial.print("Device 6 Address: "); printAddress(T7); Serial.println(); Serial.print("Device 7 Address: "); printAddress(T8); Serial.println(); }
// fonction pour afficher les adresses void printAddress(uint8_t deviceAddress[]) { for (uint8_t i = 0; i < 8; i++) { Serial.print(deviceAddress, HEX); if (i < 7) Serial.print(" "); } }
void loop(void) { sensors.requestTemperatures(); // envoie de commande de récupération // lecture de la t° (autant que de capteur dallas - jusqu'a 10 dans exemple)
itoa(sensors.getTempCByIndex(0),buf1,9); if (!sensors.getAddress(T1, 0)) { if (sensors.getTempCByIndex(0)<25) { Serial.print("Terra 1 : "); Serial.print("T° : "); Serial.print(sensors.getTempCByIndex(0)); Serial.println(" Chauffage en route "); } else { Serial.print("Terra 1 : "); Serial.print("T° : "); Serial.print(sensors.getTempCByIndex(0)); Serial.println(" Ventilation en route "); } }
itoa(sensors.getTempCByIndex(1),buf2,9); if (!sensors.getAddress(T2, 1)) { if (sensors.getTempCByIndex(1)<25) { Serial.print("Terra 2 : "); Serial.print("T° : "); Serial.print(sensors.getTempCByIndex(1)); Serial.println(" Chauffage en route "); } else { Serial.print("Terra 2 : "); Serial.print("T° : "); Serial.print(sensors.getTempCByIndex(1)); Serial.println(" Ventilation en route "); } }
itoa(sensors.getTempCByIndex(2),buf3,9); if (!sensors.getAddress(T3, 2)) { if (sensors.getTempCByIndex(2)<25) { Serial.print("Terra 3 : "); Serial.print("T° : "); Serial.print(sensors.getTempCByIndex(2)); Serial.println(" Chauffage en route "); } else { Serial.print("Terra 3 :"); Serial.print("T° : "); Serial.print(sensors.getTempCByIndex(2)); Serial.println(" Ventilation en route "); } } itoa(sensors.getTempCByIndex(3),buf4,9); if (!sensors.getAddress(T4, 3)) { if (sensors.getTempCByIndex(3)<25) { Serial.print("Terra 4 : "); Serial.print("T° : "); Serial.print(sensors.getTempCByIndex(3)); Serial.println(" Chauffage en route "); } else { Serial.print("Terra 4 : "); Serial.print("T° : "); Serial.print(sensors.getTempCByIndex(3)); Serial.println(" Ventilation en route "); } }
itoa(sensors.getTempCByIndex(4),buf5,9); if (!sensors.getAddress(T5, 4)) { if (sensors.getTempCByIndex(4)<25) { Serial.print("Terra 5 : "); Serial.print("T° : "); Serial.print(sensors.getTempCByIndex(4)); Serial.println(" Chauffage en route "); } else { Serial.print("Terra 5 :"); Serial.print("T° : "); Serial.print(sensors.getTempCByIndex(4)); Serial.println(" Ventilation en route "); } }
itoa(sensors.getTempCByIndex(5),buf6,9); { if (!sensors.getAddress(T6, 5)) { if (sensors.getTempCByIndex(5)<25) { Serial.print("Terra 6 : "); Serial.print("T° : "); Serial.print(sensors.getTempCByIndex(5)); Serial.println(" Chauffage en route "); } else { Serial.print("Terra 6 : "); Serial.print("T° : "); Serial.print(sensors.getTempCByIndex(5)); Serial.println(" Ventilation en route "); } } } } La carte duemilanove 328 une proshield ou sont connectés les DS18B20 avec sur le 5v une résistance de 1k, la 4k7 empêchait la reconnaissance des capteurs pour la pin 2 et les pin 1 et 3 sont sur le GNd de la carte les capteurs sont montés en série avec des prises jack audio (peu de longueur), pour pouvoir ajouter au fur et a mesure des besoins de nouveaux capteurs alimentation le port usb de la carte (y compris les dallas) le problème : en mode 9600 bauds, caractrère bizarre en début de programme en 1200 pas de soucis il me reconnait bien les 2 capteurs connectés mais sur les autres adresses il me récupère la dernière adresse connue alors que je souhaite aucune par contre il ne me ressort aucune valeur pour les Terras 1 et 2 du programme (condition du loop) comme si il n y avait aucun adressage, alors que j ai bien l adressage des capteurs (demandé dans le setup) si quelqu un avait une idée, là je sèche merci par avance
|
|
|
|
« Last Edit: May 31, 2011, 10:32:17 am by Stef84 »
|
Logged
|
|
|
|
|
0
Offline
God Member
Karma: 0
Posts: 763
Arduino rocks
|
 |
« Reply #1 on: May 31, 2011, 10:00:19 am » |
Yep! Si je ne me trompe, il te faut un delay() aprés le requestTemperatures, essayes avec 750 ms pour commencer. ... sensors.requestTemperatures(); delay(750); ... @+ Zoroastre.
|
|
|
|
|
Logged
|
Veuillez indiquer [RESOLU] dans l'entête du titre en éditant votre premier message 
|
|
|
|
Offline
Full Member
Karma: 0
Posts: 110
|
 |
« Reply #2 on: May 31, 2011, 10:36:10 am » |
J ai fait un screenshoot :  je viens d'essayé le 750 ms ca ne change rien, mais merci quand même, c'était l impression que ca me donnait au lancement qu il fallait un temps de latence, je ne savais pas le placer, mais le problème est autre à priori
|
|
|
|
« Last Edit: May 31, 2011, 10:41:28 am by Stef84 »
|
Logged
|
|
|
|
|
0
Offline
God Member
Karma: 0
Posts: 763
Arduino rocks
|
 |
« Reply #3 on: May 31, 2011, 11:10:48 am » |
Yep!
Tu devrais tenter de mettre quelques delay() entre tes requetes pour tester. Tu conserves les 750 ms et ajoutes un delay entre 2 requetes pour voir si cela change quelques choses.
Je pense sincèrement que les commandes sont trop rapides. L'interrogation des ds18b20 réclame du temps, il y a quelques topics dessus dont le but est justement d'accélerer ces requetes (peut-être sur l'ancien forum).
@+
Zoroastre.
|
|
|
|
|
Logged
|
Veuillez indiquer [RESOLU] dans l'entête du titre en éditant votre premier message 
|
|
|
|
Offline
Full Member
Karma: 0
Posts: 110
|
 |
« Reply #4 on: June 01, 2011, 02:52:56 am » |
Quelqu' un peut me confirmer que l ordre de connexion des ds18b20 voir les onewire ne correspondent pas forcement à l ordre de reconnaissance par la carte c est à dire que la carte classe par ordre croissant la liste des adresses qu'elles trouvent
et dans ce cas, y a t'il un moyen de contourner le problème dans le sens si je rajoute un nouveau capteur, celui ci doit se retrouver en dernière position de la liste d'adressage
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
God Member
Karma: 0
Posts: 763
Arduino rocks
|
 |
« Reply #5 on: June 01, 2011, 03:10:40 am » |
Yep! Pas sûr qu'il y ait un ordre spécifique. Il faudrait vérifier la bibliothèque mais je n'y croit pas trop ! Il y a un ancien topic ici : http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1209105786Tu peux également si tu connais les adresses de chacune de tes sondes, les interroger individuellement. void setup() { ... indoor0 = { 0x28, 0x1D, 0x39, 0x31, 0x2, 0x0, 0x0, 0xF0 }; ... } void loop() { ... tempC0 = sensors.getTempC(indoor0); ... } Je remarque aussi que j'ai une commande supplémentaire que tu n'as pas implémentée : DallasTemperature sensors(&oneWire); DeviceAddress indoor0, indoor1, indoor2, outdoor; @+ Zoroastre.
|
|
|
|
« Last Edit: June 01, 2011, 03:29:59 am by zoroastre »
|
Logged
|
Veuillez indiquer [RESOLU] dans l'entête du titre en éditant votre premier message 
|
|
|
|
Offline
Full Member
Karma: 0
Posts: 110
|
 |
« Reply #6 on: June 01, 2011, 04:37:55 am » |
Merci pour ta réponse, je pense que je vais attaquer directement les adresses, ca évitera toute dérive lors de rajout de capteur dans le classement des adresses ton indoor x028,... coresspond à l adresse complète de la rom ?
|
|
|
|
« Last Edit: June 01, 2011, 04:46:35 am by Stef84 »
|
Logged
|
|
|
|
|
0
Offline
God Member
Karma: 0
Posts: 763
Arduino rocks
|
 |
« Reply #7 on: June 01, 2011, 07:26:53 am » |
Yep! Oui c'est l'adresse d'une de mes sondes. indoor0 = { 0x28, 0x1D, 0x39, 0x31, 0x2, 0x0, 0x0, 0xF0 }; dans ton cas : T1 = { 0x28, 0xD0, 0x59, 0xFA, 0x1, 0x0, 0x0, 0x7D }; sauf erreur de frappe  @+ Zoroastre.
|
|
|
|
|
Logged
|
Veuillez indiquer [RESOLU] dans l'entête du titre en éditant votre premier message 
|
|
|
|
Offline
Full Member
Karma: 0
Posts: 110
|
 |
« Reply #8 on: June 01, 2011, 02:35:17 pm » |
Re j ai un souci, il y a un bout de code à mettre en plus je me faits jetter (je debute) ? : // Référence t° Dallas DallasTemperature sensors(&oneWire); DeviceAddress Terra1, Terra2, Terra3, Terra4, Terra5, Terra6, Terra7; setup : //Definition des adresses des capteurs sur terra Terra1 = { 0x28, 0xD0, 0x59, 0xFA, 0x1, 0x0, 0x0, 0x7D }; Terra2 = { 0x28, 0x91, 0x46, 0xFA, 0x1, 0x0, 0x0, 0x2C }; mais il me sort en erreur : prog_gestion_terra.cpp: In function 'void setup()': prog_gestion_terra:79: error: expected primary-expression before '{' token prog_gestion_terra:79: error: expected `;' before '{' token prog_gestion_terra:80: error: expected primary-expression before '{' token prog_gestion_terra:80: error: expected `;' before '{' token il bloque sur la première ligne d adresse
|
|
|
|
« Last Edit: June 01, 2011, 02:38:19 pm by Stef84 »
|
Logged
|
|
|
|
|
0
Offline
God Member
Karma: 0
Posts: 763
Arduino rocks
|
 |
« Reply #9 on: June 01, 2011, 03:17:57 pm » |
Yep! Désolé c'est de ma faute, j'ai repris bêtement le commentaire de la lib  uint8_t indoor0[8] = {0x28, 0xF1, 0xDC, 0x43, 0x2, 0x0, 0x0, 0x3}; @+ Zoroastre.
|
|
|
|
|
Logged
|
Veuillez indiquer [RESOLU] dans l'entête du titre en éditant votre premier message 
|
|
|
|
Offline
Full Member
Karma: 0
Posts: 110
|
 |
« Reply #10 on: June 01, 2011, 03:25:21 pm » |
 je te remercie, je me tapais tous les sites pour comprendre  bonne soiree
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Full Member
Karma: 0
Posts: 110
|
 |
« Reply #11 on: June 02, 2011, 01:42:06 am » |
 il y a un morceaux qu a sauter: je te remercie de m a voir donner la réponse, 
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
God Member
Karma: 0
Posts: 763
Arduino rocks
|
 |
« Reply #12 on: June 18, 2011, 05:05:27 pm » |
Yep!
Je relance un moment ce topic car, aprés un an d'absence, je reprends mon code et suis surpris de devoir déclarer manuellement mes DS18B20 dans le loop. Lorsque je les déclare dans le setup, les sondes ne répondent pas. Est-ce normal ??? Aurais-je loupé quelque chose ?
@+
Zoroastre.
|
|
|
|
|
Logged
|
Veuillez indiquer [RESOLU] dans l'entête du titre en éditant votre premier message 
|
|
|
|
Offline
Full Member
Karma: 0
Posts: 110
|
 |
« Reply #13 on: June 19, 2011, 06:16:11 am » |
je te mets mon code, si ca peux t aider, comme çà je ne sais pas te répondre, avant je récupère l adressage des db18b20 avec un autre programme, si t en as besoin, je te le mets en post, les miennes sont en mode parasite : #include <OneWire.h> //librairie Onewire - Port OneWire #include <DallasTemperature.h> // librairie dallastemperature #include <ds1307rtc.h> //librairie ds1307 - horloge #include <Wire.h> //librairie ds1307 - horloge #include <time.h> //librairie ds1307 - horloge #include <WProgram.h>
/* Arduino branchement Analog Pin 0 = H% Sensor Analog Pin 1 = H% Sensor Analog Pin 2 = H% Sensor Analog Pin 3 = H% Sensor Analog Pin 4 = SDA pour ds1307 Analog Pin 5 = SCL pour ds1307
Digital Pin 0 = Relais Chauffage Terra 1 Digital Pin 1 = Relais Chauffage Terra 2 Digital Pin 2 = Relais Chauffage Terra 3 Digital Pin 3 = Relais Chauffage Terra 4 Digital Pin 4 = Relais Pompe H% Terra 1 Digital Pin 5 = Relais Pompe H% Terra 2 Digital Pin 6 = Relais Pompe H% Terra 3 Digital Pin 7 = Relais Pompe H% Terra 4 Digital Pin 8 = Relais Lumière Terras Digital Pin 9 = Digital Pin 10 = Digital Pin 11 = Digital Pin 12 = Digital Pin 13 = T° Sensor */
// Définition pin Analogique capteur H% int HTerra1 = 0; int HTerra2 = 1; int HTerra3 = 2; int HTerra4 = 3; int SDA=4; int SCL=5;
//Définition pin de sortie int CTerra1 = 0; int CTerra2 = 1; int CTerra3 = 2; int CTerra4 = 3; int PHTerra1 = 4; int PHTerra2 = 5; int PHTerra3 = 6; int PHTerra4 = 7; int LTerra = 8;
// Définition pin entrée digital Dallas #define ONE_WIRE_BUS 13
// Définition communication avec tout matériel Onewire OneWire oneWire(ONE_WIRE_BUS);
// Référence t° Dallas DallasTemperature sensors(&oneWire); uint8_t Terra1[8] = { 0x28, 0xF5, 0x31, 0x53, 0x3, 0x0, 0x0, 0x7A }; // Sonde Terra Rany uint8_t Terra2[8] = { 0x28, 0xD0, 0x59, 0xFA, 0x1, 0x0, 0x0, 0x7D }; uint8_t Terra3[8] = { 0x28, 0x91, 0x46, 0xFA, 0x1, 0x0, 0x0, 0x2C }; uint8_t Terra4[8] = {}; uint8_t Terra8[8] = { 0x28, 0xEE, 0x1D, 0x63, 0x3, 0x0, 0x0, 0x48 }; // Sonde arduino
// Nuit_Jour Temp float Temp1Nuit=22.00; float Temp1Jour=25.00;
//H% float HHTerra1 = 0.00; float HHTerra2 = 0.00; float HHTerra3 = 0.00; float HHTerra4 = 0.00; float Humeterra1 = 0.00; float Humeterra2 = 0.00; float Humeterra3 = 0.00; float Humeterra4 = 0.00;
int current;
// Variable buttoir des horaires en secondes int P_Matin_Min = 29100; // 8h05m00 (8*60*60)+(5*60)+(00) int P_Matin_Max = 29130; // 8h05m30 (8*60*60)+(5*60)+(30) int P_Soir_Min = 73800; // 20h30m00 int P_Soir_Max = 73830; // 20h30m30 int G_Journee_Min = 28800; // 08h00m00 int G_Journee_Max= 75600; // 21h00m00
// controle h% toutes les heures de la journée (3600s = 1 heure) int Hydro9=32400; int Hydro10=36000; int Hydro11=39600; int Hydro12=43200; int Hydro13=46800; int Hydro14=50400; int Hydro15=54000; int Hydro16=57600; int Hydro17=61200; int Hydro18=64800; int Hydro19=68400; int Hydro20=72000;
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Full Member
Karma: 0
Posts: 110
|
 |
« Reply #14 on: June 19, 2011, 06:17:35 am » |
void setup(void) {
// Démarre le port série Serial.begin(9600);
// Pin mis en sortie pinMode(CTerra1, OUTPUT); pinMode(CTerra2, OUTPUT); pinMode(CTerra3, OUTPUT); pinMode(CTerra4, OUTPUT); pinMode(PHTerra1, OUTPUT); pinMode(PHTerra2, OUTPUT); pinMode(PHTerra3, OUTPUT); pinMode(PHTerra4, OUTPUT); pinMode(LTerra, OUTPUT);
setSyncProvider(RTC.get);
if(timeStatus()!= timeSet) Serial.println("Unable to sync"); else Serial.println("RTC system time ");
Serial.println("Gestion Terra");
// Démarre la librairie sensors.begin();
}
void loop(void) { current = (hour()*60*60) + (minute()*60) + second(); // heure courante en secondes
sensors.requestTemperatures(); // envoie de commande de récupération Temperature
// Recuperation hydrometrie avec alimentation 5v HHTerra1=(analogRead(HTerra1)*5000.0)/1024.0; HHTerra2=(analogRead(HTerra2)*5000.0)/1024.0; HHTerra3=(analogRead(HTerra3)*5000.0)/1024.0; HHTerra4=(analogRead(HTerra4)*5000.0)/1024.0;
// conversion pourcentage (tension -->3.9v) Humeterra1=(HHTerra1-800)/31.0; Humeterra2=(HHTerra2-800)/31.0; Humeterra3=(HHTerra3-800)/31.0; Humeterra4=(HHTerra4-800)/31.0;
delay(1000);
//Pulverisation du matin et soir if ((P_Matin_Min < current && current < P_Matin_Max) || (P_Soir_Min < current && current < P_Soir_Max)) // entre 8h05m00 et 8h05m30 et 19h30m00 et 19h30m30 { digitalWrite(PHTerra1,HIGH); digitalWrite(PHTerra2,HIGH); digitalWrite(PHTerra3,HIGH); digitalWrite(PHTerra4,HIGH); } else { digitalWrite(PHTerra1,LOW); digitalWrite(PHTerra2,LOW); digitalWrite(PHTerra3,LOW); digitalWrite(PHTerra4,LOW); }
|
|
|
|
|
Logged
|
|
|
|
|
|