Mon premier programme Arduino, Help [Résolu]

Bonjour à tous,

En fait c'est le premier programme qui rentre dans le vif du sujet de ce que je veux faire :
Si la température T1 est supérieure à T3, je veux allumer une LED ( en attendant de mettre en route une pompe)
J'ai donc travaillé à partir de ce programme (dont la source est indiquée dans les commentaires) et j'ai rajouté à la fin 10 lignes pour faire la comparaison et activer la LED.
Je relève bien mes 3 températures sur le moniteur série et j'ai bien la LED qui s'allume si j'enlève la condition T1>T3.
Je ne sais pas ce que je récupère comme type de valeur pour les températures ( le moniteur affiche 19,65 °C environ pour les 3 températures) or si je teste une sortie moniteur de T1 - T3 je lis -16 alors que T1 est environ égal à la température T2 et T3 (les 3 sondes sont plantées côte à côte sur la breadboard).

Voici le programme :

#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2 // sondes DS18B20 sur pin 2 sur ma Mega Arduino
OneWire oneWire(ONE_WIRE_BUS);// Setup a oneWire instance to communicate with any OneWire devices
DallasTemperature sensors(&oneWire);// Pass our oneWire reference to Dallas Temperature.
// Assign the addresses of your 1-Wire temp sensors.
// See the tutorial on how to obtain these addresses: c'est bon je l'ai fait et ça marche
// Arduino 1-Wire Address Finder

DeviceAddress T1 = { 0x28, 0xEB, 0x59, 0xE1, 0x03, 0x00, 0x00, 0x8B };//les adresses de mes 3 sondes
DeviceAddress T2 = { 0x28, 0x36, 0x35, 0xE1, 0x03, 0x00, 0x00, 0x35 };
DeviceAddress T3 = { 0x28, 0xA4, 0x3A, 0xE1, 0x03, 0x00, 0x00, 0x85 };
const int LED=10; //LED sur pin 10 // je l'ai rajouté

void setup(void)
{
//init entrees
Serial.begin(115200);// start serial port
sensors.begin(); // Start up the library
sensors.setResolution(T1, 12);// fixe la resolution a 12 bit
sensors.setResolution(T2, 12);
sensors.setResolution(T3, 12);

//init sorties
pinMode (LED, OUTPUT);
}

void printTemperature(DeviceAddress deviceAddress)
{
float tempC = sensors.getTempC(deviceAddress);
if (tempC == -127.00) {
Serial.print("Error getting temperature");
} else {
//Serial.print("degre C: ");
Serial.print(tempC);
//Serial.print(" F: ");
//Serial.print(DallasTemperature::toFahrenheit(tempC));//conversion C->F
}
}

void loop(void)
{
delay(2000); //delai de 2"
Serial.print("Temperatures...\n\r");
sensors.requestTemperatures();

Serial.print("T1: ");
printTemperature(T1);
Serial.print("\n\r");
Serial.print("T2: ");
printTemperature(T2);
Serial.print("\n\r");
Serial.print("T3: ");
printTemperature(T3);
Serial.print("\n\r\n\r");

Serial.println();

if ((T1) > (T3))
{
digitalWrite (LED, HIGH);
delay (500);
} else
{
digitalWrite (LED, LOW);
delay (500);
}

}

Merci de m'aider à allumer ma LED lorsque je chauffe T1 avec les doigts !

Bonjour,

Réfléchis 2 secondes :wink:

T1, T2 et T3 sont des adresses, donc if ((T1) > (T3)) ça n'as aucun sens !

Regarde de plus prés cette partie :

float tempC = sensors.getTempC(deviceAddress);

Inspire toi de cette partie pour avoir la valeur de T1 et T2 dans deux float puis fait ton if dessus :wink:

Donc voilà mon nouveau code qui me fait allumer la LED, c'est vrai qu'un débutant est un peu dérouté par cette écriture.
En tout cas merci, tu m'as donné la piste mais pas la solution et c'est bien comme cela que j'entendais être assisté !

#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2 // sondes DS18B20 sur pin 2 sur la Mega Arduino
OneWire oneWire(ONE_WIRE_BUS);// Setup a oneWire instance to communicate with any OneWire devices
DallasTemperature sensors(&oneWire);// Pass our oneWire reference to Dallas Temperature.
// Assign the addresses of your 1-Wire temp sensors.
// See the tutorial on how to obtain these addresses:
// Arduino 1-Wire Address Finder

DeviceAddress T1 = { 0x28, 0xEB, 0x59, 0xE1, 0x03, 0x00, 0x00, 0x8B };
DeviceAddress T2 = { 0x28, 0x36, 0x35, 0xE1, 0x03, 0x00, 0x00, 0x35 };
DeviceAddress T3 = { 0x28, 0xA4, 0x3A, 0xE1, 0x03, 0x00, 0x00, 0x85 };
const int LED=10; //LED sur pin 10

void setup(void)
{
//init entrees
Serial.begin(115200);// start serial port
sensors.begin(); // Start up the library
sensors.setResolution(T1, 12);// fixe la resolution a 12 bit
sensors.setResolution(T2, 12);
sensors.setResolution(T3, 12);

//init sorties
pinMode (LED, OUTPUT);
}

void printTemperature(DeviceAddress deviceAddress)
{
float tempC = sensors.getTempC(deviceAddress);
if (tempC == -127.00) {
Serial.print("Error getting temperature");
} else {
//Serial.print("degre C: ");
Serial.print(tempC);
//Serial.print(" F: ");
//Serial.print(DallasTemperature::toFahrenheit(tempC));//conversion C->F
}
}

void loop(void)
{
delay(2000); //delai de 2"
Serial.print("Temperatures...\n\r");
sensors.requestTemperatures();

Serial.print("T1: ");
printTemperature(T1);
Serial.print("\n\r");
Serial.print("T2: ");
printTemperature(T2);
Serial.print("\n\r");
Serial.print("T3: ");
printTemperature(T3);
Serial.print("\n\r\n\r");

Serial.println();

if ((sensors.getTempC(T1)) > (sensors.getTempC(T3)))
{
digitalWrite (LED, HIGH);
delay (500);
} else
{
digitalWrite (LED, LOW);
delay (500);
}

}

Maintenant j'ai calculé/affiché l'écart entre les températures et j'ai ajouté un hystérésis de 2°C
C'est top comme thermostat ! super content :slight_smile:

Voilà le résultat à l'écran : http://cjoint.com/?CBpxN5txUFR

Maintenant que tu as compris le problème voici un exemple de code "propre" (enfin c'est une question de point de vue :grin:) :

/* Includes */
#include <OneWire.h>
#include <DallasTemperature.h>

/* Déclaration du bus 1-wire */
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

/* Déclaration des sondes DS18B20 */
DeviceAddress T1 = { 0x28, 0xEB, 0x59, 0xE1, 0x03, 0x00, 0x00, 0x8B };
DeviceAddress T2 = { 0x28, 0x36, 0x35, 0xE1, 0x03, 0x00, 0x00, 0x35 };
DeviceAddress T3 = { 0x28, 0xA4, 0x3A, 0xE1, 0x03, 0x00, 0x00, 0x85 };

/* Constantes */
const byte LED_PIN = 10; /* Broche de la led */

void setup() {

  /* Initialisation du port série */
  Serial.begin(115200);

  /* Initialisation des sondes */
  sensors.begin();
  sensors.setResolution(T1, 12);
  sensors.setResolution(T2, 12);
  sensors.setResolution(T3, 12);

  /* Initialisation des broches */
  pinMode (LED_PIN, OUTPUT);
  digitalWrite (LED_PIN, LOW);
}

void loop() {

  /* Delai de 2sec */
  delay(2000);

  /* Début de la lecture des températures */
  Serial.println(F("Temperatures ..."));
  sensors.requestTemperatures();

  /* Lecture des 3 sondes */
  float temp1 = sensors.getTempC(T1);
  float temp2 = sensors.getTempC(T2);
  float temp3 = sensors.getTempC(T3);

  /* Vérification si erreurs */
  if (temp1 == -127.00) {
    Serial.print(F("Erreur de lecture de la sonde 1"));
  }
  if (temp2 == -127.00) {
    Serial.print(F("Erreur de lecture de la sonde 2"));
  }
  if (temp3 == -127.00) {
    Serial.print(F("Erreur de lecture de la sonde 3"));
  }

  /* Affichage des températures */
  Serial.print("T1: ");
  Serial.println(temp1, 2);
  Serial.print("T2: ");
  Serial.println(temp2, 2);
  Serial.print("T3: ");
  Serial.println(temp3, 2);
  Serial.println();

  /* Test et action sur la led */
  if (temp1 > temp3) {
    digitalWrite (LED_PIN, HIGH);
  } else {
    digitalWrite (LED_PIN, LOW);
  }
  delay(500);
}

(si tu as des questions n'hésite pas ;))

Merci a vous! c'est ce qu'il me fallait !

simple , efficace que du bonheur!

Désol? de répondre aussi tard !
Merci Skywood pour cette superbe mise en forme de mon programme !